OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/inspector/PromiseTracker.h" | 6 #include "core/inspector/PromiseTracker.h" |
7 | 7 |
8 #include "bindings/core/v8/ScopedPersistent.h" | 8 #include "bindings/core/v8/ScopedPersistent.h" |
9 #include "bindings/core/v8/ScriptCallStackFactory.h" | 9 #include "bindings/core/v8/ScriptCallStackFactory.h" |
10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
11 #include "bindings/core/v8/ScriptValue.h" | 11 #include "bindings/core/v8/ScriptValue.h" |
12 #include "wtf/CurrentTime.h" | 12 #include "wtf/CurrentTime.h" |
13 #include "wtf/PassOwnPtr.h" | 13 #include "wtf/PassOwnPtr.h" |
14 #include "wtf/WeakPtr.h" | 14 #include "wtf/WeakPtr.h" |
15 | 15 |
16 using blink::TypeBuilder::Array; | 16 using blink::TypeBuilder::Array; |
17 using blink::TypeBuilder::Console::CallFrame; | 17 using blink::TypeBuilder::Console::CallFrame; |
18 using blink::TypeBuilder::Debugger::PromiseDetails; | 18 using blink::TypeBuilder::Debugger::PromiseDetails; |
19 | 19 |
20 namespace blink { | 20 namespace blink { |
21 | 21 |
22 class PromiseTracker::PromiseData final : public RefCountedWillBeGarbageCollecte
dFinalized<PromiseData> { | 22 class PromiseTracker::PromiseData final : public RefCountedWillBeGarbageCollecte
dFinalized<PromiseData> { |
23 public: | 23 public: |
24 static PassRefPtrWillBeRawPtr<PromiseData> create(ScriptState* scriptState,
int promiseHash, int promiseId, v8::Handle<v8::Object> promise) | 24 static PassRefPtrWillBeRawPtr<PromiseData> create(ScriptState* scriptState,
int promiseHash, int promiseId, v8::Local<v8::Object> promise) |
25 { | 25 { |
26 return adoptRefWillBeNoop(new PromiseData(scriptState, promiseHash, prom
iseId, promise)); | 26 return adoptRefWillBeNoop(new PromiseData(scriptState, promiseHash, prom
iseId, promise)); |
27 } | 27 } |
28 | 28 |
29 int promiseHash() const { return m_promiseHash; } | 29 int promiseHash() const { return m_promiseHash; } |
30 int promiseId() const { return m_promiseId; } | 30 int promiseId() const { return m_promiseId; } |
31 ScopedPersistent<v8::Object>& promise() { return m_promise; } | 31 ScopedPersistent<v8::Object>& promise() { return m_promise; } |
32 | 32 |
33 #if ENABLE(OILPAN) | 33 #if ENABLE(OILPAN) |
34 void dispose() | 34 void dispose() |
35 { | 35 { |
36 m_promise.clear(); | 36 m_promise.clear(); |
37 m_parentPromise.clear(); | 37 m_parentPromise.clear(); |
38 } | 38 } |
39 #else | 39 #else |
40 WeakPtr<PromiseData> createWeakPtr() | 40 WeakPtr<PromiseData> createWeakPtr() |
41 { | 41 { |
42 return m_weakPtrFactory.createWeakPtr(); | 42 return m_weakPtrFactory.createWeakPtr(); |
43 } | 43 } |
44 #endif | 44 #endif |
45 | 45 |
46 void trace(Visitor* visitor) | 46 void trace(Visitor* visitor) |
47 { | 47 { |
48 visitor->trace(m_callStack); | 48 visitor->trace(m_callStack); |
49 } | 49 } |
50 | 50 |
51 private: | 51 private: |
52 friend class PromiseTracker; | 52 friend class PromiseTracker; |
53 | 53 |
54 PromiseData(ScriptState* scriptState, int promiseHash, int promiseId, v8::Ha
ndle<v8::Object> promise) | 54 PromiseData(ScriptState* scriptState, int promiseHash, int promiseId, v8::Lo
cal<v8::Object> promise) |
55 : m_scriptState(scriptState) | 55 : m_scriptState(scriptState) |
56 , m_promiseHash(promiseHash) | 56 , m_promiseHash(promiseHash) |
57 , m_promiseId(promiseId) | 57 , m_promiseId(promiseId) |
58 , m_promise(scriptState->isolate(), promise) | 58 , m_promise(scriptState->isolate(), promise) |
59 , m_parentPromiseId(0) | 59 , m_parentPromiseId(0) |
60 , m_status(0) | 60 , m_status(0) |
61 , m_creationTime(0) | 61 , m_creationTime(0) |
62 , m_settlementTime(0) | 62 , m_settlementTime(0) |
63 #if !ENABLE(OILPAN) | 63 #if !ENABLE(OILPAN) |
64 , m_weakPtrFactory(this) | 64 , m_weakPtrFactory(this) |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 } | 195 } |
196 | 196 |
197 int PromiseTracker::circularSequentialId() | 197 int PromiseTracker::circularSequentialId() |
198 { | 198 { |
199 ++m_circularSequentialId; | 199 ++m_circularSequentialId; |
200 if (m_circularSequentialId <= 0) | 200 if (m_circularSequentialId <= 0) |
201 m_circularSequentialId = 1; | 201 m_circularSequentialId = 1; |
202 return m_circularSequentialId; | 202 return m_circularSequentialId; |
203 } | 203 } |
204 | 204 |
205 PassRefPtrWillBeRawPtr<PromiseTracker::PromiseData> PromiseTracker::createPromis
eDataIfNeeded(ScriptState* scriptState, v8::Handle<v8::Object> promise) | 205 PassRefPtrWillBeRawPtr<PromiseTracker::PromiseData> PromiseTracker::createPromis
eDataIfNeeded(ScriptState* scriptState, v8::Local<v8::Object> promise) |
206 { | 206 { |
207 int promiseHash = promise->GetIdentityHash(); | 207 int promiseHash = promise->GetIdentityHash(); |
208 RawPtr<PromiseDataVector> vector = nullptr; | 208 RawPtr<PromiseDataVector> vector = nullptr; |
209 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); | 209 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); |
210 if (it != m_promiseDataMap.end()) { | 210 if (it != m_promiseDataMap.end()) { |
211 vector = &it->value; | 211 vector = &it->value; |
212 int index = indexOf(vector, ScopedPersistent<v8::Object>(scriptState->is
olate(), promise)); | 212 int index = indexOf(vector, ScopedPersistent<v8::Object>(scriptState->is
olate(), promise)); |
213 if (index != -1) | 213 if (index != -1) |
214 return vector->at(index); | 214 return vector->at(index); |
215 } else { | 215 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
228 OwnPtr<PromiseDataWrapper> wrapper = dataWrapper.release(); | 228 OwnPtr<PromiseDataWrapper> wrapper = dataWrapper.release(); |
229 #endif | 229 #endif |
230 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemovePro
mise); | 230 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemovePro
mise); |
231 vector->append(data); | 231 vector->append(data); |
232 | 232 |
233 m_promiseIdToDataMap.set(promiseId, data); | 233 m_promiseIdToDataMap.set(promiseId, data); |
234 | 234 |
235 return data.release(); | 235 return data.release(); |
236 } | 236 } |
237 | 237 |
238 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand
le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status) | 238 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Loca
l<v8::Object> promise, v8::Local<v8::Value> parentPromise, int status) |
239 { | 239 { |
240 ASSERT(isEnabled()); | 240 ASSERT(isEnabled()); |
241 | 241 |
242 RefPtrWillBeRawPtr<PromiseData> data = createPromiseDataIfNeeded(scriptState
, promise); | 242 RefPtrWillBeRawPtr<PromiseData> data = createPromiseDataIfNeeded(scriptState
, promise); |
243 if (!parentPromise.IsEmpty() && parentPromise->IsObject()) { | 243 if (!parentPromise.IsEmpty() && parentPromise->IsObject()) { |
244 v8::Handle<v8::Object> handle = parentPromise->ToObject(scriptState->iso
late()); | 244 v8::Local<v8::Object> handle = parentPromise->ToObject(scriptState->isol
ate()); |
245 RefPtrWillBeRawPtr<PromiseData> parentData = createPromiseDataIfNeeded(s
criptState, handle); | 245 RefPtrWillBeRawPtr<PromiseData> parentData = createPromiseDataIfNeeded(s
criptState, handle); |
246 data->m_parentPromiseId = parentData->m_promiseId; | 246 data->m_parentPromiseId = parentData->m_promiseId; |
247 data->m_parentPromise.set(scriptState->isolate(), handle); | 247 data->m_parentPromise.set(scriptState->isolate(), handle); |
248 } else { | 248 } else { |
249 ASSERT(!data->m_status); | 249 ASSERT(!data->m_status); |
250 data->m_status = status; | 250 data->m_status = status; |
251 if (!status) { | 251 if (!status) { |
252 if (!data->m_creationTime) | 252 if (!data->m_creationTime) |
253 data->m_creationTime = currentTimeMS(); | 253 data->m_creationTime = currentTimeMS(); |
254 if (!data->m_callStack) { | 254 if (!data->m_callStack) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 if (it == m_promiseIdToDataMap.end()) | 304 if (it == m_promiseIdToDataMap.end()) |
305 return ScriptValue(); | 305 return ScriptValue(); |
306 RefPtrWillBeRawPtr<PromiseData> data = it->value; | 306 RefPtrWillBeRawPtr<PromiseData> data = it->value; |
307 ASSERT(data && data->m_promiseId == promiseId); | 307 ASSERT(data && data->m_promiseId == promiseId); |
308 ScriptState* scriptState = data->m_scriptState.get(); | 308 ScriptState* scriptState = data->m_scriptState.get(); |
309 v8::HandleScope scope(scriptState->isolate()); | 309 v8::HandleScope scope(scriptState->isolate()); |
310 return ScriptValue(scriptState, data->m_promise.newLocal(scriptState->isolat
e())); | 310 return ScriptValue(scriptState, data->m_promise.newLocal(scriptState->isolat
e())); |
311 } | 311 } |
312 | 312 |
313 } // namespace blink | 313 } // namespace blink |
OLD | NEW |