| Index: third_party/WebKit/Source/bindings/core/v8/V8ThrowException.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ThrowException.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ThrowException.cpp
|
| index 36cb08e3bfed8d17a47cc9fdc70fe81e0c556830..7e189482c0fd23f698eb6162a7692f86b6d3bc5e 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/V8ThrowException.cpp
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/V8ThrowException.cpp
|
| @@ -27,9 +27,11 @@
|
| #include "bindings/core/v8/BindingSecurity.h"
|
| #include "bindings/core/v8/V8Binding.h"
|
| #include "bindings/core/v8/V8DOMException.h"
|
| +#include "bindings/core/v8/V8ErrorHandler.h"
|
| #include "bindings/core/v8/V8PrivateProperty.h"
|
| #include "core/dom/DOMException.h"
|
| #include "core/dom/ExceptionCode.h"
|
| +#include "core/events/ErrorEvent.h"
|
|
|
| namespace blink {
|
|
|
| @@ -104,4 +106,53 @@ DEFINE_CREATE_AND_THROW_ERROR_FUNC(TypeError, TypeError, "Type error")
|
|
|
| #undef DEFINE_CREATE_AND_THROW_ERROR_FUNC
|
|
|
| +void V8ThrowException::reportException(ScriptState* scriptState,
|
| + v8::Local<v8::Value> exception,
|
| + const String& eventMessage, v8::Local<v8::Function> function)
|
| +{
|
| + if (!eventMessage.isEmpty()) {
|
| + // The exception was created in C++ but was not thrown in JavaScript.
|
| + // It does not have proper SourceLocation nor ScriptOrigin, so use the
|
| + // given information.
|
| + reportException(scriptState, exception, eventMessage,
|
| + SourceLocation::fromFunction(function),
|
| + function->GetScriptOrigin().Options());
|
| + } else {
|
| + v8::Isolate* isolate = scriptState->isolate();
|
| + v8::Local<v8::Message> message = v8::Exception::CreateMessage(isolate,
|
| + exception);
|
| + reportException(scriptState, exception,
|
| + toCoreStringWithNullCheck(message->Get()),
|
| + SourceLocation::fromMessage(isolate, message,
|
| + scriptState->getExecutionContext()),
|
| + message->GetScriptOrigin().Options());
|
| + }
|
| +}
|
| +
|
| +static AccessControlStatus accessControlStatusFromScriptOriginOptions(
|
| + const v8::ScriptOriginOptions& scriptOriginOptions)
|
| +{
|
| + if (scriptOriginOptions.IsOpaque())
|
| + return OpaqueResource;
|
| + if (scriptOriginOptions.IsSharedCrossOrigin())
|
| + return SharableCrossOrigin;
|
| + return NotSharableCrossOrigin;
|
| +}
|
| +
|
| +void V8ThrowException::reportException(ScriptState* scriptState,
|
| + v8::Local<v8::Value> exception,
|
| + const String& eventMessage,
|
| + std::unique_ptr<SourceLocation> location,
|
| + const v8::ScriptOriginOptions& scriptOriginOptions)
|
| +{
|
| + // Report an exception:
|
| + // https://html.spec.whatwg.org/multipage/webappapis.html#report-the-exception
|
| + ErrorEvent* event = ErrorEvent::create(eventMessage, std::move(location),
|
| + &scriptState->world());
|
| + V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event,
|
| + exception, scriptState->context()->Global());
|
| + scriptState->getExecutionContext()->reportException(event,
|
| + accessControlStatusFromScriptOriginOptions(scriptOriginOptions));
|
| +}
|
| +
|
| } // namespace blink
|
|
|