Index: Source/bindings/v8/custom/V8PromiseCustom.cpp |
diff --git a/Source/bindings/v8/custom/V8PromiseCustom.cpp b/Source/bindings/v8/custom/V8PromiseCustom.cpp |
index 657647def5ef4c458825c74de04b51cee8565b41..8b3758b2f13ebc890cdd5692c9b5407463a0ee43 100644 |
--- a/Source/bindings/v8/custom/V8PromiseCustom.cpp |
+++ b/Source/bindings/v8/custom/V8PromiseCustom.cpp |
@@ -45,6 +45,7 @@ |
#include "core/dom/Document.h" |
#include "core/dom/ExecutionContextTask.h" |
#include "core/frame/DOMWindow.h" |
+#include "core/inspector/InspectorInstrumentation.h" |
#include "core/workers/WorkerGlobalScope.h" |
#include "platform/Task.h" |
#include "wtf/Deque.h" |
@@ -190,9 +191,25 @@ void addToDerived(v8::Handle<v8::Object> internal, v8::Handle<v8::Object> derive |
ASSERT(fulfillCallbacks->Length() == rejectCallbacks->Length() && rejectCallbacks->Length() == derivedPromises->Length()); |
} |
+class TaskPerformScopeForInstrumentation { |
+public: |
+ TaskPerformScopeForInstrumentation(ExecutionContext* context, ExecutionContextTask* task) |
+ : m_cookie(InspectorInstrumentation::willPerformPromiseTask(context, task)) |
+ { |
+ } |
+ |
+ ~TaskPerformScopeForInstrumentation() |
+ { |
+ InspectorInstrumentation::didPerformPromiseTask(m_cookie); |
+ } |
+ |
+private: |
+ InspectorInstrumentationCookie m_cookie; |
+}; |
+ |
class CallHandlerTask FINAL : public ExecutionContextTask { |
public: |
- CallHandlerTask(v8::Handle<v8::Object> promise, v8::Handle<v8::Function> handler, v8::Handle<v8::Value> argument, v8::Isolate* isolate, ExecutionContext* context) |
+ CallHandlerTask(v8::Handle<v8::Object> promise, v8::Handle<v8::Function> handler, v8::Handle<v8::Value> argument, V8PromiseCustom::PromiseState originatorState, v8::Isolate* isolate, ExecutionContext* context) |
: m_promise(isolate, promise) |
, m_handler(isolate, handler) |
, m_argument(isolate, argument) |
@@ -201,6 +218,7 @@ public: |
ASSERT(!m_promise.isEmpty()); |
ASSERT(!m_handler.isEmpty()); |
ASSERT(!m_argument.isEmpty()); |
+ InspectorInstrumentation::didPostPromiseTask(context, this, originatorState == V8PromiseCustom::Fulfilled); |
} |
virtual ~CallHandlerTask() { } |
@@ -215,6 +233,8 @@ private: |
void CallHandlerTask::performTask(ExecutionContext* context) |
{ |
+ TaskPerformScopeForInstrumentation performTaskScope(context, this); |
+ |
ASSERT(context); |
if (context->activeDOMObjectsAreStopped()) |
return; |
@@ -242,6 +262,7 @@ public: |
{ |
ASSERT(!m_promise.isEmpty()); |
ASSERT(!m_originatorValueObject.isEmpty()); |
+ InspectorInstrumentation::didPostPromiseTask(context, this, true); |
} |
virtual ~UpdateDerivedTask() { } |
@@ -257,6 +278,8 @@ private: |
void UpdateDerivedTask::performTask(ExecutionContext* context) |
{ |
+ TaskPerformScopeForInstrumentation performTaskScope(context, this); |
+ |
ASSERT(context); |
if (context->activeDOMObjectsAreStopped()) |
return; |
@@ -413,7 +436,7 @@ void PromisePropagator::propagateToDerived(v8::Handle<v8::Object> promise, v8::I |
void PromisePropagator::updateDerivedFromValue(v8::Handle<v8::Object> derivedPromise, v8::Handle<v8::Function> onFulfilled, v8::Handle<v8::Value> value, v8::Isolate* isolate) |
{ |
if (!onFulfilled.IsEmpty()) { |
- V8PromiseCustom::callHandler(derivedPromise, onFulfilled, value, isolate); |
+ V8PromiseCustom::callHandler(derivedPromise, onFulfilled, value, V8PromiseCustom::Fulfilled, isolate); |
} else { |
setValue(derivedPromise, value, isolate); |
} |
@@ -422,7 +445,7 @@ void PromisePropagator::updateDerivedFromValue(v8::Handle<v8::Object> derivedPro |
void PromisePropagator::updateDerivedFromReason(v8::Handle<v8::Object> derivedPromise, v8::Handle<v8::Function> onRejected, v8::Handle<v8::Value> reason, v8::Isolate* isolate) |
{ |
if (!onRejected.IsEmpty()) { |
- V8PromiseCustom::callHandler(derivedPromise, onRejected, reason, isolate); |
+ V8PromiseCustom::callHandler(derivedPromise, onRejected, reason, V8PromiseCustom::Rejected, isolate); |
} else { |
setReason(derivedPromise, reason, isolate); |
} |
@@ -783,11 +806,12 @@ v8::Local<v8::Object> V8PromiseCustom::coerceThenable(v8::Handle<v8::Object> the |
return promise; |
} |
-void V8PromiseCustom::callHandler(v8::Handle<v8::Object> promise, v8::Handle<v8::Function> handler, v8::Handle<v8::Value> argument, v8::Isolate* isolate) |
+void V8PromiseCustom::callHandler(v8::Handle<v8::Object> promise, v8::Handle<v8::Function> handler, v8::Handle<v8::Value> argument, PromiseState originatorState, v8::Isolate* isolate) |
{ |
+ ASSERT(originatorState == Fulfilled || originatorState == Rejected); |
ExecutionContext* executionContext = getExecutionContext(); |
ASSERT(executionContext && executionContext->isContextThread()); |
- executionContext->postTask(adoptPtr(new CallHandlerTask(promise, handler, argument, isolate, executionContext))); |
+ executionContext->postTask(adoptPtr(new CallHandlerTask(promise, handler, argument, originatorState, isolate, executionContext))); |
} |
} // namespace WebCore |