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

Unified Diff: Source/core/inspector/AsyncCallStackTracker.cpp

Issue 131823003: DevTools: Implement async call stacks for Promises. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: addressed Created 6 years, 11 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: Source/core/inspector/AsyncCallStackTracker.cpp
diff --git a/Source/core/inspector/AsyncCallStackTracker.cpp b/Source/core/inspector/AsyncCallStackTracker.cpp
index 508d4cd24a9dcda9e89ebc23a380f982b32f4b88..e93fdc5f85701c61cc24c6d545607df3cbb00ab4 100644
--- a/Source/core/inspector/AsyncCallStackTracker.cpp
+++ b/Source/core/inspector/AsyncCallStackTracker.cpp
@@ -48,6 +48,8 @@ static const char setIntervalName[] = "setInterval";
static const char requestAnimationFrameName[] = "requestAnimationFrame";
static const char xhrSendName[] = "XMLHttpRequest.send";
static const char enqueueMutationRecordName[] = "Mutation";
+static const char promiseResolved[] = "Promise.resolve";
+static const char promiseRejected[] = "Promise.reject";
}
@@ -127,6 +129,7 @@ public:
HashMap<EventTarget*, EventListenerAsyncCallChainVectorHashMap> m_eventTargetCallChains;
HashMap<EventTarget*, RefPtr<AsyncCallChain> > m_xhrCallChains;
HashMap<MutationObserver*, RefPtr<AsyncCallChain> > m_mutationObserverCallChains;
+ HashMap<ExecutionContextTask*, RefPtr<AsyncCallChain> > m_promiseTaskCallChains;
};
static XMLHttpRequest* toXmlHttpRequest(EventTarget* eventTarget)
@@ -362,6 +365,30 @@ void AsyncCallStackTracker::willDeliverMutationRecords(ExecutionContext* context
setCurrentAsyncCallChain(0);
}
+void AsyncCallStackTracker::didPostPromiseTask(ExecutionContext* context, ExecutionContextTask* task, bool isResolved, const ScriptValue& callFrames)
+{
+ ASSERT(context);
+ ASSERT(isEnabled());
+ if (validateCallFrames(callFrames)) {
+ ExecutionContextData* data = createContextDataIfNeeded(context);
+ data->m_promiseTaskCallChains.set(task, createAsyncCallChain(isResolved ? promiseResolved : promiseRejected, callFrames));
+ } else if (m_currentAsyncCallChain) {
+ // Propagate async call stack to the re-posted task to update a derived Promise.
+ ExecutionContextData* data = createContextDataIfNeeded(context);
+ data->m_promiseTaskCallChains.set(task, m_currentAsyncCallChain);
+ }
+}
+
+void AsyncCallStackTracker::willPerformPromiseTask(ExecutionContext* context, ExecutionContextTask* task)
+{
+ ASSERT(context);
+ ASSERT(isEnabled());
+ if (ExecutionContextData* data = m_executionContextDataMap.get(context))
+ setCurrentAsyncCallChain(data->m_promiseTaskCallChains.take(task));
+ else
+ setCurrentAsyncCallChain(0);
+}
+
void AsyncCallStackTracker::didFireAsyncCall()
{
clearCurrentAsyncCallChain();

Powered by Google App Engine
This is Rietveld 408576698