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 { | |
yurys
2014/08/26 14:06:36
Let's make it a class.
Alexandra Mikhaylova
2014/08/28 13:29:46
Done.
| |
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 | |
yurys
2014/08/26 14:06:36
These fields should be private.
Alexandra Mikhaylova
2014/08/28 13:29:46
Done.
| |
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_status(0) | |
57 , m_weakPtrFactory(this) | |
58 { | |
59 } | |
60 | |
61 void PromiseTracker::enable() | |
62 { | |
63 m_isEnabled = true; | |
64 } | |
65 | |
66 void PromiseTracker::disable() | |
67 { | |
68 m_isEnabled = false; | |
69 clear(); | |
70 } | |
71 | |
72 void PromiseTracker::clear() | |
73 { | |
74 m_promiseDataMap.clear(); | |
75 } | |
76 | |
77 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status) | |
78 { | |
79 ASSERT(isEnabled()); | |
80 | |
81 int promiseHash = promise->GetIdentityHash(); | |
82 PromiseDataVector* vector; | |
83 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); | |
84 if (it != m_promiseDataMap.end()) | |
85 vector = &it->value; | |
86 else | |
87 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value; | |
88 | |
89 v8::Isolate* isolate = scriptState->isolate(); | |
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); | |
yurys
2014/08/26 14:06:36
adoptPtr(...).leakPtr() or better assign to an Own
Alexandra Mikhaylova
2014/08/28 13:29:46
Assigned to an OwnPtr and used leakPtr() below sin
| |
95 data->m_promise.setWeak(wrapper, &PromiseDataWrapper::didRemovePromise); | |
96 vector->append(data); | |
97 } else { | |
98 data = vector->at(index); | |
99 } | |
100 | |
101 if (!parentPromise.IsEmpty()) { | |
102 ASSERT(parentPromise->IsObject()); | |
103 data->m_parentPromise.set(isolate, parentPromise->ToObject()); | |
104 } else { | |
105 data->m_status = status; | |
106 if (!status) { | |
107 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTr ace(isolate, 1)); | |
108 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(st ackTrace, 1, isolate); | |
109 if (stack->size()) | |
110 data->m_callFrame = stack->at(0); | |
111 } | |
112 } | |
113 } | |
114 | |
115 } // namespace blink | |
OLD | NEW |