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" |
(...skipping 22 matching lines...) Expand all Loading... | |
33 v8::HandleScope handleScope(m_isolate); | 33 v8::HandleScope handleScope(m_isolate); |
34 v8::Local<v8::Context> context = toV8Context(getExecutionContext(), world); | 34 v8::Local<v8::Context> context = toV8Context(getExecutionContext(), world); |
35 if (context.IsEmpty()) | 35 if (context.IsEmpty()) |
36 return ScriptPromise(); | 36 return ScriptPromise(); |
37 ScriptState* scriptState = ScriptState::from(context); | 37 ScriptState* scriptState = ScriptState::from(context); |
38 ScriptState::Scope scope(scriptState); | 38 ScriptState::Scope scope(scriptState); |
39 | 39 |
40 v8::Local<v8::Object> wrapper = ensureHolderWrapper(scriptState); | 40 v8::Local<v8::Object> wrapper = ensureHolderWrapper(scriptState); |
41 DCHECK(wrapper->CreationContext() == context); | 41 DCHECK(wrapper->CreationContext() == context); |
42 | 42 |
43 v8::Local<v8::Value> cachedPromise = | 43 v8::Local<v8::Value> cachedPromise = promiseSymbol().getOrEmpty(wrapper); |
Yuki
2017/04/06 07:32:03
You can use getOrUndefined here.
peria
2017/04/06 07:47:04
Done.
| |
44 V8HiddenValue::getHiddenValue(scriptState, wrapper, promiseName()); | |
45 if (!cachedPromise.IsEmpty() && cachedPromise->IsPromise()) | 44 if (!cachedPromise.IsEmpty() && cachedPromise->IsPromise()) |
46 return ScriptPromise(scriptState, cachedPromise); | 45 return ScriptPromise(scriptState, cachedPromise); |
47 | 46 |
48 // Create and cache the Promise | 47 // Create and cache the Promise |
49 v8::Local<v8::Promise::Resolver> resolver; | 48 v8::Local<v8::Promise::Resolver> resolver; |
50 if (!v8::Promise::Resolver::New(context).ToLocal(&resolver)) | 49 if (!v8::Promise::Resolver::New(context).ToLocal(&resolver)) |
51 return ScriptPromise(); | 50 return ScriptPromise(); |
52 v8::Local<v8::Promise> promise = resolver->GetPromise(); | 51 v8::Local<v8::Promise> promise = resolver->GetPromise(); |
53 V8HiddenValue::setHiddenValue(scriptState, wrapper, promiseName(), promise); | 52 promiseSymbol().set(wrapper, promise); |
54 | 53 |
55 switch (m_state) { | 54 switch (m_state) { |
56 case Pending: | 55 case Pending: |
57 // Cache the resolver too | 56 // Cache the resolver too |
58 V8HiddenValue::setHiddenValue(scriptState, wrapper, resolverName(), | 57 resolverSymbol().set(wrapper, resolver); |
59 resolver); | |
60 break; | 58 break; |
61 case Resolved: | 59 case Resolved: |
62 case Rejected: | 60 case Rejected: |
63 resolveOrRejectInternal(resolver); | 61 resolveOrRejectInternal(resolver); |
64 break; | 62 break; |
65 } | 63 } |
66 | 64 |
67 return ScriptPromise(scriptState, promise); | 65 return ScriptPromise(scriptState, promise); |
68 } | 66 } |
69 | 67 |
(...skipping 13 matching lines...) Expand all Loading... | |
83 // wrapper has died. | 81 // wrapper has died. |
84 // Since v8 GC can run during the iteration and clear the reference, | 82 // Since v8 GC can run during the iteration and clear the reference, |
85 // we can't move this check out of the loop. | 83 // we can't move this check out of the loop. |
86 m_wrappers.erase(i); | 84 m_wrappers.erase(i); |
87 continue; | 85 continue; |
88 } | 86 } |
89 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); | 87 v8::Local<v8::Object> wrapper = persistent->newLocal(m_isolate); |
90 ScriptState* scriptState = ScriptState::from(wrapper->CreationContext()); | 88 ScriptState* scriptState = ScriptState::from(wrapper->CreationContext()); |
91 ScriptState::Scope scope(scriptState); | 89 ScriptState::Scope scope(scriptState); |
92 | 90 |
91 V8PrivateProperty::Symbol symbol = resolverSymbol(); | |
92 DCHECK(symbol.hasValue(wrapper)); | |
93 v8::Local<v8::Promise::Resolver> resolver = | 93 v8::Local<v8::Promise::Resolver> resolver = |
94 V8HiddenValue::getHiddenValue(scriptState, wrapper, resolverName()) | 94 symbol.getOrUndefined(wrapper).As<v8::Promise::Resolver>(); |
95 .As<v8::Promise::Resolver>(); | |
96 DCHECK(!resolver.IsEmpty()); | |
97 | 95 |
98 V8HiddenValue::deleteHiddenValue(scriptState, wrapper, resolverName()); | 96 symbol.deleteProperty(wrapper); |
99 resolveOrRejectInternal(resolver); | 97 resolveOrRejectInternal(resolver); |
100 ++i; | 98 ++i; |
101 } | 99 } |
102 } | 100 } |
103 | 101 |
104 void ScriptPromisePropertyBase::resetBase() { | 102 void ScriptPromisePropertyBase::resetBase() { |
105 checkThis(); | 103 checkThis(); |
106 clearWrappers(); | 104 clearWrappers(); |
107 m_state = Pending; | 105 m_state = Pending; |
108 } | 106 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 } | 154 } |
157 | 155 |
158 void ScriptPromisePropertyBase::clearWrappers() { | 156 void ScriptPromisePropertyBase::clearWrappers() { |
159 checkThis(); | 157 checkThis(); |
160 checkWrappers(); | 158 checkWrappers(); |
161 v8::HandleScope handleScope(m_isolate); | 159 v8::HandleScope handleScope(m_isolate); |
162 for (WeakPersistentSet::iterator i = m_wrappers.begin(); | 160 for (WeakPersistentSet::iterator i = m_wrappers.begin(); |
163 i != m_wrappers.end(); ++i) { | 161 i != m_wrappers.end(); ++i) { |
164 v8::Local<v8::Object> wrapper = (*i)->newLocal(m_isolate); | 162 v8::Local<v8::Object> wrapper = (*i)->newLocal(m_isolate); |
165 if (!wrapper.IsEmpty()) { | 163 if (!wrapper.IsEmpty()) { |
166 ScriptState* scriptState = ScriptState::from(wrapper->CreationContext()); | 164 resolverSymbol().deleteProperty(wrapper); |
167 V8HiddenValue::deleteHiddenValue(scriptState, wrapper, resolverName()); | 165 promiseSymbol().deleteProperty(wrapper); |
168 V8HiddenValue::deleteHiddenValue(scriptState, wrapper, promiseName()); | |
169 } | 166 } |
170 } | 167 } |
171 m_wrappers.clear(); | 168 m_wrappers.clear(); |
172 } | 169 } |
173 | 170 |
174 void ScriptPromisePropertyBase::checkThis() { | 171 void ScriptPromisePropertyBase::checkThis() { |
175 RELEASE_ASSERT(this); | 172 RELEASE_ASSERT(this); |
176 } | 173 } |
177 | 174 |
178 void ScriptPromisePropertyBase::checkWrappers() { | 175 void ScriptPromisePropertyBase::checkWrappers() { |
179 for (WeakPersistentSet::iterator i = m_wrappers.begin(); | 176 for (WeakPersistentSet::iterator i = m_wrappers.begin(); |
180 i != m_wrappers.end(); ++i) { | 177 i != m_wrappers.end(); ++i) { |
181 RELEASE_ASSERT(*i); | 178 RELEASE_ASSERT(*i); |
182 } | 179 } |
183 } | 180 } |
184 | 181 |
185 v8::Local<v8::String> ScriptPromisePropertyBase::promiseName() { | 182 V8PrivateProperty::Symbol ScriptPromisePropertyBase::promiseSymbol() { |
186 switch (m_name) { | 183 switch (m_name) { |
187 #define P(Name) \ | 184 #define P(Interface, Name) \ |
188 case Name: \ | 185 case Name: \ |
189 return V8HiddenValue::Name##Promise(m_isolate); | 186 return V8PrivateProperty::get##Interface##Name##Promise(m_isolate); |
Yuki
2017/04/06 07:32:03
Use V8_PRIVATE_PROPERTY_GETTER_NAME.
peria
2017/04/06 07:47:04
Done.
| |
190 | 187 |
191 SCRIPT_PROMISE_PROPERTIES(P) | 188 SCRIPT_PROMISE_PROPERTIES(P) |
192 | 189 |
193 #undef P | 190 #undef P |
194 } | 191 } |
195 ASSERT_NOT_REACHED(); | 192 NOTREACHED(); |
196 return v8::Local<v8::String>(); | 193 return V8PrivateProperty::getSymbol(m_isolate, "noPromise"); |
197 } | 194 } |
198 | 195 |
199 v8::Local<v8::String> ScriptPromisePropertyBase::resolverName() { | 196 V8PrivateProperty::Symbol ScriptPromisePropertyBase::resolverSymbol() { |
200 switch (m_name) { | 197 switch (m_name) { |
201 #define P(Name) \ | 198 #define P(Interface, Name) \ |
202 case Name: \ | 199 case Name: \ |
203 return V8HiddenValue::Name##Resolver(m_isolate); | 200 return V8PrivateProperty::get##Interface##Name##Resolver(m_isolate); |
Yuki
2017/04/06 07:32:03
ditto
peria
2017/04/06 07:47:04
Done.
| |
204 | 201 |
205 SCRIPT_PROMISE_PROPERTIES(P) | 202 SCRIPT_PROMISE_PROPERTIES(P) |
206 | 203 |
207 #undef P | 204 #undef P |
208 } | 205 } |
209 ASSERT_NOT_REACHED(); | 206 NOTREACHED(); |
210 return v8::Local<v8::String>(); | 207 return V8PrivateProperty::getSymbol(m_isolate, "noResolver"); |
211 } | 208 } |
212 | 209 |
213 DEFINE_TRACE(ScriptPromisePropertyBase) { | 210 DEFINE_TRACE(ScriptPromisePropertyBase) { |
214 ContextClient::trace(visitor); | 211 ContextClient::trace(visitor); |
215 } | 212 } |
216 | 213 |
217 } // namespace blink | 214 } // namespace blink |
OLD | NEW |