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" | 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |