void injectInternalsObject(v8::Local<v8::Context> context) { ScriptState* scriptState = ScriptState::from(context); ScriptState::Scope scope(scriptState); v8::Handle<v8::Object> global = scriptState->context()->Global(); ExecutionContext* executionContext = scriptState->executionContext(); if (executionContext->isDocument()) global->Set(v8::String::NewFromUtf8(scriptState->isolate(), Internals::internalsId), toV8(Internals::create(toDocument(executionContext)), global, scriptState->isolate())); }
void injectInternalsObject(v8::Local<v8::Context> context) { ScriptState* scriptState = ScriptState::from(context); ScriptState::Scope scope(scriptState); v8::Local<v8::Object> global = scriptState->context()->Global(); ExecutionContext* executionContext = scriptState->executionContext(); if (executionContext->isDocument()) { v8::Local<v8::Value> internals = toV8(Internals::create(toDocument(executionContext)), global, scriptState->isolate()); ASSERT(!internals.IsEmpty()); v8CallOrCrash(global->Set(scriptState->context(), v8AtomicString(scriptState->isolate(), Internals::internalsId), internals)); } }
void resetInternalsObject(v8::Local<v8::Context> context) { // This can happen if JavaScript is disabled in the main frame. if (context.IsEmpty()) return; ScriptState* scriptState = ScriptState::from(context); ScriptState::Scope scope(scriptState); Page* page = toDocument(scriptState->executionContext())->frame()->page(); ASSERT(page); Internals::resetToConsistentState(page); InternalSettings::from(*page)->resetToConsistentState(); }
void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, InjectedScriptManager* injectedScriptManager, bool generatePreview) { RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console::ConsoleMessage::create() .setSource(messageSourceValue(m_source)) .setLevel(messageLevelValue(m_level)) .setText(m_message) .setTimestamp(m_timestamp); // FIXME: only send out type for ConsoleAPI source messages. jsonObj->setType(messageTypeValue(m_type)); jsonObj->setLine(static_cast<int>(m_line)); jsonObj->setColumn(static_cast<int>(m_column)); jsonObj->setUrl(m_url); ScriptState* scriptState = m_scriptState.get(); if (scriptState && scriptState->executionContext()->isDocument()) jsonObj->setExecutionContextId(injectedScriptManager->injectedScriptIdFor(scriptState)); if (m_source == NetworkMessageSource && !m_requestId.isEmpty()) jsonObj->setNetworkRequestId(m_requestId); if (m_arguments && m_arguments->argumentCount()) { InjectedScript injectedScript = injectedScriptManager->injectedScriptFor(m_arguments->scriptState()); if (!injectedScript.isEmpty()) { RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > jsonArgs = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); if (m_type == TableMessageType && generatePreview && m_arguments->argumentCount()) { ScriptValue table = m_arguments->argumentAt(0); ScriptValue columns = m_arguments->argumentCount() > 1 ? m_arguments->argumentAt(1) : ScriptValue(); RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapTable(table, columns); if (!inspectorValue) { ASSERT_NOT_REACHED(); return; } jsonArgs->addItem(inspectorValue); } else { for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) { RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview); if (!inspectorValue) { ASSERT_NOT_REACHED(); return; } jsonArgs->addItem(inspectorValue); } } jsonObj->setParameters(jsonArgs); } } if (m_callStack) jsonObj->setStackTrace(m_callStack->buildInspectorArray()); frontend->messageAdded(jsonObj); frontend->flush(); }
static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data) { v8::Local<v8::Promise> promise = data.GetPromise(); // Bail out if called during context initialization. v8::Isolate* isolate = promise->GetIsolate(); ScriptState* scriptState = ScriptState::current(isolate); if (!scriptState->contextIsValid()) return; ExecutionContext* executionContext = scriptState->executionContext(); if (!executionContext) return; ASSERT(executionContext->isWorkerGlobalScope()); WorkerScriptController* scriptController = toWorkerGlobalScope(executionContext)->script(); ASSERT(scriptController); if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { scriptController->rejectedPromises()->handlerAdded(data); return; } ASSERT(data.GetEvent() == v8::kPromiseRejectWithNoHandler); int scriptId = 0; int lineNumber = 0; int columnNumber = 0; String resourceName; String errorMessage; v8::Local<v8::Message> message = v8::Exception::CreateMessage(data.GetValue()); if (!message.IsEmpty()) { TOSTRING_VOID(V8StringResource<>, resourceName, message->GetScriptOrigin().ResourceName()); scriptId = message->GetScriptOrigin().ScriptID()->Value(); if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber) && v8Call(message->GetStartColumn(scriptState->context()), columnNumber)) ++columnNumber; // message->Get() can be empty here. https://crbug.com/450330 errorMessage = toCoreStringWithNullCheck(message->Get()); } scriptController->rejectedPromises()->rejectedWithNoHandler(scriptState, data, errorMessage, resourceName, scriptId, lineNumber, columnNumber, nullptr); }
static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data) { v8::Local<v8::Promise> promise = data.GetPromise(); // Bail out if called during context initialization. v8::Isolate* isolate = promise->GetIsolate(); ScriptState* scriptState = ScriptState::current(isolate); if (!scriptState->contextIsValid()) return; ExecutionContext* executionContext = scriptState->executionContext(); if (!executionContext) return; ASSERT(executionContext->isWorkerGlobalScope()); WorkerOrWorkletScriptController* scriptController = toWorkerGlobalScope(executionContext)->script(); ASSERT(scriptController); promiseRejectHandler(data, *scriptController->rejectedPromises(), String()); }
static void messageHandlerInWorker(v8::Local<v8::Message> message, v8::Local<v8::Value> data) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); V8PerIsolateData* perIsolateData = V8PerIsolateData::from(isolate); // Exceptions that occur in error handler should be ignored since in that case // WorkerGlobalScope::reportException will send the exception to the worker object. if (perIsolateData->isReportingException()) return; perIsolateData->setReportingException(true); ScriptState* scriptState = ScriptState::current(isolate); // During the frame teardown, there may not be a valid context. if (ExecutionContext* context = scriptState->executionContext()) { String errorMessage = toCoreStringWithNullCheck(message->Get()); TOSTRING_VOID(V8StringResource<>, sourceURL, message->GetScriptOrigin().ResourceName()); int scriptId = 0; RefPtrWillBeRawPtr<ScriptCallStack> callStack = extractCallStack(isolate, message, &scriptId); int lineNumber = 0; int columnNumber = 0; if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber) && v8Call(message->GetStartColumn(scriptState->context()), columnNumber)) ++columnNumber; RefPtrWillBeRawPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, sourceURL, lineNumber, columnNumber, &DOMWrapperWorld::current(isolate)); AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin; // If execution termination has been triggered as part of constructing // the error event from the v8::Message, quietly leave. if (!v8::V8::IsExecutionTerminating(isolate)) { V8ErrorHandler::storeExceptionOnErrorEventWrapper(isolate, event.get(), data, scriptState->context()->Global()); context->reportException(event.release(), scriptId, callStack, corsStatus); } } perIsolateData->setReportingException(false); }