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 |