Chromium Code Reviews| Index: Source/bindings/core/v8/RejectedPromises.cpp |
| diff --git a/Source/bindings/core/v8/RejectedPromises.cpp b/Source/bindings/core/v8/RejectedPromises.cpp |
| index ee1a2f158e0e89131feb6b9e14d26b7a3a04c00a..f8991808dd3274b96feb4f62edfc6d5e54757ea9 100644 |
| --- a/Source/bindings/core/v8/RejectedPromises.cpp |
| +++ b/Source/bindings/core/v8/RejectedPromises.cpp |
| @@ -10,8 +10,11 @@ |
| #include "bindings/core/v8/ScriptValue.h" |
| #include "bindings/core/v8/V8Binding.h" |
| #include "core/dom/ExecutionContext.h" |
| +#include "core/events/EventTarget.h" |
| +#include "core/events/PromiseRejectionEvent.h" |
| #include "core/inspector/ConsoleMessage.h" |
| #include "core/inspector/ScriptArguments.h" |
| +#include "platform/RuntimeEnabledFeatures.h" |
| namespace blink { |
| @@ -58,27 +61,34 @@ public: |
| return; |
| ASSERT(!v8::Local<v8::Promise>::Cast(value)->HasHandler()); |
| - const String errorMessage = "Uncaught (in promise)"; |
| - Vector<ScriptValue> args; |
| - args.append(ScriptValue(m_scriptState, v8String(m_scriptState->isolate(), errorMessage))); |
| - args.append(m_exception); |
| - RefPtrWillBeRawPtr<ScriptArguments> arguments = ScriptArguments::create(m_scriptState, args); |
| - |
| - String embedderErrorMessage = m_errorMessage; |
| - if (embedderErrorMessage.isEmpty()) |
| - embedderErrorMessage = errorMessage; |
| - else if (embedderErrorMessage.startsWith("Uncaught ")) |
| - embedderErrorMessage.insert(" (in promise)", 8); |
| - |
| - RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, embedderErrorMessage, m_resourceName, m_lineNumber, m_columnNumber); |
| - consoleMessage->setScriptArguments(arguments); |
| - consoleMessage->setCallStack(m_callStack); |
| - consoleMessage->setScriptId(m_scriptId); |
| - m_consoleMessageId = consoleMessage->assignMessageId(); |
| - executionContext->addConsoleMessage(consoleMessage.release()); |
| + EventTarget* target = executionContext->errorEventTarget(); |
| + if (RuntimeEnabledFeatures::promiseRejectionEventEnabled() && target) { |
| + RefPtrWillBeRawPtr<PromiseRejectionEvent> event = PromiseRejectionEvent::create(EventTypeNames::unhandledrejection, ScriptPromise(m_scriptState, value), m_exception); |
| + m_shouldLogToConsole = target->dispatchEvent(event); |
|
philipj_slow
2015/06/16 14:58:03
Can you document this with "Log to console if even
jochen (gone - plz use gerrit)
2015/06/17 07:57:53
done
|
| + } |
| + |
| + if (m_shouldLogToConsole) { |
| + const String errorMessage = "Uncaught (in promise)"; |
| + Vector<ScriptValue> args; |
| + args.append(ScriptValue(m_scriptState, v8String(m_scriptState->isolate(), errorMessage))); |
| + args.append(m_exception); |
| + RefPtrWillBeRawPtr<ScriptArguments> arguments = ScriptArguments::create(m_scriptState, args); |
| + |
| + String embedderErrorMessage = m_errorMessage; |
| + if (embedderErrorMessage.isEmpty()) |
| + embedderErrorMessage = errorMessage; |
| + else if (embedderErrorMessage.startsWith("Uncaught ")) |
| + embedderErrorMessage.insert(" (in promise)", 8); |
| + |
| + RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, embedderErrorMessage, m_resourceName, m_lineNumber, m_columnNumber); |
| + consoleMessage->setScriptArguments(arguments); |
| + consoleMessage->setCallStack(m_callStack); |
| + consoleMessage->setScriptId(m_scriptId); |
| + m_consoleMessageId = consoleMessage->assignMessageId(); |
| + executionContext->addConsoleMessage(consoleMessage.release()); |
| + } |
| m_callStack.clear(); |
| - m_exception.clear(); |
| } |
| void revoke() |
| @@ -87,9 +97,23 @@ public: |
| if (!executionContext) |
| return; |
| - RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, RevokedErrorMessageLevel, "Handler added to rejected promise"); |
| - consoleMessage->setRelatedMessageId(m_consoleMessageId); |
| - executionContext->addConsoleMessage(consoleMessage.release()); |
| + ScriptState::Scope scope(m_scriptState); |
| + v8::Local<v8::Value> value = m_promise.newLocal(m_scriptState->isolate()); |
| + // Either collected or https://crbug.com/450330 |
|
philipj_slow
2015/06/16 14:58:03
This issue is 403 for me, what does this comment m
jochen (gone - plz use gerrit)
2015/06/17 07:57:53
I copied it from ::report()
cc'd you on the bug,
philipj_slow
2015/06/17 08:31:00
Thanks.
|
| + if (value.IsEmpty() || !value->IsPromise()) |
| + return; |
| + |
| + EventTarget* target = executionContext->errorEventTarget(); |
| + if (RuntimeEnabledFeatures::promiseRejectionEventEnabled() && target) { |
| + RefPtrWillBeRawPtr<PromiseRejectionEvent> event = PromiseRejectionEvent::create(EventTypeNames::rejectionhandled, ScriptPromise(m_scriptState, value), m_exception); |
| + m_shouldLogToConsole &= target->dispatchEvent(event); |
| + } |
| + |
| + if (m_shouldLogToConsole) { |
| + RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, RevokedErrorMessageLevel, "Handler added to rejected promise"); |
| + consoleMessage->setRelatedMessageId(m_consoleMessageId); |
| + executionContext->addConsoleMessage(consoleMessage.release()); |
| + } |
| } |
| private: |
| @@ -105,6 +129,7 @@ private: |
| , m_callStack(callStack) |
| , m_consoleMessageId(0) |
| , m_collected(false) |
| + , m_shouldLogToConsole(true) |
| { |
| m_promise.setWeak(this, &Message::didCollectPromise); |
| } |
| @@ -126,6 +151,7 @@ private: |
| RefPtrWillBeMember<ScriptCallStack> m_callStack; |
| unsigned m_consoleMessageId; |
| bool m_collected; |
| + bool m_shouldLogToConsole; |
| }; |
| RejectedPromises::RejectedPromises() |