OLD | NEW |
---|---|
(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 | |
OLD | NEW |