Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(258)

Unified Diff: Source/bindings/v8/WorkerScriptController.cpp

Issue 22467005: Correctly attribute exceptions thrown inside a Worker's imported scripts. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/v8/WorkerScriptController.cpp
diff --git a/Source/bindings/v8/WorkerScriptController.cpp b/Source/bindings/v8/WorkerScriptController.cpp
index 72884d9bfa0d8d04c82da8326ac00e97c195dc11..b067a4d34d7d0a5741e5a5066af1baa1b38eb83a 100644
--- a/Source/bindings/v8/WorkerScriptController.cpp
+++ b/Source/bindings/v8/WorkerScriptController.cpp
@@ -167,10 +167,7 @@ ScriptValue WorkerScriptController::evaluate(const String& script, const String&
state->lineNumber = message->GetLineNumber();
state->columnNumber = message->GetStartColumn();
state->sourceURL = toWebCoreString(message->GetScriptResourceName());
- if (m_workerGlobalScope->shouldSanitizeScriptError(state->sourceURL, NotSharableCrossOrigin))
- state->exception = throwError(v8GeneralError, "Script error.", m_isolate);
- else
- state->exception = ScriptValue(block.Exception());
+ state->exception = ScriptValue(block.Exception());
do-not-use 2013/08/07 18:05:05 Actually, it looks like we can remove WorkerGlobal
Mike West 2013/08/08 05:03:15 In this patch, yes. I plan to follow up with a pat
do-not-use 2013/08/08 06:25:00 I think it is fine to keep it if you plan to use i
block.Reset();
} else
@@ -182,7 +179,7 @@ ScriptValue WorkerScriptController::evaluate(const String& script, const String&
return ScriptValue(result);
}
-void WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, ScriptValue* exception)
+void WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, RefPtr<ErrorEvent>* errorEvent)
{
if (isExecutionForbidden())
return;
@@ -190,10 +187,13 @@ void WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, Script
WorkerGlobalScopeExecutionState state;
evaluate(sourceCode.source(), sourceCode.url().string(), sourceCode.startPosition(), &state);
if (state.hadException) {
- if (exception) {
- *exception = state.exception;
+ if (errorEvent) {
+ *errorEvent = m_workerGlobalScope->shouldSanitizeScriptError(state.sourceURL, NotSharableCrossOrigin) ?
+ ErrorEvent::createSanitizedError() : ErrorEvent::create(state.errorMessage, state.sourceURL, state.lineNumber, state.columnNumber);
} else {
- RefPtr<ErrorEvent> event = ErrorEvent::create(state.errorMessage, state.sourceURL, state.lineNumber, state.columnNumber);
+ ASSERT(!m_workerGlobalScope->shouldSanitizeScriptError(state.sourceURL, NotSharableCrossOrigin));
+ RefPtr<ErrorEvent> event = m_errorEventFromImportedScript ? m_errorEventFromImportedScript.release() : ErrorEvent::create(state.errorMessage, state.sourceURL, state.lineNumber, state.columnNumber);
+ m_errorEventFromImportedScript.clear();
do-not-use 2013/08/07 18:05:05 This line looks superfluous since you release() th
Mike West 2013/08/08 05:03:15 Indeed.
m_workerGlobalScope->reportException(event, 0, NotSharableCrossOrigin);
}
}
@@ -235,9 +235,10 @@ void WorkerScriptController::disableEval(const String& errorMessage)
m_disableEvalPending = errorMessage;
}
-void WorkerScriptController::setException(const ScriptValue& exception)
+void WorkerScriptController::rethrowExceptionFromImportedScript(PassRefPtr<ErrorEvent> errorEvent)
{
- throwError(exception.v8Value());
+ m_errorEventFromImportedScript = errorEvent;
+ throwError(V8ThrowException::createError(v8GeneralError, m_errorEventFromImportedScript->message(), m_isolate));
}
WorkerScriptController* WorkerScriptController::controllerForContext()

Powered by Google App Engine
This is Rietveld 408576698