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

Unified 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, 3 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp b/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp
index 3ed8d247ee5d1659fbe25554de1e4a079984cff1..2ba13dbfba71d1f9f9d8bc5a0d75d4cbf30e3aba 100644
--- a/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp
@@ -15,6 +15,11 @@
#include "core/inspector/ConsoleMessage.h"
#include "core/inspector/ScriptArguments.h"
#include "platform/RuntimeEnabledFeatures.h"
+#include "platform/Task.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebTaskRunner.h"
+#include "public/platform/WebThread.h"
+#include "wtf/Functional.h"
namespace blink {
@@ -124,6 +129,18 @@ public:
}
}
+ void makePromiseWeak()
+ {
+ ASSERT(!m_promise.isEmpty() && !m_promise.isWeak());
+ m_promise.setWeak(this, &Message::didCollectPromise);
+ }
+
+ void makePromiseStrong()
+ {
+ ASSERT(!m_promise.isEmpty() && m_promise.isWeak());
+ m_promise.clearWeak();
+ }
+
private:
Message(ScriptState* scriptState, v8::Local<v8::Promise> promise, const ScriptValue& exception, const String& errorMessage, const String& resourceName, int scriptId, int lineNumber, int columnNumber, PassRefPtrWillBeRawPtr<ScriptCallStack> callStack)
: m_scriptState(scriptState)
@@ -139,7 +156,6 @@ private:
, m_collected(false)
, m_shouldLogToConsole(true)
{
- m_promise.setWeak(this, &Message::didCollectPromise);
}
static void didCollectPromise(const v8::WeakCallbackInfo<Message>& data)
@@ -193,7 +209,8 @@ void RejectedPromises::handlerAdded(v8::PromiseRejectMessage data)
for (size_t i = 0; i < m_reportedAsErrors.size(); ++i) {
auto& message = m_reportedAsErrors.at(i);
if (!message->isCollected() && message->hasPromise(data.GetPromise())) {
- message->revoke();
+ message->makePromiseStrong();
+ Platform::current()->currentThread()->taskRunner()->postTask(FROM_HERE, new Task(bind(&RejectedPromises::revokeNow, this, message.release())));
m_reportedAsErrors.remove(i);
return;
}
@@ -202,11 +219,20 @@ void RejectedPromises::handlerAdded(v8::PromiseRejectMessage data)
void RejectedPromises::dispose()
{
- processQueue();
+ processQueueNow(m_queue);
}
void RejectedPromises::processQueue()
{
+ if (m_queue.isEmpty())
+ return;
+ WillBeHeapDeque<OwnPtrWillBeMember<Message>> queue;
+ queue.swap(m_queue);
+ 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
+}
+
+void RejectedPromises::processQueueNow(WillBeHeapDeque<OwnPtrWillBeMember<Message>>& queue)
+{
// Remove collected handlers.
for (size_t i = 0; i < m_reportedAsErrors.size();) {
if (m_reportedAsErrors.at(i)->isCollected())
@@ -215,16 +241,21 @@ void RejectedPromises::processQueue()
++i;
}
- while (!m_queue.isEmpty()) {
- OwnPtrWillBeRawPtr<Message> message = m_queue.takeFirst();
- if (message->isCollected())
- continue;
+ while (!queue.isEmpty()) {
+ OwnPtrWillBeRawPtr<Message> message = queue.takeFirst();
+ ASSERT(!message->isCollected());
message->report();
+ message->makePromiseWeak();
m_reportedAsErrors.append(message.release());
if (m_reportedAsErrors.size() > maxReportedHandlersPendingResolution)
m_reportedAsErrors.remove(0, maxReportedHandlersPendingResolution / 10);
}
}
+void RejectedPromises::revokeNow(PassOwnPtrWillBeRawPtr<Message> message)
+{
+ message->revoke();
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698