JSValue JSInspectorFrontendHost::showContextMenu(ExecState* execState, const ArgList& args) { if (args.size() < 2) return jsUndefined(); Event* event = toEvent(args.at(0)); JSArray* array = asArray(args.at(1)); Vector<ContextMenuItem*> items; for (size_t i = 0; i < array->length(); ++i) { JSObject* item = asObject(array->getIndex(i)); JSValue label = item->get(execState, Identifier(execState, "label")); JSValue id = item->get(execState, Identifier(execState, "id")); if (label.isUndefined() || id.isUndefined()) items.append(new ContextMenuItem(SeparatorType, ContextMenuItemTagNoAction, String())); else { ContextMenuAction typedId = static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + id.toInt32(execState)); items.append(new ContextMenuItem(ActionType, typedId, label.toString(execState))); } } impl()->showContextMenu(event, items); return jsUndefined(); }
EncodedJSValue JSC_HOST_CALL regExpProtoFuncToString(ExecState* exec) { JSValue thisValue = exec->thisValue(); if (!thisValue.isObject()) return throwVMTypeError(exec); JSObject* thisObject = asObject(thisValue); StringRecursionChecker checker(exec, thisObject); if (JSValue earlyReturnValue = checker.earlyReturnValue()) return JSValue::encode(earlyReturnValue); VM& vm = exec->vm(); JSValue sourceValue = thisObject->get(exec, vm.propertyNames->source); if (vm.exception()) return JSValue::encode(jsUndefined()); String source = sourceValue.toString(exec)->value(exec); if (vm.exception()) return JSValue::encode(jsUndefined()); JSValue flagsValue = thisObject->get(exec, vm.propertyNames->flags); if (vm.exception()) return JSValue::encode(jsUndefined()); String flags = flagsValue.toString(exec)->value(exec); if (vm.exception()) return JSValue::encode(jsUndefined()); return JSValue::encode(jsMakeNontrivialString(exec, '/', source, '/', flags)); }
bool JSCustomSQLStatementErrorCallback::handleEvent(SQLTransaction* transaction, SQLError* error) { ASSERT(m_callback); ASSERT(m_frame); if (!m_frame->script()->isEnabled()) return true; JSGlobalObject* globalObject = m_frame->script()->globalObject(); ExecState* exec = globalObject->globalExec(); KJS::JSLock lock; JSValue* handleEventFunction = m_callback->get(exec, Identifier(exec, "handleEvent")); CallData handleEventCallData; CallType handleEventCallType = handleEventFunction->getCallData(handleEventCallData); CallData callbackCallData; CallType callbackCallType = CallTypeNone; if (handleEventCallType == CallTypeNone) { callbackCallType = m_callback->getCallData(callbackCallData); if (callbackCallType == CallTypeNone) { // FIXME: Should an exception be thrown here? return true; } } RefPtr<JSCustomSQLStatementErrorCallback> protect(this); ArgList args; args.append(toJS(exec, transaction)); args.append(toJS(exec, error)); JSValue* result; globalObject->startTimeoutCheck(); if (handleEventCallType != CallTypeNone) result = call(exec, handleEventFunction, handleEventCallType, handleEventCallData, m_callback, args); else result = call(exec, m_callback, callbackCallType, callbackCallData, m_callback, args); globalObject->stopTimeoutCheck(); if (exec->hadException()) { JSObject* exception = exec->exception()->toObject(exec); String message = exception->get(exec, exec->propertyNames().message)->toString(exec); int lineNumber = exception->get(exec, Identifier(exec, "line"))->toInt32(exec); String sourceURL = exception->get(exec, Identifier(exec, "sourceURL"))->toString(exec); m_frame->domWindow()->console()->addMessage(JSMessageSource, ErrorMessageLevel, message, lineNumber, sourceURL); exec->clearException(); // The spec says: // "If the error callback returns false, then move on to the next statement..." // "Otherwise, the error callback did not return false, or there was no error callback" // Therefore an exception and returning true are the same thing - so, return true on an exception return true; } Document::updateDocumentsRendering(); return result->toBoolean(exec); }
static void populateContextMenuItems(ExecState* exec, JSArray* array, ContextMenu& menu) { for (size_t i = 0; i < array->length(); ++i) { JSObject* item = asObject(array->getIndex(exec, i)); JSValue label = item->get(exec, Identifier::fromString(exec, "label")); JSValue type = item->get(exec, Identifier::fromString(exec, "type")); JSValue id = item->get(exec, Identifier::fromString(exec, "id")); JSValue enabled = item->get(exec, Identifier::fromString(exec, "enabled")); JSValue checked = item->get(exec, Identifier::fromString(exec, "checked")); JSValue subItems = item->get(exec, Identifier::fromString(exec, "subItems")); if (!type.isString()) continue; String typeString = type.toWTFString(exec); if (typeString == "separator") { ContextMenuItem item(SeparatorType, ContextMenuItemTagNoAction, String()); menu.appendItem(item); } else if (typeString == "subMenu" && subItems.inherits(JSArray::info())) { ContextMenu subMenu; JSArray* subItemsArray = asArray(subItems); populateContextMenuItems(exec, subItemsArray, subMenu); ContextMenuItem item(SubmenuType, ContextMenuItemTagNoAction, label.toWTFString(exec), &subMenu); menu.appendItem(item); } else { ContextMenuAction typedId = static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + id.toInt32(exec)); ContextMenuItem menuItem((typeString == "checkbox" ? CheckableActionType : ActionType), typedId, label.toWTFString(exec)); if (!enabled.isUndefined()) menuItem.setEnabled(enabled.toBoolean(exec)); if (!checked.isUndefined()) menuItem.setChecked(checked.toBoolean(exec)); menu.appendItem(menuItem); } } }
// ECMA-262 5.1, 15.11.4.4 EncodedJSValue JSC_HOST_CALL errorProtoFuncToString(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); // 1. Let O be the this value. JSValue thisValue = exec->thisValue(); // 2. If Type(O) is not Object, throw a TypeError exception. if (!thisValue.isObject()) return throwVMTypeError(exec, scope); JSObject* thisObj = asObject(thisValue); // Guard against recursion! StringRecursionChecker checker(exec, thisObj); ASSERT(!scope.exception() || checker.earlyReturnValue()); if (JSValue earlyReturnValue = checker.earlyReturnValue()) return JSValue::encode(earlyReturnValue); // 3. Let name be the result of calling the [[Get]] internal method of O with argument "name". JSValue name = thisObj->get(exec, exec->propertyNames().name); RETURN_IF_EXCEPTION(scope, encodedJSValue()); // 4. If name is undefined, then let name be "Error"; else let name be ToString(name). String nameString; if (name.isUndefined()) nameString = ASCIILiteral("Error"); else { nameString = name.toWTFString(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } // 5. Let msg be the result of calling the [[Get]] internal method of O with argument "message". JSValue message = thisObj->get(exec, exec->propertyNames().message); RETURN_IF_EXCEPTION(scope, encodedJSValue()); // (sic) // 6. If msg is undefined, then let msg be the empty String; else let msg be ToString(msg). // 7. If msg is undefined, then let msg be the empty String; else let msg be ToString(msg). String messageString; if (message.isUndefined()) messageString = String(); else { messageString = message.toWTFString(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } // 8. If name is the empty String, return msg. if (!nameString.length()) return JSValue::encode(message.isString() ? message : jsString(exec, messageString)); // 9. If msg is the empty String, return name. if (!messageString.length()) return JSValue::encode(name.isString() ? name : jsString(exec, nameString)); // 10. Return the result of concatenating name, ":", a single space character, and msg. scope.release(); return JSValue::encode(jsMakeNontrivialString(exec, nameString, ": ", messageString)); }
void Console::reportException(ExecState* exec, JSValue* exception) { UString errorMessage = exception->toString(exec); JSObject* exceptionObject = exception->toObject(exec); int lineNumber = exceptionObject->get(exec, Identifier(exec, "line"))->toInt32(exec); UString exceptionSourceURL = exceptionObject->get(exec, Identifier(exec, "sourceURL"))->toString(exec); addMessage(JSMessageSource, ErrorMessageLevel, errorMessage, lineNumber, exceptionSourceURL); if (exec->hadException()) exec->clearException(); }
void reportException(JSC::ExecState* exec, JSValuePtr exception) { UString errorMessage = exception.toString(exec); JSObject* exceptionObject = exception.toObject(exec); int lineNumber = exceptionObject->get(exec, Identifier(exec, "line")).toInt32(exec); UString exceptionSourceURL = exceptionObject->get(exec, Identifier(exec, "sourceURL")).toString(exec); exec->clearException(); ScriptExecutionContext* scriptExecutionContext = static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject())->scriptExecutionContext(); scriptExecutionContext->reportException(errorMessage, lineNumber, exceptionSourceURL); }
JSValue JSSQLTransactionSync::executeSql(ExecState* exec) { if (!exec->argumentCount()) { setDOMException(exec, SYNTAX_ERR); return jsUndefined(); } String sqlStatement = ustringToString(exec->argument(0).toString(exec)); if (exec->hadException()) return jsUndefined(); // Now assemble the list of SQL arguments Vector<SQLValue> sqlValues; if (!exec->argument(1).isUndefinedOrNull()) { JSObject* object = exec->argument(1).getObject(); if (!object) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } JSValue lengthValue = object->get(exec, exec->propertyNames().length); if (exec->hadException()) return jsUndefined(); unsigned length = lengthValue.toUInt32(exec); if (exec->hadException()) return jsUndefined(); for (unsigned i = 0 ; i < length; ++i) { JSValue value = object->get(exec, i); if (exec->hadException()) return jsUndefined(); if (value.isUndefinedOrNull()) sqlValues.append(SQLValue()); else if (value.isNumber()) sqlValues.append(value.uncheckedGetNumber()); else { // Convert the argument to a string and append it sqlValues.append(ustringToString(value.toString(exec))); if (exec->hadException()) return jsUndefined(); } } } ExceptionCode ec = 0; JSValue result = toJS(exec, globalObject(), WTF::getPtr(m_impl->executeSQL(sqlStatement, sqlValues, ec))); setDOMException(exec, ec); return result; }
Stringifier::Stringifier(ExecState* exec, JSValue replacer, JSValue space) : m_nextStringifierToMark(exec->globalData().firstStringifierToMark) , m_exec(exec) , m_replacer(replacer) , m_usingArrayReplacer(false) , m_arrayReplacerPropertyNames(exec) , m_replacerCallType(CallTypeNone) , m_gap(gap(exec, space)) { exec->globalData().firstStringifierToMark = this; if (!m_replacer.isObject()) return; if (asObject(m_replacer)->inherits(&JSArray::info)) { m_usingArrayReplacer = true; JSObject* array = asObject(m_replacer); unsigned length = array->get(exec, exec->globalData().propertyNames->length).toUInt32(exec); for (unsigned i = 0; i < length; ++i) { JSValue name = array->get(exec, i); if (exec->hadException()) break; UString propertyName; if (name.getString(exec, propertyName)) { m_arrayReplacerPropertyNames.add(Identifier(exec, propertyName)); continue; } double value = 0; if (name.getNumber(value)) { m_arrayReplacerPropertyNames.add(Identifier::from(exec, value)); continue; } if (name.isObject()) { if (!asObject(name)->inherits(&NumberObject::info) && !asObject(name)->inherits(&StringObject::info)) continue; propertyName = name.toString(exec); if (exec->hadException()) break; m_arrayReplacerPropertyNames.add(Identifier(exec, propertyName)); } } return; } m_replacerCallType = asObject(m_replacer)->getCallData(m_replacerCallData); }
static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyTable(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSObject* memoryDescriptor; { JSValue argument = exec->argument(0); if (!argument.isObject()) return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Table expects its first argument to be an object")))); memoryDescriptor = jsCast<JSObject*>(argument); } { Identifier elementIdent = Identifier::fromString(&vm, "element"); JSValue elementValue = memoryDescriptor->get(exec, elementIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); String elementString = elementValue.toWTFString(exec); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (elementString != "anyfunc") return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Table expects its 'element' field to be the string 'anyfunc'")))); } Identifier initialIdent = Identifier::fromString(&vm, "initial"); JSValue initialSizeValue = memoryDescriptor->get(exec, initialIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); uint32_t initial = toNonWrappingUint32(exec, initialSizeValue); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); std::optional<uint32_t> maximum; Identifier maximumIdent = Identifier::fromString(&vm, "maximum"); bool hasProperty = memoryDescriptor->hasProperty(exec, maximumIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (hasProperty) { JSValue maxSizeValue = memoryDescriptor->get(exec, maximumIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); maximum = toNonWrappingUint32(exec, maxSizeValue); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (initial > *maximum) { return JSValue::encode(throwException(exec, throwScope, createRangeError(exec, ASCIILiteral("'maximum' property must be greater than or equal to the 'initial' property")))); } } throwScope.release(); return JSValue::encode(JSWebAssemblyTable::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyTableStructure(), initial, maximum)); }
void std_map_string_string_to_jsval(JSContext* cx, const std::map<std::string, std::string>& v, JS::MutableHandleValue retVal) { JS::RootedObject proto(cx); JS::RootedObject parent(cx); #if defined(MOZJS_MAJOR_VERSION) and MOZJS_MAJOR_VERSION >= 52 JS::RootedObject jsRet(cx, JS_NewObject(cx, NULL)); #elif defined(MOZJS_MAJOR_VERSION) and MOZJS_MAJOR_VERSION >= 26 JS::RootedObject jsRet(cx, JS_NewObject(cx, NULL, proto, parent)); #else JSObject *jsRet = JS_NewObject(cx, NULL, NULL, NULL); #endif for (auto iter = v.begin(); iter != v.end(); ++iter) { #if defined(MOZJS_MAJOR_VERSION) and MOZJS_MAJOR_VERSION >= 26 JS::RootedValue element(cx); #else jsval element; #endif std::string key = iter->first; std::string val = iter->second; JSString* jsstr = JS_NewStringCopyZ(cx, val.c_str()); element = JS::StringValue(jsstr); if (!key.empty()) { #if defined(MOZJS_MAJOR_VERSION) and MOZJS_MAJOR_VERSION >= 26 JS_SetProperty(cx, jsRet, key.c_str(), element); #else JS_SetProperty(cx, jsRet, key.c_str(), &element); #endif } } retVal.set(JS::ObjectOrNullValue(jsRet.get())); }
EncodedJSValue JSC_HOST_CALL constructJSHTMLElement(ExecState& exec) { auto* jsConstructor = jsCast<DOMConstructorObject*>(exec.callee()); auto* context = jsConstructor->scriptExecutionContext(); if (!is<Document>(context)) return throwConstructorDocumentUnavailableError(exec, "HTMLElement"); auto& document = downcast<Document>(*context); auto* window = document.domWindow(); if (!window) return throwVMTypeError(&exec, ASCIILiteral("new.target is not a valid custom element constructor")); auto* registry = window->customElementsRegistry(); if (!registry) return throwVMTypeError(&exec, ASCIILiteral("new.target is not a valid custom element constructor")); VM& vm = exec.vm(); JSValue newTargetValue = exec.thisValue(); JSObject* newTarget = newTargetValue.getObject(); auto* elementInterface = registry->findInterface(newTarget); if (!elementInterface) return throwVMTypeError(&exec, ASCIILiteral("new.target does not define a custom element")); if (!elementInterface->isUpgradingElement()) { auto* globalObject = jsConstructor->globalObject(); Structure* baseStructure = getDOMStructure<JSHTMLElement>(vm, *globalObject); auto* newElementStructure = InternalFunction::createSubclassStructure(&exec, newTargetValue, baseStructure); if (UNLIKELY(exec.hadException())) return JSValue::encode(jsUndefined()); Ref<HTMLElement> element = HTMLElement::create(elementInterface->name(), document); element->setIsUnresolvedCustomElement(); auto* jsElement = JSHTMLElement::create(newElementStructure, globalObject, element.get()); cacheWrapper(globalObject->world(), element.ptr(), jsElement); return JSValue::encode(jsElement); } Element* elementToUpgrade = elementInterface->lastElementInConstructionStack(); if (!elementToUpgrade) { throwInvalidStateError(exec, ASCIILiteral("Cannot instantiate a custom element inside its own constrcutor during upgrades")); return JSValue::encode(jsUndefined()); } JSValue elementWrapperValue = toJS(&exec, jsConstructor->globalObject(), *elementToUpgrade); ASSERT(elementWrapperValue.isObject()); JSValue newPrototype = newTarget->get(&exec, vm.propertyNames->prototype); if (exec.hadException()) return JSValue::encode(jsUndefined()); JSObject* elementWrapperObject = asObject(elementWrapperValue); JSObject::setPrototype(elementWrapperObject, &exec, newPrototype, true /* shouldThrowIfCantSet */); if (exec.hadException()) return JSValue::encode(jsUndefined()); elementInterface->didUpgradeLastElementInConstructionStack(); return JSValue::encode(elementWrapperValue); }
Deprecated::ScriptValue ScriptFunctionCall::call(bool& hadException) { JSObject* thisObject = m_thisObject.jsObject(); JSLockHolder lock(m_exec); JSValue function = thisObject->get(m_exec, Identifier::fromString(m_exec, m_name)); if (m_exec->hadException()) { hadException = true; return Deprecated::ScriptValue(); } CallData callData; CallType callType = getCallData(function, callData); if (callType == CallTypeNone) return Deprecated::ScriptValue(); JSValue result; NakedPtr<Exception> exception; if (m_callHandler) result = m_callHandler(m_exec, function, callType, callData, thisObject, m_arguments, exception); else result = JSC::call(m_exec, function, callType, callData, thisObject, m_arguments, exception); if (exception) { hadException = true; return Deprecated::ScriptValue(); } return Deprecated::ScriptValue(m_exec->vm(), result); }
JSValue ScriptFunctionCall::call(bool& hadException) { JSObject* thisObject = m_thisObject.jsObject(); VM& vm = m_exec->vm(); JSLockHolder lock(vm); auto scope = DECLARE_THROW_SCOPE(vm); JSValue function = thisObject->get(m_exec, Identifier::fromString(m_exec, m_name)); if (UNLIKELY(scope.exception())) { hadException = true; return { }; } CallData callData; CallType callType = getCallData(function, callData); if (callType == CallType::None) return { }; JSValue result; NakedPtr<Exception> exception; if (m_callHandler) result = m_callHandler(m_exec, function, callType, callData, thisObject, m_arguments, exception); else result = JSC::call(m_exec, function, callType, callData, thisObject, m_arguments, exception); if (exception) { // Do not treat a terminated execution exception as having an exception. Just treat it as an empty result. hadException = !isTerminatedExecutionException(exception); return { }; } return result; }
ScriptObject ScriptFunctionCall::construct(bool& hadException, bool reportExceptions) { JSObject* thisObject = m_thisObject.jsObject(); JSLock lock(SilenceAssertionsOnly); JSObject* constructor = asObject(thisObject->get(m_exec, Identifier(m_exec, stringToUString(m_name)))); if (m_exec->hadException()) { if (reportExceptions) reportException(m_exec, m_exec->exception()); hadException = true; return ScriptObject(); } ConstructData constructData; ConstructType constructType = constructor->getConstructData(constructData); if (constructType == ConstructTypeNone) return ScriptObject(); JSValue result = JSC::construct(m_exec, constructor, constructType, constructData, m_arguments); if (m_exec->hadException()) { if (reportExceptions) reportException(m_exec, m_exec->exception()); hadException = true; return ScriptObject(); } return ScriptObject(m_exec, asObject(result)); }
ScriptValue ScriptFunctionCall::call(bool& hadException, bool reportExceptions) { JSObject* thisObject = m_thisObject.jsObject(); JSLock lock(SilenceAssertionsOnly); JSValue function = thisObject->get(m_exec, Identifier(m_exec, stringToUString(m_name))); if (m_exec->hadException()) { if (reportExceptions) reportException(m_exec, m_exec->exception()); hadException = true; return ScriptValue(); } CallData callData; CallType callType = getCallData(function, callData); if (callType == CallTypeNone) return ScriptValue(); JSValue result = JSMainThreadExecState::call(m_exec, function, callType, callData, thisObject, m_arguments); if (m_exec->hadException()) { if (reportExceptions) reportException(m_exec, m_exec->exception()); hadException = true; return ScriptValue(); } return ScriptValue(result); }
EncodedJSValue JSC_HOST_CALL objectProtoFuncToString(ExecState* exec) { VM& vm = exec->vm(); JSValue thisValue = exec->thisValue().toThis(exec, StrictMode); if (thisValue.isUndefinedOrNull()) return JSValue::encode(thisValue.isUndefined() ? vm.smallStrings.undefinedObjectString() : vm.smallStrings.nullObjectString()); JSObject* thisObject = thisValue.toObject(exec); JSValue stringTag = thisObject->get(exec, exec->propertyNames().toStringTagSymbol); if (stringTag.isString()) { JSRopeString::RopeBuilder<RecordOverflow> ropeBuilder(vm); ropeBuilder.append(vm.smallStrings.objectStringStart()); ropeBuilder.append(jsCast<JSString*>(stringTag)); ropeBuilder.append(vm.smallStrings.singleCharacterString(']')); if(ropeBuilder.hasOverflowed()) return JSValue::encode(throwOutOfMemoryError(exec)); return JSValue::encode(ropeBuilder.release()); } JSString* result = thisObject->structure(vm)->objectToStringValue(); if (!result) { RefPtr<StringImpl> newString = WTF::tryMakeString("[object ", thisObject->methodTable(exec->vm())->className(thisObject), "]"); if (!newString) return JSValue::encode(throwOutOfMemoryError(exec)); result = jsNontrivialString(&vm, newString.release()); thisObject->structure(vm)->setObjectToStringValue(vm, result); } return JSValue::encode(result); }
void fillMessagePortArray(JSC::ExecState* exec, JSC::JSValue value, MessagePortArray& portArray) { // Convert from the passed-in JS array-like object to a MessagePortArray. // Also validates the elements per sections 4.1.13 and 4.1.15 of the WebIDL spec and section 8.3.3 of the HTML5 spec. if (value.isUndefinedOrNull()) { portArray.resize(0); return; } // Validation of sequence types, per WebIDL spec 4.1.13. unsigned length; JSObject* object = toJSSequence(exec, value, length); if (exec->hadException()) return; portArray.resize(length); for (unsigned i = 0 ; i < length; ++i) { JSValue value = object->get(exec, i); if (exec->hadException()) return; // Validation of non-null objects, per HTML5 spec 8.3.3. if (value.isUndefinedOrNull()) { setDOMException(exec, INVALID_STATE_ERR); return; } // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. RefPtr<MessagePort> port = toMessagePort(value); if (!port) { throwTypeError(exec); return; } portArray[i] = port.release(); } }
EncodedJSValue JSC_HOST_CALL errorProtoFuncToString(ExecState* exec) { JSObject* thisObj = exec->hostThisValue().toThisObject(exec); JSValue name = thisObj->get(exec, exec->propertyNames().name); JSValue message = thisObj->get(exec, exec->propertyNames().message); // Mozilla-compatible format. if (!name.isUndefined()) { if (!message.isUndefined()) return JSValue::encode(jsMakeNontrivialString(exec, name.toString(exec), ": ", message.toString(exec))); return JSValue::encode(jsNontrivialString(exec, name.toString(exec))); } if (!message.isUndefined()) return JSValue::encode(jsMakeNontrivialString(exec, "Error: ", message.toString(exec))); return JSValue::encode(jsNontrivialString(exec, "Error")); }
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 runtimeObjectPropertyGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSHTMLElement* element = jsCast<JSHTMLElement*>(asObject(slotBase)); JSObject* scriptObject = pluginScriptObject(exec, element); if (!scriptObject) return jsUndefined(); return scriptObject->get(exec, propertyName); }
void reportException(ExecState* exec, JSValue exception) { UString errorMessage = exception.toString(exec); JSObject* exceptionObject = exception.toObject(exec); int lineNumber = exceptionObject->get(exec, Identifier(exec, "line")).toInt32(exec); UString exceptionSourceURL = exceptionObject->get(exec, Identifier(exec, "sourceURL")).toString(exec); exec->clearException(); ScriptExecutionContext* scriptExecutionContext = static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject())->scriptExecutionContext(); ASSERT(scriptExecutionContext); // Crash data indicates null-dereference crashes at this point in the Safari 4 Public Beta. // It's harmless to return here without reporting the exception to the log and the debugger in this case. if (!scriptExecutionContext) return; scriptExecutionContext->reportException(errorMessage, lineNumber, exceptionSourceURL); }
void JSCustomVoidCallback::handleEvent() { ASSERT(m_callback); ASSERT(m_frame); if (!m_frame->script()->isEnabled()) return; JSGlobalObject* globalObject = m_frame->script()->globalObject(); ExecState* exec = globalObject->globalExec(); KJS::JSLock lock; JSValue* function = m_callback->get(exec, Identifier(exec, "handleEvent")); CallData callData; CallType callType = function->getCallData(callData); if (callType == CallTypeNone) { callType = m_callback->getCallData(callData); if (callType == CallTypeNone) { // FIXME: Should an exception be thrown here? return; } function = m_callback; } RefPtr<JSCustomVoidCallback> protect(this); ArgList args; globalObject->startTimeoutCheck(); call(exec, function, callType, callData, m_callback, args); globalObject->stopTimeoutCheck(); if (exec->hadException()) { JSObject* exception = exec->exception()->toObject(exec); String message = exception->get(exec, exec->propertyNames().message)->toString(exec); int lineNumber = exception->get(exec, Identifier(exec, "line"))->toInt32(exec); String sourceURL = exception->get(exec, Identifier(exec, "sourceURL"))->toString(exec); m_frame->domWindow()->console()->addMessage(JSMessageSource, ErrorMessageLevel, message, lineNumber, sourceURL); exec->clearException(); } Document::updateDocumentsRendering(); }
JSValue* errorProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&) { JSObject* thisObj = thisValue->toThisObject(exec); UString s = "Error"; JSValue* v = thisObj->get(exec, exec->propertyNames().name); if (!v->isUndefined()) s = v->toString(exec); v = thisObj->get(exec, exec->propertyNames().message); if (!v->isUndefined()) { // Mozilla-compatible format. s += ": "; s += v->toString(exec); } return jsNontrivialString(exec, s); }
static RefPtr<InspectorValue> jsToInspectorValue(ExecState* scriptState, JSValue value, int maxDepth) { if (!value) { ASSERT_NOT_REACHED(); return nullptr; } if (!maxDepth) return nullptr; maxDepth--; if (value.isNull() || value.isUndefined()) return InspectorValue::null(); if (value.isBoolean()) return InspectorValue::create(value.asBoolean()); if (value.isNumber() && value.isDouble()) return InspectorValue::create(value.asNumber()); if (value.isNumber() && value.isMachineInt()) return InspectorValue::create(static_cast<int>(value.asMachineInt())); if (value.isString()) return InspectorValue::create(value.getString(scriptState)); if (value.isObject()) { if (isJSArray(value)) { Ref<InspectorArray> inspectorArray = InspectorArray::create(); JSArray* array = asArray(value); unsigned length = array->length(); for (unsigned i = 0; i < length; i++) { JSValue element = array->getIndex(scriptState, i); RefPtr<InspectorValue> elementValue = jsToInspectorValue(scriptState, element, maxDepth); if (!elementValue) return nullptr; inspectorArray->pushValue(WTFMove(elementValue)); } return WTFMove(inspectorArray); } Ref<InspectorObject> inspectorObject = InspectorObject::create(); JSObject* object = value.getObject(); PropertyNameArray propertyNames(scriptState, PropertyNameMode::Strings); object->methodTable()->getOwnPropertyNames(object, scriptState, propertyNames, EnumerationMode()); for (size_t i = 0; i < propertyNames.size(); i++) { const Identifier& name = propertyNames[i]; JSValue propertyValue = object->get(scriptState, name); RefPtr<InspectorValue> inspectorValue = jsToInspectorValue(scriptState, propertyValue, maxDepth); if (!inspectorValue) return nullptr; inspectorObject->setValue(name.string(), WTFMove(inspectorValue)); } return WTFMove(inspectorObject); } ASSERT_NOT_REACHED(); return nullptr; }
static EncodedJSValue JSC_HOST_CALL constructWithArrayConstructor(ExecState* exec) { ArgList args(exec); JSValue prototype = JSValue(); JSObject* newTarget = exec->newTarget().getObject(); if (newTarget->classInfo() != ArrayConstructor::info()) prototype = newTarget->get(exec, exec->propertyNames().prototype); return JSValue::encode(constructArrayWithSizeQuirk(exec, args, prototype)); }
static EncodedJSValue JSC_HOST_CALL promiseAllCountdownFunction(ExecState* exec) { JSValue x = exec->argument(0); VM& vm = exec->vm(); JSObject* F = exec->callee(); // 1. Let 'index' be the value of F's [[Index]] internal slot. uint32_t index = F->get(exec, vm.propertyNames->indexPrivateName).asUInt32(); // 2. Let 'values' be the value of F's [[Values]] internal slot.. JSArray* values = jsCast<JSArray*>(F->get(exec, vm.propertyNames->valuesPrivateName)); // 3. Let 'deferred' be the value of F's [[Deferred]] internal slot. JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(F->get(exec, vm.propertyNames->deferredPrivateName)); // 4. Let 'countdownHolder' be the value of F's [[CountdownHolder]] internal slot. NumberObject* countdownHolder = jsCast<NumberObject*>(F->get(exec, vm.propertyNames->countdownHolderPrivateName)); // 5. Let 'result' be the result of calling the [[DefineOwnProperty]] internal method // of 'values' with arguments 'index' and Property Descriptor { [[Value]]: x, // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }. values->putDirectIndex(exec, index, x); // 6. RejectIfAbrupt(result, deferred). if (exec->hadException()) abruptRejection(exec, deferred); // 7. Set countdownHolder.[[Countdown]] to countdownHolder.[[Countdown]] - 1. uint32_t newCountdownValue = countdownHolder->internalValue().asUInt32() - 1; countdownHolder->setInternalValue(vm, JSValue(newCountdownValue)); // 8. If countdownHolder.[[Countdown]] is 0, if (!newCountdownValue) { // i. Return the result of calling the [[Call]] internal method of deferred.[[Resolve]] // with undefined as thisArgument and a List containing 'values' as argumentsList. performDeferredResolve(exec, deferred, values); } // 9. Return. return JSValue::encode(jsUndefined()); }
EncodedJSValue pluginElementPropertyGetter(ExecState* exec, JSObject*, EncodedJSValue thisValue, PropertyName propertyName) { JSHTMLElement* thisObject = jsDynamicCast<JSHTMLElement*>(JSValue::decode(thisValue)); if (!thisObject) return throwVMTypeError(exec); JSObject* scriptObject = pluginScriptObject(exec, thisObject); if (!scriptObject) return JSValue::encode(jsUndefined()); return JSValue::encode(scriptObject->get(exec, propertyName)); }
static PassRefPtr<InspectorValue> jsToInspectorValue(ScriptState* scriptState, JSValue value, int maxDepth) { if (!value) { ASSERT_NOT_REACHED(); return 0; } if (!maxDepth) return 0; maxDepth--; if (value.isNull() || value.isUndefined()) return InspectorValue::null(); if (value.isBoolean()) return InspectorBasicValue::create(value.asBoolean()); if (value.isNumber()) return InspectorBasicValue::create(value.asNumber()); if (value.isString()) { String s = value.getString(scriptState); return InspectorString::create(String(s.characters(), s.length())); } if (value.isObject()) { if (isJSArray(value)) { RefPtr<InspectorArray> inspectorArray = InspectorArray::create(); JSArray* array = asArray(value); unsigned length = array->length(); for (unsigned i = 0; i < length; i++) { // FIXME: What if the array is in sparse mode? https://bugs.webkit.org/show_bug.cgi?id=95610 JSValue element = array->getIndexQuickly(i); RefPtr<InspectorValue> elementValue = jsToInspectorValue(scriptState, element, maxDepth); if (!elementValue) return 0; inspectorArray->pushValue(elementValue); } return inspectorArray; } RefPtr<InspectorObject> inspectorObject = InspectorObject::create(); JSObject* object = value.getObject(); PropertyNameArray propertyNames(scriptState); object->methodTable()->getOwnPropertyNames(object, scriptState, propertyNames, ExcludeDontEnumProperties); for (size_t i = 0; i < propertyNames.size(); i++) { const Identifier& name = propertyNames[i]; JSValue propertyValue = object->get(scriptState, name); RefPtr<InspectorValue> inspectorValue = jsToInspectorValue(scriptState, propertyValue, maxDepth); if (!inspectorValue) return 0; inspectorObject->setValue(String(name.characters(), name.length()), inspectorValue); } return inspectorObject; } ASSERT_NOT_REACHED(); return 0; }
JSValue JSInspectorFrontendHost::showContextMenu(ExecState* exec) { if (exec->argumentCount() < 2) return jsUndefined(); #if ENABLE(CONTEXT_MENUS) Event* event = toEvent(exec->argument(0)); JSArray* array = asArray(exec->argument(1)); Vector<ContextMenuItem*> items; for (size_t i = 0; i < array->length(); ++i) { JSObject* item = asObject(array->getIndex(i)); JSValue label = item->get(exec, Identifier(exec, "label")); JSValue type = item->get(exec, Identifier(exec, "type")); JSValue id = item->get(exec, Identifier(exec, "id")); JSValue enabled = item->get(exec, Identifier(exec, "enabled")); JSValue checked = item->get(exec, Identifier(exec, "checked")); if (!type.isString()) continue; String typeString = ustringToString(type.toString(exec)->value(exec)); if (typeString == "separator") { items.append(new ContextMenuItem(SeparatorType, ContextMenuItemCustomTagNoAction, String())); } else { ContextMenuAction typedId = static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + id.toInt32(exec)); ContextMenuItem* menuItem = new ContextMenuItem((typeString == "checkbox" ? CheckableActionType : ActionType), typedId, ustringToString(label.toString(exec)->value(exec))); if (!enabled.isUndefined()) menuItem->setEnabled(enabled.toBoolean(exec)); if (!checked.isUndefined()) menuItem->setChecked(checked.toBoolean(exec)); items.append(menuItem); } } impl()->showContextMenu(event, items); #endif return jsUndefined(); }