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); |