Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/ScriptPromisePropertyBase.cpp

Issue 2774233007: [Bindings] Move ScriptPromiseProperties from V8HiddenValue to V8PrivateProperty (Closed)
Patch Set: . Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698