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