Chromium Code Reviews| 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 |