JSValue JSDOMFormData::append(ExecState* exec) { if (exec->argumentCount() >= 2) { String name = exec->argument(0).toString(exec)->value(exec); JSValue value = exec->argument(1); if (value.inherits(&JSBlob::s_info)) { String filename; if (exec->argumentCount() >= 3 && !exec->argument(2).isUndefinedOrNull()) filename = exec->argument(2).toString(exec)->value(exec); impl()->append(name, toBlob(value), filename); } else impl()->append(name, value.toString(exec)->value(exec)); } return jsUndefined(); }
void JSLocation::setPort(ExecState* exec, JSValue value) { Frame* frame = impl()->frame(); ASSERT(frame); KURL url = frame->loader()->url(); // FIXME: Could make this a little less ugly if String provided a toUnsignedShort function. const UString& portString = value.toString(exec); int port = charactersToInt(portString.data(), portString.size()); if (port < 0 || port > 0xFFFF) url.removePort(); else url.setPort(port); navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false); }
EXPORT JSStringRef JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { JSLock lock; JSValue* jsValue = toJS(value); ExecState* exec = toJS(ctx); JSStringRef stringRef = toRef(jsValue->toString(exec).rep()->ref()); if (exec->hadException()) { if (exception) *exception = toRef(exec->exception()); exec->clearException(); stringRef = 0; } return stringRef; }
PassOwnPtr<ScheduledAction> ScheduledAction::create(ExecState* exec, DOMWrapperWorld* isolatedWorld, ContentSecurityPolicy* policy) { JSValue v = exec->argument(0); CallData callData; if (getCallData(v, callData) == CallTypeNone) { RefPtr<ScriptCallStack> callStack(createScriptCallStackForInspector(exec)); if (policy && !policy->allowEval(callStack.release())) return nullptr; String string = v.toString(exec)->value(exec); if (exec->hadException()) return nullptr; return adoptPtr(new ScheduledAction(string, isolatedWorld)); } return adoptPtr(new ScheduledAction(exec, v, isolatedWorld)); }
void JSLocation::setHash(ExecState* exec, JSValue value) { Frame* frame = impl()->frame(); ASSERT(frame); KURL url = frame->loader()->url(); String oldFragmentIdentifier = url.fragmentIdentifier(); String str = value.toString(exec); if (str.startsWith("#")) str = str.substring(1); if (equalIgnoringNullity(oldFragmentIdentifier, str)) return; url.setFragmentIdentifier(str); navigateIfAllowed(exec, frame, url, !frame->script()->anyPageIsProcessingUserGesture(), false); }
JSStringRef JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); JSValue jsValue = toJS(exec, value); RefPtr<OpaqueJSString> stringRef(OpaqueJSString::create(jsValue.toString(exec)->value(exec))); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); exec->clearException(); stringRef.clear(); } return stringRef.release().leakRef(); }
void setJSAudioNodeChannelInterpretation(ExecState* exec, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(exec); JSAudioNode* castedThis = jsDynamicCast<JSAudioNode*>(JSValue::decode(thisValue)); if (!castedThis) { throwVMTypeError(exec); return; } AudioNode& impl = castedThis->impl(); ExceptionCode ec = 0; const String& nativeValue(value.isEmpty() ? String() : value.toString(exec)->value(exec)); if (exec->hadException()) return; impl.setChannelInterpretation(nativeValue, ec); setDOMException(exec, ec); }
inline RegExpFlags toFlags(ExecState* exec, JSValue flags) { if (flags.isUndefined()) return NoFlags; JSString* flagsString = flags.toString(exec); if (!flagsString) { ASSERT(exec->hadException()); return InvalidFlags; } RegExpFlags result = regExpFlags(flagsString->value(exec)); if (exec->hadException()) return InvalidFlags; if (result == InvalidFlags) throwSyntaxError(exec, ASCIILiteral("Invalid flags supplied to RegExp constructor.")); return result; }
void JSDocument::setLocation(ExecState* exec, JSValue value) { Frame* frame = static_cast<Document*>(impl())->frame(); if (!frame) return; String str = value.toString(exec); // IE and Mozilla both resolve the URL relative to the source frame, // not the target frame. Frame* activeFrame = asJSDOMWindow(exec->dynamicGlobalObject())->impl()->frame(); if (activeFrame) str = activeFrame->document()->completeURL(str).string(); bool userGesture = activeFrame->script()->processingUserGesture(currentWorld(exec)); frame->redirectScheduler()->scheduleLocationChange(str, activeFrame->loader()->outgoingReferrer(), !activeFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture); }
void JSDictionary::convertValue(ExecState* exec, JSValue value, Vector<String>& result) { if (value.isUndefinedOrNull()) return; unsigned length = 0; JSObject* object = toJSSequence(exec, value, length); if (exec->hadException()) return; for (unsigned i = 0 ; i < length; ++i) { JSValue itemValue = object->get(exec, i); if (exec->hadException()) return; result.append(itemValue.toString(exec)->value(exec)); } }
JSStringRef JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exception) { ExecState* exec = toJS(ctx); exec->globalData().heap.registerThread(); JSLock lock(exec); JSValue jsValue = toJS(exec, value); RefPtr<OpaqueJSString> stringRef(OpaqueJSString::create(jsValue.toString(exec))); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); exec->clearException(); stringRef.clear(); } return stringRef.release().releaseRef(); }
void setJSTestTypedefsStringAttrWithSetterException(ExecState* exec, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(exec); JSTestTypedefs* castedThis = jsDynamicCast<JSTestTypedefs*>(JSValue::decode(thisValue)); if (!castedThis) { throwVMTypeError(exec); return; } TestTypedefs& impl = castedThis->impl(); ExceptionCode ec = 0; const String& nativeValue(value.isEmpty() ? String() : value.toString(exec)->value(exec)); if (exec->hadException()) return; impl.setStringAttrWithSetterException(nativeValue, ec); setDOMException(exec, ec); }
bool setJSTestNondeterministicNondeterministicSetterExceptionAttr(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(thisValue); JSTestNondeterministic* castedThis = jsDynamicCast<JSTestNondeterministic*>(JSValue::decode(thisValue)); if (UNLIKELY(!castedThis)) { return throwSetterTypeError(*state, "TestNondeterministic", "nondeterministicSetterExceptionAttr"); } auto& impl = castedThis->wrapped(); ExceptionCode ec = 0; String nativeValue = value.toString(state)->value(state); if (UNLIKELY(state->hadException())) return false; impl.setNondeterministicSetterExceptionAttr(nativeValue, ec); setDOMException(state, ec); return true; }
Stringifier::Stringifier(ExecState* exec, const Local<Unknown>& replacer, const Local<Unknown>& space) : m_exec(exec) , m_replacer(replacer) , m_usingArrayReplacer(false) , m_arrayReplacerPropertyNames(exec) , m_replacerCallType(CallTypeNone) , m_gap(gap(exec, space.get())) { if (!m_replacer.isObject()) return; if (m_replacer.asObject()->inherits(&JSArray::s_info)) { m_usingArrayReplacer = true; Handle<JSObject> array = m_replacer.asObject(); 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::s_info) && !asObject(name)->inherits(&StringObject::s_info)) continue; propertyName = name.toString(exec); if (exec->hadException()) break; m_arrayReplacerPropertyNames.add(Identifier(exec, propertyName)); } } return; } m_replacerCallType = m_replacer.asObject()->getCallData(m_replacerCallData); }
void NPRuntimeObjectMap::convertJSValueToNPVariant(ExecState* exec, JSValue value, NPVariant& variant) { JSLock lock(SilenceAssertionsOnly); VOID_TO_NPVARIANT(variant); if (value.isNull()) { NULL_TO_NPVARIANT(variant); return; } if (value.isUndefined()) { VOID_TO_NPVARIANT(variant); return; } if (value.isBoolean()) { BOOLEAN_TO_NPVARIANT(value.toBoolean(exec), variant); return; } if (value.isNumber()) { DOUBLE_TO_NPVARIANT(value.toNumber(exec), variant); return; } if (value.isString()) { CString utf8String = value.toString(exec).utf8(); // This should use NPN_MemAlloc, but we know that it uses malloc under the hood. char* utf8Characters = static_cast<char*>(malloc(utf8String.length())); memcpy(utf8Characters, utf8String.data(), utf8String.length()); STRINGN_TO_NPVARIANT(utf8Characters, utf8String.length(), variant); return; } if (value.isObject()) { NPObject* npObject = getOrCreateNPObject(asObject(value)); OBJECT_TO_NPVARIANT(npObject, variant); return; } ASSERT_NOT_REACHED(); }
JSValue JSInjectedScriptHost::evaluateWithScopeExtension(ExecState* exec) { JSValue scriptValue = exec->argument(0); if (!scriptValue.isString()) return throwTypeError(exec, "InjectedScriptHost.evaluateWithScopeExtension first argument must be a string."); String program = scriptValue.toString(exec)->value(exec); if (exec->hadException()) return jsUndefined(); NakedPtr<Exception> exception; JSObject* scopeExtension = exec->argument(1).getObject(); JSValue result = JSC::evaluateWithScopeExtension(exec, makeSource(program), scopeExtension, exception); if (exception) exec->vm().throwException(exec, exception); return result; }
void setJSTestTypedefsStringAttrWithGetterException(ExecState* exec, JSObject* baseObject, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(baseObject); JSTestTypedefs* castedThis = jsDynamicCast<JSTestTypedefs*>(JSValue::decode(thisValue)); if (UNLIKELY(!castedThis)) { if (jsDynamicCast<JSTestTypedefsPrototype*>(JSValue::decode(thisValue))) reportDeprecatedSetterError(*exec, "TestTypedefs", "stringAttrWithGetterException"); else throwSetterTypeError(*exec, "TestTypedefs", "stringAttrWithGetterException"); return; } auto& impl = castedThis->impl(); const String& nativeValue(value.isEmpty() ? String() : value.toString(exec)->value(exec)); if (UNLIKELY(exec->hadException())) return; impl.setStringAttrWithGetterException(nativeValue); }
void JSDocument::setLocation(ExecState* exec, JSValue value) { Frame* frame = static_cast<Document*>(impl())->frame(); if (!frame) return; String str = ustringToString(value.toString(exec)); Frame* lexicalFrame = asJSDOMWindow(exec->lexicalGlobalObject())->impl()->frame(); // IE and Mozilla both resolve the URL relative to the source frame, // not the target frame. Frame* activeFrame = asJSDOMWindow(exec->dynamicGlobalObject())->impl()->frame(); str = activeFrame->document()->completeURL(str).string(); frame->navigationScheduler()->scheduleLocationChange(lexicalFrame->document()->securityOrigin(), str, activeFrame->loader()->outgoingReferrer(), !activeFrame->script()->anyPageIsProcessingUserGesture(), false); }
void setJSTestNondeterministicNondeterministicExceptionAttr(ExecState* exec, JSObject* baseObject, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(baseObject); JSTestNondeterministic* castedThis = jsDynamicCast<JSTestNondeterministic*>(JSValue::decode(thisValue)); if (UNLIKELY(!castedThis)) { if (jsDynamicCast<JSTestNondeterministicPrototype*>(JSValue::decode(thisValue))) reportDeprecatedSetterError(*exec, "TestNondeterministic", "nondeterministicExceptionAttr"); else throwSetterTypeError(*exec, "TestNondeterministic", "nondeterministicExceptionAttr"); return; } TestNondeterministic& impl = castedThis->impl(); const String& nativeValue(value.isEmpty() ? String() : value.toString(exec)->value(exec)); if (UNLIKELY(exec->hadException())) return; impl.setNondeterministicExceptionAttr(nativeValue); }
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); }
JSLR_API bool _cdecl JSTryConvertToString(JSContextRef ctx, JSValueRef value, const char** ptr, size_t* length, JSStringRef* str) { ExecState* exec = toJS(ctx); JSValue jsValue = toJS(exec, value); if (jsValue.isString()) { RefPtr<OpaqueJSString> stringRef(OpaqueJSString::create(jsValue.toString(exec)->value(exec))); *ptr = (const char*)stringRef->characters(); *length = stringRef->length(); auto js_str = JSStringRetain(stringRef.release().leakRef()); *str = js_str; return true; } return false; }
void setJSTestNodeName(ExecState* state, JSObject* baseObject, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(baseObject); JSTestNode* castedThis = jsDynamicCast<JSTestNode*>(JSValue::decode(thisValue)); if (UNLIKELY(!castedThis)) { if (jsDynamicCast<JSTestNodePrototype*>(JSValue::decode(thisValue))) reportDeprecatedSetterError(*state, "TestNode", "name"); else throwSetterTypeError(*state, "TestNode", "name"); return; } auto& impl = castedThis->impl(); String nativeValue = value.toString(state)->value(state); if (UNLIKELY(state->hadException())) return; impl.setName(nativeValue); }
// Variant value must be released with NPReleaseVariantValue() void convertValueToNPVariant(ExecState* exec, JSValue value, NPVariant* result) { JSLock lock(SilenceAssertionsOnly); VOID_TO_NPVARIANT(*result); if (value.isString()) { UString ustring = value.toString(exec); CString cstring = ustring.utf8(); NPString string = { (const NPUTF8*)cstring.data(), static_cast<uint32_t>(cstring.length()) }; NPN_InitializeVariantWithStringCopy(result, &string); } else if (value.isNumber()) { DOUBLE_TO_NPVARIANT(value.toNumber(exec), *result); } else if (value.isBoolean()) { BOOLEAN_TO_NPVARIANT(value.toBoolean(exec), *result); } else if (value.isNull()) { NULL_TO_NPVARIANT(*result); } else if (value.isObject()) { JSObject* object = asObject(value); if (object->classInfo() == &CRuntimeObject::s_info) { CRuntimeObject* runtimeObject = static_cast<CRuntimeObject*>(object); CInstance* instance = runtimeObject->getInternalCInstance(); if (instance) { NPObject* obj = instance->getObject(); _NPN_RetainObject(obj); OBJECT_TO_NPVARIANT(obj, *result); } } else { #ifdef ANDROID RootObject* rootObject = findRootObject(exec->dynamicGlobalObject()); if (!rootObject) rootObject = findRootObject(exec->lexicalGlobalObject()); #else JSGlobalObject* globalObject = exec->dynamicGlobalObject(); RootObject* rootObject = findRootObject(globalObject); #endif if (rootObject) { NPObject* npObject = _NPN_CreateScriptObject(0, object, rootObject); OBJECT_TO_NPVARIANT(npObject, *result); } } } }
void setJSWaveShaperNodeOversample(ExecState* exec, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(exec); JSWaveShaperNode* castedThis = jsDynamicCast<JSWaveShaperNode*>(JSValue::decode(thisValue)); if (!castedThis) { throwVMTypeError(exec); return; } WaveShaperNode& impl = castedThis->impl(); ExceptionCode ec = 0; const String nativeValue(value.isEmpty() ? String() : value.toString(exec)->value(exec)); if (exec->hadException()) return; if (nativeValue != "none" && nativeValue != "2x" && nativeValue != "4x") return; impl.setOversample(nativeValue, ec); setDOMException(exec, ec); }
JSString* JSValue::toStringSlowCase(ExecState* exec, bool returnEmptyStringOnError) const { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); auto errorValue = [&] () -> JSString* { if (returnEmptyStringOnError) return jsEmptyString(exec); return nullptr; }; ASSERT(!isString()); if (isInt32()) { auto integer = asInt32(); if (static_cast<unsigned>(integer) <= 9) return vm.smallStrings.singleCharacterString(integer + '0'); return jsNontrivialString(&vm, vm.numericStrings.add(integer)); } if (isDouble()) return jsString(&vm, vm.numericStrings.add(asDouble())); if (isTrue()) return vm.smallStrings.trueString(); if (isFalse()) return vm.smallStrings.falseString(); if (isNull()) return vm.smallStrings.nullString(); if (isUndefined()) return vm.smallStrings.undefinedString(); if (isSymbol()) { throwTypeError(exec, scope, ASCIILiteral("Cannot convert a symbol to a string")); return errorValue(); } ASSERT(isCell()); JSValue value = asCell()->toPrimitive(exec, PreferString); if (vm.exception()) return errorValue(); ASSERT(!value.isObject()); JSString* result = value.toString(exec); if (vm.exception()) return errorValue(); return result; }
EncodedJSValue DFG_OPERATION operationGetByValCell(ExecState* exec, JSCell* base, EncodedJSValue encodedProperty) { JSValue property = JSValue::decode(encodedProperty); if (property.isUInt32()) return getByVal(exec, base, property.asUInt32()); if (property.isDouble()) { double propertyAsDouble = property.asDouble(); uint32_t propertyAsUInt32 = static_cast<uint32_t>(propertyAsDouble); if (propertyAsUInt32 == propertyAsDouble) return getByVal(exec, base, propertyAsUInt32); } else if (property.isString()) { if (JSValue result = base->fastGetOwnProperty(exec, asString(property)->value(exec))) return JSValue::encode(result); } Identifier ident(exec, property.toString(exec)); return JSValue::encode(JSValue(base).get(exec, ident)); }
void JSDictionary::convertValue(ExecState* exec, JSValue value, HashSet<AtomicString>& result) { result.clear(); if (value.isUndefinedOrNull()) return; unsigned length; JSObject* object = toJSSequence(exec, value, length); if (exec->hadException()) return; for (unsigned i = 0 ; i < length; ++i) { JSValue itemValue = object->get(exec, i); if (exec->hadException()) return; result.add(ustringToAtomicString(itemValue.toString(exec)->value(exec))); } }
static bool cryptoKeyFormatFromJSValue(ExecState* exec, JSValue value, CryptoKeyFormat& result) { String keyFormatString = value.toString(exec)->value(exec); if (exec->hadException()) return false; if (keyFormatString == "raw") result = CryptoKeyFormat::Raw; else if (keyFormatString == "pkcs8") result = CryptoKeyFormat::PKCS8; else if (keyFormatString == "spki") result = CryptoKeyFormat::SPKI; else if (keyFormatString == "jwk") result = CryptoKeyFormat::JWK; else { throwTypeError(exec, "Unknown key format"); return false; } return true; }
String JSCustomXPathNSResolver::lookupNamespaceURI(const String& prefix) { ASSERT(m_customResolver); JSLock lock(SilenceAssertionsOnly); ExecState* exec = m_globalObject->globalExec(); JSValue function = m_customResolver->get(exec, Identifier(exec, "lookupNamespaceURI")); CallData callData; CallType callType = getCallData(function, callData); if (callType == CallTypeNone) { callType = m_customResolver->getCallData(callData); if (callType == CallTypeNone) { // FIXME: Pass actual line number and source URL. m_globalObject->impl()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "XPathNSResolver does not have a lookupNamespaceURI method.", 0, String()); return String(); } function = m_customResolver; } RefPtr<JSCustomXPathNSResolver> selfProtector(this); MarkedArgumentBuffer args; args.append(jsString(exec, prefix)); m_globalObject->globalData().timeoutChecker.start(); JSValue retval = JSC::call(exec, function, callType, callData, m_customResolver, args); m_globalObject->globalData().timeoutChecker.stop(); String result; if (exec->hadException()) reportCurrentException(exec); else { if (!retval.isUndefinedOrNull()) result = ustringToString(retval.toString(exec)); } Document::updateStyleForAllDocuments(); return result; }
void setJSTestTypedefsStringAttrWithSetterException(ExecState* state, JSObject* baseObject, EncodedJSValue thisValue, EncodedJSValue encodedValue) { JSValue value = JSValue::decode(encodedValue); UNUSED_PARAM(baseObject); JSTestTypedefs* castedThis = jsDynamicCast<JSTestTypedefs*>(JSValue::decode(thisValue)); if (UNLIKELY(!castedThis)) { if (jsDynamicCast<JSTestTypedefsPrototype*>(JSValue::decode(thisValue))) reportDeprecatedSetterError(*state, "TestTypedefs", "stringAttrWithSetterException"); else throwSetterTypeError(*state, "TestTypedefs", "stringAttrWithSetterException"); return; } auto& impl = castedThis->impl(); ExceptionCode ec = 0; String nativeValue = value.toString(state)->value(state); if (UNLIKELY(state->hadException())) return; impl.setStringAttrWithSetterException(nativeValue, ec); setDOMException(state, ec); }