JSValue JSHistory::replaceState(ExecState* exec) { RefPtr<SerializedScriptValue> historyState = SerializedScriptValue::create(exec, exec->argument(0), 0, 0); if (exec->hadException()) return jsUndefined(); String title = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(1)); if (exec->hadException()) return jsUndefined(); String url; if (exec->argumentCount() > 2) { url = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); if (exec->hadException()) return jsUndefined(); } ExceptionCode ec = 0; impl()->stateObjectAdded(historyState.release(), title, url, History::StateObjectReplace, ec); setDOMException(exec, ec); m_state.clear(); return jsUndefined(); }
JSValue JSDOMWindow::showModalDialog(ExecState* exec) { String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); String dialogFeaturesString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); if (exec->hadException()) return jsUndefined(); DialogHandler handler(exec); impl()->showModalDialog(urlString, dialogFeaturesString, activeDOMWindow(exec), firstDOMWindow(exec), setUpDialog, &handler); return handler.returnValue(); }
JSValue JSDOMWindow::postMessage(ExecState* exec) { DOMWindow* window = impl(); DOMWindow* source = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); MessagePortArray messagePorts; if (exec->argumentCount() > 2) fillMessagePortArray(exec, exec->argument(1), messagePorts); if (exec->hadException()) return jsUndefined(); String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, exec->argument((exec->argumentCount() == 2) ? 1 : 2)); if (exec->hadException()) return jsUndefined(); ExceptionCode ec = 0; window->postMessage(message, &messagePorts, targetOrigin, source, ec); setDOMException(exec, ec); return jsUndefined(); }
void Console::profileEnd(ExecState* exec, const ArgList& args) { Page* page = this->page(); if (!page) return; if (!page->inspectorController()->profilerEnabled()) return; UString title; if (args.size() >= 1) title = valueToStringWithUndefinedOrNullCheck(exec, args.at(exec, 0)); RefPtr<Profile> profile = Profiler::profiler()->stopProfiling(exec, title); if (!profile) return; m_profiles.append(profile); if (Page* page = this->page()) { KURL url; unsigned lineNumber; retrieveLastCaller(exec, url, lineNumber); page->inspectorController()->addProfile(profile, lineNumber, url); } }
JSValue JSDOMWindow::open(ExecState* exec) { String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); AtomicString frameName = exec->argument(1).isUndefinedOrNull() ? "_blank" : exec->argument(1).toString(exec)->value(exec); if (exec->hadException()) return jsUndefined(); String windowFeaturesString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); if (exec->hadException()) return jsUndefined(); RefPtr<DOMWindow> openedWindow = impl()->open(urlString, frameName, windowFeaturesString, activeDOMWindow(exec), firstDOMWindow(exec)); if (!openedWindow) return jsUndefined(); return toJS(exec, openedWindow.get()); }
EncodedJSValue JSC_HOST_CALL jsDOMImplementationPrototypeFunctionCreateDocumentType(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSDOMImplementation::s_info)) return throwVMTypeError(exec); JSDOMImplementation* castedThis = static_cast<JSDOMImplementation*>(asObject(thisValue)); DOMImplementation* imp = static_cast<DOMImplementation*>(castedThis->impl()); ExceptionCode ec = 0; const String& qualifiedName = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); const String& publicId = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(1)); const String& systemId = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); JSC::JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->createDocumentType(qualifiedName, publicId, systemId, ec))); setDOMException(exec, ec); return JSValue::encode(result); }
JSValue JSConsole::profileEnd(ExecState* exec) { RefPtr<ScriptCallStack> callStack(createScriptCallStack(exec, 1)); const String& title = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); impl()->profileEnd(title, exec, callStack); return jsUndefined(); }
JSValue* jsElementPrototypeFunctionQuerySelectorAll(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args) { if (!thisValue->isObject(&JSElement::s_info)) return throwError(exec, TypeError); JSElement* castedThisObj = static_cast<JSElement*>(thisValue); Element* imp = static_cast<Element*>(castedThisObj->impl()); ExceptionCode ec = 0; const UString& selectors = valueToStringWithUndefinedOrNullCheck(exec, args[0]); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->querySelectorAll(selectors, ec))); setDOMException(exec, ec); return result; }
EncodedJSValue JSC_HOST_CALL jsConsolePrototypeFunctionTime(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSConsole::s_info)) return throwVMTypeError(exec); JSConsole* castedThis = static_cast<JSConsole*>(asObject(thisValue)); Console* imp = static_cast<Console*>(castedThis->impl()); const String& title(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); imp->time(title); return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL jsHTMLSelectElementPrototypeFunctionSetCustomValidity(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSHTMLSelectElement::s_info)) return throwVMTypeError(exec); JSHTMLSelectElement* castedThis = static_cast<JSHTMLSelectElement*>(asObject(thisValue)); HTMLSelectElement* imp = static_cast<HTMLSelectElement*>(castedThis->impl()); const String& error(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); imp->setCustomValidity(error); return JSValue::encode(jsUndefined()); }
JSValue* jsHTMLCanvasElementPrototypeFunctionToDataURL(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args) { if (!thisValue->isObject(&JSHTMLCanvasElement::s_info)) return throwError(exec, TypeError); JSHTMLCanvasElement* castedThisObj = static_cast<JSHTMLCanvasElement*>(thisValue); HTMLCanvasElement* imp = static_cast<HTMLCanvasElement*>(castedThisObj->impl()); ExceptionCode ec = 0; const UString& type = valueToStringWithUndefinedOrNullCheck(exec, args[0]); KJS::JSValue* result = jsString(exec, imp->toDataURL(type, ec)); setDOMException(exec, ec); return result; }
void Console::count(ExecState* exec, const ArgList& args) { Page* page = this->page(); if (!page) return; KURL url; unsigned lineNumber; retrieveLastCaller(exec, url, lineNumber); UString title; if (args.size() >= 1) title = valueToStringWithUndefinedOrNullCheck(exec, args.at(exec, 0)); page->inspectorController()->count(title, lineNumber, url.string()); }
EncodedJSValue JSC_HOST_CALL jsHTMLObjectElementPrototypeFunctionSetCustomValidity(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); JSHTMLObjectElement* castedThis = jsDynamicCast<JSHTMLObjectElement*>(thisValue); if (!castedThis) return throwVMTypeError(exec); ASSERT_GC_OBJECT_INHERITS(castedThis, JSHTMLObjectElement::info()); HTMLObjectElement& impl = castedThis->impl(); if (exec->argumentCount() < 1) return throwVMError(exec, createNotEnoughArgumentsError(exec)); const String& error(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); impl.setCustomValidity(error); return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL jsHTMLKeygenElementPrototypeFunctionSetCustomValidity(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSHTMLKeygenElement::s_info)) return throwVMTypeError(exec); JSHTMLKeygenElement* castedThis = static_cast<JSHTMLKeygenElement*>(asObject(thisValue)); ASSERT_GC_OBJECT_INHERITS(castedThis, &JSHTMLKeygenElement::s_info); HTMLKeygenElement* imp = static_cast<HTMLKeygenElement*>(castedThis->impl()); if (exec->argumentCount() < 1) return throwVMError(exec, createTypeError(exec, "Not enough arguments")); const String& error(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); imp->setCustomValidity(error); return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL jsConsolePrototypeFunctionTimeEnd(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSConsole::s_info)) return throwVMTypeError(exec); JSConsole* castedThis = static_cast<JSConsole*>(asObject(thisValue)); Console* imp = static_cast<Console*>(castedThis->impl()); RefPtr<ScriptArguments> scriptArguments(createScriptArguments(exec, 1)); size_t maxStackSize = imp->shouldCaptureFullStackTrace() ? ScriptCallStack::maxCallStackSizeToCapture : 1; RefPtr<ScriptCallStack> callStack(createScriptCallStack(exec, maxStackSize)); const String& title(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); imp->timeEnd(title, scriptArguments, callStack); return JSValue::encode(jsUndefined()); }
JSValue JSDirectoryEntry::getDirectory(ExecState* exec) { DirectoryEntry* imp = static_cast<DirectoryEntry*>(impl()); const String& path = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); int argsCount = exec->argumentCount(); if (argsCount <= 1) { imp->getDirectory(path); return jsUndefined(); } RefPtr<Flags> flags; if (!exec->argument(1).isNull() && !exec->argument(1).isUndefined() && exec->argument(1).isObject() && !exec->argument(1).inherits(&JSFlags::s_info)) { JSObject* object = exec->argument(1).getObject(); flags = Flags::create(); JSValue jsCreate = object->get(exec, Identifier(exec, "create")); flags->setCreate(jsCreate.toBoolean(exec)); JSValue jsExclusive = object->get(exec, Identifier(exec, "exclusive")); flags->setExclusive(jsExclusive.toBoolean(exec)); } else flags = toFlags(exec->argument(1)); if (exec->hadException()) return jsUndefined(); RefPtr<EntryCallback> successCallback; if (exec->argumentCount() > 2 && !exec->argument(2).isNull() && !exec->argument(2).isUndefined()) { if (!exec->argument(2).isObject()) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } successCallback = JSEntryCallback::create(asObject(exec->argument(2)), globalObject()); } RefPtr<ErrorCallback> errorCallback; if (exec->argumentCount() > 3 && !exec->argument(3).isNull() && !exec->argument(3).isUndefined()) { if (!exec->argument(3).isObject()) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } errorCallback = JSErrorCallback::create(asObject(exec->argument(3)), globalObject()); } imp->getDirectory(path, flags, successCallback, errorCallback); return jsUndefined(); }
JSValue JSHTMLCanvasElement::toDataURL(ExecState* exec) { HTMLCanvasElement& canvas = impl(); ExceptionCode ec = 0; const String& type = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); double quality; double* qualityPtr = 0; if (exec->argumentCount() > 1) { JSValue v = exec->uncheckedArgument(1); if (v.isNumber()) { quality = v.toNumber(exec); qualityPtr = &quality; } } JSValue result = JSC::jsString(exec, canvas.toDataURL(type, qualityPtr, ec)); setDOMException(exec, ec); return result; }
static EncodedJSValue JSC_HOST_CALL consoleProtoFuncTakeHeapSnapshot(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); ConsoleClient* client = exec->lexicalGlobalObject()->consoleClient(); if (!client) return JSValue::encode(jsUndefined()); size_t argsCount = exec->argumentCount(); if (!argsCount) { client->takeHeapSnapshot(exec, String()); return JSValue::encode(jsUndefined()); } const String& title(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0))); RETURN_IF_EXCEPTION(scope, encodedJSValue()); client->takeHeapSnapshot(exec, title); return JSValue::encode(jsUndefined()); }
JSValue JSHTMLCanvasElement::toDataURL(ExecState* exec) { const String& type = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(impl()); ExceptionCode ec = 0; JSC::JSValue result; double quality; double* qualityPtr = 0; if (exec->argumentCount() > 1) { JSValue v = exec->argument(1); if (v.isNumber()) { quality = v.toNumber(exec); qualityPtr = &quality; } } result = jsString(exec, canvas->toDataURL(type, qualityPtr, ec)); setDOMException(exec, ec); return result; }
static JSValue handlePostMessage(DOMWindow* impl, ExecState* exec) { MessagePortArray messagePorts; ArrayBufferArray arrayBuffers; // This function has variable arguments and can be: // Per current spec: // postMessage(message, targetOrigin) // postMessage(message, targetOrigin, {sequence of transferrables}) // Legacy non-standard implementations in webkit allowed: // postMessage(message, {sequence of transferrables}, targetOrigin); int targetOriginArgIndex = 1; if (exec->argumentCount() > 2) { int transferablesArgIndex = 2; if (exec->argument(2).isString()) { targetOriginArgIndex = 2; transferablesArgIndex = 1; } fillMessagePortArray(exec, exec->argument(transferablesArgIndex), messagePorts, arrayBuffers); } if (exec->hadException()) return jsUndefined(); RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, exec->argument(0), &messagePorts, &arrayBuffers); if (exec->hadException()) return jsUndefined(); String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(targetOriginArgIndex)); if (exec->hadException()) return jsUndefined(); ExceptionCode ec = 0; impl->postMessage(message.release(), &messagePorts, targetOrigin, activeDOMWindow(exec), ec); setDOMException(exec, ec); return jsUndefined(); }
JSValue JSDOMWindow::postMessage(ExecState* exec, const ArgList& args) { DOMWindow* window = impl(); DOMWindow* source = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); String message = args.at(0).toString(exec); if (exec->hadException()) return jsUndefined(); MessagePort* messagePort = (args.size() == 2) ? 0 : toMessagePort(args.at(1)); String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, args.at((args.size() == 2) ? 1 : 2)); if (exec->hadException()) return jsUndefined(); ExceptionCode ec = 0; window->postMessage(message, messagePort, targetOrigin, source, ec); setDOMException(exec, ec); return jsUndefined(); }
void Console::timeEnd(ExecState* exec, const ArgList& args) { UString title; if (args.size() >= 1) title = valueToStringWithUndefinedOrNullCheck(exec, args.at(exec, 0)); if (title.isNull()) return; Page* page = this->page(); if (!page) return; double elapsed; if (!page->inspectorController()->stopTiming(title, elapsed)) return; String message = String(title) + String::format(": %.0fms", elapsed); KURL url; unsigned lineNumber; retrieveLastCaller(exec, url, lineNumber); page->inspectorController()->addMessageToConsole(JSMessageSource, LogMessageLevel, message, lineNumber, url.string()); }
JSValue* JSDocumentPrototypeFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args) { if (!thisObj->inherits(&JSDocument::info)) return throwError(exec, TypeError); JSDocument* castedThisObj = static_cast<JSDocument*>(thisObj); Document* imp = static_cast<Document*>(castedThisObj->impl()); switch (id) { case JSDocument::CreateElementFuncNum: { ExceptionCode ec = 0; String tagName = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createElement(tagName, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateDocumentFragmentFuncNum: { KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createDocumentFragment())); return result; } case JSDocument::CreateTextNodeFuncNum: { String data = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createTextNode(data))); return result; } case JSDocument::CreateCommentFuncNum: { String data = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createComment(data))); return result; } case JSDocument::CreateCDATASectionFuncNum: { ExceptionCode ec = 0; String data = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createCDATASection(data, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateProcessingInstructionFuncNum: { ExceptionCode ec = 0; String target = args[0]->toString(exec); String data = args[1]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createProcessingInstruction(target, data, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateAttributeFuncNum: { ExceptionCode ec = 0; String name = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createAttribute(name, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateEntityReferenceFuncNum: { ExceptionCode ec = 0; String name = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createEntityReference(name, ec))); setDOMException(exec, ec); return result; } case JSDocument::GetElementsByTagNameFuncNum: { String tagname = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->getElementsByTagName(tagname))); return result; } case JSDocument::ImportNodeFuncNum: { ExceptionCode ec = 0; Node* importedNode = toNode(args[0]); bool deep = args[1]->toBoolean(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->importNode(importedNode, deep, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateElementNSFuncNum: { ExceptionCode ec = 0; String namespaceURI = valueToStringWithNullCheck(exec, args[0]); String qualifiedName = args[1]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createElementNS(namespaceURI, qualifiedName, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateAttributeNSFuncNum: { ExceptionCode ec = 0; String namespaceURI = valueToStringWithNullCheck(exec, args[0]); String qualifiedName = args[1]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createAttributeNS(namespaceURI, qualifiedName, ec))); setDOMException(exec, ec); return result; } case JSDocument::GetElementsByTagNameNSFuncNum: { String namespaceURI = valueToStringWithNullCheck(exec, args[0]); String localName = args[1]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->getElementsByTagNameNS(namespaceURI, localName))); return result; } case JSDocument::GetElementByIdFuncNum: { String elementId = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->getElementById(elementId))); return result; } case JSDocument::AdoptNodeFuncNum: { ExceptionCode ec = 0; Node* source = toNode(args[0]); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->adoptNode(source, ec))); setDOMException(exec, ec); return result; } case JSDocument::LoadFuncNum: { String url = args[0]->toString(exec); KJS::JSValue* result = jsBoolean(imp->load(url)); return result; } case JSDocument::CreateEventFuncNum: { ExceptionCode ec = 0; String eventType = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createEvent(eventType, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateRangeFuncNum: { KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createRange())); return result; } case JSDocument::CreateNodeIteratorFuncNum: { ExceptionCode ec = 0; Node* root = toNode(args[0]); bool whatToShowOk; unsigned whatToShow = args[1]->toInt32(exec, whatToShowOk); if (!whatToShowOk) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } NodeFilter* filter = toNodeFilter(args[2]); bool entityReferenceExpansion = args[3]->toBoolean(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createNodeIterator(root, whatToShow, filter, entityReferenceExpansion, ec))); setDOMException(exec, ec); return result; } case JSDocument::CreateTreeWalkerFuncNum: { ExceptionCode ec = 0; Node* root = toNode(args[0]); bool whatToShowOk; unsigned whatToShow = args[1]->toInt32(exec, whatToShowOk); if (!whatToShowOk) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } NodeFilter* filter = toNodeFilter(args[2]); bool entityReferenceExpansion = args[3]->toBoolean(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->createTreeWalker(root, whatToShow, filter, entityReferenceExpansion, ec))); setDOMException(exec, ec); return result; } case JSDocument::GetOverrideStyleFuncNum: { Element* element = toElement(args[0]); String pseudoElement = args[1]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->getOverrideStyle(element, pseudoElement))); return result; } case JSDocument::ExecCommandFuncNum: { String command = args[0]->toString(exec); bool userInterface = args[1]->toBoolean(exec); String value = valueToStringWithUndefinedOrNullCheck(exec, args[2]); KJS::JSValue* result = jsBoolean(imp->execCommand(command, userInterface, value)); return result; } case JSDocument::QueryCommandEnabledFuncNum: { String command = args[0]->toString(exec); KJS::JSValue* result = jsBoolean(imp->queryCommandEnabled(command)); return result; } case JSDocument::QueryCommandIndetermFuncNum: { String command = args[0]->toString(exec); KJS::JSValue* result = jsBoolean(imp->queryCommandIndeterm(command)); return result; } case JSDocument::QueryCommandStateFuncNum: { String command = args[0]->toString(exec); KJS::JSValue* result = jsBoolean(imp->queryCommandState(command)); return result; } case JSDocument::QueryCommandSupportedFuncNum: { String command = args[0]->toString(exec); KJS::JSValue* result = jsBoolean(imp->queryCommandSupported(command)); return result; } case JSDocument::QueryCommandValueFuncNum: { String command = args[0]->toString(exec); KJS::JSValue* result = jsStringOrFalse(imp->queryCommandValue(command)); return result; } case JSDocument::GetElementsByNameFuncNum: { String elementName = args[0]->toString(exec); KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->getElementsByName(elementName))); return result; } case JSDocument::ElementFromPointFuncNum: { bool xOk; int x = args[0]->toInt32(exec, xOk); if (!xOk) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } bool yOk; int y = args[1]->toInt32(exec, yOk); if (!yOk) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->elementFromPoint(x, y))); return result; } } return 0; }
JSValue JSDOMWindow::open(ExecState* exec) { String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); AtomicString frameName = exec->argument(1).isUndefinedOrNull() ? "_blank" : ustringToAtomicString(exec->argument(1).toString(exec)); WindowFeatures windowFeatures(valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2))); Frame* frame = impl()->frame(); if (!frame) return jsUndefined(); Frame* lexicalFrame = toLexicalFrame(exec); if (!lexicalFrame) return jsUndefined(); Frame* dynamicFrame = toDynamicFrame(exec); if (!dynamicFrame) return jsUndefined(); Page* page = frame->page(); // Because FrameTree::find() returns true for empty strings, we must check for empty framenames. // Otherwise, illegitimate window.open() calls with no name will pass right through the popup blocker. if (!domWindowAllowPopUp(dynamicFrame) && (frameName.isEmpty() || !frame->tree()->find(frameName))) return jsUndefined(); // Get the target frame for the special cases of _top and _parent. In those // cases, we can schedule a location change right now and return early. bool topOrParent = false; if (frameName == "_top") { frame = frame->tree()->top(); topOrParent = true; } else if (frameName == "_parent") { if (Frame* parent = frame->tree()->parent()) frame = parent; topOrParent = true; } if (topOrParent) { String completedURL; if (!urlString.isEmpty()) completedURL = completeURL(exec, urlString).string(); if (!shouldAllowNavigation(exec, frame)) return jsUndefined(); const JSDOMWindow* targetedWindow = toJSDOMWindow(frame, currentWorld(exec)); if (!completedURL.isEmpty() && (!protocolIsJavaScript(completedURL) || (targetedWindow && targetedWindow->allowsAccessFrom(exec)))) { bool userGesture = processingUserGesture(); // For whatever reason, Firefox uses the dynamicGlobalObject to // determine the outgoingReferrer. We replicate that behavior // here. String referrer = dynamicFrame->loader()->outgoingReferrer(); frame->redirectScheduler()->scheduleLocationChange(completedURL, referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture); } return toJS(exec, frame->domWindow()); } // In the case of a named frame or a new window, we'll use the createWindow() helper FloatRect windowRect(windowFeatures.xSet ? windowFeatures.x : 0, windowFeatures.ySet ? windowFeatures.y : 0, windowFeatures.widthSet ? windowFeatures.width : 0, windowFeatures.heightSet ? windowFeatures.height : 0); DOMWindow::adjustWindowRect(screenAvailableRect(page ? page->mainFrame()->view() : 0), windowRect, windowRect); windowFeatures.x = windowRect.x(); windowFeatures.y = windowRect.y(); windowFeatures.height = windowRect.height(); windowFeatures.width = windowRect.width(); frame = createWindow(exec, lexicalFrame, dynamicFrame, frame, urlString, frameName, windowFeatures, JSValue()); if (!frame) return jsUndefined(); return toJS(exec, frame->domWindow()); }
JSValue JSDOMWindow::showModalDialog(ExecState* exec) { String url = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); JSValue dialogArgs = exec->argument(1); String featureArgs = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); Frame* frame = impl()->frame(); if (!frame) return jsUndefined(); Frame* lexicalFrame = toLexicalFrame(exec); if (!lexicalFrame) return jsUndefined(); Frame* dynamicFrame = toDynamicFrame(exec); if (!dynamicFrame) return jsUndefined(); if (!DOMWindow::canShowModalDialogNow(frame) || !domWindowAllowPopUp(dynamicFrame)) return jsUndefined(); HashMap<String, String> features; DOMWindow::parseModalDialogFeatures(featureArgs, features); const bool trusted = false; // The following features from Microsoft's documentation are not implemented: // - default font settings // - width, height, left, and top specified in units other than "px" // - edge (sunken or raised, default is raised) // - dialogHide: trusted && boolFeature(features, "dialoghide"), makes dialog hide when you print // - help: boolFeature(features, "help", true), makes help icon appear in dialog (what does it do on Windows?) // - unadorned: trusted && boolFeature(features, "unadorned"); FloatRect screenRect = screenAvailableRect(frame->view()); WindowFeatures wargs; wargs.width = WindowFeatures::floatFeature(features, "dialogwidth", 100, screenRect.width(), 620); // default here came from frame size of dialog in MacIE wargs.widthSet = true; wargs.height = WindowFeatures::floatFeature(features, "dialogheight", 100, screenRect.height(), 450); // default here came from frame size of dialog in MacIE wargs.heightSet = true; wargs.x = WindowFeatures::floatFeature(features, "dialogleft", screenRect.x(), screenRect.right() - wargs.width, -1); wargs.xSet = wargs.x > 0; wargs.y = WindowFeatures::floatFeature(features, "dialogtop", screenRect.y(), screenRect.bottom() - wargs.height, -1); wargs.ySet = wargs.y > 0; if (WindowFeatures::boolFeature(features, "center", true)) { if (!wargs.xSet) { wargs.x = screenRect.x() + (screenRect.width() - wargs.width) / 2; wargs.xSet = true; } if (!wargs.ySet) { wargs.y = screenRect.y() + (screenRect.height() - wargs.height) / 2; wargs.ySet = true; } } wargs.dialog = true; wargs.resizable = WindowFeatures::boolFeature(features, "resizable"); wargs.scrollbarsVisible = WindowFeatures::boolFeature(features, "scroll", true); wargs.statusBarVisible = WindowFeatures::boolFeature(features, "status", !trusted); wargs.menuBarVisible = false; wargs.toolBarVisible = false; wargs.locationBarVisible = false; wargs.fullscreen = false; Frame* dialogFrame = createWindow(exec, lexicalFrame, dynamicFrame, frame, url, "", wargs, dialogArgs); if (!dialogFrame) return jsUndefined(); JSDOMWindow* dialogWindow = toJSDOMWindow(dialogFrame, currentWorld(exec)); dialogFrame->page()->chrome()->runModal(); Identifier returnValue(exec, "returnValue"); if (dialogWindow->allowsAccessFromNoErrorMessage(exec)) { PropertySlot slot; // This is safe, we have already performed the origin security check and we are // not interested in any of the DOM properties of the window. if (dialogWindow->JSGlobalObject::getOwnPropertySlot(exec, returnValue, slot)) return slot.getValue(exec, returnValue); } return jsUndefined(); }