Chromium Code Reviews| OLD | NEW |
|---|---|
| 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)}}; |
| 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)}}; |
| 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)}}; |
| 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 Loading... | |
| 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 TONATIVE_VOID_ASYNC(double, {{argument.name}}NativeValue, info[{{argument.index} }]->NumberValue(), info); | |
| 139 {% else %} | |
| 137 TONATIVE_VOID(double, {{argument.name}}NativeValue, info[{{argument.index}}]->Nu mberValue()); | 140 TONATIVE_VOID(double, {{argument.name}}NativeValue, info[{{argument.index}}]->Nu mberValue()); |
| 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)}}; | |
| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 201 {% if method.idl_type == 'void' %} | 211 {% if method.idl_type == 'void' %} |
| 202 {{cpp_value}}; | 212 {{cpp_value}}; |
| 203 {% elif method.is_constructor %} | 213 {% elif method.is_constructor %} |
| 204 {{method.cpp_type}} impl = {{cpp_value}}; | 214 {{method.cpp_type}} impl = {{cpp_value}}; |
| 205 {% elif method.is_call_with_script_state or method.is_call_with_new_script_state or method.is_raises_exception %} | 215 {% elif method.is_call_with_script_state or method.is_call_with_new_script_state or method.is_raises_exception %} |
| 206 {# FIXME: consider always using a local variable #} | 216 {# FIXME: consider always using a local variable #} |
| 207 {{method.cpp_type}} result = {{cpp_value}}; | 217 {{method.cpp_type}} result = {{cpp_value}}; |
| 208 {% endif %} | 218 {% endif %} |
| 209 {# Post-call #} | 219 {# Post-call #} |
| 210 {% if method.is_raises_exception %} | 220 {% if method.is_raises_exception %} |
| 211 if (exceptionState.throwIfNeeded()) | 221 if (exceptionState.hadException()) { |
| 222 {{throw_from_exception_state(method)}}; | |
| 212 return; | 223 return; |
| 224 } | |
| 213 {% endif %} | 225 {% endif %} |
| 214 {# Set return value #} | 226 {# Set return value #} |
| 215 {% if method.is_constructor %} | 227 {% if method.is_constructor %} |
| 216 {{generate_constructor_wrapper(method)}}{% elif method.union_arguments %} | 228 {{generate_constructor_wrapper(method)}}{% elif method.union_arguments %} |
| 217 {{union_type_method_call_and_set_return_value(method)}} | 229 {{union_type_method_call_and_set_return_value(method)}} |
| 218 {% elif v8_set_return_value %}{{v8_set_return_value}};{% endif %}{# None for voi d #} | 230 {% elif v8_set_return_value %}{{v8_set_return_value}};{% endif %}{# None for voi d #} |
| 219 {% endmacro %} | 231 {% endmacro %} |
| 220 | 232 |
| 221 | 233 |
| 222 {######################################} | 234 {######################################} |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 238 {% endfor %} | 250 {% endfor %} |
| 239 {# Fall back to null if none of the union members results are returned #} | 251 {# Fall back to null if none of the union members results are returned #} |
| 240 v8SetReturnValueNull(info); | 252 v8SetReturnValueNull(info); |
| 241 {%- endmacro %} | 253 {%- endmacro %} |
| 242 | 254 |
| 243 | 255 |
| 244 {######################################} | 256 {######################################} |
| 245 {% macro throw_type_error(method, error_message) %} | 257 {% macro throw_type_error(method, error_message) %} |
| 246 {% if method.has_exception_state %} | 258 {% if method.has_exception_state %} |
| 247 exceptionState.throwTypeError({{error_message}}); | 259 exceptionState.throwTypeError({{error_message}}); |
| 248 exceptionState.throwIfNeeded(); | 260 {{throw_from_exception_state(method)}}; |
| 249 {%- elif method.is_constructor %} | 261 {%- elif method.is_constructor %} |
| 262 {% if method.idl_type == 'Promise' %} | |
| 263 v8SetReturnValue(info, ScriptPromise::rejectWithTypeError(ExceptionMessages::fai ledToConstruct("{{interface_name}}", {{error_message}}), info.GetIsolate()).v8Va lue()); | |
| 264 {%- else %} | |
| 250 throwTypeError(ExceptionMessages::failedToConstruct("{{interface_name}}", {{erro r_message}}), info.GetIsolate()); | 265 throwTypeError(ExceptionMessages::failedToConstruct("{{interface_name}}", {{erro r_message}}), info.GetIsolate()); |
| 266 {%- endif %}{# if method.idl_type == 'Promise' #} | |
| 267 {%- else %} | |
|
Nils Barth (inactive)
2014/04/14 01:18:55
Could you comment the outer statements instead, or
yhirano
2014/04/14 06:12:43
Done.
| |
| 268 {% if method.idl_type == 'Promise' %} | |
| 269 v8SetReturnValue(info, ScriptPromise::rejectWithTypeError(ExceptionMessages::fai ledToExecute("{{method.name}}", "{{interface_name}}", {{error_message}}), info.G etIsolate()).v8Value()); | |
| 251 {%- else %} | 270 {%- else %} |
| 252 throwTypeError(ExceptionMessages::failedToExecute("{{method.name}}", "{{interfac e_name}}", {{error_message}}), info.GetIsolate()); | 271 throwTypeError(ExceptionMessages::failedToExecute("{{method.name}}", "{{interfac e_name}}", {{error_message}}), info.GetIsolate()); |
| 272 {%- endif %}{# if method.idl_type == 'Promise' #} | |
| 273 {%- endif %} | |
| 274 {% endmacro %} | |
| 275 | |
| 276 | |
| 277 {######################################} | |
| 278 {% macro throw_from_exception_state(method) %} | |
| 279 {% if method.idl_type == 'Promise' %} | |
| 280 v8SetReturnValue(info, exceptionState.reject().v8Value()) | |
| 281 {%- else %} | |
| 282 exceptionState.throwIfNeeded() | |
| 253 {%- endif %} | 283 {%- endif %} |
| 254 {% endmacro %} | 284 {% endmacro %} |
| 255 | 285 |
| 256 | 286 |
| 257 {######################################} | 287 {######################################} |
| 258 {% macro throw_arity_type_error(method, number_of_required_arguments) %} | 288 {% macro throw_arity_type_error(method, number_of_required_arguments) %} |
| 289 {% if method.idl_type == 'Promise' %} | |
| 290 {% if method.has_exception_state %} | |
| 291 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeError(exceptionState, { {number_of_required_arguments}}, info.Length()).v8Value()) | |
| 292 {%- elif method.is_constructor %} | |
| 293 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeErrorForConstructor("{{ interface_name}}", {{number_of_required_arguments}}, info.Length(), info.GetIsol ate().v8Value()) | |
| 294 {%- else %} | |
| 295 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeErrorForMethod("{{metho d.name}}", "{{interface_name}}", {{number_of_required_arguments}}, info.Length() , info.GetIsolate()).v8Value()) | |
| 296 {%- endif %} | |
| 297 {%- else %} | |
|
Nils Barth (inactive)
2014/04/14 01:18:55
Could you put {# method.idl_type != 'Promise' #} h
yhirano
2014/04/14 06:12:43
Done. I think using 'method.idl_type == 'Promise'
Nils Barth (inactive)
2014/04/14 06:17:43
That's fine, thanks!
| |
| 259 {% if method.has_exception_state %} | 298 {% if method.has_exception_state %} |
| 260 throwArityTypeError(exceptionState, {{number_of_required_arguments}}, info.Lengt h()) | 299 throwArityTypeError(exceptionState, {{number_of_required_arguments}}, info.Lengt h()) |
| 261 {%- elif method.is_constructor %} | 300 {%- elif method.is_constructor %} |
| 262 throwArityTypeErrorForConstructor("{{interface_name}}", {{number_of_required_arg uments}}, info.Length(), info.GetIsolate()) | 301 throwArityTypeErrorForConstructor("{{interface_name}}", {{number_of_required_arg uments}}, info.Length(), info.GetIsolate()) |
| 263 {%- else %} | 302 {%- else %} |
| 264 throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{number_o f_required_arguments}}, info.Length(), info.GetIsolate()) | 303 throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{number_o f_required_arguments}}, info.Length(), info.GetIsolate()) |
| 265 {%- endif %} | 304 {%- endif %} |
| 305 {%- endif %} | |
| 266 {% endmacro %} | 306 {% endmacro %} |
| 267 | 307 |
| 268 | 308 |
| 269 {##############################################################################} | 309 {##############################################################################} |
| 270 {% macro overload_resolution_method(overloads, world_suffix) %} | 310 {% macro overload_resolution_method(overloads, world_suffix) %} |
| 271 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) | 311 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) |
| 272 { | 312 { |
| 273 {% for method in overloads.methods %} | 313 {% for method in overloads.methods %} |
| 274 if ({{method.overload_resolution_expression}}) { | 314 if ({{method.overload_resolution_expression}}) { |
| 275 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info); | 315 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 {% endfor %} | 492 {% endfor %} |
| 453 {{constructor.cpp_type}} impl = {{cpp_class}}::createForJSConstructor({{cons tructor.argument_list | join(', ')}}); | 493 {{constructor.cpp_type}} impl = {{cpp_class}}::createForJSConstructor({{cons tructor.argument_list | join(', ')}}); |
| 454 {% if is_constructor_raises_exception %} | 494 {% if is_constructor_raises_exception %} |
| 455 if (exceptionState.throwIfNeeded()) | 495 if (exceptionState.throwIfNeeded()) |
| 456 return; | 496 return; |
| 457 {% endif %} | 497 {% endif %} |
| 458 | 498 |
| 459 {{generate_constructor_wrapper(constructor) | indent}} | 499 {{generate_constructor_wrapper(constructor) | indent}} |
| 460 } | 500 } |
| 461 {% endmacro %} | 501 {% endmacro %} |
| OLD | NEW |