Chromium Code Reviews| 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 struct PromiseTracker::PromiseDataWrapper { | |
|
aandrey
2014/08/06 16:31:31
should be just PromiseDataWrapper, wrapped into na
Alexandra Mikhaylova
2014/08/07 15:01:09
Done.
| |
| 14 WTF_MAKE_NONCOPYABLE(PromiseDataWrapper); | |
| 15 public: | |
| 16 PromiseDataWrapper(WeakPtr<PromiseData> data) | |
| 17 : m_data(data) | |
| 18 { | |
| 19 } | |
| 20 | |
| 21 WeakPtr<PromiseData> m_data; | |
| 22 | |
| 23 static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseD ataWrapper>& data) | |
| 24 { | |
| 25 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter()); | |
| 26 WeakPtr<PromiseData> promiseData = wrapper->m_data; | |
| 27 if (!promiseData.get()) | |
| 28 return; | |
| 29 PromiseTracker* tracker = promiseData->m_promiseTracker; | |
| 30 if (!tracker->isEnabled()) | |
| 31 return; | |
| 32 tracker->didRemovePromise(promiseData); | |
| 33 } | |
| 34 }; | |
| 35 | |
| 36 PromiseTracker::PromiseData::PromiseData(v8::Isolate* isolate, v8::Handle<v8::Ob ject> promise, v8::Handle<v8::Object> parentPromise, int status, PromiseTracker* tracker, bool captureStack) | |
| 37 : m_promiseTracker(tracker) | |
| 38 , m_promiseHash(promise->GetIdentityHash()) | |
| 39 , m_promise(isolate, promise) | |
| 40 , m_parentPromise(isolate, parentPromise) | |
| 41 , m_status(status) | |
| 42 , m_weakPtrFactory(this) | |
| 43 { | |
| 44 if (captureStack) { | |
| 45 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTrace( isolate, 1)); | |
| 46 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(stackT race, 1, isolate); | |
| 47 if (stack->size()) | |
| 48 m_callFrame = stack->at(0); | |
| 49 } | |
| 50 PromiseDataWrapper* wrapper = new PromiseDataWrapper(m_weakPtrFactory.create WeakPtr()); | |
| 51 m_promise.setWeak(wrapper, &PromiseTracker::PromiseDataWrapper::didRemovePro mise); | |
| 52 } | |
| 53 | |
| 54 void PromiseTracker::enable() | |
| 55 { | |
| 56 m_isEnabled = true; | |
| 57 } | |
| 58 | |
| 59 void PromiseTracker::disable() | |
| 60 { | |
| 61 m_isEnabled = false; | |
| 62 clear(); | |
| 63 } | |
| 64 | |
| 65 void PromiseTracker::clear() | |
| 66 { | |
| 67 m_promiseDataMap.clear(); | |
| 68 } | |
| 69 | |
| 70 PromiseTracker::PromiseDataVector* PromiseTracker::promiseVector(int promiseHash ) | |
| 71 { | |
| 72 ASSERT(isEnabled()); | |
|
aandrey
2014/08/06 16:31:31
redundant?
Alexandra Mikhaylova
2014/08/07 15:01:09
Removed.
| |
| 73 | |
| 74 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); | |
| 75 if (it != m_promiseDataMap.end()) | |
| 76 return &it->value; | |
| 77 return &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedValue-> value; | |
| 78 } | |
| 79 | |
| 80 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status) | |
| 81 { | |
| 82 ASSERT(isEnabled()); | |
| 83 | |
| 84 if (status != 0) { | |
| 85 didUpdatePromiseStatus(scriptState, promise, status); | |
| 86 } else if (parentPromise->IsObject()) { | |
| 87 didUpdatePromiseParent(scriptState, promise, parentPromise->ToObject()); | |
| 88 } else { | |
| 89 didCreatePromise(scriptState, promise); | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 void PromiseTracker::didCreatePromise(ScriptState* scriptState, v8::Handle<v8::O bject> promise) | |
| 94 { | |
| 95 PromiseDataVector* vector = promiseVector(promise->GetIdentityHash()); | |
| 96 vector->append(adoptRef(new PromiseData(scriptState->isolate(), promise, v8: :Handle<v8::Object>(), 0, this, true))); | |
| 97 } | |
| 98 | |
| 99 void PromiseTracker::didUpdatePromiseParent(ScriptState* scriptState, v8::Handle <v8::Object> promise, v8::Handle<v8::Object> parentPromise) | |
| 100 { | |
| 101 PromiseDataVector* vector = promiseVector(promise->GetIdentityHash()); | |
| 102 bool found = false; | |
| 103 for (size_t index = 0; index < vector->size(); ++index) { | |
| 104 RefPtr<PromiseData> data = vector->at(index); | |
| 105 if (data->m_promise == promise) { | |
| 106 found = true; | |
| 107 data->m_parentPromise.set(scriptState->isolate(), parentPromise); | |
| 108 break; | |
| 109 } | |
| 110 } | |
| 111 if (!found) | |
| 112 vector->append(adoptRef(new PromiseData(scriptState->isolate(), promise, parentPromise, 0, this))); | |
| 113 } | |
| 114 | |
| 115 void PromiseTracker::didUpdatePromiseStatus(ScriptState* scriptState, v8::Handle <v8::Object> promise, int status) | |
| 116 { | |
| 117 PromiseDataVector* vector = promiseVector(promise->GetIdentityHash()); | |
| 118 bool found = false; | |
| 119 for (size_t index = 0; index < vector->size(); ++index) { | |
| 120 RefPtr<PromiseData> data = vector->at(index); | |
| 121 if (data->m_promise == promise) { | |
| 122 found = true; | |
| 123 data->m_status = status; | |
| 124 break; | |
| 125 } | |
| 126 } | |
| 127 if (!found) | |
| 128 vector->append(adoptRef(new PromiseData(scriptState->isolate(), promise, v8::Handle<v8::Object>(), status, this))); | |
| 129 } | |
| 130 | |
| 131 void PromiseTracker::didRemovePromise(WeakPtr<PromiseData>& promiseData) | |
|
aandrey
2014/08/06 16:31:31
don't use WeakPtr here
Alexandra Mikhaylova
2014/08/07 15:01:09
Done.
| |
| 132 { | |
| 133 ASSERT(isEnabled()); | |
|
aandrey
2014/08/06 16:31:31
remove
Alexandra Mikhaylova
2014/08/07 15:01:09
Done.
| |
| 134 | |
| 135 int promiseHash = promiseData->m_promiseHash; | |
| 136 PromiseDataVector* vector = promiseVector(promiseHash); | |
| 137 ASSERT(vector->size() >= 1); | |
| 138 bool found = false; | |
| 139 for (size_t index = 0; index < vector->size(); ++index) { | |
| 140 RefPtr<PromiseData> data = vector->at(index); | |
| 141 if (data->m_promise == promiseData->m_promise) { | |
| 142 found = true; | |
|
aandrey
2014/08/06 16:31:31
too much copy-pasted code duplication, this is a n
Alexandra Mikhaylova
2014/08/07 15:01:09
Refactored the methods.
| |
| 143 vector->remove(index); | |
| 144 break; | |
| 145 } | |
| 146 } | |
| 147 if (vector->size() == 0) | |
| 148 m_promiseDataMap.remove(promiseHash); | |
| 149 } | |
| 150 | |
| 151 } // namespace blink | |
| OLD | NEW |