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

Side by Side Diff: Source/bindings/templates/attributes.cpp

Issue 226073003: Fix StrictTypeChecking on interface type attributes (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Mark HTMLMediaElement.error nullable. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « Source/bindings/scripts/v8_attributes.py ('k') | Source/bindings/tests/idls/TestObject.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 {##############################################################################} 1 {##############################################################################}
2 {% macro attribute_getter(attribute, world_suffix) %} 2 {% macro attribute_getter(attribute, world_suffix) %}
3 {% filter conditional(attribute.conditional_string) %} 3 {% filter conditional(attribute.conditional_string) %}
4 static void {{attribute.name}}AttributeGetter{{world_suffix}}( 4 static void {{attribute.name}}AttributeGetter{{world_suffix}}(
5 {%- if attribute.is_expose_js_accessors %} 5 {%- if attribute.is_expose_js_accessors %}
6 const v8::FunctionCallbackInfo<v8::Value>& info 6 const v8::FunctionCallbackInfo<v8::Value>& info
7 {%- else %} 7 {%- else %}
8 const v8::PropertyCallbackInfo<v8::Value>& info 8 const v8::PropertyCallbackInfo<v8::Value>& info
9 {%- endif %}) 9 {%- endif %})
10 { 10 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 return; 44 return;
45 {% endif %} 45 {% endif %}
46 {# Local variables #} 46 {# Local variables #}
47 {% if attribute.is_call_with_execution_context %} 47 {% if attribute.is_call_with_execution_context %}
48 ExecutionContext* scriptContext = currentExecutionContext(info.GetIsolate()) ; 48 ExecutionContext* scriptContext = currentExecutionContext(info.GetIsolate()) ;
49 {% endif %} 49 {% endif %}
50 {% if attribute.is_check_security_for_node or 50 {% if attribute.is_check_security_for_node or
51 attribute.is_getter_raises_exception %} 51 attribute.is_getter_raises_exception %}
52 ExceptionState exceptionState(ExceptionState::GetterContext, "{{attribute.na me}}", "{{interface_name}}", holder, info.GetIsolate()); 52 ExceptionState exceptionState(ExceptionState::GetterContext, "{{attribute.na me}}", "{{interface_name}}", holder, info.GetIsolate());
53 {% endif %} 53 {% endif %}
54 {% if attribute.is_nullable %} 54 {% if attribute.is_nullable and not attribute.has_strict_type_checking %}
55 bool isNull = false; 55 bool isNull = false;
56 {% endif %} 56 {% endif %}
57 {# FIXME: consider always using a local variable for value #} 57 {# FIXME: consider always using a local variable for value #}
58 {% if attribute.cached_attribute_validation_method or 58 {% if attribute.cached_attribute_validation_method or
59 attribute.is_getter_raises_exception or 59 attribute.is_getter_raises_exception or
60 attribute.is_nullable or 60 attribute.is_nullable or
61 attribute.reflect_only or 61 attribute.reflect_only or
62 attribute.idl_type == 'EventHandler' %} 62 attribute.idl_type == 'EventHandler' %}
63 {{attribute.cpp_type}} {{attribute.cpp_value}} = {{attribute.cpp_value_origi nal}}; 63 {{attribute.cpp_type}} {{attribute.cpp_value}} = {{attribute.cpp_value_origi nal}};
64 {% endif %} 64 {% endif %}
65 {# Checks #} 65 {# Checks #}
66 {% if attribute.is_getter_raises_exception %} 66 {% if attribute.is_getter_raises_exception %}
67 if (UNLIKELY(exceptionState.throwIfNeeded())) 67 if (UNLIKELY(exceptionState.throwIfNeeded()))
68 return; 68 return;
69 {% endif %} 69 {% endif %}
70 {% if attribute.is_check_security_for_node %} 70 {% if attribute.is_check_security_for_node %}
71 {# FIXME: use a local variable to not call getter twice #} 71 {# FIXME: use a local variable to not call getter twice #}
72 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), {{attribute .cpp_value}}, exceptionState)) { 72 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), {{attribute .cpp_value}}, exceptionState)) {
73 v8SetReturnValueNull(info); 73 v8SetReturnValueNull(info);
74 exceptionState.throwIfNeeded(); 74 exceptionState.throwIfNeeded();
75 return; 75 return;
76 } 76 }
77 {% endif %} 77 {% endif %}
78 {% if attribute.reflect_only %} 78 {% if attribute.reflect_only %}
79 {{release_only_check(attribute.reflect_only, attribute.reflect_missing, 79 {{release_only_check(attribute.reflect_only, attribute.reflect_missing,
80 attribute.reflect_invalid, attribute.reflect_empty) 80 attribute.reflect_invalid, attribute.reflect_empty)
81 | indent}} 81 | indent}}
82 {% endif %} 82 {% endif %}
83 {% if attribute.is_nullable %} 83 {% if attribute.is_nullable %}
84 {% if attribute.has_strict_type_checking %}
85 if (!{{attribute.cpp_value}}) {
86 {% else %}
84 if (isNull) { 87 if (isNull) {
88 {% endif %}
85 v8SetReturnValueNull(info); 89 v8SetReturnValueNull(info);
86 return; 90 return;
87 } 91 }
88 {% endif %} 92 {% endif %}
89 {% if attribute.cached_attribute_validation_method %} 93 {% if attribute.cached_attribute_validation_method %}
90 V8HiddenValue::setHiddenValue(info.GetIsolate(), holder, propertyName, {{att ribute.cpp_value}}.v8Value()); 94 V8HiddenValue::setHiddenValue(info.GetIsolate(), holder, propertyName, {{att ribute.cpp_value}}.v8Value());
91 {% endif %} 95 {% endif %}
92 {# v8SetReturnValue #} 96 {# v8SetReturnValue #}
93 {% if attribute.is_keep_alive_for_gc %} 97 {% if attribute.is_keep_alive_for_gc %}
94 {# FIXME: merge local variable assignment with above #} 98 {# FIXME: merge local variable assignment with above #}
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 {% if not attribute.is_static %} 217 {% if not attribute.is_static %}
214 v8::Handle<v8::Object> holder = info.Holder(); 218 v8::Handle<v8::Object> holder = info.Holder();
215 {% endif %} 219 {% endif %}
216 {% if attribute.has_setter_exception_state %} 220 {% if attribute.has_setter_exception_state %}
217 ExceptionState exceptionState(ExceptionState::SetterContext, "{{attribute.na me}}", "{{interface_name}}", holder, info.GetIsolate()); 221 ExceptionState exceptionState(ExceptionState::SetterContext, "{{attribute.na me}}", "{{interface_name}}", holder, info.GetIsolate());
218 {% endif %} 222 {% endif %}
219 {# Type checking #} 223 {# Type checking #}
220 {% if attribute.has_strict_type_checking %} 224 {% if attribute.has_strict_type_checking %}
221 {# Type checking for interface types (if interface not implemented, throw 225 {# Type checking for interface types (if interface not implemented, throw
222 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} 226 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
223 if (!isUndefinedOrNull(v8Value) && !V8{{attribute.idl_type}}::hasInstance(v8 Value, info.GetIsolate())) { 227 if ({% if attribute.is_nullable %}!isUndefinedOrNull(v8Value) && {% endif %} !V8{{attribute.idl_type}}::hasInstance(v8Value, info.GetIsolate())) {
224 exceptionState.throwTypeError("The provided value is not of type '{{attr ibute.idl_type}}'."); 228 exceptionState.throwTypeError("The provided value is not of type '{{attr ibute.idl_type}}'.");
225 exceptionState.throwIfNeeded(); 229 exceptionState.throwIfNeeded();
226 return; 230 return;
227 } 231 }
228 {% endif %} 232 {% endif %}
229 {# impl #} 233 {# impl #}
230 {% if attribute.put_forwards %} 234 {% if attribute.put_forwards %}
231 {{cpp_class}}* proxyImpl = {{v8_class}}::toNative(holder); 235 {{cpp_class}}* proxyImpl = {{v8_class}}::toNative(holder);
232 {{attribute.ref_ptr}}<{{attribute.idl_type}}> impl = WTF::getPtr(proxyImpl-> {{attribute.name}}()); 236 {{attribute.ref_ptr}}<{{attribute.idl_type}}> impl = WTF::getPtr(proxyImpl-> {{attribute.name}}());
233 if (!impl) 237 if (!impl)
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 {% endif %} 315 {% endif %}
312 {% if attribute.has_custom_setter %} 316 {% if attribute.has_custom_setter %}
313 {{v8_class}}::{{attribute.name}}AttributeSetterCustom(v8Value, info); 317 {{v8_class}}::{{attribute.name}}AttributeSetterCustom(v8Value, info);
314 {% else %} 318 {% else %}
315 {{cpp_class}}V8Internal::{{attribute.name}}AttributeSetter{{world_suffix}}(v 8Value, info); 319 {{cpp_class}}V8Internal::{{attribute.name}}AttributeSetter{{world_suffix}}(v 8Value, info);
316 {% endif %} 320 {% endif %}
317 TRACE_EVENT_SET_SAMPLING_STATE("V8", "V8Execution"); 321 TRACE_EVENT_SET_SAMPLING_STATE("V8", "V8Execution");
318 } 322 }
319 {% endfilter %} 323 {% endfilter %}
320 {% endmacro %} 324 {% endmacro %}
OLDNEW
« no previous file with comments | « Source/bindings/scripts/v8_attributes.py ('k') | Source/bindings/tests/idls/TestObject.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698