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

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

Issue 871443002: IDL: Further improve indexed/named property setter type checking (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 11 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 {% extends 'interface_base.cpp' %} 1 {% extends 'interface_base.cpp' %}
2 2
3 3
4 {##############################################################################} 4 {##############################################################################}
5 {% block indexed_property_getter %} 5 {% block indexed_property_getter %}
6 {% if indexed_property_getter and not indexed_property_getter.is_custom %} 6 {% if indexed_property_getter and not indexed_property_getter.is_custom %}
7 {% set getter = indexed_property_getter %} 7 {% set getter = indexed_property_getter %}
8 static void indexedPropertyGetter(uint32_t index, const v8::PropertyCallbackInfo <v8::Value>& info) 8 static void indexedPropertyGetter(uint32_t index, const v8::PropertyCallbackInfo <v8::Value>& info)
9 { 9 {
10 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 10 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 static void indexedPropertySetter(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) 54 static void indexedPropertySetter(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info)
55 { 55 {
56 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 56 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
57 {{setter.v8_value_to_local_cpp_value}}; 57 {{setter.v8_value_to_local_cpp_value}};
58 {% if setter.has_exception_state %} 58 {% if setter.has_exception_state %}
59 ExceptionState exceptionState(ExceptionState::IndexedSetterContext, "{{inter face_name}}", info.Holder(), info.GetIsolate()); 59 ExceptionState exceptionState(ExceptionState::IndexedSetterContext, "{{inter face_name}}", info.Holder(), info.GetIsolate());
60 {% endif %} 60 {% endif %}
61 {% if setter.has_type_checking_interface %} 61 {% if setter.has_type_checking_interface %}
62 {# Type checking for interface types (if interface not implemented, throw 62 {# Type checking for interface types (if interface not implemented, throw
63 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} 63 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
64 if (!isUndefinedOrNull(v8Value) && !V8{{setter.idl_type}}::hasInstance(v8Val ue, info.GetIsolate())) { 64 if (!propertyValue{% if setter.is_nullable %} && !isUndefinedOrNull(v8Value) {% endif %}) {
65 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'."); 65 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'.");
66 exceptionState.throwIfNeeded(); 66 exceptionState.throwIfNeeded();
67 return; 67 return;
68 } 68 }
69 {% endif %} 69 {% endif %}
70 {% set setter_name = setter.name or 'anonymousIndexedSetter' %} 70 {% set setter_name = setter.name or 'anonymousIndexedSetter' %}
71 {% set setter_arguments = ['index', 'propertyValue', 'exceptionState'] 71 {% set setter_arguments = ['index', 'propertyValue', 'exceptionState']
72 if setter.is_raises_exception else ['index', 'propertyValue'] %} 72 if setter.is_raises_exception else ['index', 'propertyValue'] %}
73 bool result = impl->{{setter_name}}({{setter_arguments | join(', ')}}); 73 bool result = impl->{{setter_name}}({{setter_arguments | join(', ')}});
74 {% if setter.is_raises_exception %} 74 {% if setter.is_raises_exception %}
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 225
226 {% endif %} 226 {% endif %}
227 {% if setter.has_exception_state %} 227 {% if setter.has_exception_state %}
228 v8::String::Utf8Value namedProperty(nameString); 228 v8::String::Utf8Value namedProperty(nameString);
229 ExceptionState exceptionState(ExceptionState::SetterContext, *namedProperty, "{{interface_name}}", info.Holder(), info.GetIsolate()); 229 ExceptionState exceptionState(ExceptionState::SetterContext, *namedProperty, "{{interface_name}}", info.Holder(), info.GetIsolate());
230 {% endif %} 230 {% endif %}
231 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 231 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
232 {# v8_value_to_local_cpp_value('DOMString', 'nameString', 'propertyName') #} 232 {# v8_value_to_local_cpp_value('DOMString', 'nameString', 'propertyName') #}
233 TOSTRING_VOID(V8StringResource<>, propertyName, nameString); 233 TOSTRING_VOID(V8StringResource<>, propertyName, nameString);
234 {{setter.v8_value_to_local_cpp_value}}; 234 {{setter.v8_value_to_local_cpp_value}};
235 {% if setter.has_type_checking_interface %}
236 {# Type checking for interface types (if interface not implemented, throw
237 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
238 if (!propertyValue{% if setter.is_nullable %} && !isUndefinedOrNull(v8Value) {% endif %}) {
239 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'.");
240 exceptionState.throwIfNeeded();
241 return;
242 }
243 {% endif %}
235 {% set setter_name = setter.name or 'anonymousNamedSetter' %} 244 {% set setter_name = setter.name or 'anonymousNamedSetter' %}
236 {% set setter_arguments = 245 {% set setter_arguments =
237 ['propertyName', 'propertyValue', 'exceptionState'] 246 ['propertyName', 'propertyValue', 'exceptionState']
238 if setter.is_raises_exception else 247 if setter.is_raises_exception else
239 ['propertyName', 'propertyValue'] %} 248 ['propertyName', 'propertyValue'] %}
240 bool result = impl->{{setter_name}}({{setter_arguments | join(', ')}}); 249 bool result = impl->{{setter_name}}({{setter_arguments | join(', ')}});
241 {% if setter.is_raises_exception %} 250 {% if setter.is_raises_exception %}
242 if (exceptionState.throwIfNeeded()) 251 if (exceptionState.throwIfNeeded())
243 return; 252 return;
244 {% endif %} 253 {% endif %}
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 } 979 }
971 980
972 {% for method in methods if method.overloads and method.overloads.has_partial_ov erloads %} 981 {% for method in methods if method.overloads and method.overloads.has_partial_ov erloads %}
973 void {{v8_class}}::register{{method.name | blink_capitalize}}MethodForPartialInt erface(void (*method)(const v8::FunctionCallbackInfo<v8::Value>&)) 982 void {{v8_class}}::register{{method.name | blink_capitalize}}MethodForPartialInt erface(void (*method)(const v8::FunctionCallbackInfo<v8::Value>&))
974 { 983 {
975 {{cpp_class}}V8Internal::{{method.name}}MethodForPartialInterface = method; 984 {{cpp_class}}V8Internal::{{method.name}}MethodForPartialInterface = method;
976 } 985 }
977 {% endfor %} 986 {% endfor %}
978 {% endif %} 987 {% endif %}
979 {% endblock %} 988 {% endblock %}
OLDNEW
« no previous file with comments | « Source/bindings/scripts/v8_interface.py ('k') | Source/bindings/tests/idls/core/TestInterface2.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698