Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp

Issue 1381693002: Don't report promise rejection events during the microtask checkpoint (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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" 13 #include "core/events/EventTarget.h"
14 #include "core/events/PromiseRejectionEvent.h" 14 #include "core/events/PromiseRejectionEvent.h"
15 #include "core/inspector/ConsoleMessage.h" 15 #include "core/inspector/ConsoleMessage.h"
16 #include "core/inspector/ScriptArguments.h" 16 #include "core/inspector/ScriptArguments.h"
17 #include "platform/RuntimeEnabledFeatures.h" 17 #include "platform/RuntimeEnabledFeatures.h"
18 #include "platform/Task.h"
19 #include "public/platform/Platform.h"
20 #include "public/platform/WebTaskRunner.h"
21 #include "public/platform/WebThread.h"
22 #include "wtf/Functional.h"
18 23
19 namespace blink { 24 namespace blink {
20 25
21 static const unsigned maxReportedHandlersPendingResolution = 1000; 26 static const unsigned maxReportedHandlersPendingResolution = 1000;
22 27
23 class RejectedPromises::Message final : public NoBaseWillBeGarbageCollectedFinal ized<RejectedPromises::Message> { 28 class RejectedPromises::Message final : public NoBaseWillBeGarbageCollectedFinal ized<RejectedPromises::Message> {
24 public: 29 public:
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) 30 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)
26 { 31 {
27 return adoptPtrWillBeNoop(new Message(scriptState, promise, exception, e rrorMessage, resourceName, scriptId, lineNumber, columnNumber, callStack)); 32 return adoptPtrWillBeNoop(new Message(scriptState, promise, exception, e rrorMessage, resourceName, scriptId, lineNumber, columnNumber, callStack));
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 target->dispatchEvent(event); 122 target->dispatchEvent(event);
118 } 123 }
119 124
120 if (m_shouldLogToConsole) { 125 if (m_shouldLogToConsole) {
121 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage:: create(JSMessageSource, RevokedErrorMessageLevel, "Handler added to rejected pro mise"); 126 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage:: create(JSMessageSource, RevokedErrorMessageLevel, "Handler added to rejected pro mise");
122 consoleMessage->setRelatedMessageId(m_consoleMessageId); 127 consoleMessage->setRelatedMessageId(m_consoleMessageId);
123 executionContext->addConsoleMessage(consoleMessage.release()); 128 executionContext->addConsoleMessage(consoleMessage.release());
124 } 129 }
125 } 130 }
126 131
132 void makePromiseWeak()
133 {
134 ASSERT(!m_promise.isEmpty() && !m_promise.isWeak());
135 m_promise.setWeak(this, &Message::didCollectPromise);
136 }
137
138 void makePromiseStrong()
139 {
140 ASSERT(!m_promise.isEmpty() && m_promise.isWeak());
141 m_promise.clearWeak();
142 }
143
127 private: 144 private:
128 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) 145 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)
129 : m_scriptState(scriptState) 146 : m_scriptState(scriptState)
130 , m_promise(scriptState->isolate(), promise) 147 , m_promise(scriptState->isolate(), promise)
131 , m_exception(exception) 148 , m_exception(exception)
132 , m_errorMessage(errorMessage) 149 , m_errorMessage(errorMessage)
133 , m_resourceName(resourceName) 150 , m_resourceName(resourceName)
134 , m_scriptId(scriptId) 151 , m_scriptId(scriptId)
135 , m_lineNumber(lineNumber) 152 , m_lineNumber(lineNumber)
136 , m_columnNumber(columnNumber) 153 , m_columnNumber(columnNumber)
137 , m_callStack(callStack) 154 , m_callStack(callStack)
138 , m_consoleMessageId(0) 155 , m_consoleMessageId(0)
139 , m_collected(false) 156 , m_collected(false)
140 , m_shouldLogToConsole(true) 157 , m_shouldLogToConsole(true)
141 { 158 {
142 m_promise.setWeak(this, &Message::didCollectPromise);
143 } 159 }
144 160
145 static void didCollectPromise(const v8::WeakCallbackInfo<Message>& data) 161 static void didCollectPromise(const v8::WeakCallbackInfo<Message>& data)
146 { 162 {
147 data.GetParameter()->m_collected = true; 163 data.GetParameter()->m_collected = true;
148 data.GetParameter()->m_promise.clear(); 164 data.GetParameter()->m_promise.clear();
149 } 165 }
150 166
151 ScriptState* m_scriptState; 167 ScriptState* m_scriptState;
152 ScopedPersistent<v8::Promise> m_promise; 168 ScopedPersistent<v8::Promise> m_promise;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 if (!(*it)->isCollected() && (*it)->hasPromise(data.GetPromise())) { 202 if (!(*it)->isCollected() && (*it)->hasPromise(data.GetPromise())) {
187 m_queue.remove(it); 203 m_queue.remove(it);
188 return; 204 return;
189 } 205 }
190 } 206 }
191 207
192 // Then look it up in the reported errors. 208 // Then look it up in the reported errors.
193 for (size_t i = 0; i < m_reportedAsErrors.size(); ++i) { 209 for (size_t i = 0; i < m_reportedAsErrors.size(); ++i) {
194 auto& message = m_reportedAsErrors.at(i); 210 auto& message = m_reportedAsErrors.at(i);
195 if (!message->isCollected() && message->hasPromise(data.GetPromise())) { 211 if (!message->isCollected() && message->hasPromise(data.GetPromise())) {
196 message->revoke(); 212 message->makePromiseStrong();
213 Platform::current()->currentThread()->taskRunner()->postTask(FROM_HE RE, new Task(bind(&RejectedPromises::revokeNow, this, message.release())));
197 m_reportedAsErrors.remove(i); 214 m_reportedAsErrors.remove(i);
198 return; 215 return;
199 } 216 }
200 } 217 }
201 } 218 }
202 219
203 void RejectedPromises::dispose() 220 void RejectedPromises::dispose()
204 { 221 {
205 processQueue(); 222 processQueueNow(m_queue);
206 } 223 }
207 224
208 void RejectedPromises::processQueue() 225 void RejectedPromises::processQueue()
209 { 226 {
227 if (m_queue.isEmpty())
228 return;
229 WillBeHeapDeque<OwnPtrWillBeMember<Message>> queue;
230 queue.swap(m_queue);
231 Platform::current()->currentThread()->taskRunner()->postTask(FROM_HERE, new Task(bind(&RejectedPromises::processQueueNow, this, queue)));
jochen (gone - plz use gerrit) 2015/09/30 14:31:42 hiroshige@ this line doesn't even compile, so I g
hiroshige 2015/10/01 03:59:25 WTF::bind()'s argument should be: - Something copy
232 }
233
234 void RejectedPromises::processQueueNow(WillBeHeapDeque<OwnPtrWillBeMember<Messag e>>& queue)
235 {
210 // Remove collected handlers. 236 // Remove collected handlers.
211 for (size_t i = 0; i < m_reportedAsErrors.size();) { 237 for (size_t i = 0; i < m_reportedAsErrors.size();) {
212 if (m_reportedAsErrors.at(i)->isCollected()) 238 if (m_reportedAsErrors.at(i)->isCollected())
213 m_reportedAsErrors.remove(i); 239 m_reportedAsErrors.remove(i);
214 else 240 else
215 ++i; 241 ++i;
216 } 242 }
217 243
218 while (!m_queue.isEmpty()) { 244 while (!queue.isEmpty()) {
219 OwnPtrWillBeRawPtr<Message> message = m_queue.takeFirst(); 245 OwnPtrWillBeRawPtr<Message> message = queue.takeFirst();
220 if (message->isCollected()) 246 ASSERT(!message->isCollected());
221 continue;
222 247
223 message->report(); 248 message->report();
249 message->makePromiseWeak();
224 m_reportedAsErrors.append(message.release()); 250 m_reportedAsErrors.append(message.release());
225 if (m_reportedAsErrors.size() > maxReportedHandlersPendingResolution) 251 if (m_reportedAsErrors.size() > maxReportedHandlersPendingResolution)
226 m_reportedAsErrors.remove(0, maxReportedHandlersPendingResolution / 10); 252 m_reportedAsErrors.remove(0, maxReportedHandlersPendingResolution / 10);
227 } 253 }
228 } 254 }
229 255
256 void RejectedPromises::revokeNow(PassOwnPtrWillBeRawPtr<Message> message)
257 {
258 message->revoke();
259 }
260
230 } // namespace blink 261 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698