Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp |
| index 6c7b1e3de4e39b0513efb14349dddf12a81ff0b4..58c6c6c10c2943f9f8b90482441f83ea1b7e159d 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp |
| @@ -189,6 +189,69 @@ HTMLElement* ScriptCustomElementDefinition::createElementSync( |
| return toHTMLElement(element); |
| } |
| +static AccessControlStatus accessControlStatusFromScriptOriginOptions( |
| + const v8::ScriptOriginOptions& scriptOriginOptions) |
| +{ |
| + if (scriptOriginOptions.IsOpaque()) |
| + return OpaqueResource; |
| + if (scriptOriginOptions.IsSharedCrossOrigin()) |
| + return SharableCrossOrigin; |
| + return NotSharableCrossOrigin; |
|
haraken
2016/08/18 09:03:02
Can you create a helper function and share the cod
|
| +} |
| + |
| +static void reportException(ScriptState* scriptState, |
|
haraken
2016/08/18 09:03:03
Would you move this function to V8ThrowException?
Yuki
2016/08/18 09:34:26
I opposed putting this function in V8ThrowExceptio
|
| + 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)); |
| +} |
| + |
| +static void reportException(ScriptState* scriptState, |
| + v8::Local<v8::Value> exception, |
| + const String& message, |
| + v8::Local<v8::Function> function) |
| +{ |
| + reportException(scriptState, exception, message, |
| + SourceLocation::fromFunction(function), |
| + function->GetScriptOrigin().Options()); |
| +} |
| + |
| +static void reportException(ScriptState* scriptState, |
| + ExceptionState& exceptionState, |
| + v8::Local<v8::Function> function) |
| +{ |
| + DCHECK(exceptionState.hadException()); |
| + v8::Local<v8::Value> exception = exceptionState.getException(); |
| + const String& message = exceptionState.message(); |
| + if (!message.isEmpty()) { |
|
haraken
2016/08/18 09:03:02
It looks nasty to have this branch.
Wouldn't it b
kojii
2016/08/18 10:15:14
There's no place to report, this is similar to unh
|
| + // 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, message, function); |
| + } else { |
| + // The exception was thrown in JavaScript, caught, and set by |
| + // rethrowV8Exception(). It has SourceLocation and ScriptOrigin. |
| + 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()); |
| + } |
| + exceptionState.clearException(); |
| +} |
| + |
| HTMLElement* ScriptCustomElementDefinition::createElementSync( |
| Document& document, const QualifiedName& tagName) |
| { |
| @@ -202,16 +265,14 @@ HTMLElement* ScriptCustomElementDefinition::createElementSync( |
| "CustomElement", constructor(), isolate); |
| HTMLElement* element = createElementSync(document, tagName, exceptionState); |
| - if (exceptionState.hadException() || !element) { |
| + if (exceptionState.hadException()) { |
| + DCHECK(!element); |
| // 7. If this step throws an exception, then report the exception, ... |
| - { |
| - v8::TryCatch tryCatch(isolate); |
| - tryCatch.SetVerbose(true); |
| - exceptionState.throwIfNeeded(); |
| - } |
| - |
| + reportException(m_scriptState.get(), exceptionState, |
| + constructor().As<v8::Function>()); |
|
haraken
2016/08/18 09:03:02
Why do you pass in constructor()? Here you're hand
kojii
2016/08/18 10:15:14
This code path comes from the document parser, whe
|
| return CustomElement::createFailedElement(document, tagName); |
| } |
| + DCHECK(element); |
| return element; |
| } |
| @@ -238,12 +299,12 @@ bool ScriptCustomElementDefinition::runConstructor(Element* element) |
| if (result != element) { |
| const String& message = "custom element constructors must call super() first and must " |
| "not return a different object"; |
| - std::unique_ptr<SourceLocation> location = SourceLocation::fromFunction(constructor().As<v8::Function>()); |
| v8::Local<v8::Value> exception = V8ThrowException::createDOMException( |
| m_scriptState->isolate(), |
| InvalidStateError, |
| message); |
| - fireErrorEvent(m_scriptState.get(), message, exception, std::move(location)); |
| + reportException(m_scriptState.get(), exception, message, |
| + constructor().As<v8::Function>()); |
| return false; |
| } |
| @@ -268,14 +329,6 @@ Element* ScriptCustomElementDefinition::runConstructor() |
| return V8Element::toImplWithTypeCheck(isolate, result); |
| } |
| -void ScriptCustomElementDefinition::fireErrorEvent(ScriptState* scriptState, const String& message, v8::Local<v8::Value> exception, std::unique_ptr<SourceLocation> location) |
| -{ |
| - ErrorEvent* event = ErrorEvent::create(message, std::move(location), &scriptState->world()); |
| - V8ErrorHandler::storeExceptionOnErrorEventWrapper(scriptState, event, exception, scriptState->context()->Global()); |
| - ExecutionContext* executionContext = scriptState->getExecutionContext(); |
| - executionContext->reportException(event, NotSharableCrossOrigin); |
| -} |
| - |
| v8::Local<v8::Object> ScriptCustomElementDefinition::constructor() const |
| { |
| DCHECK(!m_constructor.isEmpty()); |