static JSC::JSValue handleInitMessageEvent(JSMessageEvent* jsEvent, JSC::ExecState* exec) { const String& typeArg = exec->argument(0).toString(exec)->value(exec); bool canBubbleArg = exec->argument(1).toBoolean(exec); bool cancelableArg = exec->argument(2).toBoolean(exec); const String originArg = exec->argument(4).toString(exec)->value(exec); const String lastEventIdArg = exec->argument(5).toString(exec)->value(exec); DOMWindow* sourceArg = toDOMWindow(exec->argument(6)); std::unique_ptr<MessagePortArray> messagePorts; OwnPtr<ArrayBufferArray> arrayBuffers; if (!exec->argument(7).isUndefinedOrNull()) { messagePorts = std::make_unique<MessagePortArray>(); arrayBuffers = adoptPtr(new ArrayBufferArray); fillMessagePortArray(exec, exec->argument(7), *messagePorts, *arrayBuffers); if (exec->hadException()) return jsUndefined(); } Deprecated::ScriptValue dataArg = Deprecated::ScriptValue(exec->vm(), exec->argument(3)); if (exec->hadException()) return jsUndefined(); MessageEvent& event = jsEvent->impl(); event.initMessageEvent(typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, WTF::move(messagePorts)); jsEvent->m_data.set(exec->vm(), jsEvent, dataArg.jsValue()); return jsUndefined(); }
void InjectedScriptModule::ensureInjected(InjectedScriptManager* injectedScriptManager, InjectedScript injectedScript) { ASSERT(!injectedScript.hasNoValue()); if (injectedScript.hasNoValue()) return; // FIXME: Make the InjectedScript a module itself. JSC::APIEntryShim entryShim(injectedScript.scriptState()); Deprecated::ScriptFunctionCall function(injectedScript.injectedScriptObject(), ASCIILiteral("module"), injectedScriptManager->inspectorEnvironment().functionCallHandler()); function.appendArgument(name()); bool hadException = false; Deprecated::ScriptValue resultValue = injectedScript.callFunctionWithEvalEnabled(function, hadException); ASSERT(!hadException); if (hadException || resultValue.hasNoValue() || !resultValue.isObject()) { Deprecated::ScriptFunctionCall function(injectedScript.injectedScriptObject(), ASCIILiteral("injectModule"), injectedScriptManager->inspectorEnvironment().functionCallHandler()); function.appendArgument(name()); function.appendArgument(source()); function.appendArgument(host(injectedScriptManager, injectedScript.scriptState())); resultValue = injectedScript.callFunctionWithEvalEnabled(function, hadException); if (hadException || (returnsObject() && (resultValue.hasNoValue() || !resultValue.isObject()))) { ASSERT_NOT_REACHED(); return; } } if (returnsObject()) { Deprecated::ScriptObject moduleObject(injectedScript.scriptState(), resultValue); initialize(moduleObject, &injectedScriptManager->inspectorEnvironment()); } }
void InjectedScriptModule::ensureInjected(InjectedScriptManager* injectedScriptManager, InjectedScript injectedScript) { ASSERT(!injectedScript.hasNoValue()); if (injectedScript.hasNoValue()) return; // FIXME: Make the InjectedScript a module itself. Deprecated::ScriptFunctionCall function(injectedScript.injectedScriptObject(), "module", WebCore::functionCallHandlerFromAnyThread); function.appendArgument(name()); bool hadException = false; Deprecated::ScriptValue resultValue = injectedScript.callFunctionWithEvalEnabled(function, hadException); ASSERT(!hadException); if (hadException || resultValue.hasNoValue() || !resultValue.isObject()) { Deprecated::ScriptFunctionCall function(injectedScript.injectedScriptObject(), "injectModule", WebCore::functionCallHandlerFromAnyThread); function.appendArgument(name()); function.appendArgument(source()); function.appendArgument(host(injectedScriptManager, injectedScript.scriptState())); resultValue = injectedScript.callFunctionWithEvalEnabled(function, hadException); if (hadException || (returnsObject() && (resultValue.hasNoValue() || !resultValue.isObject()))) { ASSERT_NOT_REACHED(); return; } } if (returnsObject()) { Deprecated::ScriptObject moduleObject(injectedScript.scriptState(), resultValue); initialize(moduleObject, injectedScriptManager->inspectedStateAccessCheck()); } }
void WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode) { if (isExecutionForbidden()) return; Deprecated::ScriptValue exception; evaluate(sourceCode, &exception); if (exception.jsValue()) { JSLockHolder lock(vm()); reportException(m_workerGlobalScopeWrapper->globalExec(), exception.jsValue()); } }
RefPtr<InspectorObject> InspectorDebuggerAgent::buildExceptionPauseReason(const Deprecated::ScriptValue& exception, const InjectedScript& injectedScript) { ASSERT(!exception.hasNoValue()); if (exception.hasNoValue()) return nullptr; ASSERT(!injectedScript.hasNoValue()); if (injectedScript.hasNoValue()) return nullptr; return injectedScript.wrapObject(exception, InspectorDebuggerAgent::backtraceObjectGroup)->openAccessors(); }
Deprecated::ScriptObject InjectedScriptCanvasModule::callWrapContextFunction(const String& functionName, const Deprecated::ScriptObject& context) { Deprecated::ScriptFunctionCall function(injectedScriptObject(), functionName, WebCore::functionCallHandlerFromAnyThread); function.appendArgument(context); bool hadException = false; Deprecated::ScriptValue resultValue = callFunctionWithEvalEnabled(function, hadException); if (hadException || resultValue.hasNoValue() || !resultValue.isObject()) { ASSERT_NOT_REACHED(); return Deprecated::ScriptObject(); } return Deprecated::ScriptObject(context.scriptState(), resultValue); }
JSValue JSCommandLineAPIHost::inspectedObject(ExecState* exec) { CommandLineAPIHost::InspectableObject* object = impl().inspectedObject(); if (!object) return jsUndefined(); JSLockHolder lock(exec); Deprecated::ScriptValue scriptValue = object->get(exec); if (scriptValue.hasNoValue()) return jsUndefined(); return scriptValue.jsValue(); }
void InspectorHeapProfilerAgent::getHeapObjectId(ErrorString* errorString, const String& objectId, String* heapSnapshotObjectId) { InjectedScript injectedScript = m_injectedScriptManager->injectedScriptForObjectId(objectId); if (injectedScript.hasNoValue()) { *errorString = "Inspected context has gone"; return; } Deprecated::ScriptValue value = injectedScript.findObjectById(objectId); if (value.hasNoValue() || value.isUndefined()) { *errorString = "Object with given id not found"; return; } unsigned id = ScriptProfiler::getHeapObjectId(value); *heapSnapshotObjectId = String::number(id); }
PassRefPtr<Array<Inspector::TypeBuilder::Debugger::CallFrame>> InjectedScript::wrapCallFrames(const Deprecated::ScriptValue& callFrames) { ASSERT(!hasNoValue()); Deprecated::ScriptFunctionCall function(injectedScriptObject(), ASCIILiteral("wrapCallFrames"), inspectorEnvironment()->functionCallHandler()); function.appendArgument(callFrames); bool hadException = false; Deprecated::ScriptValue callFramesValue = callFunctionWithEvalEnabled(function, hadException); ASSERT(!hadException); RefPtr<InspectorValue> result = callFramesValue.toInspectorValue(scriptState()); if (result->type() == InspectorValue::TypeArray) return Array<Inspector::TypeBuilder::Debugger::CallFrame>::runtimeCast(result); return Array<Inspector::TypeBuilder::Debugger::CallFrame>::create(); }
RefPtr<WebCore::IDBRequest> IDBCursor::update(JSC::ExecState& exec, Deprecated::ScriptValue& value, ExceptionCode& ec) { LOG(IndexedDB, "IDBCursor::update"); if (sourcesDeleted()) { ec = IDBDatabaseException::InvalidStateError; return nullptr; } if (!transaction().isActive()) { ec = IDBDatabaseException::TransactionInactiveError; return nullptr; } if (transaction().isReadOnly()) { ec = IDBDatabaseException::ReadOnlyError; return nullptr; } if (!m_gotValue) { ec = IDBDatabaseException::InvalidStateError; return nullptr; } if (isKeyCursor()) { ec = IDBDatabaseException::InvalidStateError; return nullptr; } return effectiveObjectStore().put(exec, value.jsValue(), m_deprecatedCurrentPrimaryKey.jsValue(), ec); }
void InspectorDebuggerAgent::didPause(JSC::ExecState* scriptState, const Deprecated::ScriptValue& callFrames, const Deprecated::ScriptValue& exception) { ASSERT(scriptState && !m_pausedScriptState); m_pausedScriptState = scriptState; m_currentCallStack = callFrames; if (!exception.hasNoValue()) { InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); if (!injectedScript.hasNoValue()) { m_breakReason = InspectorDebuggerFrontendDispatcher::Reason::Exception; m_breakAuxData = injectedScript.wrapObject(exception, InspectorDebuggerAgent::backtraceObjectGroup)->openAccessors(); // m_breakAuxData might be null after this. } } m_frontendDispatcher->paused(currentCallFrames(), m_breakReason, m_breakAuxData); m_javaScriptPauseScheduled = false; if (m_continueToLocationBreakpointID != JSC::noBreakpointID) { scriptDebugServer().removeBreakpoint(m_continueToLocationBreakpointID); m_continueToLocationBreakpointID = JSC::noBreakpointID; } if (m_listener) m_listener->didPause(); }
bool injectIDBKeyIntoScriptValue(DOMRequestState* requestState, PassRefPtr<IDBKey> key, Deprecated::ScriptValue& value, const IDBKeyPath& keyPath) { LOG(StorageAPI, "injectIDBKeyIntoScriptValue"); ASSERT(keyPath.type() == IndexedDB::KeyPathType::String); Vector<String> keyPathElements; IDBKeyPathParseError error; IDBParseKeyPath(keyPath.string(), keyPathElements, error); ASSERT(error == IDBKeyPathParseError::None); if (keyPathElements.isEmpty()) return false; ExecState* exec = requestState->exec(); JSValue parent = ensureNthValueOnKeyPath(exec, value.jsValue(), keyPathElements, keyPathElements.size() - 1); if (parent.isUndefined()) return false; if (!set(exec, parent, keyPathElements.last(), idbKeyToJSValue(exec, exec->lexicalGlobalObject(), key.get()))) return false; return true; }
JSValue JSCommandLineAPIHost::inspectedObject(ExecState* exec) { if (exec->argumentCount() < 1) return jsUndefined(); CommandLineAPIHost::InspectableObject* object = impl().inspectedObject(exec->uncheckedArgument(0).toInt32(exec)); if (!object) return jsUndefined(); JSLockHolder lock(exec); Deprecated::ScriptValue scriptValue = object->get(exec); if (scriptValue.hasNoValue()) return jsUndefined(); return scriptValue.jsValue(); }
PassRefPtr<Inspector::TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapObject(const Deprecated::ScriptValue& value, const String& groupName, bool generatePreview) const { ASSERT(!hasNoValue()); Deprecated::ScriptFunctionCall wrapFunction(injectedScriptObject(), ASCIILiteral("wrapObject"), inspectorEnvironment()->functionCallHandler()); wrapFunction.appendArgument(value); wrapFunction.appendArgument(groupName); wrapFunction.appendArgument(hasAccessToInspectedScriptState()); wrapFunction.appendArgument(generatePreview); bool hadException = false; Deprecated::ScriptValue r = callFunctionWithEvalEnabled(wrapFunction, hadException); if (hadException) return nullptr; RefPtr<InspectorObject> rawResult = r.toInspectorValue(scriptState())->asObject(); return Inspector::TypeBuilder::Runtime::RemoteObject::runtimeCast(rawResult); }
void InjectedScriptBase::makeCall(Deprecated::ScriptFunctionCall& function, RefPtr<InspectorValue>* result) { if (hasNoValue() || !hasAccessToInspectedScriptState()) { *result = InspectorValue::null(); return; } bool hadException = false; Deprecated::ScriptValue resultValue = callFunctionWithEvalEnabled(function, hadException); ASSERT(!hadException); if (!hadException) { *result = resultValue.toInspectorValue(m_injectedScriptObject.scriptState()); if (!*result) *result = InspectorString::create(String::format("Object has too long reference chain (must not be longer than %d)", InspectorValue::maxDepth)); } else *result = InspectorString::create("Exception while making a call."); }
PassRefPtr<Inspector::TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapTable(const Deprecated::ScriptValue& table, const Deprecated::ScriptValue& columns) const { ASSERT(!hasNoValue()); Deprecated::ScriptFunctionCall wrapFunction(injectedScriptObject(), ASCIILiteral("wrapTable"), inspectorEnvironment()->functionCallHandler()); wrapFunction.appendArgument(hasAccessToInspectedScriptState()); wrapFunction.appendArgument(table); if (columns.hasNoValue()) wrapFunction.appendArgument(false); else wrapFunction.appendArgument(columns); bool hadException = false; Deprecated::ScriptValue r = callFunctionWithEvalEnabled(wrapFunction, hadException); if (hadException) return nullptr; RefPtr<InspectorObject> rawResult = r.toInspectorValue(scriptState())->asObject(); return Inspector::TypeBuilder::Runtime::RemoteObject::runtimeCast(rawResult); }
JSValue JSMessageEvent::data(ExecState* exec) const { if (JSValue cachedValue = m_data.get()) return cachedValue; MessageEvent& event = impl(); JSValue result; switch (event.dataType()) { case MessageEvent::DataTypeScriptValue: { Deprecated::ScriptValue scriptValue = event.dataAsScriptValue(); if (scriptValue.hasNoValue()) result = jsNull(); else result = scriptValue.jsValue(); break; } case MessageEvent::DataTypeSerializedScriptValue: if (RefPtr<SerializedScriptValue> serializedValue = event.dataAsSerializedScriptValue()) { MessagePortArray ports = impl().ports(); // FIXME: Why does this suppress exceptions? result = serializedValue->deserialize(exec, globalObject(), &ports, NonThrowing); } else result = jsNull(); break; case MessageEvent::DataTypeString: result = jsStringWithCache(exec, event.dataAsString()); break; case MessageEvent::DataTypeBlob: result = toJS(exec, globalObject(), event.dataAsBlob()); break; case MessageEvent::DataTypeArrayBuffer: result = toJS(exec, globalObject(), event.dataAsArrayBuffer()); break; } // Save the result so we don't have to deserialize the value again. const_cast<JSMessageEvent*>(this)->m_data.set(exec->vm(), this, result); return result; }
bool ScriptController::executeIfJavaScriptURL(const URL& url, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL) { if (!protocolIsJavaScript(url)) return false; if (!m_frame.page() || !m_frame.document()->contentSecurityPolicy()->allowJavaScriptURLs(m_frame.document()->url(), eventHandlerPosition().m_line)) return true; // We need to hold onto the Frame here because executing script can // destroy the frame. Ref<Frame> protector(m_frame); RefPtr<Document> ownerDocument(m_frame.document()); const int javascriptSchemeLength = sizeof("javascript:") - 1; String decodedURL = decodeURLEscapeSequences(url.string()); Deprecated::ScriptValue result = executeScript(decodedURL.substring(javascriptSchemeLength)); // If executing script caused this frame to be removed from the page, we // don't want to try to replace its document! if (!m_frame.page()) return true; String scriptResult; JSDOMWindowShell* shell = windowShell(mainThreadNormalWorld()); JSC::ExecState* exec = shell->window()->globalExec(); if (!result.getString(exec, scriptResult)) return true; // FIXME: We should always replace the document, but doing so // synchronously can cause crashes: // http://bugs.webkit.org/show_bug.cgi?id=16782 if (shouldReplaceDocumentIfJavaScriptURL == ReplaceDocumentIfJavaScriptURL) { // We're still in a frame, so there should be a DocumentLoader. ASSERT(m_frame.document()->loader()); // DocumentWriter::replaceDocument can cause the DocumentLoader to get deref'ed and possible destroyed, // so protect it with a RefPtr. if (RefPtr<DocumentLoader> loader = m_frame.document()->loader()) loader->writer().replaceDocument(scriptResult, ownerDocument.get()); } return true; }
RefPtr<WebCore::IDBRequest> IDBCursor::update(JSC::ExecState& exec, Deprecated::ScriptValue& value, ExceptionCodeWithMessage& ec) { LOG(IndexedDB, "IDBCursor::update"); if (sourcesDeleted()) { ec.code = IDBDatabaseException::InvalidStateError; return nullptr; } if (!transaction().isActive()) { ec.code = IDBDatabaseException::TransactionInactiveError; ec.message = ASCIILiteral("Failed to execute 'update' on 'IDBCursor': The transaction is inactive or finished."); return nullptr; } if (transaction().isReadOnly()) { ec.code = IDBDatabaseException::ReadOnlyError; ec.message = ASCIILiteral("Failed to execute 'update' on 'IDBCursor': The record may not be updated inside a read-only transaction."); return nullptr; } if (!m_gotValue) { ec.code = IDBDatabaseException::InvalidStateError; return nullptr; } if (isKeyCursor()) { ec.code = IDBDatabaseException::InvalidStateError; ec.message = ASCIILiteral("Failed to execute 'update' on 'IDBCursor': The cursor is a key cursor."); return nullptr; } auto& objectStore = effectiveObjectStore(); auto& keyPath = objectStore.info().keyPath(); const bool usesInLineKeys = !keyPath.isNull(); if (usesInLineKeys) { RefPtr<IDBKey> keyPathKey = maybeCreateIDBKeyFromScriptValueAndKeyPath(exec, value, keyPath); IDBKeyData keyPathKeyData(keyPathKey.get()); if (!keyPathKey || keyPathKeyData != m_currentPrimaryKeyData) { ec.code = IDBDatabaseException::DataError; ec.message = ASCIILiteral("Failed to execute 'update' on 'IDBCursor': The effective object store of this cursor uses in-line keys and evaluating the key path of the value parameter results in a different value than the cursor's effective key."); return nullptr; } } auto request = effectiveObjectStore().putForCursorUpdate(exec, value.jsValue(), m_deprecatedCurrentPrimaryKey.jsValue(), ec); if (ec.code) return nullptr; ASSERT(request); request->setSource(*this); return request; }
static RefPtr<IDBKey> internalCreateIDBKeyFromScriptValueAndKeyPath(ExecState* exec, const Deprecated::ScriptValue& value, const String& keyPath) { Vector<String> keyPathElements; IDBKeyPathParseError error; IDBParseKeyPath(keyPath, keyPathElements, error); ASSERT(error == IDBKeyPathParseErrorNone); JSValue jsValue = value.jsValue(); jsValue = getNthValueOnKeyPath(exec, jsValue, keyPathElements, keyPathElements.size()); if (jsValue.isUndefined()) return nullptr; return createIDBKeyFromValue(exec, jsValue); }
void WorkerGlobalScope::importScripts(const Vector<String>& urls, ExceptionCode& ec) { ASSERT(contentSecurityPolicy()); ec = 0; Vector<String>::const_iterator urlsEnd = urls.end(); Vector<URL> completedURLs; for (Vector<String>::const_iterator it = urls.begin(); it != urlsEnd; ++it) { const URL& url = scriptExecutionContext()->completeURL(*it); if (!url.isValid()) { ec = SYNTAX_ERR; return; } completedURLs.append(url); } Vector<URL>::const_iterator end = completedURLs.end(); for (Vector<URL>::const_iterator it = completedURLs.begin(); it != end; ++it) { Ref<WorkerScriptLoader> scriptLoader = WorkerScriptLoader::create(); scriptLoader->loadSynchronously(scriptExecutionContext(), *it, AllowCrossOriginRequests); // If the fetching attempt failed, throw a NETWORK_ERR exception and abort all these steps. if (scriptLoader->failed()) { ec = XMLHttpRequestException::NETWORK_ERR; return; } InspectorInstrumentation::scriptImported(scriptExecutionContext(), scriptLoader->identifier(), scriptLoader->script()); Deprecated::ScriptValue exception; m_script->evaluate(ScriptSourceCode(scriptLoader->script(), scriptLoader->responseURL()), &exception); if (!exception.hasNoValue()) { m_script->setException(exception); return; } } }
bool canInjectIDBKeyIntoScriptValue(DOMRequestState* requestState, const Deprecated::ScriptValue& scriptValue, const IDBKeyPath& keyPath) { LOG(StorageAPI, "canInjectIDBKeyIntoScriptValue"); ASSERT(keyPath.type() == IDBKeyPath::StringType); Vector<String> keyPathElements; IDBKeyPathParseError error; IDBParseKeyPath(keyPath.string(), keyPathElements, error); ASSERT(error == IDBKeyPathParseErrorNone); if (!keyPathElements.size()) return false; JSC::ExecState* exec = requestState->exec(); return canInjectNthValueOnKeyPath(exec, scriptValue.jsValue(), keyPathElements, keyPathElements.size() - 1); }
bool InspectorFrontendClientLocal::evaluateAsBoolean(const String& expression) { Deprecated::ScriptValue value = m_frontendPage->mainFrame().script().executeScript(expression); return value.toString(mainWorldExecState(&m_frontendPage->mainFrame())) == "true"; }
void InspectorDebuggerAgent::didPause(JSC::ExecState* scriptState, const Deprecated::ScriptValue& callFrames, const Deprecated::ScriptValue& exceptionOrCaughtValue) { ASSERT(scriptState && !m_pausedScriptState); m_pausedScriptState = scriptState; m_currentCallStack = callFrames; InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); // If a high level pause pause reason is not already set, try to infer a reason from the debugger. if (m_breakReason == DebuggerFrontendDispatcher::Reason::Other) { switch (scriptDebugServer().reasonForPause()) { case JSC::Debugger::PausedForBreakpoint: { JSC::BreakpointID debuggerBreakpointId = scriptDebugServer().pausingBreakpointID(); if (debuggerBreakpointId != m_continueToLocationBreakpointID) { m_breakReason = DebuggerFrontendDispatcher::Reason::Breakpoint; m_breakAuxData = buildBreakpointPauseReason(debuggerBreakpointId); } break; } case JSC::Debugger::PausedForDebuggerStatement: m_breakReason = DebuggerFrontendDispatcher::Reason::DebuggerStatement; m_breakAuxData = nullptr; break; case JSC::Debugger::PausedForException: m_breakReason = DebuggerFrontendDispatcher::Reason::Exception; m_breakAuxData = buildExceptionPauseReason(exceptionOrCaughtValue, injectedScript); break; case JSC::Debugger::PausedAtStatement: case JSC::Debugger::PausedAfterCall: case JSC::Debugger::PausedBeforeReturn: case JSC::Debugger::PausedAtStartOfProgram: case JSC::Debugger::PausedAtEndOfProgram: // Pause was just stepping. Nothing to report. break; case JSC::Debugger::NotPaused: ASSERT_NOT_REACHED(); break; } } // Set $exception to the exception or caught value. if (!exceptionOrCaughtValue.hasNoValue() && !injectedScript.hasNoValue()) { injectedScript.setExceptionValue(exceptionOrCaughtValue); m_hasExceptionValue = true; } m_frontendDispatcher->paused(currentCallFrames(injectedScript), m_breakReason, m_breakAuxData); m_javaScriptPauseScheduled = false; if (m_continueToLocationBreakpointID != JSC::noBreakpointID) { scriptDebugServer().removeBreakpoint(m_continueToLocationBreakpointID); m_continueToLocationBreakpointID = JSC::noBreakpointID; } if (m_listener) m_listener->didPause(); RefPtr<Stopwatch> stopwatch = m_injectedScriptManager->inspectorEnvironment().executionStopwatch(); if (stopwatch && stopwatch->isActive()) { stopwatch->stop(); m_didPauseStopwatch = true; } }
PassRefPtr<IDBRequest> IDBObjectStore::put(IDBDatabaseBackend::PutMode putMode, PassRefPtr<IDBAny> source, JSC::ExecState* state, Deprecated::ScriptValue& value, PassRefPtr<IDBKey> prpKey, ExceptionCode& ec) { RefPtr<IDBKey> key = prpKey; if (m_deleted) { ec = IDBDatabaseException::InvalidStateError; return nullptr; } if (!m_transaction->isActive()) { ec = IDBDatabaseException::TransactionInactiveError; return nullptr; } if (m_transaction->isReadOnly()) { ec = IDBDatabaseException::ReadOnlyError; return nullptr; } RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::create(state, value.jsValue(), nullptr, nullptr); if (state->hadException()) return nullptr; if (serializedValue->hasBlobURLs()) { // FIXME: Add Blob/File/FileList support ec = IDBDatabaseException::DataCloneError; return nullptr; } const IDBKeyPath& keyPath = m_metadata.keyPath; const bool usesInLineKeys = !keyPath.isNull(); const bool hasKeyGenerator = autoIncrement(); ScriptExecutionContext* context = scriptExecutionContextFromExecState(state); DOMRequestState requestState(context); if (putMode != IDBDatabaseBackend::CursorUpdate && usesInLineKeys && key) { ec = IDBDatabaseException::DataError; return nullptr; } if (!usesInLineKeys && !hasKeyGenerator && !key) { ec = IDBDatabaseException::DataError; return nullptr; } if (usesInLineKeys) { RefPtr<IDBKey> keyPathKey = createIDBKeyFromScriptValueAndKeyPath(requestState.exec(), value, keyPath); if (keyPathKey && !keyPathKey->isValid()) { ec = IDBDatabaseException::DataError; return nullptr; } if (!hasKeyGenerator && !keyPathKey) { ec = IDBDatabaseException::DataError; return nullptr; } if (hasKeyGenerator && !keyPathKey) { if (!canInjectIDBKeyIntoScriptValue(&requestState, value, keyPath)) { ec = IDBDatabaseException::DataError; return nullptr; } } if (keyPathKey) key = keyPathKey; } if (key && !key->isValid()) { ec = IDBDatabaseException::DataError; return nullptr; } Vector<int64_t> indexIds; Vector<IndexKeys> indexKeys; for (auto& index : m_metadata.indexes) { Vector<IDBKeyData> keyDatas; generateIndexKeysForValue(requestState.exec(), index.value, value, keyDatas); indexIds.append(index.key); // FIXME: Much of the Indexed DB code needs to use IDBKeyData directly to avoid wasteful conversions like this. Vector<RefPtr<IDBKey>> keys; for (auto& keyData : keyDatas) { RefPtr<IDBKey> key = keyData.maybeCreateIDBKey(); if (key) keys.append(key.release()); } indexKeys.append(keys); } RefPtr<IDBRequest> request = IDBRequest::create(context, source, m_transaction.get()); Vector<uint8_t> valueBytes = serializedValue->toWireBytes(); // This is a hack to account for disagreements about whether SerializedScriptValue should deal in Vector<uint8_t> or Vector<char>. // See https://lists.webkit.org/pipermail/webkit-dev/2013-February/023682.html Vector<char>* valueBytesSigned = reinterpret_cast<Vector<char>*>(&valueBytes); RefPtr<SharedBuffer> valueBuffer = SharedBuffer::adoptVector(*valueBytesSigned); backendDB()->put(m_transaction->id(), id(), valueBuffer, key.release(), static_cast<IDBDatabaseBackend::PutMode>(putMode), request, indexIds, indexKeys); return request.release(); }
void WorkerScriptController::setException(const Deprecated::ScriptValue& exception) { m_workerGlobalScopeWrapper->globalExec()->vm().throwException(m_workerGlobalScopeWrapper->globalExec(), exception.jsValue()); }
void ScriptCallArgumentHandler::appendArgument(const Deprecated::ScriptValue& argument) { m_arguments.append(argument.jsValue()); }
RefPtr<IDBKey> scriptValueToIDBKey(DOMRequestState* requestState, const Deprecated::ScriptValue& scriptValue) { ExecState* exec = requestState->exec(); return createIDBKeyFromValue(exec, scriptValue.jsValue()); }
RefPtr<WebCore::IDBRequest> IDBObjectStore::deleteFunction(ScriptExecutionContext* context, const Deprecated::ScriptValue& key, ExceptionCode& ec) { return deleteFunction(context, key.jsValue(), ec); }