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

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 comments Created 6 years, 4 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/ScriptCallStackFactory.h"
9 #include "bindings/core/v8/ScriptState.h"
10
11 namespace blink {
12
13 struct PromiseTracker::PromiseDataWrapper {
aandrey 2014/08/06 16:31:31 should be just PromiseDataWrapper, wrapped into na
Alexandra Mikhaylova 2014/08/07 15:01:09 Done.
14 WTF_MAKE_NONCOPYABLE(PromiseDataWrapper);
15 public:
16 PromiseDataWrapper(WeakPtr<PromiseData> data)
17 : m_data(data)
18 {
19 }
20
21 WeakPtr<PromiseData> m_data;
22
23 static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseD ataWrapper>& data)
24 {
25 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter());
26 WeakPtr<PromiseData> promiseData = wrapper->m_data;
27 if (!promiseData.get())
28 return;
29 PromiseTracker* tracker = promiseData->m_promiseTracker;
30 if (!tracker->isEnabled())
31 return;
32 tracker->didRemovePromise(promiseData);
33 }
34 };
35
36 PromiseTracker::PromiseData::PromiseData(v8::Isolate* isolate, v8::Handle<v8::Ob ject> promise, v8::Handle<v8::Object> parentPromise, int status, PromiseTracker* tracker, bool captureStack)
37 : m_promiseTracker(tracker)
38 , m_promiseHash(promise->GetIdentityHash())
39 , m_promise(isolate, promise)
40 , m_parentPromise(isolate, parentPromise)
41 , m_status(status)
42 , m_weakPtrFactory(this)
43 {
44 if (captureStack) {
45 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTrace( isolate, 1));
46 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(stackT race, 1, isolate);
47 if (stack->size())
48 m_callFrame = stack->at(0);
49 }
50 PromiseDataWrapper* wrapper = new PromiseDataWrapper(m_weakPtrFactory.create WeakPtr());
51 m_promise.setWeak(wrapper, &PromiseTracker::PromiseDataWrapper::didRemovePro mise);
52 }
53
54 void PromiseTracker::enable()
55 {
56 m_isEnabled = true;
57 }
58
59 void PromiseTracker::disable()
60 {
61 m_isEnabled = false;
62 clear();
63 }
64
65 void PromiseTracker::clear()
66 {
67 m_promiseDataMap.clear();
68 }
69
70 PromiseTracker::PromiseDataVector* PromiseTracker::promiseVector(int promiseHash )
71 {
72 ASSERT(isEnabled());
aandrey 2014/08/06 16:31:31 redundant?
Alexandra Mikhaylova 2014/08/07 15:01:09 Removed.
73
74 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash);
75 if (it != m_promiseDataMap.end())
76 return &it->value;
77 return &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedValue-> value;
78 }
79
80 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status)
81 {
82 ASSERT(isEnabled());
83
84 if (status != 0) {
85 didUpdatePromiseStatus(scriptState, promise, status);
86 } else if (parentPromise->IsObject()) {
87 didUpdatePromiseParent(scriptState, promise, parentPromise->ToObject());
88 } else {
89 didCreatePromise(scriptState, promise);
90 }
91 }
92
93 void PromiseTracker::didCreatePromise(ScriptState* scriptState, v8::Handle<v8::O bject> promise)
94 {
95 PromiseDataVector* vector = promiseVector(promise->GetIdentityHash());
96 vector->append(adoptRef(new PromiseData(scriptState->isolate(), promise, v8: :Handle<v8::Object>(), 0, this, true)));
97 }
98
99 void PromiseTracker::didUpdatePromiseParent(ScriptState* scriptState, v8::Handle <v8::Object> promise, v8::Handle<v8::Object> parentPromise)
100 {
101 PromiseDataVector* vector = promiseVector(promise->GetIdentityHash());
102 bool found = false;
103 for (size_t index = 0; index < vector->size(); ++index) {
104 RefPtr<PromiseData> data = vector->at(index);
105 if (data->m_promise == promise) {
106 found = true;
107 data->m_parentPromise.set(scriptState->isolate(), parentPromise);
108 break;
109 }
110 }
111 if (!found)
112 vector->append(adoptRef(new PromiseData(scriptState->isolate(), promise, parentPromise, 0, this)));
113 }
114
115 void PromiseTracker::didUpdatePromiseStatus(ScriptState* scriptState, v8::Handle <v8::Object> promise, int status)
116 {
117 PromiseDataVector* vector = promiseVector(promise->GetIdentityHash());
118 bool found = false;
119 for (size_t index = 0; index < vector->size(); ++index) {
120 RefPtr<PromiseData> data = vector->at(index);
121 if (data->m_promise == promise) {
122 found = true;
123 data->m_status = status;
124 break;
125 }
126 }
127 if (!found)
128 vector->append(adoptRef(new PromiseData(scriptState->isolate(), promise, v8::Handle<v8::Object>(), status, this)));
129 }
130
131 void PromiseTracker::didRemovePromise(WeakPtr<PromiseData>& promiseData)
aandrey 2014/08/06 16:31:31 don't use WeakPtr here
Alexandra Mikhaylova 2014/08/07 15:01:09 Done.
132 {
133 ASSERT(isEnabled());
aandrey 2014/08/06 16:31:31 remove
Alexandra Mikhaylova 2014/08/07 15:01:09 Done.
134
135 int promiseHash = promiseData->m_promiseHash;
136 PromiseDataVector* vector = promiseVector(promiseHash);
137 ASSERT(vector->size() >= 1);
138 bool found = false;
139 for (size_t index = 0; index < vector->size(); ++index) {
140 RefPtr<PromiseData> data = vector->at(index);
141 if (data->m_promise == promiseData->m_promise) {
142 found = true;
aandrey 2014/08/06 16:31:31 too much copy-pasted code duplication, this is a n
Alexandra Mikhaylova 2014/08/07 15:01:09 Refactored the methods.
143 vector->remove(index);
144 break;
145 }
146 }
147 if (vector->size() == 0)
148 m_promiseDataMap.remove(promiseHash);
149 }
150
151 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698