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 static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis tent<v8::Object>& promise) | |
14 { | |
15 for (size_t index = 0; index < vector->size(); ++index) { | |
16 if (vector->at(index)->promise() == promise) | |
17 return index; | |
18 } | |
19 return -1; | |
20 } | |
21 | |
22 namespace { | |
23 | |
24 struct PromiseDataWrapper { | |
25 PromiseDataWrapper(WeakPtr<PromiseTracker::PromiseData> data, PromiseTracker ::PromiseDataMap* map) | |
26 : m_data(data) | |
27 , m_promiseDataMap(map) | |
28 { | |
29 } | |
30 | |
31 static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseD ataWrapper>& data) | |
32 { | |
33 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter()); | |
34 WeakPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data; | |
35 if (!promiseData) | |
36 return; | |
37 PromiseTracker::PromiseDataMap* map = wrapper->m_promiseDataMap; | |
38 int promiseHash = promiseData->promiseHash(); | |
39 PromiseTracker::PromiseDataVector* vector = &map->find(promiseHash)->val ue; | |
40 int index = indexOf(vector, promiseData->promise()); | |
41 ASSERT(index >= 0); | |
42 vector->remove(index); | |
43 if (vector->size() == 0) | |
44 map->remove(promiseHash); | |
45 } | |
46 | |
47 WeakPtr<PromiseTracker::PromiseData> m_data; | |
48 PromiseTracker::PromiseDataMap* m_promiseDataMap; | |
49 }; | |
50 | |
51 } | |
52 | |
53 PromiseTracker::PromiseData::PromiseData(v8::Isolate* isolate, int promiseHash, v8::Handle<v8::Object> promise) | |
54 : m_promiseHash(promiseHash) | |
55 , m_promise(isolate, promise) | |
56 , m_parentPromise(isolate, v8::Handle<v8::Object>()) | |
aandrey
2014/08/25 14:38:52
just remove the line
Alexandra Mikhaylova
2014/08/25 15:23:34
Done.
| |
57 , m_status(0) | |
58 , m_weakPtrFactory(this) | |
59 { | |
60 } | |
61 | |
62 void PromiseTracker::enable() | |
63 { | |
64 m_isEnabled = true; | |
65 } | |
66 | |
67 void PromiseTracker::disable() | |
68 { | |
69 m_isEnabled = false; | |
70 clear(); | |
71 } | |
72 | |
73 void PromiseTracker::clear() | |
74 { | |
75 m_promiseDataMap.clear(); | |
76 } | |
77 | |
78 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status) | |
79 { | |
80 ASSERT(isEnabled()); | |
81 | |
82 int promiseHash = promise->GetIdentityHash(); | |
83 PromiseDataVector* vector; | |
84 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); | |
85 if (it != m_promiseDataMap.end()) | |
86 vector = &it->value; | |
87 else | |
88 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value; | |
89 v8::Isolate* isolate = scriptState->isolate(); | |
aandrey
2014/08/25 14:36:54
nit: put a blank line before this line
Alexandra Mikhaylova
2014/08/25 15:23:34
Done.
| |
90 RefPtr<PromiseData> data; | |
91 int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise)); | |
92 if (index == -1) { | |
93 data = adoptRef(new PromiseData(isolate, promiseHash, promise)); | |
94 PromiseDataWrapper* wrapper = new PromiseDataWrapper(data->m_weakPtrFact ory.createWeakPtr(), &m_promiseDataMap); | |
95 data->m_promise.setWeak(wrapper, &PromiseDataWrapper::didRemovePromise); | |
96 vector->append(data); | |
97 } else { | |
98 data = vector->at(index); | |
99 } | |
100 | |
101 if (status != 0) { | |
aandrey
2014/08/25 14:36:54
why not just:
if (!parentPromise.IsEmpty()) {
Alexandra Mikhaylova
2014/08/25 15:23:34
Thanks, done.
| |
102 data->m_status = status; | |
103 } else if (!parentPromise.IsEmpty()) { | |
104 ASSERT(parentPromise->IsObject()); | |
105 data->m_parentPromise.set(isolate, parentPromise->ToObject()); | |
106 } else { | |
107 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTrace( isolate, 1)); | |
108 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(stackT race, 1, isolate); | |
109 if (stack->size()) | |
110 data->m_callFrame = stack->at(0); | |
111 } | |
112 } | |
113 | |
114 } // namespace blink | |
OLD | NEW |