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

Side by Side Diff: Source/core/inspector/PromiseTracker.cpp

Issue 433653003: Support Promises event-based instrumentation on backend. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address review comments + REBASE Created 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/inspector/PromiseTracker.h"
7
8 #include "bindings/core/v8/ScopedPersistent.h"
9 #include "bindings/core/v8/ScriptCallStackFactory.h"
10 #include "bindings/core/v8/ScriptState.h"
11 #include "wtf/PassOwnPtr.h"
12 #include "wtf/WeakPtr.h"
13
14 namespace blink {
15
16 class PromiseTracker::PromiseData : public RefCounted<PromiseData> {
17 public:
18 PromiseData(v8::Isolate* isolate, int promiseHash, v8::Handle<v8::Object> pr omise)
19 : m_promiseHash(promiseHash)
20 , m_promise(isolate, promise)
21 , m_status(0)
22 , m_weakPtrFactory(this)
23 {
24 }
25
26 int promiseHash() const { return m_promiseHash; }
27 ScopedPersistent<v8::Object>& promise() { return m_promise; }
28
29 private:
30 friend class PromiseTracker;
31
32 int m_promiseHash;
33
34 ScopedPersistent<v8::Object> m_promise;
35 ScriptCallFrame m_callFrame;
36 ScopedPersistent<v8::Object> m_parentPromise;
37 int m_status;
38
39 WeakPtrFactory<PromiseData> m_weakPtrFactory;
40 };
41
42 static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis tent<v8::Object>& promise)
43 {
44 for (size_t index = 0; index < vector->size(); ++index) {
45 if (vector->at(index)->promise() == promise)
46 return index;
47 }
48 return -1;
49 }
50
51 namespace {
52
53 class PromiseDataWrapper {
54 public:
55 PromiseDataWrapper(WeakPtr<PromiseTracker::PromiseData> data, PromiseTracker ::PromiseDataMap* map)
56 : m_data(data)
57 , m_promiseDataMap(map)
58 {
59 }
60
61 static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseD ataWrapper>& data)
62 {
63 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter());
64 WeakPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data;
65 if (!promiseData)
66 return;
67 PromiseTracker::PromiseDataMap* map = wrapper->m_promiseDataMap;
68 int promiseHash = promiseData->promiseHash();
69 PromiseTracker::PromiseDataVector* vector = &map->find(promiseHash)->val ue;
70 int index = indexOf(vector, promiseData->promise());
71 ASSERT(index >= 0);
72 vector->remove(index);
73 if (vector->size() == 0)
74 map->remove(promiseHash);
75 }
76
77 private:
78 WeakPtr<PromiseTracker::PromiseData> m_data;
79 PromiseTracker::PromiseDataMap* m_promiseDataMap;
80 };
81
82 }
83
84 PromiseTracker::PromiseTracker()
85 : m_isEnabled(false)
86 {
87 }
88
89 PromiseTracker::~PromiseTracker()
90 {
91 }
92
93 void PromiseTracker::enable()
94 {
95 m_isEnabled = true;
96 }
97
98 void PromiseTracker::disable()
99 {
100 m_isEnabled = false;
101 clear();
102 }
103
104 void PromiseTracker::clear()
105 {
106 m_promiseDataMap.clear();
107 }
108
109 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status)
110 {
111 ASSERT(isEnabled());
112
113 int promiseHash = promise->GetIdentityHash();
114 PromiseDataVector* vector;
115 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash);
116 if (it != m_promiseDataMap.end())
117 vector = &it->value;
118 else
119 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value;
120
121 v8::Isolate* isolate = scriptState->isolate();
122 RefPtr<PromiseData> data;
123 int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise));
124 if (index == -1) {
125 data = adoptRef(new PromiseData(isolate, promiseHash, promise));
126 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(new PromiseDataWrapper(dat a->m_weakPtrFactory.createWeakPtr(), &m_promiseDataMap));
127 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemov ePromise);
128 vector->append(data);
129 } else {
130 data = vector->at(index);
131 }
132
133 if (!parentPromise.IsEmpty()) {
134 ASSERT(parentPromise->IsObject());
135 data->m_parentPromise.set(isolate, parentPromise->ToObject());
136 } else {
137 data->m_status = status;
138 if (!status) {
139 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTr ace(isolate, 1));
140 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(st ackTrace, 1, isolate);
141 if (stack->size())
142 data->m_callFrame = stack->at(0);
143 }
144 }
145 }
146
147 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698