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 "bindings/core/v8/ScriptPromisePropertyBase.h" | 5 #include "bindings/core/v8/ScriptPromisePropertyBase.h" |
6 | 6 |
7 #include "bindings/core/v8/ScopedPersistent.h" | 7 #include "bindings/core/v8/ScopedPersistent.h" |
8 #include "bindings/core/v8/ScriptState.h" | 8 #include "bindings/core/v8/ScriptState.h" |
9 #include "bindings/core/v8/V8Binding.h" | 9 #include "bindings/core/v8/V8Binding.h" |
10 #include "bindings/core/v8/V8HiddenValue.h" | 10 #include "bindings/core/v8/V8HiddenValue.h" |
11 #include "core/dom/ExecutionContext.h" | 11 #include "core/dom/ExecutionContext.h" |
12 #include "wtf/PtrUtil.h" | |
13 #include <memory> | |
14 | 12 |
15 namespace blink { | 13 namespace blink { |
16 | 14 |
17 ScriptPromisePropertyBase::ScriptPromisePropertyBase(ExecutionContext* execution
Context, Name name) | 15 ScriptPromisePropertyBase::ScriptPromisePropertyBase(ExecutionContext* execution
Context, Name name) |
18 : ContextLifecycleObserver(executionContext) | 16 : ContextLifecycleObserver(executionContext) |
19 , m_isolate(toIsolate(executionContext)) | 17 , m_isolate(toIsolate(executionContext)) |
20 , m_name(name) | 18 , m_name(name) |
21 , m_state(Pending) | 19 , m_state(Pending) |
22 { | 20 { |
23 } | 21 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 { | 74 { |
77 ASSERT(getExecutionContext()); | 75 ASSERT(getExecutionContext()); |
78 ASSERT(m_state == Pending); | 76 ASSERT(m_state == Pending); |
79 ASSERT(targetState == Resolved || targetState == Rejected); | 77 ASSERT(targetState == Resolved || targetState == Rejected); |
80 | 78 |
81 m_state = targetState; | 79 m_state = targetState; |
82 | 80 |
83 v8::HandleScope handleScope(m_isolate); | 81 v8::HandleScope handleScope(m_isolate); |
84 size_t i = 0; | 82 size_t i = 0; |
85 while (i < m_wrappers.size()) { | 83 while (i < m_wrappers.size()) { |
86 const std::unique_ptr<ScopedPersistent<v8::Object>>& persistent = m_wrap
pers[i]; | 84 const OwnPtr<ScopedPersistent<v8::Object>>& persistent = m_wrappers[i]; |
87 if (persistent->isEmpty()) { | 85 if (persistent->isEmpty()) { |
88 // wrapper has died. | 86 // wrapper has died. |
89 // Since v8 GC can run during the iteration and clear the reference, | 87 // Since v8 GC can run during the iteration and clear the reference, |
90 // we can't move this check out of the loop. | 88 // we can't move this check out of the loop. |
91 m_wrappers.remove(i); | 89 m_wrappers.remove(i); |
92 continue; | 90 continue; |
93 } | 91 } |
94 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); | 92 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); |
95 ScriptState* scriptState = ScriptState::from(wrapper->CreationContext())
; | 93 ScriptState* scriptState = ScriptState::from(wrapper->CreationContext())
; |
96 ScriptState::Scope scope(scriptState); | 94 ScriptState::Scope scope(scriptState); |
(...skipping 27 matching lines...) Expand all Loading... |
124 resolver->Reject(context, rejectedValue(m_isolate, context->Global())); | 122 resolver->Reject(context, rejectedValue(m_isolate, context->Global())); |
125 break; | 123 break; |
126 } | 124 } |
127 } | 125 } |
128 | 126 |
129 v8::Local<v8::Object> ScriptPromisePropertyBase::ensureHolderWrapper(ScriptState
* scriptState) | 127 v8::Local<v8::Object> ScriptPromisePropertyBase::ensureHolderWrapper(ScriptState
* scriptState) |
130 { | 128 { |
131 v8::Local<v8::Context> context = scriptState->context(); | 129 v8::Local<v8::Context> context = scriptState->context(); |
132 size_t i = 0; | 130 size_t i = 0; |
133 while (i < m_wrappers.size()) { | 131 while (i < m_wrappers.size()) { |
134 const std::unique_ptr<ScopedPersistent<v8::Object>>& persistent = m_wrap
pers[i]; | 132 const OwnPtr<ScopedPersistent<v8::Object>>& persistent = m_wrappers[i]; |
135 if (persistent->isEmpty()) { | 133 if (persistent->isEmpty()) { |
136 // wrapper has died. | 134 // wrapper has died. |
137 // Since v8 GC can run during the iteration and clear the reference, | 135 // Since v8 GC can run during the iteration and clear the reference, |
138 // we can't move this check out of the loop. | 136 // we can't move this check out of the loop. |
139 m_wrappers.remove(i); | 137 m_wrappers.remove(i); |
140 continue; | 138 continue; |
141 } | 139 } |
142 | 140 |
143 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); | 141 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); |
144 if (wrapper->CreationContext() == context) | 142 if (wrapper->CreationContext() == context) |
145 return wrapper; | 143 return wrapper; |
146 ++i; | 144 ++i; |
147 } | 145 } |
148 v8::Local<v8::Object> wrapper = holder(m_isolate, context->Global()); | 146 v8::Local<v8::Object> wrapper = holder(m_isolate, context->Global()); |
149 std::unique_ptr<ScopedPersistent<v8::Object>> weakPersistent = wrapUnique(ne
w ScopedPersistent<v8::Object>); | 147 OwnPtr<ScopedPersistent<v8::Object>> weakPersistent = adoptPtr(new ScopedPer
sistent<v8::Object>); |
150 weakPersistent->set(m_isolate, wrapper); | 148 weakPersistent->set(m_isolate, wrapper); |
151 weakPersistent->setWeak(weakPersistent.get(), &clearHandle); | 149 weakPersistent->setWeak(weakPersistent.get(), &clearHandle); |
152 m_wrappers.append(std::move(weakPersistent)); | 150 m_wrappers.append(std::move(weakPersistent)); |
153 return wrapper; | 151 return wrapper; |
154 } | 152 } |
155 | 153 |
156 void ScriptPromisePropertyBase::clearWrappers() | 154 void ScriptPromisePropertyBase::clearWrappers() |
157 { | 155 { |
158 checkThis(); | 156 checkThis(); |
159 checkWrappers(); | 157 checkWrappers(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 ASSERT_NOT_REACHED(); | 208 ASSERT_NOT_REACHED(); |
211 return v8::Local<v8::String>(); | 209 return v8::Local<v8::String>(); |
212 } | 210 } |
213 | 211 |
214 DEFINE_TRACE(ScriptPromisePropertyBase) | 212 DEFINE_TRACE(ScriptPromisePropertyBase) |
215 { | 213 { |
216 ContextLifecycleObserver::trace(visitor); | 214 ContextLifecycleObserver::trace(visitor); |
217 } | 215 } |
218 | 216 |
219 } // namespace blink | 217 } // namespace blink |
OLD | NEW |