| 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 |