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

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

Issue 259773008: Add support for type checking of floating point arguments as [TypeChecking=Unrestricted] (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Remove outdated test Created 6 years, 7 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_methods.py ('k') | Source/bindings/tests/idls/TestInterface.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 generate_method(method, world_suffix) %} 2 {% macro generate_method(method, world_suffix) %}
3 {% filter conditional(method.conditional_string) %} 3 {% filter conditional(method.conditional_string) %}
4 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) 4 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info)
5 { 5 {
6 {# Local variables #} 6 {# Local variables #}
7 {% if method.has_exception_state %} 7 {% if method.has_exception_state %}
8 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); 8 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate());
9 {% endif %} 9 {% endif %}
10 {% if method.number_of_required_arguments %} 10 {% if method.number_of_required_arguments %}
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent}} 87 {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent}}
88 {% endif %} 88 {% endif %}
89 {% if argument.has_event_listener_argument %} 89 {% if argument.has_event_listener_argument %}
90 {{hidden_dependency_action(method.name) | indent}} 90 {{hidden_dependency_action(method.name) | indent}}
91 {% endif %} 91 {% endif %}
92 return; 92 return;
93 } 93 }
94 {% endif %} 94 {% endif %}
95 {% if argument.has_type_checking_interface %} 95 {% if argument.has_type_checking_interface %}
96 {# Type checking for wrapper interface types (if interface not implemented, 96 {# Type checking for wrapper interface types (if interface not implemented,
97 throw TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} 97 throw a TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
98 if (info.Length() > {{argument.index}} && {% if argument.is_nullable %}!isUndefi nedOrNull(info[{{argument.index}}]) && {% endif %}!V8{{argument.idl_type}}::hasI nstance(info[{{argument.index}}], info.GetIsolate())) { 98 if (info.Length() > {{argument.index}} && {% if argument.is_nullable %}!isUndefi nedOrNull(info[{{argument.index}}]) && {% endif %}!V8{{argument.idl_type}}::hasI nstance(info[{{argument.index}}], info.GetIsolate())) {
99 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' % 99 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' %
100 (argument.index + 1, argument.idl_type)) | indent }} 100 (argument.index + 1, argument.idl_type)) | indent }}
101 return; 101 return;
102 } 102 }
103 {% endif %} 103 {% endif %}
104 {% if argument.is_callback_interface %} 104 {% if argument.is_callback_interface %}
105 {# FIXME: remove EventListener special case #} 105 {# FIXME: remove EventListener special case #}
106 {% if argument.idl_type == 'EventListener' %} 106 {% if argument.idl_type == 'EventListener' %}
107 {% if method.name == 'removeEventListener' %} 107 {% if method.name == 'removeEventListener' %}
108 RefPtr<{{argument.idl_type}}> {{argument.name}} = V8EventListenerList::getEventL istener(info[1], false, ListenerFindOnly); 108 RefPtr<{{argument.idl_type}}> {{argument.name}} = V8EventListenerList::getEventL istener(info[1], false, ListenerFindOnly);
109 {% else %}{# method.name == 'addEventListener' #} 109 {% else %}{# method.name == 'addEventListener' #}
110 RefPtr<{{argument.idl_type}}> {{argument.name}} = V8EventListenerList::getEventL istener(info[1], false, ListenerFindOrCreate); 110 RefPtr<{{argument.idl_type}}> {{argument.name}} = V8EventListenerList::getEventL istener(info[1], false, ListenerFindOrCreate);
111 {% endif %}{# method.name #} 111 {% endif %}{# method.name #}
112 {% else %} 112 {% else %}
113 {# Callback functions must be functions:
114 http://www.w3.org/TR/WebIDL/#es-callback-function #}
113 {% if argument.is_optional %} 115 {% if argument.is_optional %}
114 OwnPtr<{{argument.idl_type}}> {{argument.name}}; 116 OwnPtr<{{argument.idl_type}}> {{argument.name}};
115 if (info.Length() > {{argument.index}} && !isUndefinedOrNull(info[{{argument.ind ex}}])) { 117 if (info.Length() > {{argument.index}} && !isUndefinedOrNull(info[{{argument.ind ex}}])) {
116 if (!info[{{argument.index}}]->IsFunction()) { 118 if (!info[{{argument.index}}]->IsFunction()) {
117 {{throw_type_error(method, 119 {{throw_type_error(method,
118 '"The callback provided as parameter %s is not a function."' % 120 '"The callback provided as parameter %s is not a function."' %
119 (argument.index + 1)) | indent(8)}} 121 (argument.index + 1)) | indent(8)}}
120 return; 122 return;
121 } 123 }
122 {{argument.name}} = V8{{argument.idl_type}}::create(v8::Handle<v8::Function> ::Cast(info[{{argument.index}}]), currentExecutionContext(info.GetIsolate())); 124 {{argument.name}} = V8{{argument.idl_type}}::create(v8::Handle<v8::Function> ::Cast(info[{{argument.index}}]), currentExecutionContext(info.GetIsolate()));
(...skipping 26 matching lines...) Expand all
149 if (!V8{{argument.idl_type}}::hasInstance(info[i], info.GetIsolate())) { 151 if (!V8{{argument.idl_type}}::hasInstance(info[i], info.GetIsolate())) {
150 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' % 152 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' %
151 (argument.index + 1, argument.idl_type)) | in dent(8)}} 153 (argument.index + 1, argument.idl_type)) | in dent(8)}}
152 return; 154 return;
153 } 155 }
154 {{argument.name}}.append(V8{{argument.idl_type}}::toNative(v8::Handle<v8::Ob ject>::Cast(info[i]))); 156 {{argument.name}}.append(V8{{argument.idl_type}}::toNative(v8::Handle<v8::Ob ject>::Cast(info[i])));
155 } 157 }
156 {% else %} 158 {% else %}
157 {{argument.v8_value_to_local_cpp_value}}; 159 {{argument.v8_value_to_local_cpp_value}};
158 {% endif %} 160 {% endif %}
159 {% if argument.enum_validation_expression %} 161 {# Type checking, possibly throw a TypeError, per:
160 {# Methods throw on invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #} 162 http://www.w3.org/TR/WebIDL/#es-type-mapping #}
163 {% if argument.has_type_checking_unrestricted %}
164 {# Non-finite floating point values (NaN, +Infinity or −Infinity), per:
165 http://heycam.github.io/webidl/#es-float
166 http://heycam.github.io/webidl/#es-double #}
167 if (!std::isfinite({{argument.name}})) {
168 {{throw_type_error(method, '"%s parameter %s is non-finite."' %
169 (argument.idl_type, argument.index + 1)) | indent }}
170 return;
171 }
172 {% elif argument.enum_validation_expression %}
173 {# Invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #}
161 String string = {{argument.name}}; 174 String string = {{argument.name}};
162 if (!({{argument.enum_validation_expression}})) { 175 if (!({{argument.enum_validation_expression}})) {
163 {{throw_type_error(method, 176 {{throw_type_error(method,
164 '"parameter %s (\'" + string + "\') is not a valid enum value."' % 177 '"parameter %s (\'" + string + "\') is not a valid enum value."' %
165 (argument.index + 1)) | indent}} 178 (argument.index + 1)) | indent}}
166 return; 179 return;
167 } 180 }
168 {% endif %} 181 {% elif argument.idl_type in ['Dictionary', 'Promise'] %}
169 {% if argument.idl_type in ['Dictionary', 'Promise'] %} 182 {# Dictionaries must have type Undefined, Null or Object:
183 http://heycam.github.io/webidl/#es-dictionary
184 We also require this for our implementation of promises, though not in spec:
185 http://heycam.github.io/webidl/#es-promise #}
170 if (!{{argument.name}}.isUndefinedOrNull() && !{{argument.name}}.isObject()) { 186 if (!{{argument.name}}.isUndefinedOrNull() && !{{argument.name}}.isObject()) {
171 {{throw_type_error(method, '"parameter %s (\'%s\') is not an object."' % 187 {{throw_type_error(method, '"parameter %s (\'%s\') is not an object."' %
172 (argument.index + 1, argument.name)) | indent}} 188 (argument.index + 1, argument.name)) | indent}}
173 return; 189 return;
174 } 190 }
175 {% endif %} 191 {% endif %}
176 {% endmacro %} 192 {% endmacro %}
177 193
178 194
179 {######################################} 195 {######################################}
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 {% endfor %} 464 {% endfor %}
449 {{constructor.cpp_type}} impl = {{cpp_class}}::createForJSConstructor({{cons tructor.argument_list | join(', ')}}); 465 {{constructor.cpp_type}} impl = {{cpp_class}}::createForJSConstructor({{cons tructor.argument_list | join(', ')}});
450 {% if is_constructor_raises_exception %} 466 {% if is_constructor_raises_exception %}
451 if (exceptionState.throwIfNeeded()) 467 if (exceptionState.throwIfNeeded())
452 return; 468 return;
453 {% endif %} 469 {% endif %}
454 470
455 {{generate_constructor_wrapper(constructor) | indent}} 471 {{generate_constructor_wrapper(constructor) | indent}}
456 } 472 }
457 {% endmacro %} 473 {% endmacro %}
OLDNEW
« no previous file with comments | « Source/bindings/scripts/v8_methods.py ('k') | Source/bindings/tests/idls/TestInterface.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698