void V8SVGLength::convertToSpecifiedUnitsMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) { SVGPropertyTearOff<SVGLength>* wrapper = V8SVGLength::toNative(info.Holder()); if (wrapper->isReadOnly()) { setDOMException(NoModificationAllowedError, info.GetIsolate()); return; } if (info.Length() < 1) { throwTypeError(ExceptionMessages::failedToExecute("convertToSpecifiedUnits", "SVGLength", ExceptionMessages::notEnoughArguments(1, info.Length())), info.GetIsolate()); return; } SVGLength& imp = wrapper->propertyReference(); ExceptionState exceptionState(info.Holder(), info.GetIsolate()); V8TRYCATCH_VOID(int, unitType, toUInt32(info[0])); SVGLengthContext lengthContext(wrapper->contextElement()); imp.convertToSpecifiedUnits(unitType, lengthContext, exceptionState); if (exceptionState.throwIfNeeded()) return; wrapper->commitChange(); }
EncodedJSValue JSC_HOST_CALL JSWebSocketConstructor::constructJSWebSocket(ExecState* exec) { JSWebSocketConstructor* jsConstructor = static_cast<JSWebSocketConstructor*>(exec->callee()); ScriptExecutionContext* context = jsConstructor->scriptExecutionContext(); if (!context) return throwVMError(exec, createReferenceError(exec, "WebSocket constructor associated document is unavailable")); if (!exec->argumentCount()) return throwVMError(exec, createSyntaxError(exec, "Not enough arguments")); String urlString = ustringToString(exec->argument(0).toString(exec)); if (exec->hadException()) return throwVMError(exec, createSyntaxError(exec, "wrong URL")); RefPtr<WebSocket> webSocket = WebSocket::create(context); ExceptionCode ec = 0; if (exec->argumentCount() < 2) webSocket->connect(urlString, ec); else { JSValue protocolsValue = exec->argument(1); if (isJSArray(&exec->globalData(), protocolsValue)) { Vector<String> protocols; JSArray* protocolsArray = asArray(protocolsValue); for (unsigned i = 0; i < protocolsArray->length(); ++i) { String protocol = ustringToString(protocolsArray->getIndex(i).toString(exec)); if (exec->hadException()) return JSValue::encode(JSValue()); protocols.append(protocol); } webSocket->connect(urlString, protocols, ec); } else { String protocol = ustringToString(protocolsValue.toString(exec)); if (exec->hadException()) return JSValue::encode(JSValue()); webSocket->connect(urlString, protocol, ec); } } setDOMException(exec, ec); return JSValue::encode(CREATE_DOM_WRAPPER(exec, jsConstructor->globalObject(), WebSocket, webSocket.get())); }
static JSValue getObjectParameter(JSWebGLRenderingContextBase* obj, ExecState* exec, ObjectType objectType) { if (exec->argumentCount() != 2) return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); ExceptionCode ec = 0; WebGLRenderingContextBase& context = obj->impl(); unsigned target = exec->uncheckedArgument(0).toInt32(exec); if (exec->hadException()) return jsUndefined(); unsigned pname = exec->uncheckedArgument(1).toInt32(exec); if (exec->hadException()) return jsUndefined(); WebGLGetInfo info; switch (objectType) { case kBuffer: info = context.getBufferParameter(target, pname, ec); break; case kRenderbuffer: info = context.getRenderbufferParameter(target, pname, ec); break; case kTexture: info = context.getTexParameter(target, pname, ec); break; case kVertexAttrib: // target => index info = context.getVertexAttrib(target, pname, ec); break; default: notImplemented(); break; } if (ec) { setDOMException(exec, ec); return jsUndefined(); } return toJS(exec, obj->globalObject(), info); }
JSValue JSIDBObjectStore::createIndex(ExecState* exec) { ScriptExecutionContext* context = jsCast<JSDOMGlobalObject*>(exec->lexicalGlobalObject())->scriptExecutionContext(); if (!context) return exec->vm().throwException(exec, createReferenceError(exec, "IDBObjectStore script execution context is unavailable")); if (exec->argumentCount() < 2) return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); String name = exec->argument(0).toString(exec)->value(exec); if (exec->hadException()) return jsUndefined(); IDBKeyPath keyPath = idbKeyPathFromValue(exec, exec->argument(1)); if (exec->hadException()) return jsUndefined(); JSValue optionsValue = exec->argument(2); if (!optionsValue.isUndefinedOrNull() && !optionsValue.isObject()) return throwTypeError(exec, "Not an object."); bool unique = false; bool multiEntry = false; if (!optionsValue.isUndefinedOrNull()) { unique = optionsValue.get(exec, Identifier(exec, "unique")).toBoolean(exec); if (exec->hadException()) return jsUndefined(); multiEntry = optionsValue.get(exec, Identifier(exec, "multiEntry")).toBoolean(exec); if (exec->hadException()) return jsUndefined(); } ExceptionCode ec = 0; JSValue result = toJS(exec, globalObject(), impl().createIndex(context, name, keyPath, unique, multiEntry, ec).get()); setDOMException(exec, ec); return result; }
JSValue JSNavigator::webkitGetUserMedia(ExecState* exec) { if (exec->argumentCount() < 2) { throwVMError(exec, createNotEnoughArgumentsError(exec)); return jsUndefined(); } Dictionary options(exec, exec->argument(0)); if (exec->hadException()) return jsUndefined(); if (!options.isObject()) { throwVMError(exec, createTypeError(exec, "First argument of webkitGetUserMedia must be a valid Dictionary")); return jsUndefined(); } if (!exec->argument(1).isFunction()) { throwVMTypeError(exec, "Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function"); return jsUndefined(); } JSNavigator* castedThis = jsDynamicCast<JSNavigator*>(exec->thisValue()); RefPtr<NavigatorUserMediaErrorCallback> errorCallback; if (!exec->argument(2).isUndefinedOrNull()) { if (!exec->uncheckedArgument(2).isFunction()) { throwVMTypeError(exec, "Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function"); return jsUndefined(); } errorCallback = JSNavigatorUserMediaErrorCallback::create(asObject(exec->uncheckedArgument(2)), castedThis->globalObject()); } RefPtr<NavigatorUserMediaSuccessCallback> successCallback = JSNavigatorUserMediaSuccessCallback::create(asObject(exec->uncheckedArgument(1)), castedThis->globalObject()); Navigator& impl = castedThis->impl(); ExceptionCode ec = 0; NavigatorMediaStream::webkitGetUserMedia(&impl, options, successCallback, errorCallback, ec); setDOMException(exec, ec); return jsUndefined(); }
std::unique_ptr<CryptoAlgorithmParameters> JSCryptoAlgorithmDictionary::createParametersForImportKey(ExecState* exec, CryptoAlgorithmIdentifier algorithm, JSValue value) { switch (algorithm) { case CryptoAlgorithmIdentifier::RSAES_PKCS1_v1_5: return std::make_unique<CryptoAlgorithmParameters>(); case CryptoAlgorithmIdentifier::RSASSA_PKCS1_v1_5: return createRsaKeyParamsWithHash(exec, value); case CryptoAlgorithmIdentifier::RSA_PSS: return std::make_unique<CryptoAlgorithmParameters>(); case CryptoAlgorithmIdentifier::RSA_OAEP: return createRsaKeyParamsWithHash(exec, value); case CryptoAlgorithmIdentifier::ECDSA: case CryptoAlgorithmIdentifier::ECDH: case CryptoAlgorithmIdentifier::AES_CTR: case CryptoAlgorithmIdentifier::AES_CBC: case CryptoAlgorithmIdentifier::AES_CMAC: case CryptoAlgorithmIdentifier::AES_GCM: case CryptoAlgorithmIdentifier::AES_CFB: case CryptoAlgorithmIdentifier::AES_KW: return std::make_unique<CryptoAlgorithmParameters>(); case CryptoAlgorithmIdentifier::HMAC: return createHmacParams(exec, value); case CryptoAlgorithmIdentifier::DH: return std::make_unique<CryptoAlgorithmParameters>(); case CryptoAlgorithmIdentifier::SHA_1: case CryptoAlgorithmIdentifier::SHA_224: case CryptoAlgorithmIdentifier::SHA_256: case CryptoAlgorithmIdentifier::SHA_384: case CryptoAlgorithmIdentifier::SHA_512: case CryptoAlgorithmIdentifier::CONCAT: case CryptoAlgorithmIdentifier::HKDF_CTR: case CryptoAlgorithmIdentifier::PBKDF2: setDOMException(exec, NOT_SUPPORTED_ERR); return nullptr; } RELEASE_ASSERT_NOT_REACHED(); return nullptr; }
EncodedJSValue JSC_HOST_CALL jsIDBCursorPrototypeFunctionUpdate(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSIDBCursor::s_info)) return throwVMTypeError(exec); JSIDBCursor* castedThis = static_cast<JSIDBCursor*>(asObject(thisValue)); ASSERT_GC_OBJECT_INHERITS(castedThis, &JSIDBCursor::s_info); IDBCursor* imp = static_cast<IDBCursor*>(castedThis->impl()); if (exec->argumentCount() < 1) return throwVMError(exec, createTypeError(exec, "Not enough arguments")); ExceptionCode ec = 0; ScriptExecutionContext* scriptContext = static_cast<JSDOMGlobalObject*>(exec->lexicalGlobalObject())->scriptExecutionContext(); if (!scriptContext) return JSValue::encode(jsUndefined()); RefPtr<SerializedScriptValue> value(SerializedScriptValue::create(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); JSC::JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->update(scriptContext, value, ec))); setDOMException(exec, ec); return JSValue::encode(result); }
JSValue JSHistory::replaceState(ExecState* exec) { RefPtr<SerializedScriptValue> historyState = SerializedScriptValue::create(exec, exec->argument(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); return jsUndefined(); }
static JSObject* constructSharedWorker(ExecState* exec, JSObject* constructor, const ArgList& args) { JSSharedWorkerConstructor* jsConstructor = static_cast<JSSharedWorkerConstructor*>(constructor); if (args.size() < 1) return throwError(exec, SyntaxError, "Not enough arguments"); UString scriptURL = args.at(0).toString(exec); UString name; if (args.size() > 1) name = args.at(1).toString(exec); if (exec->hadException()) return 0; // FIXME: We need to use both the dynamic scope and the lexical scope (dynamic scope for resolving the worker URL) DOMWindow* window = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); ExceptionCode ec = 0; RefPtr<SharedWorker> worker = SharedWorker::create(scriptURL, name, window->document(), ec); setDOMException(exec, ec); return asObject(toJS(exec, jsConstructor->globalObject(), worker.release())); }
static JSObject* constructEventSource(ExecState* exec, JSObject* constructor, const ArgList& args) { if (args.size() < 1) return throwError(exec, SyntaxError, "Not enough arguments"); UString url = args.at(0).toString(exec); if (exec->hadException()) return 0; JSEventSourceConstructor* jsConstructor = static_cast<JSEventSourceConstructor*>(constructor); ScriptExecutionContext* context = jsConstructor->scriptExecutionContext(); if (!context) return throwError(exec, ReferenceError, "EventSource constructor associated document is unavailable"); ExceptionCode ec = 0; RefPtr<EventSource> eventSource = EventSource::create(url, context, ec); if (ec) { setDOMException(exec, ec); return 0; } return asObject(toJS(exec, jsConstructor->globalObject(), eventSource.release())); }
JSValue JSWebGLRenderingContextBase::getFramebufferAttachmentParameter(ExecState& state) { if (state.argumentCount() != 3) return state.vm().throwException(&state, createNotEnoughArgumentsError(&state)); ExceptionCode ec = 0; WebGLRenderingContextBase& context = wrapped(); unsigned target = state.uncheckedArgument(0).toInt32(&state); if (state.hadException()) return jsUndefined(); unsigned attachment = state.uncheckedArgument(1).toInt32(&state); if (state.hadException()) return jsUndefined(); unsigned pname = state.uncheckedArgument(2).toInt32(&state); if (state.hadException()) return jsUndefined(); WebGLGetInfo info = context.getFramebufferAttachmentParameter(target, attachment, pname, ec); if (ec) { setDOMException(&state, ec); return jsUndefined(); } return toJS(&state, globalObject(), info); }
static v8::Handle<v8::Value> handlePostMessageCallback(const v8::Arguments& args) { INC_STATS("DOM.Worker.postMessage"); Worker* worker = V8Worker::toNative(args.Holder()); MessagePortArray ports; ArrayBufferArray arrayBuffers; if (args.Length() > 1) { if (!extractTransferables(args[1], ports, arrayBuffers, args.GetIsolate())) return v8::Undefined(); } bool didThrow = false; RefPtr<SerializedScriptValue> message = SerializedScriptValue::create(args[0], &ports, &arrayBuffers, didThrow, args.GetIsolate()); if (didThrow) return v8::Undefined(); ExceptionCode ec = 0; worker->postMessage(message.release(), &ports, ec); return setDOMException(ec, args.GetIsolate()); }
EncodedJSValue JSC_HOST_CALL JSWorkerConstructor::constructJSWorker(ExecState* exec) { JSWorkerConstructor* jsConstructor = static_cast<JSWorkerConstructor*>(exec->callee()); if (!exec->argumentCount()) return throwVMError(exec, createTypeError(exec, "Not enough arguments")); UString scriptURL = exec->argument(0).toString(exec); if (exec->hadException()) return JSValue::encode(JSValue()); // See section 4.8.2 step 14 of WebWorkers for why this is the lexicalGlobalObject. DOMWindow* window = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); ExceptionCode ec = 0; RefPtr<Worker> worker = Worker::create(ustringToString(scriptURL), window->document(), ec); if (ec) { setDOMException(exec, ec); return JSValue::encode(JSValue()); } return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), worker.release()))); }
JSValue JSWebGLRenderingContextBase::getFramebufferAttachmentParameter(ExecState* exec) { if (exec->argumentCount() != 3) return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); ExceptionCode ec = 0; WebGLRenderingContextBase& context = impl(); unsigned target = exec->uncheckedArgument(0).toInt32(exec); if (exec->hadException()) return jsUndefined(); unsigned attachment = exec->uncheckedArgument(1).toInt32(exec); if (exec->hadException()) return jsUndefined(); unsigned pname = exec->uncheckedArgument(2).toInt32(exec); if (exec->hadException()) return jsUndefined(); WebGLGetInfo info = context.getFramebufferAttachmentParameter(target, attachment, pname, ec); if (ec) { setDOMException(exec, ec); return jsUndefined(); } return toJS(exec, globalObject(), info); }
static JSObject* constructWorker(ExecState* exec, JSObject* constructor, const ArgList& args) { JSWorkerConstructor* jsConstructor = static_cast<JSWorkerConstructor*>(constructor); if (args.size() == 0) return throwError(exec, SyntaxError, "Not enough arguments"); UString scriptURL = args.at(0).toString(exec); if (exec->hadException()) return 0; // See section 4.8.2 step 14 of WebWorkers for why this is the lexicalGlobalObject. DOMWindow* window = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); ExceptionCode ec = 0; RefPtr<Worker> worker = Worker::create(scriptURL, window->document(), ec); if (ec) { setDOMException(exec, ec); return 0; } return asObject(toJS(exec, jsConstructor->globalObject(), worker.release())); }
JSObject* JSHTMLOptionElementConstructor::construct(ExecState* exec, const List& args) { int exception = 0; RefPtr<Element> el(m_doc->createElement("option", exception)); HTMLOptionElement* opt = 0; if (el) { opt = static_cast<HTMLOptionElement*>(el.get()); int sz = args.size(); RefPtr<Text> text = m_doc->createTextNode(""); opt->appendChild(text, exception); if (exception == 0 && sz > 0) text->setData(args[0]->toString(exec), exception); if (exception == 0 && sz > 1) opt->setValue(args[1]->toString(exec)); if (exception == 0 && sz > 2) opt->setDefaultSelected(args[2]->toBoolean(exec)); if (exception == 0 && sz > 3) opt->setSelected(args[3]->toBoolean(exec)); } setDOMException(exec, exception); return static_cast<JSObject*>(toJS(exec, opt)); }
bool JSStorage::putDelegate(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot&) { // Only perform the custom put if the object doesn't have a native property by this name. // Since hasProperty() would end up calling canGetItemsForName() and be fooled, we need to check // the native property slots manually. PropertySlot slot; if (getStaticValueSlot<JSStorage, Base>(exec, s_info.propHashTable(exec), this, propertyName, slot)) return false; JSValue prototype = this->prototype(); if (prototype.isObject() && asObject(prototype)->hasProperty(exec, propertyName)) return false; String stringValue = ustringToString(value.toString(exec)->value(exec)); if (exec->hadException()) return true; ExceptionCode ec = 0; impl()->setItem(identifierToString(propertyName), stringValue, ec); setDOMException(exec, ec); return true; }
JSValue JSWebGLRenderingContext::getFramebufferAttachmentParameter(ExecState* exec) { if (exec->argumentCount() != 3) return throwSyntaxError(exec); ExceptionCode ec = 0; WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl()); unsigned target = exec->argument(0).toInt32(exec); if (exec->hadException()) return jsUndefined(); unsigned attachment = exec->argument(1).toInt32(exec); if (exec->hadException()) return jsUndefined(); unsigned pname = exec->argument(2).toInt32(exec); if (exec->hadException()) return jsUndefined(); WebGLGetInfo info = context->getFramebufferAttachmentParameter(target, attachment, pname, ec); if (ec) { setDOMException(exec, ec); return jsUndefined(); } return toJS(exec, globalObject(), info); }
bool JSStorage::customPut(ExecState* exec, const Identifier& propertyName, JSValue* value) { // Only perform the custom put if the object doesn't have a native property by this name. // Since hasProperty() would end up calling canGetItemsForName() and be fooled, we need to check // the native property slots manually. PropertySlot slot; if (getStaticValueSlot<JSStorage, Base>(exec, s_info.propHashTable(exec), this, propertyName, slot)) return false; JSValue* prototype = this->prototype(); if (prototype->isObject() && static_cast<JSObject*>(prototype)->hasProperty(exec, propertyName)) return false; String stringValue = valueToStringWithNullCheck(exec, value); if (exec->hadException()) return true; ExceptionCode ec = 0; impl()->setItem(propertyName, stringValue, ec); setDOMException(exec, ec); return true; }
JSValue* JSSVGElementInstanceListPrototypeFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args) { if (!thisObj->inherits(&JSSVGElementInstanceList::info)) return throwError(exec, TypeError); SVGElementInstanceList* imp = static_cast<SVGElementInstanceList*>(static_cast<JSSVGElementInstanceList*>(thisObj)->impl()); switch (id) { case JSSVGElementInstanceList::ItemFuncNum: { bool indexOk; unsigned index = args[0]->toInt32(exec, indexOk); if (!indexOk) { setDOMException(exec, TYPE_MISMATCH_ERR); return jsUndefined(); } KJS::JSValue* result = toJS(exec, WTF::getPtr(imp->item(index))); return result; } } return 0; }
EncodedJSValue JSC_HOST_CALL jsCSSStyleDeclarationPrototypeFunctionSetProperty(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSCSSStyleDeclaration::s_info)) return throwVMTypeError(exec); JSCSSStyleDeclaration* castedThis = static_cast<JSCSSStyleDeclaration*>(asObject(thisValue)); ASSERT_GC_OBJECT_INHERITS(castedThis, &JSCSSStyleDeclaration::s_info); CSSStyleDeclaration* imp = static_cast<CSSStyleDeclaration*>(castedThis->impl()); ExceptionCode ec = 0; const String& propertyName(ustringToString(exec->argument(0).toString(exec))); if (exec->hadException()) return JSValue::encode(jsUndefined()); const String& value(valueToStringWithNullCheck(exec, exec->argument(1))); if (exec->hadException()) return JSValue::encode(jsUndefined()); const String& priority(ustringToString(exec->argument(2).toString(exec))); if (exec->hadException()) return JSValue::encode(jsUndefined()); imp->setProperty(propertyName, value, priority, ec); setDOMException(exec, ec); return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL JSEventSourceConstructor::constructJSEventSource(ExecState* exec) { if (exec->argumentCount() < 1) return throwVMError(exec, createTypeError(exec, "Not enough arguments")); UString url = exec->argument(0).toString(exec); if (exec->hadException()) return JSValue::encode(JSValue()); JSEventSourceConstructor* jsConstructor = static_cast<JSEventSourceConstructor*>(exec->callee()); ScriptExecutionContext* context = jsConstructor->scriptExecutionContext(); if (!context) return throwVMError(exec, createReferenceError(exec, "EventSource constructor associated document is unavailable")); ExceptionCode ec = 0; RefPtr<EventSource> eventSource = EventSource::create(ustringToString(url), context, ec); if (ec) { setDOMException(exec, ec); return JSValue::encode(JSValue()); } return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), eventSource.release()))); }
EncodedJSValue JSC_HOST_CALL jsDOMImplementationPrototypeFunctionCreateDocument(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSDOMImplementation::s_info)) return throwVMTypeError(exec); JSDOMImplementation* castedThis = static_cast<JSDOMImplementation*>(asObject(thisValue)); ASSERT_GC_OBJECT_INHERITS(castedThis, &JSDOMImplementation::s_info); DOMImplementation* imp = static_cast<DOMImplementation*>(castedThis->impl()); ExceptionCode ec = 0; const String& namespaceURI(valueToStringWithNullCheck(exec, exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); const String& qualifiedName(valueToStringWithNullCheck(exec, exec->argument(1))); if (exec->hadException()) return JSValue::encode(jsUndefined()); DocumentType* doctype(toDocumentType(exec->argument(2))); if (exec->hadException()) return JSValue::encode(jsUndefined()); JSC::JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->createDocument(namespaceURI, qualifiedName, doctype, ec))); setDOMException(exec, ec); return JSValue::encode(result); }
EncodedJSValue JSC_HOST_CALL jsXPathExpressionPrototypeFunctionEvaluate(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&JSXPathExpression::s_info)) return throwVMTypeError(exec); JSXPathExpression* castedThis = static_cast<JSXPathExpression*>(asObject(thisValue)); ASSERT_GC_OBJECT_INHERITS(castedThis, &JSXPathExpression::s_info); XPathExpression* imp = static_cast<XPathExpression*>(castedThis->impl()); ExceptionCode ec = 0; Node* contextNode(toNode(exec->argument(0))); if (exec->hadException()) return JSValue::encode(jsUndefined()); unsigned short type(exec->argument(1).toUInt32(exec)); if (exec->hadException()) return JSValue::encode(jsUndefined()); XPathResult* inResult(toXPathResult(exec->argument(2))); if (exec->hadException()) return JSValue::encode(jsUndefined()); JSC::JSValue result = toJS(exec, castedThis->globalObject(), WTF::getPtr(imp->evaluate(contextNode, type, inResult, ec))); setDOMException(exec, ec); return JSValue::encode(result); }
JSValue JSXMLHttpRequest::send(ExecState* exec) { InspectorInstrumentation::willSendXMLHttpRequest(impl()->scriptExecutionContext(), impl()->url()); ExceptionCode ec = 0; if (!exec->argumentCount()) impl()->send(ec); else { JSValue val = exec->argument(0); if (val.isUndefinedOrNull()) impl()->send(ec); else if (val.inherits(&JSDocument::s_info)) impl()->send(toDocument(val), ec); else if (val.inherits(&JSBlob::s_info)) impl()->send(toBlob(val), ec); else if (val.inherits(&JSDOMFormData::s_info)) impl()->send(toDOMFormData(val), ec); else if (val.inherits(&JSArrayBuffer::s_info)) impl()->send(toArrayBuffer(val), ec); else if (val.inherits(&JSArrayBufferView::s_info)) impl()->send(toArrayBufferView(val), ec); else impl()->send(val.toString(exec)->value(exec), ec); } int signedLineNumber; intptr_t sourceID; String sourceURL; JSValue function; exec->interpreter()->retrieveLastCaller(exec, signedLineNumber, sourceID, sourceURL, function); impl()->setLastSendLineNumber(signedLineNumber >= 0 ? signedLineNumber : 0); impl()->setLastSendURL(sourceURL); setDOMException(exec, ec); return jsUndefined(); }
v8::Handle<v8::Value> V8AudioContext::constructorCallbackCustom(const v8::Arguments& args) { Document* document = currentDocument(BindingState::instance()); RefPtr<AudioContext> audioContext; if (!args.Length()) { // Constructor for default AudioContext which talks to audio hardware. ExceptionCode ec = 0; audioContext = AudioContext::create(document, ec); if (ec) return setDOMException(ec, args.GetIsolate()); if (!audioContext.get()) return throwError(v8SyntaxError, "audio resources unavailable for AudioContext construction", args.GetIsolate()); } else { #if ENABLE(LEGACY_WEB_AUDIO) // Constructor for offline (render-target) AudioContext which renders into an AudioBuffer. // new AudioContext(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate); document->addConsoleMessage(JSMessageSource, WarningMessageLevel, "Deprecated AudioContext constructor: use OfflineAudioContext instead"); return V8OfflineAudioContext::constructorCallback(args); #else return throwError(v8SyntaxError, "Illegal AudioContext constructor", args.GetIsolate()); #endif } if (!audioContext.get()) return throwError(v8SyntaxError, "Error creating AudioContext", args.GetIsolate()); // Transform the holder into a wrapper object for the audio context. v8::Handle<v8::Object> wrapper = args.Holder(); V8DOMWrapper::associateObjectWithWrapper(audioContext.release(), &info, wrapper, args.GetIsolate()); return wrapper; }
JSValue JSWebGLRenderingContext::getAttachedShaders(ExecState* exec) { if (exec->argumentCount() < 1) return throwSyntaxError(exec); ExceptionCode ec = 0; WebGLRenderingContext* context = static_cast<WebGLRenderingContext*>(impl()); if (exec->argumentCount() > 0 && !exec->argument(0).isUndefinedOrNull() && !exec->argument(0).inherits(&JSWebGLProgram::s_info)) return throwTypeError(exec); WebGLProgram* program = toWebGLProgram(exec->argument(0)); if (exec->hadException()) return jsUndefined(); Vector<WebGLShader*> shaders; bool succeed = context->getAttachedShaders(program, shaders, ec); if (ec) { setDOMException(exec, ec); return jsUndefined(); } if (!succeed) return jsUndefined(); MarkedArgumentBuffer list; for (size_t ii = 0; ii < shaders.size(); ++ii) list.append(toJS(exec, globalObject(), shaders[ii])); return constructArray(exec, list); }
EncodedJSValue JSC_HOST_CALL constructJSWorker(ExecState* exec) { DOMConstructorObject* jsConstructor = jsCast<DOMConstructorObject*>(exec->callee()); if (!exec->argumentCount()) return throwVMError(exec, createNotEnoughArgumentsError(exec)); String scriptURL = exec->argument(0).toString(exec)->value(exec); if (exec->hadException()) return JSValue::encode(JSValue()); // See section 4.8.2 step 14 of WebWorkers for why this is the lexicalGlobalObject. DOMWindow& window = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); ExceptionCode ec = 0; ASSERT(window.document()); RefPtr<Worker> worker = Worker::create(*window.document(), scriptURL, ec); if (ec) { setDOMException(exec, ec); return JSValue::encode(JSValue()); } return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), worker.release()))); }
JSValue JSNotificationCenter::requestPermission(ExecState* exec) { ScriptExecutionContext* context = impl()->scriptExecutionContext(); // Make sure that script execution context is valid. if (!context) { setDOMException(exec, INVALID_STATE_ERR); return jsUndefined(); } // Permission request is only valid from page context. if (context->isWorkerContext()) return throwSyntaxError(exec); // If a callback function is provided as first argument, convert to a VoidCallback. RefPtr<JSVoidCallback> callback; if (exec->argument(0).isObject()) { callback = JSVoidCallback::create(exec->argument(0).getObject(), toJSDOMGlobalObject(static_cast<Document*>(context), exec)); if (exec->hadException()) return jsUndefined(); } impl()->requestPermission(callback.release()); return jsUndefined(); }
static JSValue getDataViewMember(ExecState* exec, DataView* imp, DataViewAccessType type) { if (exec->argumentCount() < 1) return throwError(exec, createNotEnoughArgumentsError(exec)); ExceptionCode ec = 0; unsigned byteOffset = exec->argument(0).toUInt32(exec); if (exec->hadException()) return jsUndefined(); bool littleEndian = false; if (exec->argumentCount() > 1 && (type == AccessDataViewMemberAsFloat32 || type == AccessDataViewMemberAsFloat64)) { littleEndian = exec->argument(1).toBoolean(); if (exec->hadException()) return jsUndefined(); } JSC::JSValue result; switch (type) { case AccessDataViewMemberAsInt8: result = jsNumber(imp->getInt8(byteOffset, ec)); break; case AccessDataViewMemberAsUint8: result = jsNumber(imp->getUint8(byteOffset, ec)); break; case AccessDataViewMemberAsFloat32: case AccessDataViewMemberAsFloat64: { double value = (type == AccessDataViewMemberAsFloat32) ? imp->getFloat32(byteOffset, littleEndian, ec) : imp->getFloat64(byteOffset, littleEndian, ec); result = isnan(value) ? jsNaN() : jsNumber(value); break; } default: ASSERT_NOT_REACHED(); break; } setDOMException(exec, ec); return result; }