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

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 + REBASE 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/04 16:58:47 wrap into an anonymous namespace
Alexandra Mikhaylova 2014/08/06 13:28:39 How can it be compliant with the private method Pr
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() && promiseData->m_promiseTracker->isEnabled()))
aandrey 2014/08/04 16:58:48 if (!promiseData) return; PromiseTracker* trac
Alexandra Mikhaylova 2014/08/06 13:28:39 Done.
28 return;
29
30 promiseData->m_promiseTracker->didRemovePromise(promiseData->m_scriptSta te.get(), promiseData->m_promise);
31 }
32 };
33
34 PromiseTracker::PromiseData::PromiseData(const ScopedPersistent<v8::Object>& pro mise, const ScopedPersistent<v8::Object>& parentPromise, int status, ScriptState * scriptState, PromiseTracker* tracker, bool captureStack)
35 : m_scriptState(scriptState)
36 , m_promiseTracker(tracker)
37 , m_promise(scriptState->isolate(), promise.newLocal(scriptState->isolate()) )
aandrey 2014/08/04 16:58:48 make copy constructor on ScopedPersistent
Alexandra Mikhaylova 2014/08/06 13:28:39 Switched back to v8::Handle instead.
38 , m_parentPromise(scriptState->isolate(), parentPromise.newLocal(scriptState ->isolate()))
39 , m_status(status)
40 , m_weakPtrFactory(this)
41 {
42 if (captureStack) {
43 v8::Isolate* isolate = scriptState->isolate();
44 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTrace( isolate, 1));
45 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(stackT race, 1, isolate);
46 if (stack->size())
47 m_callFrame = stack->at(0);
48 }
49 PromiseDataWrapper* wrapper = new PromiseDataWrapper(m_weakPtrFactory.create WeakPtr());
50 m_promise.setWeak(wrapper, &PromiseTracker::PromiseDataWrapper::didRemovePro mise);
51 }
52
53 void PromiseTracker::enable()
54 {
55 m_isEnabled = true;
56 }
57
58 void PromiseTracker::disable()
59 {
60 m_isEnabled = false;
61 clear();
62 }
63
64 void PromiseTracker::clear()
65 {
66 m_promiseDataMap.clear();
67 }
68
69 PromiseTracker::PromiseDataVector* PromiseTracker::promiseVector(ScriptState* sc riptState, const ScopedPersistent<v8::Object>& promise)
70 {
71 ASSERT(isEnabled());
72
73 int promiseHash = promise.newLocal(scriptState->isolate())->GetIdentityHash( );
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, const Sc opedPersistent<v8::Object>& promise, const ScopedPersistent<v8::Object>& parentP romise, int status)
81 {
82 ASSERT(isEnabled());
83
84 if (status != 0) {
85 didUpdatePromiseStatus(scriptState, promise, status);
86 } else if (!parentPromise.isEmpty()) {
87 didUpdatePromiseParent(scriptState, promise, parentPromise);
88 } else {
89 didCreatePromise(scriptState, promise);
90 }
91 }
92
93 void PromiseTracker::didCreatePromise(ScriptState* scriptState, const ScopedPers istent<v8::Object>& promise)
94 {
95 PromiseDataVector* vector = promiseVector(scriptState, promise);
96 vector->append(adoptRef(new PromiseData(promise, ScopedPersistent<v8::Object >(), 0, scriptState, this, true)));
97 }
98
99 void PromiseTracker::didUpdatePromiseParent(ScriptState* scriptState, const Scop edPersistent<v8::Object>& promise, const ScopedPersistent<v8::Object>& parentPro mise)
100 {
101 PromiseDataVector* vector = promiseVector(scriptState, promise);
102 bool found = false;
103 for (size_t index = 0; index < vector->size(); ++index) {
104 RefPtr<PromiseData> data = (*vector)[index];
aandrey 2014/08/04 16:58:48 vector->at(index)
Alexandra Mikhaylova 2014/08/06 13:28:39 Done.
105 if (data->m_promise == promise) {
106 found = true;
107 v8::Isolate* isolate = scriptState->isolate();
108 data->m_parentPromise.set(isolate, parentPromise.newLocal(isolate));
aandrey 2014/08/04 16:58:48 should be no newLocal() call
Alexandra Mikhaylova 2014/08/06 13:28:39 Done.
109 break;
110 }
111 }
112 if (!found)
113 vector->append(adoptRef(new PromiseData(promise, parentPromise, 0, scrip tState, this)));
114 }
115
116 void PromiseTracker::didUpdatePromiseStatus(ScriptState* scriptState, const Scop edPersistent<v8::Object>& promise, int status)
117 {
118 PromiseDataVector* vector = promiseVector(scriptState, promise);
119 bool found = false;
120 for (size_t index = 0; index < vector->size(); ++index) {
121 RefPtr<PromiseData> data = (*vector)[index];
122 if (data->m_promise == promise) {
123 found = true;
124 data->m_status = status;
125 break;
126 }
127 }
128 if (!found)
129 vector->append(adoptRef(new PromiseData(promise, ScopedPersistent<v8::Ob ject>(), status, scriptState, this)));
130 }
131
132 void PromiseTracker::didRemovePromise(ScriptState* scriptState, ScopedPersistent <v8::Object>& promise)
133 {
134 ASSERT(isEnabled());
135
136 int promiseHash = promise.newLocal(scriptState->isolate())->GetIdentityHash( );
aandrey 2014/08/04 16:58:48 we can remove m_scriptState if we cache the identi
Alexandra Mikhaylova 2014/08/06 13:28:39 Done.
137
138 PromiseDataVector* vector = promiseVector(scriptState, promise);
139 ASSERT(vector->size() >= 1);
140 bool found = false;
141 for (size_t index = 0; index < vector->size(); ++index) {
142 RefPtr<PromiseData> data = (*vector)[index];
143 if (data->m_promise == promise) {
144 found = true;
145 vector->remove(index);
aandrey 2014/08/04 16:58:48 too much code duplication
146 break;
147 }
148 }
149 if (vector->size() == 0)
150 m_promiseDataMap.remove(promiseHash);
151 }
152
153 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698