JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return 0; } ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); JSObject* jsThisObject = toJS(thisObject); // evaluate sets "this" to the global object if it is NULL JSGlobalObject* globalObject = exec->dynamicGlobalObject(); SourceCode source = makeSource(script->string(), sourceURL->string(), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first())); JSValue evaluationException; JSValue returnValue = evaluate(globalObject->globalExec(), source, jsThisObject, &evaluationException); if (evaluationException) { if (exception) *exception = toRef(exec, evaluationException); return 0; } if (returnValue) return toRef(exec, returnValue); // happens, for example, when the only statement is an empty (';') statement return toRef(exec, jsUndefined()); }
JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned parameterCount, const JSStringRef parameterNames[], JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return 0; } ExecState* exec = toJS(ctx); VM& vm = exec->vm(); JSLockHolder locker(vm); auto scope = DECLARE_CATCH_SCOPE(vm); startingLineNumber = std::max(1, startingLineNumber); Identifier nameID = name ? name->identifier(&vm) : Identifier::fromString(exec, "anonymous"); MarkedArgumentBuffer args; for (unsigned i = 0; i < parameterCount; i++) args.append(jsString(exec, parameterNames[i]->string())); args.append(jsString(exec, body->string())); if (UNLIKELY(args.hasOverflowed())) { auto throwScope = DECLARE_THROW_SCOPE(vm); throwOutOfMemoryError(exec, throwScope); handleExceptionIfNeeded(scope, exec, exception); return 0; } auto sourceURLString = sourceURL ? sourceURL->string() : String(); JSObject* result = constructFunction(exec, exec->lexicalGlobalObject(), args, nameID, SourceOrigin { sourceURLString }, sourceURLString, TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber())); if (handleExceptionIfNeeded(scope, exec, exception) == ExceptionStatus::DidThrow) result = 0; return toRef(result); }
bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return false; } ExecState* exec = toJS(ctx); JSLockHolder locker(exec); startingLineNumber = std::max(1, startingLineNumber); SourceCode source = makeSource(script->string(), sourceURL ? sourceURL->string() : String(), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first())); JSValue syntaxException; bool isValidSyntax = checkSyntax(exec->vmEntryGlobalObject()->globalExec(), source, &syntaxException); if (!isValidSyntax) { if (exception) *exception = toRef(exec, syntaxException); #if ENABLE(REMOTE_INSPECTOR) exec->vmEntryGlobalObject()->inspectorController().reportAPIException(exec, syntaxException); #endif return false; } return true; }
JSStringRef TestRunner::pathToLocalResource(JSContextRef context, JSStringRef url) { String requestedUrl(url->characters(), url->length()); String resourceRoot; String requestedRoot; if (requestedUrl.find("LayoutTests") != notFound) { // If the URL contains LayoutTests we need to remap that to // LOCAL_RESOURCE_ROOT which is the path of the LayoutTests directory // within the WebKit source tree. requestedRoot = "/tmp/LayoutTests"; resourceRoot = getenv("LOCAL_RESOURCE_ROOT"); } else if (requestedUrl.find("tmp") != notFound) { // If the URL is a child of /tmp we need to convert it to be a child // DUMPRENDERTREE_TEMP replace tmp with DUMPRENDERTREE_TEMP requestedRoot = "/tmp"; resourceRoot = getenv("DUMPRENDERTREE_TEMP"); } size_t indexOfRootStart = requestedUrl.reverseFind(requestedRoot); size_t indexOfSeparatorAfterRoot = indexOfRootStart + requestedRoot.length(); String fullPathToUrl = "file://" + resourceRoot + requestedUrl.substring(indexOfSeparatorAfterRoot); return JSStringCreateWithUTF8CString(fullPathToUrl.utf8().data()); }
JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { ExecState* exec = toJS(ctx); exec->globalData().heap.registerThread(); JSLock lock(exec); JSObject* jsThisObject = toJS(thisObject); // evaluate sets "this" to the global object if it is NULL JSGlobalObject* globalObject = exec->dynamicGlobalObject(); SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber); Completion completion = evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), source, jsThisObject); if (completion.complType() == Throw) { if (exception) *exception = toRef(completion.value()); return 0; } if (completion.value()) return toRef(completion.value()); // happens, for example, when the only statement is an empty (';') statement return toRef(jsUndefined()); }
JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned parameterCount, const JSStringRef parameterNames[], JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return 0; } ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); Identifier nameID = name ? name->identifier(&exec->vm()) : Identifier(exec, "anonymous"); MarkedArgumentBuffer args; for (unsigned i = 0; i < parameterCount; i++) args.append(jsString(exec, parameterNames[i]->string())); args.append(jsString(exec, body->string())); JSObject* result = constructFunction(exec, exec->lexicalGlobalObject(), args, nameID, sourceURL->string(), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first())); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } return toRef(result); }
void LayoutTestController::removeOriginAccessWhitelistEntry(JSStringRef sourceOrigin, JSStringRef protocol, JSStringRef host, bool includeSubdomains) { WebCore::KURL kurl; kurl.setProtocol(String(protocol->characters(), protocol->length())); kurl.setHost(String(host->characters(), host->length())); ewk_security_policy_whitelist_origin_del(sourceOrigin->ustring().utf8().data(), kurl.string().utf8().data(), includeSubdomains); }
void LayoutTestController::queueLoad(JSStringRef url, JSStringRef target) { WebCore::KURL baseURL(WebCore::KURL(), String::fromUTF8(ewk_frame_uri_get(browser->mainFrame()))); WebCore::KURL absoluteURL(baseURL, WTF::String(url->characters(), url->length())); JSRetainPtr<JSStringRef> jsAbsoluteURL( Adopt, JSStringCreateWithUTF8CString(absoluteURL.string().utf8().data())); WorkQueue::shared()->queue(new LoadItem(jsAbsoluteURL.get(), target)); }
CFStringRef JSStringCopyCFString(CFAllocatorRef allocator, JSStringRef string) { if (!string || !string->length()) return CFSTR(""); if (string->is8Bit()) return CFStringCreateWithBytes(allocator, reinterpret_cast<const UInt8*>(string->characters8()), string->length(), kCFStringEncodingISOLatin1, false); return CFStringCreateWithCharacters(allocator, reinterpret_cast<const UniChar*>(string->characters16()), string->length()); }
void DumpRenderTreeSupportEfl::deliverWebIntent(Evas_Object* ewkFrame, JSStringRef action, JSStringRef type, JSStringRef data) { #if ENABLE(WEB_INTENTS) RefPtr<WebCore::SerializedScriptValue> serializedData = WebCore::SerializedScriptValue::create(data->string()); WebCore::ExceptionCode ec = 0; WebCore::MessagePortArray ports; RefPtr<WebCore::Intent> coreIntent = WebCore::Intent::create(action->string(), type->string(), serializedData.get(), ports, ec); if (ec) return; Ewk_Intent* ewkIntent = ewk_intent_new(coreIntent.get()); ewk_frame_intent_deliver(ewkFrame, ewkIntent); ewk_intent_free(ewkIntent); #endif }
size_t JSStringGetUTF8CString(JSStringRef string, char* buffer, size_t bufferSize) { if (!bufferSize) return 0; char* p = buffer; const UChar* d = string->characters(); ConversionResult result = convertUTF16ToUTF8(&d, d + string->length(), &p, p + bufferSize - 1, true); *p++ = '\0'; if (result != conversionOK && result != targetExhausted) return 0; return p - buffer; }
bool LayoutTestController::findString(JSContextRef context, JSStringRef target, JSObjectRef optionsArray) { JSRetainPtr<JSStringRef> lengthPropertyName(Adopt, JSStringCreateWithUTF8CString("length")); JSValueRef lengthValue = JSObjectGetProperty(context, optionsArray, lengthPropertyName.get(), 0); if (!JSValueIsNumber(context, lengthValue)) return false; WebCore::FindOptions options = 0; const size_t length = static_cast<size_t>(JSValueToNumber(context, lengthValue, 0)); for (size_t i = 0; i < length; ++i) { JSValueRef value = JSObjectGetPropertyAtIndex(context, optionsArray, i, 0); if (!JSValueIsString(context, value)) continue; JSRetainPtr<JSStringRef> optionName(Adopt, JSValueToStringCopy(context, value, 0)); if (equals(optionName, "CaseInsensitive")) options |= WebCore::CaseInsensitive; else if (equals(optionName, "AtWordStarts")) options |= WebCore::AtWordStarts; else if (equals(optionName, "TreatMedialCapitalAsWordStart")) options |= WebCore::TreatMedialCapitalAsWordStart; else if (equals(optionName, "Backwards")) options |= WebCore::Backwards; else if (equals(optionName, "WrapAround")) options |= WebCore::WrapAround; else if (equals(optionName, "StartInSelection")) options |= WebCore::StartInSelection; } return DumpRenderTreeSupportEfl::findString(browser->mainView(), target->ustring().utf8().data(), options); }
JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); return toRef(exec, jsString(exec, string->ustring())); }
void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return; } ExecState* exec = toJS(ctx); VM& vm = exec->vm(); JSLockHolder locker(vm); auto scope = DECLARE_CATCH_SCOPE(vm); JSObject* jsObject = toJS(object); Identifier name(propertyName->identifier(&vm)); JSValue jsValue = toJS(exec, value); bool doesNotHaveProperty = attributes && !jsObject->hasProperty(exec, name); if (LIKELY(!scope.exception())) { if (doesNotHaveProperty) { PropertyDescriptor desc(jsValue, attributes); jsObject->methodTable(vm)->defineOwnProperty(jsObject, exec, name, desc, false); } else { PutPropertySlot slot(jsObject); jsObject->methodTable(vm)->put(jsObject, exec, name, jsValue, slot); } } handleExceptionIfNeeded(scope, exec, exception); }
void TestRunner::setUserStyleSheetLocation(JSStringRef path) { gUserStyleSheet = path->string().utf8(); if (gUserStyleSheetEnabled) setUserStyleSheetEnabled(true); }
void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return; } ExecState* exec = toJS(ctx); JSLockHolder locker(exec); JSObject* jsObject = toJS(object); Identifier name(propertyName->identifier(&exec->vm())); JSValue jsValue = toJS(exec, value); if (attributes && !jsObject->hasProperty(exec, name)) { PropertyDescriptor desc(jsValue, attributes); jsObject->methodTable()->defineOwnProperty(jsObject, exec, name, desc, false); } else { PutPropertySlot slot(jsObject); jsObject->methodTable()->put(jsObject, exec, name, jsValue, slot); } if (exec->hadException()) { JSValue exceptionValue = exec->exception(); if (exception) *exception = toRef(exec, exceptionValue); exec->clearException(); #if ENABLE(REMOTE_INSPECTOR) exec->vmEntryGlobalObject()->inspectorController().reportAPIException(exec, exceptionValue); #endif } }
void JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef array, JSStringRef propertyName) { PropertyNameArray* propertyNames = toJS(array); VM* vm = propertyNames->vm(); JSLockHolder locker(vm); propertyNames->add(propertyName->identifier(vm)); }
void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return; } ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); JSObject* jsObject = toJS(object); Identifier name(propertyName->identifier(&exec->vm())); JSValue jsValue = toJS(exec, value); if (attributes && !jsObject->hasProperty(exec, name)) jsObject->methodTable()->putDirectVirtual(jsObject, exec, name, jsValue, attributes); else { PutPropertySlot slot; jsObject->methodTable()->put(jsObject, exec, name, jsValue, slot); } if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); exec->clearException(); } }
JSValueRef JSValueMakeFromJSONString(JSContextRef ctx, JSStringRef string) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); LiteralParser parser(exec, string->ustring(), LiteralParser::StrictJSON); return toRef(exec, parser.tryLiteralParse()); }
bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { ExecState* exec = toJS(ctx); exec->globalData().heap.registerThread(); JSLock lock(exec); SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber); Completion completion = checkSyntax(exec->dynamicGlobalObject()->globalExec(), source); if (completion.complType() == Throw) { if (exception) *exception = toRef(completion.value()); return false; } return true; }
bool JSObjectDeletePrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) { ExecState* exec = toJS(ctx); JSLockHolder locker(exec); JSObject* jsObject = toJS(object); Identifier name(propertyName->identifier(&exec->vm())); // Get wrapped object if proxied if (jsObject->inherits(JSProxy::info())) jsObject = jsCast<JSProxy*>(jsObject)->target(); if (jsObject->inherits(JSCallbackObject<JSGlobalObject>::info())) { jsCast<JSCallbackObject<JSGlobalObject>*>(jsObject)->deletePrivateProperty(name); return true; } if (jsObject->inherits(JSCallbackObject<JSDestructibleObject>::info())) { jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->deletePrivateProperty(name); return true; } #if JSC_OBJC_API_ENABLED if (jsObject->inherits(JSCallbackObject<JSAPIWrapperObject>::info())) { jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->deletePrivateProperty(name); return true; } #endif return false; }
bool JSObjectSetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value) { ExecState* exec = toJS(ctx); VM& vm = exec->vm(); JSLockHolder locker(vm); JSObject* jsObject = toJS(object); JSValue jsValue = value ? toJS(exec, value) : JSValue(); Identifier name(propertyName->identifier(&vm)); // Get wrapped object if proxied if (jsObject->inherits<JSProxy>(vm)) jsObject = jsCast<JSProxy*>(jsObject)->target(); if (jsObject->inherits<JSCallbackObject<JSGlobalObject>>(vm)) { jsCast<JSCallbackObject<JSGlobalObject>*>(jsObject)->setPrivateProperty(vm, name, jsValue); return true; } if (jsObject->inherits<JSCallbackObject<JSDestructibleObject>>(vm)) { jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->setPrivateProperty(vm, name, jsValue); return true; } #if JSC_OBJC_API_ENABLED if (jsObject->inherits<JSCallbackObject<JSAPIWrapperObject>>(vm)) { jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->setPrivateProperty(vm, name, jsValue); return true; } #endif return false; }
void LayoutTestController::setUserStyleSheetLocation(JSStringRef path) { gUserStyleSheet = path->ustring().utf8(); if (gUserStyleSheetEnabled) setUserStyleSheetEnabled(true); }
JSScriptRef JSScriptCreateReferencingImmortalASCIIText(JSContextGroupRef contextGroup, JSStringRef url, int startingLineNumber, const char* source, size_t length, JSStringRef* errorMessage, int* errorLine) { auto& vm = *toJS(contextGroup); JSLockHolder locker(&vm); for (size_t i = 0; i < length; i++) { if (!isASCII(source[i])) return 0; } startingLineNumber = std::max(1, startingLineNumber); auto sourceURLString = url ? url->string() : String(); auto result = OpaqueJSScript::create(vm, SourceOrigin { sourceURLString }, URL({ }, sourceURLString), startingLineNumber, String(StringImpl::createFromLiteral(source, length))); ParserError error; if (!parseScript(vm, SourceCode(result.copyRef()), error)) { if (errorMessage) *errorMessage = OpaqueJSString::tryCreate(error.message()).leakRef(); if (errorLine) *errorLine = error.line(); return nullptr; } return &result.leakRef(); }
JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) { if (!ctx) { ASSERT_NOT_REACHED(); return nullptr; } ExecState* exec = toJS(ctx); VM& vm = exec->vm(); JSLockHolder locker(vm); startingLineNumber = std::max(1, startingLineNumber); auto sourceURLString = sourceURL ? sourceURL->string() : String(); SourceCode source = makeSource(script->string(), SourceOrigin { sourceURLString }, URL({ }, sourceURLString), TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber())); return JSEvaluateScriptInternal(locker, exec, ctx, thisObject, source, exception); }
JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string) { ExecState* exec = toJS(ctx); exec->globalData().heap.registerThread(); JSLock lock(exec); return toRef(jsString(exec, string->ustring())); }
void TestRunner::setMockGeolocationPositionUnavailableError(JSStringRef message) { Evas_Object* view = browser->mainView(); if (browser->extraViews().size() > 0) view = browser->extraViews().last(); DumpRenderTreeSupportEfl::setMockGeolocationPositionUnavailableError(view, message->string().utf8().data()); }
JSObjectRef JSObjectMakeFunctionWithCallback(JSContextRef ctx, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); Identifier nameID = name ? name->identifier(&exec->globalData()) : Identifier(exec, "anonymous"); return toRef(JSCallbackFunction::create(exec, exec->lexicalGlobalObject(), callAsFunction, nameID)); }
void JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef array, JSStringRef propertyName) { PropertyNameArray* propertyNames = toJS(array); propertyNames->globalData()->heap->registerThread(); JSLock lock(propertyNames->globalData()->isSharedInstance); propertyNames->add(propertyName->identifier(propertyNames->globalData())); }
bool JSObjectHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); JSObject* jsObject = toJS(object); return jsObject->hasProperty(exec, propertyName->identifier(&exec->globalData())); }