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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp

Issue 2010603002: Use SourceLocation when reporting runtime exceptions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2004243002
Patch Set: test fixes Created 4 years, 7 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: third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
index 2ff20cce431400eaa32a5f3d61a254c5a24661ff..cd6e616c9e9a8ff61408bd11976fd74c408ce6a3 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
@@ -28,9 +28,9 @@
#include "bindings/core/v8/DOMWrapperWorld.h"
#include "bindings/core/v8/RejectedPromises.h"
#include "bindings/core/v8/RetainedDOMInfo.h"
-#include "bindings/core/v8/ScriptCallStack.h"
#include "bindings/core/v8/ScriptController.h"
#include "bindings/core/v8/ScriptValue.h"
+#include "bindings/core/v8/SourceLocation.h"
#include "bindings/core/v8/V8Binding.h"
#include "bindings/core/v8/V8DOMException.h"
#include "bindings/core/v8/V8ErrorEvent.h"
@@ -95,26 +95,6 @@ static void reportFatalErrorInMainThread(const char* location, const char* messa
CRASH();
}
-static PassRefPtr<ScriptCallStack> extractCallStack(v8::Isolate* isolate, v8::Local<v8::Message> message, int* const scriptId)
-{
- v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace();
- RefPtr<ScriptCallStack> callStack = ScriptCallStack::create(isolate, stackTrace);
- *scriptId = message->GetScriptOrigin().ScriptID()->Value();
- if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) {
- int topScriptId = stackTrace->GetFrame(0)->GetScriptId();
- if (topScriptId == *scriptId)
- *scriptId = 0;
- }
- return callStack.release();
-}
-
-static String extractResourceName(v8::Local<v8::Message> message, const ExecutionContext* context)
-{
- v8::Local<v8::Value> resourceName = message->GetScriptOrigin().ResourceName();
- bool shouldUseDocumentURL = context->isDocument() && (resourceName.IsEmpty() || !resourceName->IsString());
- return shouldUseDocumentURL ? context->url() : toCoreString(resourceName.As<v8::String>());
-}
-
static String extractMessageForConsole(v8::Isolate* isolate, v8::Local<v8::Value> data)
{
if (V8DOMWrapper::isWrapper(isolate, data)) {
@@ -129,17 +109,6 @@ static String extractMessageForConsole(v8::Isolate* isolate, v8::Local<v8::Value
return emptyString();
}
-static ErrorEvent* createErrorEventFromMesssage(ScriptState* scriptState, v8::Local<v8::Message> message, String resourceName)
-{
- String errorMessage = toCoreStringWithNullCheck(message->Get());
- int lineNumber = 0;
- int columnNumber = 0;
- if (v8Call(message->GetLineNumber(scriptState->context()), lineNumber)
- && v8Call(message->GetStartColumn(scriptState->context()), columnNumber))
- ++columnNumber;
- return ErrorEvent::create(errorMessage, resourceName, lineNumber, columnNumber, &scriptState->world());
-}
-
static void messageHandlerInMainThread(v8::Local<v8::Message> message, v8::Local<v8::Value> data)
{
ASSERT(isMainThread());
@@ -150,8 +119,8 @@ static void messageHandlerInMainThread(v8::Local<v8::Message> message, v8::Local
if (!scriptState->contextIsValid())
return;
- int scriptId = 0;
- RefPtr<ScriptCallStack> callStack = extractCallStack(isolate, message, &scriptId);
+ ExecutionContext* context = scriptState->getExecutionContext();
+ OwnPtr<SourceLocation> location = SourceLocation::fromMessage(isolate, message, context);
AccessControlStatus accessControlStatus = NotSharableCrossOrigin;
if (message->IsOpaque())
@@ -159,9 +128,7 @@ static void messageHandlerInMainThread(v8::Local<v8::Message> message, v8::Local
else if (message->IsSharedCrossOrigin())
accessControlStatus = SharableCrossOrigin;
- ExecutionContext* context = scriptState->getExecutionContext();
- String resourceName = extractResourceName(message, context);
- ErrorEvent* event = createErrorEventFromMesssage(scriptState, message, resourceName);
+ ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Get()), location->url(), location->lineNumber(), location->columnNumber(), &scriptState->world());
String messageForConsole = extractMessageForConsole(isolate, data);
if (!messageForConsole.isEmpty())
@@ -185,9 +152,9 @@ static void messageHandlerInMainThread(v8::Local<v8::Message> message, v8::Local
// other isolated worlds (which means that the error events won't fire any event listeners
// in user's scripts).
EventDispatchForbiddenScope::AllowUserAgentEvents allowUserAgentEvents;
- context->reportException(event, scriptId, callStack, accessControlStatus);
+ context->reportException(event, std::move(location), accessControlStatus);
} else {
- context->reportException(event, scriptId, callStack, accessControlStatus);
+ context->reportException(event, std::move(location), accessControlStatus);
}
}
@@ -207,7 +174,7 @@ void V8Initializer::reportRejectedPromisesOnMainThread()
rejectedPromisesOnMainThread().processQueue();
}
-static void promiseRejectHandler(v8::PromiseRejectMessage data, RejectedPromises& rejectedPromises, const String& fallbackResourceName)
+static void promiseRejectHandler(v8::PromiseRejectMessage data, RejectedPromises& rejectedPromises, ScriptState* scriptState)
{
if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) {
rejectedPromises.handlerAdded(data);
@@ -218,7 +185,7 @@ static void promiseRejectHandler(v8::PromiseRejectMessage data, RejectedPromises
v8::Local<v8::Promise> promise = data.GetPromise();
v8::Isolate* isolate = promise->GetIsolate();
- ScriptState* scriptState = ScriptState::current(isolate);
+ ExecutionContext* context = scriptState->getExecutionContext();
v8::Local<v8::Value> exception = data.GetValue();
if (V8DOMWrapper::isWrapper(isolate, exception)) {
@@ -230,35 +197,26 @@ static void promiseRejectHandler(v8::PromiseRejectMessage data, RejectedPromises
exception = error;
}
- int scriptId = 0;
- int lineNumber = 0;
- int columnNumber = 0;
- String resourceName = fallbackResourceName;
String errorMessage;
AccessControlStatus corsStatus = NotSharableCrossOrigin;
- RefPtr<ScriptCallStack> callStack;
+ OwnPtr<SourceLocation> location;
v8::Local<v8::Message> message = v8::Exception::CreateMessage(isolate, exception);
if (!message.IsEmpty()) {
- V8StringResource<> v8ResourceName(message->GetScriptOrigin().ResourceName());
- if (v8ResourceName.prepare())
- resourceName = v8ResourceName;
- 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());
- callStack = extractCallStack(isolate, message, &scriptId);
+ location = SourceLocation::fromMessage(isolate, message, context);
if (message->IsSharedCrossOrigin())
corsStatus = SharableCrossOrigin;
+ } else {
+ location = SourceLocation::create(context->url().getString(), 0, 0, nullptr);
}
String messageForConsole = extractMessageForConsole(isolate, data.GetValue());
if (!messageForConsole.isEmpty())
errorMessage = "Uncaught " + messageForConsole;
- rejectedPromises.rejectedWithNoHandler(scriptState, data, errorMessage, resourceName, scriptId, lineNumber, columnNumber, callStack, corsStatus);
+ rejectedPromises.rejectedWithNoHandler(scriptState, data, errorMessage, std::move(location), corsStatus);
}
static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage data)
@@ -280,7 +238,7 @@ static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage data)
if (!scriptState->contextIsValid())
return;
- promiseRejectHandler(data, rejectedPromisesOnMainThread(), scriptState->getExecutionContext()->url());
+ promiseRejectHandler(data, rejectedPromisesOnMainThread(), scriptState);
}
static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data)
@@ -301,7 +259,7 @@ static void promiseRejectHandlerInWorker(v8::PromiseRejectMessage data)
WorkerOrWorkletScriptController* scriptController = toWorkerGlobalScope(executionContext)->scriptController();
ASSERT(scriptController);
- promiseRejectHandler(data, *scriptController->getRejectedPromises(), String());
+ promiseRejectHandler(data, *scriptController->getRejectedPromises(), scriptState);
}
static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8::AccessType type, v8::Local<v8::Value> data)
@@ -440,11 +398,9 @@ static void messageHandlerInWorker(v8::Local<v8::Message> message, v8::Local<v8:
perIsolateData->setReportingException(true);
- TOSTRING_VOID(V8StringResource<>, resourceName, message->GetScriptOrigin().ResourceName());
- ErrorEvent* event = createErrorEventFromMesssage(scriptState, message, resourceName);
-
- int scriptId = 0;
- RefPtr<ScriptCallStack> callStack = extractCallStack(isolate, message, &scriptId);
+ ExecutionContext* context = scriptState->getExecutionContext();
+ OwnPtr<SourceLocation> location = SourceLocation::fromMessage(isolate, message, context);
+ ErrorEvent* event = ErrorEvent::create(toCoreStringWithNullCheck(message->Get()), location->url(), location->lineNumber(), location->columnNumber(), &scriptState->world());
AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin;
@@ -452,7 +408,7 @@ static void messageHandlerInWorker(v8::Local<v8::Message> message, v8::Local<v8:
// the error event from the v8::Message, quietly leave.
if (!isolate->IsExecutionTerminating()) {
V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event, data, scriptState->context()->Global());
- scriptState->getExecutionContext()->reportException(event, scriptId, callStack, corsStatus);
+ scriptState->getExecutionContext()->reportException(event, std::move(location), corsStatus);
}
perIsolateData->setReportingException(false);

Powered by Google App Engine
This is Rietveld 408576698