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