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

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

Issue 232563003: API functions returning Promises should not throw exceptions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 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
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 %}
11 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { 11 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
12 {{throw_arity_type_error(method, method.number_of_required_arguments)}}; 12 {{throw_arity_type_error(method, method.number_of_required_arguments)}};
13 return; 13 return;
14 } 14 }
15 {% endif %} 15 {% endif %}
16 {% if not method.is_static %} 16 {% if not method.is_static %}
17 {{cpp_class}}* impl = {{v8_class}}::toNative(info.Holder()); 17 {{cpp_class}}* impl = {{v8_class}}::toNative(info.Holder());
18 {% endif %} 18 {% endif %}
19 {% if method.is_custom_element_callbacks %} 19 {% if method.is_custom_element_callbacks %}
20 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope; 20 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope;
21 {% endif %} 21 {% endif %}
22 {# Security checks #} 22 {# Security checks #}
23 {# FIXME: change to method.is_check_security_for_window #} 23 {# FIXME: change to method.is_check_security_for_window #}
24 {% if interface_name == 'EventTarget' %} 24 {% if interface_name == 'EventTarget' %}
25 if (DOMWindow* window = impl->toDOMWindow()) { 25 if (DOMWindow* window = impl->toDOMWindow()) {
26 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), window ->frame(), exceptionState)) { 26 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), window ->frame(), exceptionState)) {
27 exceptionState.throwIfNeeded(); 27 {{throw_from_exception_state(method) | indent}}
Nils Barth (inactive) 2014/04/10 07:48:03 No indent here (it's a 1-line macro, right), and '
yhirano 2014/04/11 10:19:04 Done.
28 return; 28 return;
29 } 29 }
30 if (!window->document()) 30 if (!window->document())
31 return; 31 return;
32 } 32 }
33 {% elif method.is_check_security_for_frame %} 33 {% elif method.is_check_security_for_frame %}
34 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), impl->fram e(), exceptionState)) { 34 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), impl->fram e(), exceptionState)) {
35 exceptionState.throwIfNeeded(); 35 {{throw_from_exception_state(method) | indent}}
Nils Barth (inactive) 2014/04/10 07:48:03 no indent, ; at call
yhirano 2014/04/11 10:19:04 Done.
36 return; 36 return;
37 } 37 }
38 {% endif %} 38 {% endif %}
39 {% if method.is_check_security_for_node %} 39 {% if method.is_check_security_for_node %}
40 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), impl->{{met hod.name}}(exceptionState), exceptionState)) { 40 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), impl->{{met hod.name}}(exceptionState), exceptionState)) {
41 v8SetReturnValueNull(info); 41 v8SetReturnValueNull(info);
42 exceptionState.throwIfNeeded(); 42 {{throw_from_exception_state(method) | indent}}
Nils Barth (inactive) 2014/04/10 07:48:03 no indent, ; at call
yhirano 2014/04/11 10:19:04 Done.
43 return; 43 return;
44 } 44 }
45 {% endif %} 45 {% endif %}
46 {# Call method #} 46 {# Call method #}
47 {% for argument in method.arguments %} 47 {% for argument in method.arguments %}
48 {{generate_argument(method, argument, world_suffix) | indent}} 48 {{generate_argument(method, argument, world_suffix) | indent}}
49 {% endfor %} 49 {% endfor %}
50 {% if world_suffix %} 50 {% if world_suffix %}
51 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method. cpp_value) | indent}} 51 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method. cpp_value) | indent}}
52 {% else %} 52 {% else %}
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 '"The callback provided as parameter %s is not a function."' % 127 '"The callback provided as parameter %s is not a function."' %
128 (argument.index + 1)) | indent }} 128 (argument.index + 1)) | indent }}
129 return; 129 return;
130 } 130 }
131 OwnPtr<{{argument.idl_type}}> {{argument.name}} = {% if argument.is_nullable %}i nfo[{{argument.index}}]->IsNull() ? nullptr : {% endif %}V8{{argument.idl_type}} ::create(v8::Handle<v8::Function>::Cast(info[{{argument.index}}]), currentExecut ionContext(info.GetIsolate())); 131 OwnPtr<{{argument.idl_type}}> {{argument.name}} = {% if argument.is_nullable %}i nfo[{{argument.index}}]->IsNull() ? nullptr : {% endif %}V8{{argument.idl_type}} ::create(v8::Handle<v8::Function>::Cast(info[{{argument.index}}]), currentExecut ionContext(info.GetIsolate()));
132 {% endif %}{# argument.is_optional #} 132 {% endif %}{# argument.is_optional #}
133 {% endif %}{# argument.idl_type == 'EventListener' #} 133 {% endif %}{# argument.idl_type == 'EventListener' #}
134 {% elif argument.is_clamp %}{# argument.is_callback_interface #} 134 {% elif argument.is_clamp %}{# argument.is_callback_interface #}
135 {# NaN is treated as 0: http://www.w3.org/TR/WebIDL/#es-type-mapping #} 135 {# NaN is treated as 0: http://www.w3.org/TR/WebIDL/#es-type-mapping #}
136 {{argument.cpp_type}} {{argument.name}} = 0; 136 {{argument.cpp_type}} {{argument.name}} = 0;
137 {% if method.idl_type == 'Promise' %}
138 V8TRYCATCH_VOID_PROMISE(double, {{argument.name}}NativeValue, info[{{argument.in dex}}]->NumberValue(), info);
139 {% else %}
137 V8TRYCATCH_VOID(double, {{argument.name}}NativeValue, info[{{argument.index}}]-> NumberValue()); 140 V8TRYCATCH_VOID(double, {{argument.name}}NativeValue, info[{{argument.index}}]-> NumberValue());
141 {% endif %}
138 if (!std::isnan({{argument.name}}NativeValue)) 142 if (!std::isnan({{argument.name}}NativeValue))
139 {# IDL type is used for clamping, for the right bounds, since different 143 {# IDL type is used for clamping, for the right bounds, since different
140 IDL integer types have same internal C++ type (int or unsigned) #} 144 IDL integer types have same internal C++ type (int or unsigned) #}
141 {{argument.name}} = clampTo<{{argument.idl_type}}>({{argument.name}}NativeVa lue); 145 {{argument.name}} = clampTo<{{argument.idl_type}}>({{argument.name}}NativeVa lue);
142 {% elif argument.idl_type == 'SerializedScriptValue' %} 146 {% elif argument.idl_type == 'SerializedScriptValue' %}
143 {{argument.cpp_type}} {{argument.name}} = SerializedScriptValue::create(info[{{a rgument.index}}], 0, 0, exceptionState, info.GetIsolate()); 147 {{argument.cpp_type}} {{argument.name}} = SerializedScriptValue::create(info[{{a rgument.index}}], 0, 0, exceptionState, info.GetIsolate());
144 if (exceptionState.throwIfNeeded()) 148 if (exceptionState.hadException()) {
149 {{throw_from_exception_state(method) | indent}}
145 return; 150 return;
151 }
146 {% elif argument.is_variadic_wrapper_type %} 152 {% elif argument.is_variadic_wrapper_type %}
147 {{argument.vector_type}}<{{argument.cpp_type}} > {{argument.name}}; 153 {{argument.vector_type}}<{{argument.cpp_type}} > {{argument.name}};
148 for (int i = {{argument.index}}; i < info.Length(); ++i) { 154 for (int i = {{argument.index}}; i < info.Length(); ++i) {
149 if (!V8{{argument.idl_type}}::hasInstance(info[i], info.GetIsolate())) { 155 if (!V8{{argument.idl_type}}::hasInstance(info[i], info.GetIsolate())) {
150 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' % 156 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' %
151 (argument.index + 1, argument.idl_type)) | in dent(8)}} 157 (argument.index + 1, argument.idl_type)) | in dent(8)}}
152 return; 158 return;
153 } 159 }
154 {{argument.name}}.append(V8{{argument.idl_type}}::toNative(v8::Handle<v8::Ob ject>::Cast(info[i]))); 160 {{argument.name}}.append(V8{{argument.idl_type}}::toNative(v8::Handle<v8::Ob ject>::Cast(info[i])));
155 } 161 }
156 {% else %} 162 {% else %}
163 {% if method.idl_type == 'Promise' %}
164 {{argument.v8_value_to_local_cpp_value_async}};
165 {% else %}
157 {{argument.v8_value_to_local_cpp_value}}; 166 {{argument.v8_value_to_local_cpp_value}};
158 {% endif %} 167 {% endif %}
168 {% endif %}
159 {% if argument.enum_validation_expression %} 169 {% if argument.enum_validation_expression %}
160 {# Methods throw on invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #} 170 {# Methods throw on invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #}
161 String string = {{argument.name}}; 171 String string = {{argument.name}};
162 if (!({{argument.enum_validation_expression}})) { 172 if (!({{argument.enum_validation_expression}})) {
163 {{throw_type_error(method, 173 {{throw_type_error(method,
164 '"parameter %s (\'" + string + "\') is not a valid enum value."' % 174 '"parameter %s (\'" + string + "\') is not a valid enum value."' %
165 (argument.index + 1)) | indent}} 175 (argument.index + 1)) | indent}}
166 return; 176 return;
167 } 177 }
168 {% endif %} 178 {% endif %}
(...skipping 30 matching lines...) Expand all
199 {% endif %} 209 {% endif %}
200 {# Call #} 210 {# Call #}
201 {% if method.idl_type == 'void' %} 211 {% if method.idl_type == 'void' %}
202 {{cpp_value}}; 212 {{cpp_value}};
203 {% elif method.is_call_with_script_state or method.is_call_with_new_script_state or method.is_raises_exception %} 213 {% elif method.is_call_with_script_state or method.is_call_with_new_script_state or method.is_raises_exception %}
204 {# FIXME: consider always using a local variable #} 214 {# FIXME: consider always using a local variable #}
205 {{method.cpp_type}} result = {{cpp_value}}; 215 {{method.cpp_type}} result = {{cpp_value}};
206 {% endif %} 216 {% endif %}
207 {# Post-call #} 217 {# Post-call #}
208 {% if method.is_raises_exception %} 218 {% if method.is_raises_exception %}
209 if (exceptionState.throwIfNeeded()) 219 if (exceptionState.hadException()) {
220 {{throw_from_exception_state(method) | indent}}
210 return; 221 return;
222 }
211 {% endif %} 223 {% endif %}
212 {# Set return value #} 224 {# Set return value #}
213 {% if method.union_arguments %} 225 {% if method.union_arguments %}
214 {{union_type_method_call_and_set_return_value(method)}} 226 {{union_type_method_call_and_set_return_value(method)}}
215 {% elif v8_set_return_value %}{{v8_set_return_value}};{% endif %}{# None for voi d #} 227 {% elif v8_set_return_value %}{{v8_set_return_value}};{% endif %}{# None for voi d #}
216 {% endmacro %} 228 {% endmacro %}
217 229
218 230
219 {######################################} 231 {######################################}
220 {% macro union_type_method_call_and_set_return_value(method) %} 232 {% macro union_type_method_call_and_set_return_value(method) %}
(...skipping 14 matching lines...) Expand all
235 {% endfor %} 247 {% endfor %}
236 {# Fall back to null if none of the union members results are returned #} 248 {# Fall back to null if none of the union members results are returned #}
237 v8SetReturnValueNull(info); 249 v8SetReturnValueNull(info);
238 {%- endmacro %} 250 {%- endmacro %}
239 251
240 252
241 {######################################} 253 {######################################}
242 {% macro throw_type_error(method, error_message) %} 254 {% macro throw_type_error(method, error_message) %}
243 {% if method.has_exception_state %} 255 {% if method.has_exception_state %}
244 exceptionState.throwTypeError({{error_message}}); 256 exceptionState.throwTypeError({{error_message}});
245 exceptionState.throwIfNeeded(); 257 {{throw_from_exception_state(method)}}
246 {%- elif method.is_constructor %} 258 {%- elif method.is_constructor %}
259 {% if method.idl_type == 'Promise' %}
260 v8SetReturnValue(info, ScriptPromise::rejectWithTypeError(ExceptionMessages::fai ledToConstruct("{{interface_name}}", {{error_message}}), info.GetIsolate()).v8Va lue());
261 {%- else %}
247 throwTypeError(ExceptionMessages::failedToConstruct("{{interface_name}}", {{erro r_message}}), info.GetIsolate()); 262 throwTypeError(ExceptionMessages::failedToConstruct("{{interface_name}}", {{erro r_message}}), info.GetIsolate());
263 {%- endif %}{# if method.idl_type == 'Promise' #}
264 {%- else %}
265 {% if method.idl_type == 'Promise' %}
266 v8SetReturnValue(info, ScriptPromise::rejectWithTypeError(ExceptionMessages::fai ledToExecute("{{method.name}}", "{{interface_name}}", {{error_message}}), info.G etIsolate()).v8Value());
248 {%- else %} 267 {%- else %}
249 throwTypeError(ExceptionMessages::failedToExecute("{{method.name}}", "{{interfac e_name}}", {{error_message}}), info.GetIsolate()); 268 throwTypeError(ExceptionMessages::failedToExecute("{{method.name}}", "{{interfac e_name}}", {{error_message}}), info.GetIsolate());
269 {%- endif %}{# if method.idl_type == 'Promise' #}
250 {%- endif %} 270 {%- endif %}
251 {% endmacro %} 271 {% endmacro %}
252 272
Nils Barth (inactive) 2014/04/10 07:48:03 2 lines between macros
yhirano 2014/04/11 10:19:04 Done.
273 {######################################}
274 {% macro throw_from_exception_state(method) %}
275 {% if method.idl_type == 'Promise' %}
276 v8SetReturnValue(info, exceptionState.rejectedPromise().v8Value());
277 {%- else %}
278 exceptionState.throwIfNeeded();
279 {%- endif %}
280 {% endmacro %}
253 281
Nils Barth (inactive) 2014/04/10 07:48:03 2 lines between macros
yhirano 2014/04/11 10:19:04 Done.
254 {######################################} 282 {######################################}
255 {% macro throw_arity_type_error(method, number_of_required_arguments) %} 283 {% macro throw_arity_type_error(method, number_of_required_arguments) %}
284 {% if method.idl_type == 'Promise' %}
285 {% if method.has_exception_state %}
286 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeError(exceptionState, { {number_of_required_arguments}}, info.Length()).v8Value())
287 {%- elif method.is_constructor %}
288 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeErrorForConstructor("{{ interface_name}}", {{number_of_required_arguments}}, info.Length(), info.GetIsol ate().v8Value())
289 {%- else %}
290 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeErrorForMethod("{{metho d.name}}", "{{interface_name}}", {{number_of_required_arguments}}, info.Length() , info.GetIsolate()).v8Value())
291 {%- endif %}
292 {%- else %}
256 {% if method.has_exception_state %} 293 {% if method.has_exception_state %}
257 throwArityTypeError(exceptionState, {{number_of_required_arguments}}, info.Lengt h()) 294 throwArityTypeError(exceptionState, {{number_of_required_arguments}}, info.Lengt h())
258 {%- elif method.is_constructor %} 295 {%- elif method.is_constructor %}
259 throwArityTypeErrorForConstructor("{{interface_name}}", {{number_of_required_arg uments}}, info.Length(), info.GetIsolate()) 296 throwArityTypeErrorForConstructor("{{interface_name}}", {{number_of_required_arg uments}}, info.Length(), info.GetIsolate())
260 {%- else %} 297 {%- else %}
261 throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{number_o f_required_arguments}}, info.Length(), info.GetIsolate()) 298 throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{number_o f_required_arguments}}, info.Length(), info.GetIsolate())
262 {%- endif %} 299 {%- endif %}
300 {%- endif %}
263 {% endmacro %} 301 {% endmacro %}
264 302
265 303
266 {##############################################################################} 304 {##############################################################################}
267 {% macro overload_resolution_method(overloads, world_suffix) %} 305 {% macro overload_resolution_method(overloads, world_suffix) %}
268 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) 306 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info)
269 { 307 {
270 {% for method in overloads.methods %} 308 {% for method in overloads.methods %}
271 if ({{method.overload_resolution_expression}}) { 309 if ({{method.overload_resolution_expression}}) {
272 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info); 310 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info);
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 483
446 {% if has_custom_wrap %} 484 {% if has_custom_wrap %}
447 v8::Handle<v8::Object> wrapper = wrap(impl.get(), info.Holder(), info.GetIso late()); 485 v8::Handle<v8::Object> wrapper = wrap(impl.get(), info.Holder(), info.GetIso late());
448 {% else %} 486 {% else %}
449 v8::Handle<v8::Object> wrapper = info.Holder(); 487 v8::Handle<v8::Object> wrapper = info.Holder();
450 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{v8 _class}}Constructor::wrapperTypeInfo, wrapper, info.GetIsolate(), {{wrapper_conf iguration}}); 488 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{v8 _class}}Constructor::wrapperTypeInfo, wrapper, info.GetIsolate(), {{wrapper_conf iguration}});
451 {% endif %} 489 {% endif %}
452 v8SetReturnValue(info, wrapper); 490 v8SetReturnValue(info, wrapper);
453 } 491 }
454 {% endmacro %} 492 {% endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698