| 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 "bindings/core/v8/ScriptPromisePropertyBase.h" | 6 #include "bindings/core/v8/ScriptPromisePropertyBase.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/ScopedPersistent.h" | 8 #include "bindings/core/v8/ScopedPersistent.h" |
| 9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
| 10 #include "bindings/core/v8/V8Binding.h" | 10 #include "bindings/core/v8/V8Binding.h" |
| 11 #include "bindings/core/v8/V8HiddenValue.h" | 11 #include "bindings/core/v8/V8HiddenValue.h" |
| 12 #include "core/dom/ExecutionContext.h" | 12 #include "core/dom/ExecutionContext.h" |
| 13 | 13 |
| 14 namespace blink { | 14 namespace blink { |
| 15 | 15 |
| 16 ScriptPromisePropertyBase::ScriptPromisePropertyBase(ExecutionContext* execution
Context, Name name) | 16 ScriptPromisePropertyBase::ScriptPromisePropertyBase(ExecutionContext* execution
Context, Name name) |
| 17 : ContextLifecycleObserver(executionContext) | 17 : ContextLifecycleObserver(executionContext) |
| 18 , m_isolate(toIsolate(executionContext)) | 18 , m_isolate(toIsolate(executionContext)) |
| 19 , m_name(name) | 19 , m_name(name) |
| 20 , m_state(Pending) | 20 , m_state(Pending) |
| 21 { | 21 { |
| 22 } | 22 } |
| 23 | 23 |
| 24 ScriptPromisePropertyBase::~ScriptPromisePropertyBase() | 24 ScriptPromisePropertyBase::~ScriptPromisePropertyBase() |
| 25 { | 25 { |
| 26 clearWrappers(); | 26 clearWrappers(); |
| 27 } | 27 } |
| 28 | 28 |
| 29 static void clearHandle(const v8::WeakCallbackData<v8::Object, ScopedPersistent<
v8::Object> >& data) | 29 static void clearHandle(const v8::WeakCallbackData<v8::Object, ScopedPersistent<
v8::Object>>& data) |
| 30 { | 30 { |
| 31 data.GetParameter()->clear(); | 31 data.GetParameter()->clear(); |
| 32 } | 32 } |
| 33 | 33 |
| 34 ScriptPromise ScriptPromisePropertyBase::promise(DOMWrapperWorld& world) | 34 ScriptPromise ScriptPromisePropertyBase::promise(DOMWrapperWorld& world) |
| 35 { | 35 { |
| 36 if (!executionContext()) | 36 if (!executionContext()) |
| 37 return ScriptPromise(); | 37 return ScriptPromise(); |
| 38 | 38 |
| 39 v8::HandleScope handleScope(m_isolate); | 39 v8::HandleScope handleScope(m_isolate); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 { | 73 { |
| 74 ASSERT(executionContext()); | 74 ASSERT(executionContext()); |
| 75 ASSERT(m_state == Pending); | 75 ASSERT(m_state == Pending); |
| 76 ASSERT(targetState == Resolved || targetState == Rejected); | 76 ASSERT(targetState == Resolved || targetState == Rejected); |
| 77 | 77 |
| 78 m_state = targetState; | 78 m_state = targetState; |
| 79 | 79 |
| 80 v8::HandleScope handleScope(m_isolate); | 80 v8::HandleScope handleScope(m_isolate); |
| 81 size_t i = 0; | 81 size_t i = 0; |
| 82 while (i < m_wrappers.size()) { | 82 while (i < m_wrappers.size()) { |
| 83 const OwnPtr<ScopedPersistent<v8::Object> >& persistent = m_wrappers[i]; | 83 const OwnPtr<ScopedPersistent<v8::Object>>& persistent = m_wrappers[i]; |
| 84 if (persistent->isEmpty()) { | 84 if (persistent->isEmpty()) { |
| 85 // wrapper has died. | 85 // wrapper has died. |
| 86 // Since v8 GC can run during the iteration and clear the reference, | 86 // Since v8 GC can run during the iteration and clear the reference, |
| 87 // we can't move this check out of the loop. | 87 // we can't move this check out of the loop. |
| 88 m_wrappers.remove(i); | 88 m_wrappers.remove(i); |
| 89 continue; | 89 continue; |
| 90 } | 90 } |
| 91 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); | 91 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); |
| 92 ScriptState::Scope scope(ScriptState::from(wrapper->CreationContext())); | 92 ScriptState::Scope scope(ScriptState::from(wrapper->CreationContext())); |
| 93 | 93 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 118 resolver->Reject(rejectedValue(m_isolate, resolver->CreationContext()->G
lobal())); | 118 resolver->Reject(rejectedValue(m_isolate, resolver->CreationContext()->G
lobal())); |
| 119 break; | 119 break; |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 | 122 |
| 123 v8::Local<v8::Object> ScriptPromisePropertyBase::ensureHolderWrapper(ScriptState
* scriptState) | 123 v8::Local<v8::Object> ScriptPromisePropertyBase::ensureHolderWrapper(ScriptState
* scriptState) |
| 124 { | 124 { |
| 125 v8::Local<v8::Context> context = scriptState->context(); | 125 v8::Local<v8::Context> context = scriptState->context(); |
| 126 size_t i = 0; | 126 size_t i = 0; |
| 127 while (i < m_wrappers.size()) { | 127 while (i < m_wrappers.size()) { |
| 128 const OwnPtr<ScopedPersistent<v8::Object> >& persistent = m_wrappers[i]; | 128 const OwnPtr<ScopedPersistent<v8::Object>>& persistent = m_wrappers[i]; |
| 129 if (persistent->isEmpty()) { | 129 if (persistent->isEmpty()) { |
| 130 // wrapper has died. | 130 // wrapper has died. |
| 131 // Since v8 GC can run during the iteration and clear the reference, | 131 // Since v8 GC can run during the iteration and clear the reference, |
| 132 // we can't move this check out of the loop. | 132 // we can't move this check out of the loop. |
| 133 m_wrappers.remove(i); | 133 m_wrappers.remove(i); |
| 134 continue; | 134 continue; |
| 135 } | 135 } |
| 136 | 136 |
| 137 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); | 137 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); |
| 138 if (wrapper->CreationContext() == context) | 138 if (wrapper->CreationContext() == context) |
| 139 return wrapper; | 139 return wrapper; |
| 140 ++i; | 140 ++i; |
| 141 } | 141 } |
| 142 v8::Local<v8::Object> wrapper = holder(context->Global(), m_isolate); | 142 v8::Local<v8::Object> wrapper = holder(context->Global(), m_isolate); |
| 143 OwnPtr<ScopedPersistent<v8::Object> > weakPersistent = adoptPtr(new ScopedPe
rsistent<v8::Object>); | 143 OwnPtr<ScopedPersistent<v8::Object>> weakPersistent = adoptPtr(new ScopedPer
sistent<v8::Object>); |
| 144 weakPersistent->set(m_isolate, wrapper); | 144 weakPersistent->set(m_isolate, wrapper); |
| 145 weakPersistent->setWeak(weakPersistent.get(), &clearHandle); | 145 weakPersistent->setWeak(weakPersistent.get(), &clearHandle); |
| 146 m_wrappers.append(weakPersistent.release()); | 146 m_wrappers.append(weakPersistent.release()); |
| 147 return wrapper; | 147 return wrapper; |
| 148 } | 148 } |
| 149 | 149 |
| 150 void ScriptPromisePropertyBase::clearWrappers() | 150 void ScriptPromisePropertyBase::clearWrappers() |
| 151 { | 151 { |
| 152 v8::HandleScope handleScope(m_isolate); | 152 v8::HandleScope handleScope(m_isolate); |
| 153 for (WeakPersistentSet::iterator i = m_wrappers.begin(); i != m_wrappers.end
(); ++i) { | 153 for (WeakPersistentSet::iterator i = m_wrappers.begin(); i != m_wrappers.end
(); ++i) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 ASSERT_NOT_REACHED(); | 189 ASSERT_NOT_REACHED(); |
| 190 return v8::Handle<v8::String>(); | 190 return v8::Handle<v8::String>(); |
| 191 } | 191 } |
| 192 | 192 |
| 193 void ScriptPromisePropertyBase::trace(Visitor* visitor) | 193 void ScriptPromisePropertyBase::trace(Visitor* visitor) |
| 194 { | 194 { |
| 195 ContextLifecycleObserver::trace(visitor); | 195 ContextLifecycleObserver::trace(visitor); |
| 196 } | 196 } |
| 197 | 197 |
| 198 } // namespace blink | 198 } // namespace blink |
| OLD | NEW |