Chromium Code Reviews| 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 |