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

Side by Side Diff: third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl

Issue 2794453002: [Bindings] Replace V8HiddenValue in generated code with 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 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable, v8_value_t o_local_cpp_value %} 1 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable, v8_value_t o_local_cpp_value %}
2 2
3 {##############################################################################} 3 {##############################################################################}
4 {% macro attribute_getter(attribute, world_suffix) %} 4 {% macro attribute_getter(attribute, world_suffix) %}
5 static void {{attribute.name}}AttributeGetter{{world_suffix}}( 5 static void {{attribute.name}}AttributeGetter{{world_suffix}}(
6 {%- if attribute.is_data_type_property %} 6 {%- if attribute.is_data_type_property %}
7 const v8::PropertyCallbackInfo<v8::Value>& info 7 const v8::PropertyCallbackInfo<v8::Value>& info
8 {%- else %} 8 {%- else %}
9 const v8::FunctionCallbackInfo<v8::Value>& info 9 const v8::FunctionCallbackInfo<v8::Value>& info
10 {%- endif %}) { 10 {%- endif %}) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 // safe to downcast here. 53 // safe to downcast here.
54 LocalDOMWindow* impl = toLocalDOMWindow({{v8_class}}::toImpl(holder)); 54 LocalDOMWindow* impl = toLocalDOMWindow({{v8_class}}::toImpl(holder));
55 {% endif %}{# attribute.is_check_security_for_receiver #} 55 {% endif %}{# attribute.is_check_security_for_receiver #}
56 {% else %} 56 {% else %}
57 {{cpp_class}}* impl = {{v8_class}}::toImpl(holder); 57 {{cpp_class}}* impl = {{v8_class}}::toImpl(holder);
58 {% endif %}{# local_dom_window_only #} 58 {% endif %}{# local_dom_window_only #}
59 {% endif %}{# not attribute.is_static #} 59 {% endif %}{# not attribute.is_static #}
60 60
61 {% if attribute.cached_attribute_validation_method %} 61 {% if attribute.cached_attribute_validation_method %}
62 // [CachedAttribute] 62 // [CachedAttribute]
63 v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "{{attr ibute.name}}"); 63 V8PrivateProperty::Symbol propertySymbol =
64 V8PrivateProperty::getSymbol(info.GetIsolate(),
65 "{{cpp_class}}#{{attribute.name.capitalize()}}");
64 if (!impl->{{attribute.cached_attribute_validation_method}}()) { 66 if (!impl->{{attribute.cached_attribute_validation_method}}()) {
65 v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::fo rFunctionObject(info), holder, propertyName); 67 v8::Local<v8::Value> v8Value = propertySymbol.getOrUndefined(holder);
66 if (!v8Value.IsEmpty() && !v8Value->IsUndefined()) { 68 if (!v8Value->IsUndefined()) {
67 v8SetReturnValue(info, v8Value); 69 v8SetReturnValue(info, v8Value);
68 return; 70 return;
69 } 71 }
70 } 72 }
71 {% endif %} 73 {% endif %}
72 74
73 {% if attribute.is_check_security_for_receiver and not attribute.is_data_type_ property %} 75 {% if attribute.is_check_security_for_receiver and not attribute.is_data_type_ property %}
74 // Perform a security check for the receiver object. 76 // Perform a security check for the receiver object.
75 {{define_exception_state}} 77 {{define_exception_state}}
76 {% if local_dom_window_only %} 78 {% if local_dom_window_only %}
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 {% if attribute.reflect_only %} 131 {% if attribute.reflect_only %}
130 {{release_only_check(attribute.reflect_only, attribute.reflect_missing, 132 {{release_only_check(attribute.reflect_only, attribute.reflect_missing,
131 attribute.reflect_invalid, attribute.reflect_empty, 133 attribute.reflect_invalid, attribute.reflect_empty,
132 attribute.cpp_value) 134 attribute.cpp_value)
133 | indent(2)}} 135 | indent(2)}}
134 {% endif %} 136 {% endif %}
135 137
136 {% if attribute.cached_attribute_validation_method %} 138 {% if attribute.cached_attribute_validation_method %}
137 // [CachedAttribute] 139 // [CachedAttribute]
138 v8::Local<v8::Value> v8Value({{attribute.cpp_value_to_v8_value}}); 140 v8::Local<v8::Value> v8Value({{attribute.cpp_value_to_v8_value}});
139 V8HiddenValue::setHiddenValue(ScriptState::forFunctionObject(info), holder, pr opertyName, v8Value); 141 propertySymbol.set(holder, v8Value);
140 {% endif %} 142 {% endif %}
141 143
142 {% if attribute.is_explicit_nullable %} 144 {% if attribute.is_explicit_nullable %}
143 if (isNull) { 145 if (isNull) {
144 v8SetReturnValueNull(info); 146 v8SetReturnValueNull(info);
145 return; 147 return;
146 } 148 }
147 {% endif %} 149 {% endif %}
148 150
149 {% if attribute.is_keep_alive_for_gc %} 151 {% if attribute.is_keep_alive_for_gc %}
150 // Keep the wrapper object for the return value alive as long as |this| 152 // Keep the wrapper object for the return value alive as long as |this|
151 // object is alive in order to save creation time of the wrapper object. 153 // object is alive in order to save creation time of the wrapper object.
152 if ({{attribute.cpp_value}} && DOMDataStore::setReturnValue{{world_suffix}}(in fo.GetReturnValue(), {{attribute.cpp_value}})) 154 if ({{attribute.cpp_value}} && DOMDataStore::setReturnValue{{world_suffix}}(in fo.GetReturnValue(), {{attribute.cpp_value}}))
153 return; 155 return;
154 v8::Local<v8::Value> v8Value(ToV8({{attribute.cpp_value}}, holder, info.GetIso late())); 156 v8::Local<v8::Value> v8Value(ToV8({{attribute.cpp_value}}, holder, info.GetIso late()));
155 V8HiddenValue::setHiddenValue(ScriptState::current(info.GetIsolate()), holder, v8AtomicString(info.GetIsolate(), "KeepAlive#{{interface_name}}#{{attribute.nam e}}"), v8Value); 157 V8PrivateProperty::getSymbol(
158 info.GetIsolate(), "KeepAlive#{{interface_name}}#{{attribute.name}}")
159 .set(holder, v8Value);
156 {% endif %} 160 {% endif %}
157 161
158 {% if world_suffix %} 162 {% if world_suffix %}
159 {{attribute.v8_set_return_value_for_main_world}}; 163 {{attribute.v8_set_return_value_for_main_world}};
160 {% else %} 164 {% else %}
161 {{attribute.v8_set_return_value}}; 165 {{attribute.v8_set_return_value}};
162 {% endif %} 166 {% endif %}
163 167
164 {% if attribute.is_save_same_object %} 168 {% if attribute.is_save_same_object %}
165 // [SaveSameObject] 169 // [SaveSameObject]
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 {% macro attribute_setter(attribute, world_suffix) %} 278 {% macro attribute_setter(attribute, world_suffix) %}
275 static void {{attribute.name}}AttributeSetter{{world_suffix}}( 279 static void {{attribute.name}}AttributeSetter{{world_suffix}}(
276 {%- if attribute.has_cross_origin_setter %} 280 {%- if attribute.has_cross_origin_setter %}
277 v8::Local<v8::Value> v8Value, const V8CrossOriginSetterInfo& info 281 v8::Local<v8::Value> v8Value, const V8CrossOriginSetterInfo& info
278 {%- elif attribute.is_data_type_property %} 282 {%- elif attribute.is_data_type_property %}
279 v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info 283 v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info
280 {%- else %} 284 {%- else %}
281 v8::Local<v8::Value> v8Value, const v8::FunctionCallbackInfo<v8::Value>& info 285 v8::Local<v8::Value> v8Value, const v8::FunctionCallbackInfo<v8::Value>& info
282 {%- endif %}) { 286 {%- endif %}) {
283 {% filter format_remove_duplicates(['ExceptionState exceptionState']) %} 287 {% filter format_remove_duplicates(['ExceptionState exceptionState']) %}
288 v8::Isolate* isolate = info.GetIsolate();
289 ALLOW_UNUSED_LOCAL(isolate);
290
284 {% set define_exception_state -%} 291 {% set define_exception_state -%}
285 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::SetterContext , "{{interface_name}}", "{{attribute.name}}"); 292 ExceptionState exceptionState(isolate, ExceptionState::SetterContext, "{{inter face_name}}", "{{attribute.name}}");
286 {%- endset %} 293 {%- endset %}
287 294
288 {% if attribute.is_lenient_this %} 295 {% if attribute.is_lenient_this %}
289 // [LenientThis] 296 // [LenientThis]
290 // Make sure that info.Holder() really points to an instance if [LenientThis]. 297 // Make sure that info.Holder() really points to an instance if [LenientThis].
291 if (!{{v8_class}}::hasInstance(info.Holder(), info.GetIsolate())) 298 if (!{{v8_class}}::hasInstance(info.Holder(), isolate))
292 return; // Return silently because of [LenientThis]. 299 return; // Return silently because of [LenientThis].
293 {% endif %} 300 {% endif %}
294 301
295 {% if not attribute.is_static and not attribute.is_replaceable %} 302 {% if not attribute.is_static and not attribute.is_replaceable %}
296 v8::Local<v8::Object> holder = info.Holder(); 303 v8::Local<v8::Object> holder = info.Holder();
297 {% if attribute.is_put_forwards %} 304 {% if attribute.is_put_forwards %}
298 {{cpp_class}}* proxyImpl = {{v8_class}}::toImpl(holder); 305 {{cpp_class}}* proxyImpl = {{v8_class}}::toImpl(holder);
299 {{attribute.cpp_type}} impl = WTF::getPtr(proxyImpl->{{attribute.name}}()); 306 {{attribute.cpp_type}} impl = WTF::getPtr(proxyImpl->{{attribute.name}}());
300 if (!impl) 307 if (!impl)
301 return; 308 return;
(...skipping 11 matching lines...) Expand all
313 {% else %} 320 {% else %}
314 {{cpp_class}}* impl = {{v8_class}}::toImpl(holder); 321 {{cpp_class}}* impl = {{v8_class}}::toImpl(holder);
315 {% endif %}{# local_dom_window_only #} 322 {% endif %}{# local_dom_window_only #}
316 {% endif %} 323 {% endif %}
317 {% endif %} 324 {% endif %}
318 325
319 {% if attribute.is_check_security_for_receiver and not attribute.is_data_type_ property %} 326 {% if attribute.is_check_security_for_receiver and not attribute.is_data_type_ property %}
320 // Perform a security check for the receiver object. 327 // Perform a security check for the receiver object.
321 {{define_exception_state}} 328 {{define_exception_state}}
322 {% if local_dom_window_only %} 329 {% if local_dom_window_only %}
323 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate()), uncheckedImpl, exceptionState)) { 330 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(isolate), unchecked Impl, exceptionState)) {
324 {% else %} 331 {% else %}
325 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate()), impl, exceptionState)) { 332 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(isolate), impl, exc eptionState)) {
326 {% endif %}{# local_dom_window_only #} 333 {% endif %}{# local_dom_window_only #}
327 v8SetReturnValue(info, v8Value); 334 v8SetReturnValue(info, v8Value);
328 return; 335 return;
329 } 336 }
330 {% if local_dom_window_only %} 337 {% if local_dom_window_only %}
331 LocalDOMWindow* impl = toLocalDOMWindow(uncheckedImpl); 338 LocalDOMWindow* impl = toLocalDOMWindow(uncheckedImpl);
332 {% endif %}{# local_dom_window_only #} 339 {% endif %}{# local_dom_window_only #}
333 {% endif %} 340 {% endif %}
334 341
335 {% if attribute.is_check_security_for_return_value %} 342 {% if attribute.is_check_security_for_return_value %}
336 #error Attribute setter with the security check for the return value is not supp orted. Since the return value is the given value to be set, it\'s meaningless t o perform the security check for the return value. 343 #error Attribute setter with the security check for the return value is not supp orted. Since the return value is the given value to be set, it\'s meaningless t o perform the security check for the return value.
337 {% endif %} 344 {% endif %}
338 345
339 {% if attribute.is_custom_element_callbacks or 346 {% if attribute.is_custom_element_callbacks or
340 (attribute.is_reflect and not (attribute.idl_type == 'DOMString' and is_ node)) %} 347 (attribute.is_reflect and not (attribute.idl_type == 'DOMString' and is_ node)) %}
341 // Skip on compact node DOMString getters. 348 // Skip on compact node DOMString getters.
342 V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope; 349 V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
343 {% endif %} 350 {% endif %}
344 351
345 {% if attribute.has_setter_exception_state %} 352 {% if attribute.has_setter_exception_state %}
346 {{define_exception_state}} 353 {{define_exception_state}}
347 {% endif %} 354 {% endif %}
348 355
349 // Prepare the value to be set. 356 // Prepare the value to be set.
350 {% if attribute.idl_type == 'EventHandler' %} 357 {% if attribute.idl_type == 'EventHandler' %}
351 {% if not is_node %} 358 {% if not is_node %}
352 moveEventListenerToNewWrapper(info.GetIsolate(), holder, {{attribute.event_han dler_getter_expression}}, v8Value, {{v8_class}}::eventListenerCacheIndex); 359 moveEventListenerToNewWrapper(isolate, holder, {{attribute.event_handler_gette r_expression}}, v8Value, {{v8_class}}::eventListenerCacheIndex);
353 {% endif %} 360 {% endif %}
354 {% else %}{# not EventHandler #} 361 {% else %}{# not EventHandler #}
355 {{v8_value_to_local_cpp_value(attribute) | indent(2)}} 362 {{v8_value_to_local_cpp_value(attribute) | indent(2)}}
356 {% endif %} 363 {% endif %}
357 364
358 {% if attribute.has_type_checking_interface %} 365 {% if attribute.has_type_checking_interface %}
359 // Type check per: http://heycam.github.io/webidl/#es-interface 366 // Type check per: http://heycam.github.io/webidl/#es-interface
360 if (!cppValue{% if attribute.is_nullable %} && !isUndefinedOrNull(v8Value){% e ndif %}) { 367 if (!cppValue{% if attribute.is_nullable %} && !isUndefinedOrNull(v8Value){% e ndif %}) {
361 exceptionState.throwTypeError("The provided value is not of type '{{attribut e.idl_type}}'."); 368 exceptionState.throwTypeError("The provided value is not of type '{{attribut e.idl_type}}'.");
362 return; 369 return;
363 } 370 }
364 {% endif %} 371 {% endif %}
365 372
366 {% if attribute.enum_values %} 373 {% if attribute.enum_values %}
367 // Type check per: http://heycam.github.io/webidl/#dfn-attribute-setter 374 // Type check per: http://heycam.github.io/webidl/#dfn-attribute-setter
368 // Returns undefined without setting the value if the value is invalid. 375 // Returns undefined without setting the value if the value is invalid.
369 DummyExceptionStateForTesting dummyExceptionState; 376 DummyExceptionStateForTesting dummyExceptionState;
370 {{declare_enum_validation_variable(attribute.enum_values) | indent(2)}} 377 {{declare_enum_validation_variable(attribute.enum_values) | indent(2)}}
371 if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "{{attr ibute.enum_type}}", dummyExceptionState)) { 378 if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "{{attr ibute.enum_type}}", dummyExceptionState)) {
372 currentExecutionContext(info.GetIsolate())->addConsoleMessage(ConsoleMessage ::create(JSMessageSource, WarningMessageLevel, dummyExceptionState.message())); 379 currentExecutionContext(isolate)->addConsoleMessage(ConsoleMessage::create(J SMessageSource, WarningMessageLevel, dummyExceptionState.message()));
373 return; 380 return;
374 } 381 }
375 {% endif %} 382 {% endif %}
376 383
377 {% if attribute.is_call_with_execution_context or attribute.is_setter_call_wit h_execution_context %} 384 {% if attribute.is_call_with_execution_context or attribute.is_setter_call_wit h_execution_context %}
378 ExecutionContext* executionContext = currentExecutionContext(info.GetIsolate() ); 385 ExecutionContext* executionContext = currentExecutionContext(isolate);
379 {% endif %} 386 {% endif %}
380 387
381 {% if attribute.is_call_with_script_state %} 388 {% if attribute.is_call_with_script_state %}
382 {% if attribute.is_static %} 389 {% if attribute.is_static %}
383 ScriptState* scriptState = ScriptState::forFunctionObject(info); 390 ScriptState* scriptState = ScriptState::forFunctionObject(info);
384 {% else %} 391 {% else %}
385 ScriptState* scriptState = ScriptState::forReceiverObject(info); 392 ScriptState* scriptState = ScriptState::forReceiverObject(info);
386 {% endif %} 393 {% endif %}
387 {% endif %} 394 {% endif %}
388 395
389 {% if attribute.is_replaceable %} 396 {% if attribute.is_replaceable %}
390 v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "{{attr ibute.name}}"); 397 v8::Local<v8::String> propertyName = v8AtomicString(isolate, "{{attribute.name }}");
391 {% endif %} 398 {% endif %}
392 {{attribute.cpp_setter}}; 399 {{attribute.cpp_setter}};
393 400
394 {% if attribute.cached_attribute_validation_method %} 401 {% if attribute.cached_attribute_validation_method %}
395 // [CachedAttribute] 402 // [CachedAttribute]
396 // Invalidate the cached value. 403 // Invalidate the cached value.
397 V8HiddenValue::deleteHiddenValue(ScriptState::forFunctionObject(info), holder, v8AtomicString(info.GetIsolate(), "{{attribute.name}}")); 404 V8PrivateProperty::getSymbol(
405 isolate, "{{cpp_class}}#{{attribute.name.capitalize()}}")
406 .deleteProperty(holder, v8::Undefined(isolate));
398 {% endif %} 407 {% endif %}
399 } 408 }
400 {% endfilter %}{# format_remove_duplicates #} 409 {% endfilter %}{# format_remove_duplicates #}
401 {% endmacro %} 410 {% endmacro %}
402 411
403 412
404 {##############################################################################} 413 {##############################################################################}
405 {% macro attribute_setter_callback(attribute, world_suffix) %} 414 {% macro attribute_setter_callback(attribute, world_suffix) %}
406 void {{v8_class_or_partial}}::{{attribute.name}}AttributeSetterCallback{{world_s uffix}}( 415 void {{v8_class_or_partial}}::{{attribute.name}}AttributeSetterCallback{{world_s uffix}}(
407 {%- if attribute.is_data_type_property %} 416 {%- if attribute.is_data_type_property %}
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 static const V8DOMConfiguration::AccessorConfiguration accessorConfiguration[] = { 515 static const V8DOMConfiguration::AccessorConfiguration accessorConfiguration[] = {
507 {{attribute_configuration(attribute)}} 516 {{attribute_configuration(attribute)}}
508 }; 517 };
509 for (const auto& accessorConfig : accessorConfiguration) 518 for (const auto& accessorConfig : accessorConfiguration)
510 V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), p rototypeObject, interfaceObject, signature, accessorConfig); 519 V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), p rototypeObject, interfaceObject, signature, accessorConfig);
511 {% endfilter %}{# runtime_enabled #} 520 {% endfilter %}{# runtime_enabled #}
512 {% endfilter %}{# secure_context #} 521 {% endfilter %}{# secure_context #}
513 {% endfilter %}{# exposed #} 522 {% endfilter %}{# exposed #}
514 {% endfor %} 523 {% endfor %}
515 {% endmacro %} 524 {% endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698