ScriptValue WorkerOrWorkletScriptController::evaluate( const String& script, const String& fileName, const TextPosition& scriptStartPosition, CachedMetadataHandler* cacheHandler, V8CacheOptions v8CacheOptions) { TRACE_EVENT1("devtools.timeline", "EvaluateScript", "data", InspectorEvaluateScriptEvent::data(nullptr, fileName, scriptStartPosition)); if (!initializeContextIfNeeded()) return ScriptValue(); ScriptState::Scope scope(m_scriptState.get()); if (!m_disableEvalPending.isEmpty()) { m_scriptState->context()->AllowCodeGenerationFromStrings(false); m_scriptState->context()->SetErrorMessageForCodeGenerationFromStrings( v8String(m_isolate, m_disableEvalPending)); m_disableEvalPending = String(); } v8::TryCatch block(m_isolate); v8::Local<v8::Script> compiledScript; v8::MaybeLocal<v8::Value> maybeResult; if (v8Call(V8ScriptRunner::compileScript( script, fileName, String(), scriptStartPosition, m_isolate, cacheHandler, SharableCrossOrigin, v8CacheOptions), compiledScript, block)) maybeResult = V8ScriptRunner::runCompiledScript(m_isolate, compiledScript, m_globalScope); if (!block.CanContinue()) { forbidExecution(); return ScriptValue(); } if (block.HasCaught()) { v8::Local<v8::Message> message = block.Message(); m_executionState->hadException = true; m_executionState->errorMessage = toCoreString(message->Get()); m_executionState->m_location = SourceLocation::fromMessage( m_isolate, message, m_scriptState->getExecutionContext()); m_executionState->exception = ScriptValue(m_scriptState.get(), block.Exception()); block.Reset(); } else { m_executionState->hadException = false; } v8::Local<v8::Value> result; if (!maybeResult.ToLocal(&result) || result->IsUndefined()) return ScriptValue(); return ScriptValue(m_scriptState.get(), result); }
ScriptValue WorkerScriptController::evaluate(const String& script, const String& fileName, const TextPosition& scriptStartPosition, CachedMetadataHandler* cacheHandler, V8CacheOptions v8CacheOptions) { if (!initializeContextIfNeeded()) return ScriptValue(); ScriptState::Scope scope(m_scriptState.get()); if (!m_disableEvalPending.isEmpty()) { m_scriptState->context()->AllowCodeGenerationFromStrings(false); m_scriptState->context()->SetErrorMessageForCodeGenerationFromStrings(v8String(isolate(), m_disableEvalPending)); m_disableEvalPending = String(); } v8::TryCatch block(isolate()); v8::Local<v8::Script> compiledScript; v8::MaybeLocal<v8::Value> maybeResult; if (v8Call(V8ScriptRunner::compileScript(script, fileName, String(), scriptStartPosition, isolate(), cacheHandler, SharableCrossOrigin, v8CacheOptions), compiledScript, block)) maybeResult = V8ScriptRunner::runCompiledScript(isolate(), compiledScript, m_workerGlobalScope); if (!block.CanContinue()) { forbidExecution(); return ScriptValue(); } if (block.HasCaught()) { v8::Local<v8::Message> message = block.Message(); m_executionState->hadException = true; m_executionState->errorMessage = toCoreString(message->Get()); if (v8Call(message->GetLineNumber(m_scriptState->context()), m_executionState->lineNumber) && v8Call(message->GetStartColumn(m_scriptState->context()), m_executionState->columnNumber)) { ++m_executionState->columnNumber; } else { m_executionState->lineNumber = 0; m_executionState->columnNumber = 0; } TOSTRING_DEFAULT(V8StringResource<>, sourceURL, message->GetScriptOrigin().ResourceName(), ScriptValue()); m_executionState->sourceURL = sourceURL; m_executionState->exception = ScriptValue(m_scriptState.get(), block.Exception()); block.Reset(); } else { m_executionState->hadException = false; } v8::Local<v8::Value> result; if (!maybeResult.ToLocal(&result) || result->IsUndefined()) return ScriptValue(); return ScriptValue(m_scriptState.get(), result); }
ScriptValue WorkerScriptController::evaluate(const String& script, const String& fileName, const TextPosition& scriptStartPosition, WorkerContextExecutionState* state) { V8GCController::checkMemoryUsage(); v8::HandleScope handleScope; if (!initializeContextIfNeeded()) return ScriptValue(); if (!m_disableEvalPending.isEmpty()) { m_context->AllowCodeGenerationFromStrings(false); m_context->SetErrorMessageForCodeGenerationFromStrings(v8String(m_disableEvalPending, m_context->GetIsolate())); m_disableEvalPending = String(); } v8::Isolate* isolate = m_context->GetIsolate(); v8::Context::Scope scope(m_context.get()); v8::TryCatch block; v8::Handle<v8::String> scriptString = v8String(script, isolate); v8::Handle<v8::Script> compiledScript = ScriptSourceCode::compileScript(scriptString, fileName, scriptStartPosition, 0, isolate); v8::Local<v8::Value> result = ScriptRunner::runCompiledScript(compiledScript, m_workerContext); if (!block.CanContinue()) { m_workerContext->script()->forbidExecution(); return ScriptValue(); } if (block.HasCaught()) { v8::Local<v8::Message> message = block.Message(); state->hadException = true; state->errorMessage = toWebCoreString(message->Get()); state->lineNumber = message->GetLineNumber(); state->sourceURL = toWebCoreString(message->GetScriptResourceName()); if (m_workerContext->sanitizeScriptError(state->errorMessage, state->lineNumber, state->sourceURL)) state->exception = throwError(v8GeneralError, state->errorMessage.utf8().data(), isolate); else state->exception = ScriptValue(block.Exception()); block.Reset(); } else state->hadException = false; if (result.IsEmpty() || result->IsUndefined()) return ScriptValue(); return ScriptValue(result); }
ScriptValue WorkerScriptController::evaluate(const String& script, const String& fileName, const TextPosition& scriptStartPosition, WorkerGlobalScopeExecutionState* state) { v8::HandleScope handleScope(isolate()); if (!initializeContextIfNeeded()) return ScriptValue(); v8::Handle<v8::Context> context = m_contextHolder->context(); if (!m_disableEvalPending.isEmpty()) { context->AllowCodeGenerationFromStrings(false); context->SetErrorMessageForCodeGenerationFromStrings(v8String(isolate(), m_disableEvalPending)); m_disableEvalPending = String(); } v8::Context::Scope scope(context); v8::TryCatch block; v8::Handle<v8::String> scriptString = v8String(isolate(), script); v8::Handle<v8::Script> compiledScript = V8ScriptRunner::compileScript(scriptString, fileName, scriptStartPosition, 0, isolate()); v8::Local<v8::Value> result = V8ScriptRunner::runCompiledScript(compiledScript, &m_workerGlobalScope, isolate()); if (!block.CanContinue()) { m_workerGlobalScope.script()->forbidExecution(); return ScriptValue(); } if (block.HasCaught()) { v8::Local<v8::Message> message = block.Message(); state->hadException = true; state->errorMessage = toCoreString(message->Get()); state->lineNumber = message->GetLineNumber(); state->columnNumber = message->GetStartColumn() + 1; V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<>, sourceURL, message->GetScriptResourceName(), ScriptValue()); state->sourceURL = sourceURL; state->exception = ScriptValue(block.Exception(), isolate()); block.Reset(); } else state->hadException = false; if (result.IsEmpty() || result->IsUndefined()) return ScriptValue(); return ScriptValue(result, isolate()); }
ScriptValue WorkerScriptController::evaluate(const String& script, const String& fileName, const TextPosition& scriptStartPosition) { if (!initializeContextIfNeeded()) return ScriptValue(); ScriptState::Scope scope(m_scriptState.get()); if (!m_disableEvalPending.isEmpty()) { m_scriptState->context()->AllowCodeGenerationFromStrings(false); m_scriptState->context()->SetErrorMessageForCodeGenerationFromStrings(v8String(m_isolate, m_disableEvalPending)); m_disableEvalPending = String(); } v8::TryCatch block; v8::Handle<v8::String> scriptString = v8String(m_isolate, script); v8::Handle<v8::Script> compiledScript = V8ScriptRunner::compileScript(scriptString, fileName, scriptStartPosition, 0, 0, m_isolate); v8::Local<v8::Value> result = V8ScriptRunner::runCompiledScript(m_isolate, compiledScript, &m_workerGlobalScope); if (!block.CanContinue()) { m_workerGlobalScope.script()->forbidExecution(); return ScriptValue(); } if (block.HasCaught()) { v8::Local<v8::Message> message = block.Message(); m_globalScopeExecutionState->hadException = true; m_globalScopeExecutionState->errorMessage = toCoreString(message->Get()); m_globalScopeExecutionState->lineNumber = message->GetLineNumber(); m_globalScopeExecutionState->columnNumber = message->GetStartColumn() + 1; TOSTRING_DEFAULT(V8StringResource<>, sourceURL, message->GetScriptOrigin().ResourceName(), ScriptValue()); m_globalScopeExecutionState->sourceURL = sourceURL; m_globalScopeExecutionState->exception = ScriptValue(m_scriptState.get(), block.Exception()); block.Reset(); } else { m_globalScopeExecutionState->hadException = false; } if (result.IsEmpty() || result->IsUndefined()) return ScriptValue(); return ScriptValue(m_scriptState.get(), result); }