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

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

Issue 529723002: [WIP] Protocol for sending information about Promises to frontend. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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 "core/inspector/PromiseTracker.h" 6 #include "core/inspector/PromiseTracker.h"
7 7
8 #include "bindings/core/v8/ScopedPersistent.h" 8 #include "bindings/core/v8/ScopedPersistent.h"
9 #include "bindings/core/v8/ScriptCallStackFactory.h" 9 #include "bindings/core/v8/ScriptCallStackFactory.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
11 #include "wtf/PassOwnPtr.h" 11 #include "wtf/PassOwnPtr.h"
12 #include "wtf/WeakPtr.h" 12 #include "wtf/WeakPtr.h"
13 13
14 using blink::TypeBuilder::Array;
15 using blink::TypeBuilder::Console::CallFrame;
16 using blink::TypeBuilder::Debugger::PromiseDetails;
17
14 namespace blink { 18 namespace blink {
15 19
16 class PromiseTracker::PromiseData : public RefCounted<PromiseData> { 20 class PromiseTracker::PromiseData : public RefCounted<PromiseData> {
17 public: 21 public:
18 PromiseData(v8::Isolate* isolate, int promiseHash, v8::Handle<v8::Object> pr omise) 22 PromiseData(v8::Isolate* isolate, int promiseHash, int promiseId, v8::Handle <v8::Object> promise)
19 : m_promiseHash(promiseHash) 23 : m_promiseHash(promiseHash)
24 , m_promiseId(promiseId)
20 , m_promise(isolate, promise) 25 , m_promise(isolate, promise)
26 , m_parentPromiseId(0)
21 , m_status(0) 27 , m_status(0)
22 , m_weakPtrFactory(this) 28 , m_weakPtrFactory(this)
23 { 29 {
24 } 30 }
25 31
26 int promiseHash() const { return m_promiseHash; } 32 int promiseHash() const { return m_promiseHash; }
27 ScopedPersistent<v8::Object>& promise() { return m_promise; } 33 ScopedPersistent<v8::Object>& promise() { return m_promise; }
28 34
29 private: 35 private:
30 friend class PromiseTracker; 36 friend class PromiseTracker;
31 37
32 int m_promiseHash; 38 int m_promiseHash;
33 39
aandrey 2014/09/01 13:39:27 extra line
Alexandra Mikhaylova 2014/09/02 11:39:29 Fixed.
40 int m_promiseId;
34 ScopedPersistent<v8::Object> m_promise; 41 ScopedPersistent<v8::Object> m_promise;
35 ScriptCallFrame m_callFrame; 42 ScriptCallFrame m_callFrame;
43 int m_parentPromiseId;
36 ScopedPersistent<v8::Object> m_parentPromise; 44 ScopedPersistent<v8::Object> m_parentPromise;
37 int m_status; 45 int m_status;
38 46
39 WeakPtrFactory<PromiseData> m_weakPtrFactory; 47 WeakPtrFactory<PromiseData> m_weakPtrFactory;
40 }; 48 };
41 49
42 static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis tent<v8::Object>& promise) 50 static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis tent<v8::Object>& promise)
43 { 51 {
44 for (size_t index = 0; index < vector->size(); ++index) { 52 for (size_t index = 0; index < vector->size(); ++index) {
45 if (vector->at(index)->promise() == promise) 53 if (vector->at(index)->promise() == promise)
(...skipping 30 matching lines...) Expand all
76 84
77 private: 85 private:
78 WeakPtr<PromiseTracker::PromiseData> m_data; 86 WeakPtr<PromiseTracker::PromiseData> m_data;
79 PromiseTracker::PromiseDataMap* m_promiseDataMap; 87 PromiseTracker::PromiseDataMap* m_promiseDataMap;
80 }; 88 };
81 89
82 } 90 }
83 91
84 PromiseTracker::PromiseTracker() 92 PromiseTracker::PromiseTracker()
85 : m_isEnabled(false) 93 : m_isEnabled(false)
94 , m_lastPromiseId(0)
86 { 95 {
87 } 96 }
88 97
89 PromiseTracker::~PromiseTracker() 98 PromiseTracker::~PromiseTracker()
90 { 99 {
91 } 100 }
92 101
93 void PromiseTracker::enable() 102 void PromiseTracker::enable()
94 { 103 {
95 m_isEnabled = true; 104 m_isEnabled = true;
96 } 105 }
97 106
98 void PromiseTracker::disable() 107 void PromiseTracker::disable()
99 { 108 {
100 m_isEnabled = false; 109 m_isEnabled = false;
101 clear(); 110 clear();
102 } 111 }
103 112
104 void PromiseTracker::clear() 113 void PromiseTracker::clear()
105 { 114 {
106 m_promiseDataMap.clear(); 115 m_promiseDataMap.clear();
116 m_lastPromiseId = 0;
aandrey 2014/09/01 13:39:27 remove
Alexandra Mikhaylova 2014/09/02 11:39:29 I think we shouldn't remove it as we're using inte
107 } 117 }
108 118
109 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status) 119 PassRefPtr<PromiseTracker::PromiseData> PromiseTracker::findOrAddPromiseData(v8: :Isolate* isolate, v8::Handle<v8::Object> promise)
aandrey 2014/09/01 13:39:27 findOrAddPromiseData -> createPromiseDataIfNeeded
Alexandra Mikhaylova 2014/09/02 11:39:29 Done.
110 { 120 {
111 ASSERT(isEnabled());
112
113 int promiseHash = promise->GetIdentityHash(); 121 int promiseHash = promise->GetIdentityHash();
114 PromiseDataVector* vector; 122 PromiseDataVector* vector;
115 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); 123 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash);
116 if (it != m_promiseDataMap.end()) 124 if (it != m_promiseDataMap.end())
117 vector = &it->value; 125 vector = &it->value;
118 else 126 else
119 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value; 127 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value;
120 128
121 v8::Isolate* isolate = scriptState->isolate();
122 RefPtr<PromiseData> data; 129 RefPtr<PromiseData> data;
123 int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise)); 130 int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise));
124 if (index == -1) { 131 if (index == -1) {
125 data = adoptRef(new PromiseData(isolate, promiseHash, promise)); 132 data = adoptRef(new PromiseData(isolate, promiseHash, ++m_lastPromiseId, promise));
aandrey 2014/09/01 13:39:27 use this pattern: int AsyncCallStackTracker::Exec
Alexandra Mikhaylova 2014/09/02 11:39:29 Done, also renamed m_lastPromiseId to m_circularSe
126 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(new PromiseDataWrapper(dat a->m_weakPtrFactory.createWeakPtr(), &m_promiseDataMap)); 133 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(new PromiseDataWrapper(dat a->m_weakPtrFactory.createWeakPtr(), &m_promiseDataMap));
127 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemov ePromise); 134 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemov ePromise);
128 vector->append(data); 135 vector->append(data);
129 } else { 136 } else {
130 data = vector->at(index); 137 data = vector->at(index);
131 } 138 }
132 139
140 return data.release();
141 }
142
143 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status)
144 {
145 ASSERT(isEnabled());
146
147 v8::Isolate* isolate = scriptState->isolate();
148 RefPtr<PromiseData> data = findOrAddPromiseData(isolate, promise);
133 if (!parentPromise.IsEmpty()) { 149 if (!parentPromise.IsEmpty()) {
134 ASSERT(parentPromise->IsObject()); 150 ASSERT(parentPromise->IsObject());
135 data->m_parentPromise.set(isolate, parentPromise->ToObject()); 151 v8::Handle<v8::Object> handle = parentPromise->ToObject();
152 RefPtr<PromiseData> parentData = findOrAddPromiseData(isolate, handle);
153 data->m_parentPromiseId = parentData->m_promiseId;
154 data->m_parentPromise.set(isolate, handle);
136 } else { 155 } else {
137 data->m_status = status; 156 data->m_status = status;
138 if (!status) { 157 if (!status) {
139 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTr ace(isolate, 1)); 158 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTr ace(isolate, 1));
140 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(st ackTrace, 1, isolate); 159 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(st ackTrace, 1, isolate);
141 if (stack->size()) 160 if (stack->size())
142 data->m_callFrame = stack->at(0); 161 data->m_callFrame = stack->at(0);
143 } 162 }
144 } 163 }
145 } 164 }
146 165
166 PassRefPtr<Array<PromiseDetails> > PromiseTracker::getPromises()
167 {
168 ASSERT(isEnabled());
169
170 RefPtr<Array<PromiseDetails> > result;
171 for (PromiseDataMap::iterator it = m_promiseDataMap.begin(); it != m_promise DataMap.end(); ++it) {
172 PromiseDataVector* vector = &it->value;
173 for (size_t index = 0; index < vector->size(); ++index) {
174 RefPtr<PromiseData> data = vector->at(index);
175 RefPtr<CallFrame> callFrame = CallFrame::create()
176 .setFunctionName(data->m_callFrame.functionName())
177 .setScriptId(data->m_callFrame.scriptId())
178 .setUrl(data->m_callFrame.sourceURL())
179 .setLineNumber(data->m_callFrame.lineNumber())
180 .setColumnNumber(data->m_callFrame.columnNumber())
181 .release();
aandrey 2014/09/01 13:39:27 use ScriptCallFrame::buildInspectorObject() instea
Alexandra Mikhaylova 2014/09/02 11:39:29 Thanks! Done.
182 RefPtr<PromiseDetails> promiseDetails = PromiseDetails::create()
183 .setId(data->m_promiseId)
184 .setParentId(data->m_parentPromiseId)
185 .setStatus(data->m_status)
186 .setCallFrame(callFrame)
aandrey 2014/09/01 13:39:27 this should be optional, added only if we captured
Alexandra Mikhaylova 2014/09/02 11:39:29 Done.
187 .release();
aandrey 2014/09/01 13:39:27 remove release() call
Alexandra Mikhaylova 2014/09/02 11:39:29 Done.
188 result->addItem(promiseDetails);
aandrey 2014/09/01 13:39:27 doesn't this crash? result is nullptr here
Alexandra Mikhaylova 2014/09/02 11:39:29 Thanks, fixed it.
189 }
190 }
191
192 return result.release();
193 }
194
147 } // namespace blink 195 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698