Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "bindings/core/v8/RejectedPromises.h" | 6 #include "bindings/core/v8/RejectedPromises.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/ScopedPersistent.h" | 8 #include "bindings/core/v8/ScopedPersistent.h" |
| 9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
| 10 #include "bindings/core/v8/ScriptValue.h" | 10 #include "bindings/core/v8/ScriptValue.h" |
| 11 #include "bindings/core/v8/V8Binding.h" | 11 #include "bindings/core/v8/V8Binding.h" |
| 12 #include "core/dom/ExecutionContext.h" | 12 #include "core/dom/ExecutionContext.h" |
| 13 #include "core/events/EventTarget.h" | |
| 14 #include "core/events/PromiseRejectionEvent.h" | |
| 13 #include "core/inspector/ConsoleMessage.h" | 15 #include "core/inspector/ConsoleMessage.h" |
| 14 #include "core/inspector/ScriptArguments.h" | 16 #include "core/inspector/ScriptArguments.h" |
| 17 #include "platform/RuntimeEnabledFeatures.h" | |
| 15 | 18 |
| 16 namespace blink { | 19 namespace blink { |
| 17 | 20 |
| 18 static const unsigned maxReportedHandlersPendingResolution = 1000; | 21 static const unsigned maxReportedHandlersPendingResolution = 1000; |
| 19 | 22 |
| 20 class RejectedPromises::Message final : public NoBaseWillBeGarbageCollectedFinal ized<RejectedPromises::Message> { | 23 class RejectedPromises::Message final : public NoBaseWillBeGarbageCollectedFinal ized<RejectedPromises::Message> { |
| 21 public: | 24 public: |
| 22 static PassOwnPtrWillBeRawPtr<Message> create(ScriptState* scriptState, v8:: Local<v8::Promise> promise, const ScriptValue& exception, const String& errorMes sage, const String& resourceName, int scriptId, int lineNumber, int columnNumber , PassRefPtrWillBeRawPtr<ScriptCallStack> callStack) | 25 static PassOwnPtrWillBeRawPtr<Message> create(ScriptState* scriptState, v8:: Local<v8::Promise> promise, const ScriptValue& exception, const String& errorMes sage, const String& resourceName, int scriptId, int lineNumber, int columnNumber , PassRefPtrWillBeRawPtr<ScriptCallStack> callStack) |
| 23 { | 26 { |
| 24 return adoptPtrWillBeNoop(new Message(scriptState, promise, exception, e rrorMessage, resourceName, scriptId, lineNumber, columnNumber, callStack)); | 27 return adoptPtrWillBeNoop(new Message(scriptState, promise, exception, e rrorMessage, resourceName, scriptId, lineNumber, columnNumber, callStack)); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 51 if (!executionContext) | 54 if (!executionContext) |
| 52 return; | 55 return; |
| 53 | 56 |
| 54 ScriptState::Scope scope(m_scriptState); | 57 ScriptState::Scope scope(m_scriptState); |
| 55 v8::Local<v8::Value> value = m_promise.newLocal(m_scriptState->isolate() ); | 58 v8::Local<v8::Value> value = m_promise.newLocal(m_scriptState->isolate() ); |
| 56 // Either collected or https://crbug.com/450330 | 59 // Either collected or https://crbug.com/450330 |
| 57 if (value.IsEmpty() || !value->IsPromise()) | 60 if (value.IsEmpty() || !value->IsPromise()) |
| 58 return; | 61 return; |
| 59 ASSERT(!v8::Local<v8::Promise>::Cast(value)->HasHandler()); | 62 ASSERT(!v8::Local<v8::Promise>::Cast(value)->HasHandler()); |
| 60 | 63 |
| 61 const String errorMessage = "Uncaught (in promise)"; | 64 EventTarget* target = executionContext->errorEventTarget(); |
| 62 Vector<ScriptValue> args; | 65 if (RuntimeEnabledFeatures::promiseRejectionEventEnabled() && target) { |
| 63 args.append(ScriptValue(m_scriptState, v8String(m_scriptState->isolate() , errorMessage))); | 66 RefPtrWillBeRawPtr<PromiseRejectionEvent> event = PromiseRejectionEv ent::create(EventTypeNames::unhandledrejection, ScriptPromise(m_scriptState, val ue), m_exception); |
| 64 args.append(m_exception); | 67 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
| |
| 65 RefPtrWillBeRawPtr<ScriptArguments> arguments = ScriptArguments::create( m_scriptState, args); | 68 } |
| 66 | 69 |
| 67 String embedderErrorMessage = m_errorMessage; | 70 if (m_shouldLogToConsole) { |
| 68 if (embedderErrorMessage.isEmpty()) | 71 const String errorMessage = "Uncaught (in promise)"; |
| 69 embedderErrorMessage = errorMessage; | 72 Vector<ScriptValue> args; |
| 70 else if (embedderErrorMessage.startsWith("Uncaught ")) | 73 args.append(ScriptValue(m_scriptState, v8String(m_scriptState->isola te(), errorMessage))); |
| 71 embedderErrorMessage.insert(" (in promise)", 8); | 74 args.append(m_exception); |
| 75 RefPtrWillBeRawPtr<ScriptArguments> arguments = ScriptArguments::cre ate(m_scriptState, args); | |
| 72 | 76 |
| 73 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::crea te(JSMessageSource, ErrorMessageLevel, embedderErrorMessage, m_resourceName, m_l ineNumber, m_columnNumber); | 77 String embedderErrorMessage = m_errorMessage; |
| 74 consoleMessage->setScriptArguments(arguments); | 78 if (embedderErrorMessage.isEmpty()) |
| 75 consoleMessage->setCallStack(m_callStack); | 79 embedderErrorMessage = errorMessage; |
| 76 consoleMessage->setScriptId(m_scriptId); | 80 else if (embedderErrorMessage.startsWith("Uncaught ")) |
| 77 m_consoleMessageId = consoleMessage->assignMessageId(); | 81 embedderErrorMessage.insert(" (in promise)", 8); |
| 78 executionContext->addConsoleMessage(consoleMessage.release()); | 82 |
| 83 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage:: create(JSMessageSource, ErrorMessageLevel, embedderErrorMessage, m_resourceName, m_lineNumber, m_columnNumber); | |
| 84 consoleMessage->setScriptArguments(arguments); | |
| 85 consoleMessage->setCallStack(m_callStack); | |
| 86 consoleMessage->setScriptId(m_scriptId); | |
| 87 m_consoleMessageId = consoleMessage->assignMessageId(); | |
| 88 executionContext->addConsoleMessage(consoleMessage.release()); | |
| 89 } | |
| 79 | 90 |
| 80 m_callStack.clear(); | 91 m_callStack.clear(); |
| 81 m_exception.clear(); | |
| 82 } | 92 } |
| 83 | 93 |
| 84 void revoke() | 94 void revoke() |
| 85 { | 95 { |
| 86 ExecutionContext* executionContext = m_scriptState->executionContext(); | 96 ExecutionContext* executionContext = m_scriptState->executionContext(); |
| 87 if (!executionContext) | 97 if (!executionContext) |
| 88 return; | 98 return; |
| 89 | 99 |
| 90 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::crea te(JSMessageSource, RevokedErrorMessageLevel, "Handler added to rejected promise "); | 100 ScriptState::Scope scope(m_scriptState); |
| 91 consoleMessage->setRelatedMessageId(m_consoleMessageId); | 101 v8::Local<v8::Value> value = m_promise.newLocal(m_scriptState->isolate() ); |
| 92 executionContext->addConsoleMessage(consoleMessage.release()); | 102 // 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.
| |
| 103 if (value.IsEmpty() || !value->IsPromise()) | |
| 104 return; | |
| 105 | |
| 106 EventTarget* target = executionContext->errorEventTarget(); | |
| 107 if (RuntimeEnabledFeatures::promiseRejectionEventEnabled() && target) { | |
| 108 RefPtrWillBeRawPtr<PromiseRejectionEvent> event = PromiseRejectionEv ent::create(EventTypeNames::rejectionhandled, ScriptPromise(m_scriptState, value ), m_exception); | |
| 109 m_shouldLogToConsole &= target->dispatchEvent(event); | |
| 110 } | |
| 111 | |
| 112 if (m_shouldLogToConsole) { | |
| 113 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage:: create(JSMessageSource, RevokedErrorMessageLevel, "Handler added to rejected pro mise"); | |
| 114 consoleMessage->setRelatedMessageId(m_consoleMessageId); | |
| 115 executionContext->addConsoleMessage(consoleMessage.release()); | |
| 116 } | |
| 93 } | 117 } |
| 94 | 118 |
| 95 private: | 119 private: |
| 96 Message(ScriptState* scriptState, v8::Local<v8::Promise> promise, const Scri ptValue& exception, const String& errorMessage, const String& resourceName, int scriptId, int lineNumber, int columnNumber, PassRefPtrWillBeRawPtr<ScriptCallSta ck> callStack) | 120 Message(ScriptState* scriptState, v8::Local<v8::Promise> promise, const Scri ptValue& exception, const String& errorMessage, const String& resourceName, int scriptId, int lineNumber, int columnNumber, PassRefPtrWillBeRawPtr<ScriptCallSta ck> callStack) |
| 97 : m_scriptState(scriptState) | 121 : m_scriptState(scriptState) |
| 98 , m_promise(scriptState->isolate(), promise) | 122 , m_promise(scriptState->isolate(), promise) |
| 99 , m_exception(exception) | 123 , m_exception(exception) |
| 100 , m_errorMessage(errorMessage) | 124 , m_errorMessage(errorMessage) |
| 101 , m_resourceName(resourceName) | 125 , m_resourceName(resourceName) |
| 102 , m_scriptId(scriptId) | 126 , m_scriptId(scriptId) |
| 103 , m_lineNumber(lineNumber) | 127 , m_lineNumber(lineNumber) |
| 104 , m_columnNumber(columnNumber) | 128 , m_columnNumber(columnNumber) |
| 105 , m_callStack(callStack) | 129 , m_callStack(callStack) |
| 106 , m_consoleMessageId(0) | 130 , m_consoleMessageId(0) |
| 107 , m_collected(false) | 131 , m_collected(false) |
| 132 , m_shouldLogToConsole(true) | |
| 108 { | 133 { |
| 109 m_promise.setWeak(this, &Message::didCollectPromise); | 134 m_promise.setWeak(this, &Message::didCollectPromise); |
| 110 } | 135 } |
| 111 | 136 |
| 112 static void didCollectPromise(const v8::WeakCallbackInfo<Message>& data) | 137 static void didCollectPromise(const v8::WeakCallbackInfo<Message>& data) |
| 113 { | 138 { |
| 114 data.GetParameter()->m_collected = true; | 139 data.GetParameter()->m_collected = true; |
| 115 data.GetParameter()->m_promise.clear(); | 140 data.GetParameter()->m_promise.clear(); |
| 116 } | 141 } |
| 117 | 142 |
| 118 ScriptState* m_scriptState; | 143 ScriptState* m_scriptState; |
| 119 ScopedPersistent<v8::Promise> m_promise; | 144 ScopedPersistent<v8::Promise> m_promise; |
| 120 ScriptValue m_exception; | 145 ScriptValue m_exception; |
| 121 String m_errorMessage; | 146 String m_errorMessage; |
| 122 String m_resourceName; | 147 String m_resourceName; |
| 123 int m_scriptId; | 148 int m_scriptId; |
| 124 int m_lineNumber; | 149 int m_lineNumber; |
| 125 int m_columnNumber; | 150 int m_columnNumber; |
| 126 RefPtrWillBeMember<ScriptCallStack> m_callStack; | 151 RefPtrWillBeMember<ScriptCallStack> m_callStack; |
| 127 unsigned m_consoleMessageId; | 152 unsigned m_consoleMessageId; |
| 128 bool m_collected; | 153 bool m_collected; |
| 154 bool m_shouldLogToConsole; | |
| 129 }; | 155 }; |
| 130 | 156 |
| 131 RejectedPromises::RejectedPromises() | 157 RejectedPromises::RejectedPromises() |
| 132 { | 158 { |
| 133 } | 159 } |
| 134 | 160 |
| 135 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(RejectedPromises); | 161 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(RejectedPromises); |
| 136 | 162 |
| 137 DEFINE_TRACE(RejectedPromises) | 163 DEFINE_TRACE(RejectedPromises) |
| 138 { | 164 { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 187 continue; | 213 continue; |
| 188 | 214 |
| 189 message->report(); | 215 message->report(); |
| 190 m_reportedAsErrors.append(message.release()); | 216 m_reportedAsErrors.append(message.release()); |
| 191 if (m_reportedAsErrors.size() > maxReportedHandlersPendingResolution) | 217 if (m_reportedAsErrors.size() > maxReportedHandlersPendingResolution) |
| 192 m_reportedAsErrors.remove(0, maxReportedHandlersPendingResolution / 10); | 218 m_reportedAsErrors.remove(0, maxReportedHandlersPendingResolution / 10); |
| 193 } | 219 } |
| 194 } | 220 } |
| 195 | 221 |
| 196 } // namespace blink | 222 } // namespace blink |
| OLD | NEW |