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

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

Issue 201603002: Simplify EventTarget bindings generation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Much more extensive Created 6 years, 9 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
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 {% if method.has_exception_state %} 6 {% if method.has_exception_state %}
7 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); 7 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate());
8 {% endif %} 8 {% endif %}
9 {% if method.name in ['addEventListener', 'removeEventListener',
Nils Barth (inactive) 2014/03/18 03:34:46 This if statement lists all the methods in EventTa
10 'dispatchEvent'] %}
11 {{add_event_listener_remove_event_listener_dispatch_event() | indent}}
12 {% endif %}
13 {% if method.name in ['addEventListener', 'removeEventListener'] %}
Nils Barth (inactive) 2014/03/18 03:34:46 This {% if %} block meant that addEventListener/re
14 {{add_event_listener_remove_event_listener_method(method.name) | indent}}
15 {% else %}
16 {% if method.number_of_required_arguments %} 9 {% if method.number_of_required_arguments %}
17 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { 10 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
18 {{throw_type_error(method, 11 {{throw_type_error(method,
19 'ExceptionMessages::notEnoughArguments(%s, info.Length())' % 12 'ExceptionMessages::notEnoughArguments(%s, info.Length())' %
20 method.number_of_required_arguments) | indent(8)}} 13 method.number_of_required_arguments) | indent(8)}}
21 return; 14 return;
22 } 15 }
23 {% endif %} 16 {% endif %}
24 {% if not method.is_static %} 17 {% if not method.is_static %}
25 {{cpp_class}}* imp = {{v8_class}}::toNative(info.Holder()); 18 {{cpp_class}}* imp = {{v8_class}}::toNative(info.Holder());
26 {% endif %} 19 {% endif %}
27 {% if method.is_custom_element_callbacks %} 20 {% if method.is_custom_element_callbacks %}
28 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope; 21 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope;
29 {% endif %} 22 {% endif %}
30 {% if method.is_check_security_for_frame %} 23 {# Security checks #}
24 {% if interface_name == 'EventTarget' %}
25 {{event_target_check_security_for_frame() | indent }}
26 {% elif method.is_check_security_for_frame %}
31 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), imp->frame (), exceptionState)) { 27 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), imp->frame (), exceptionState)) {
32 exceptionState.throwIfNeeded(); 28 exceptionState.throwIfNeeded();
33 return; 29 return;
34 } 30 }
35 {% endif %} 31 {% endif %}
36 {% if method.is_check_security_for_node %} 32 {% if method.is_check_security_for_node %}
37 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), imp->{{meth od.name}}(exceptionState), exceptionState)) { 33 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), imp->{{meth od.name}}(exceptionState), exceptionState)) {
38 v8SetReturnValueNull(info); 34 v8SetReturnValueNull(info);
39 exceptionState.throwIfNeeded(); 35 exceptionState.throwIfNeeded();
40 return; 36 return;
41 } 37 }
42 {% endif %} 38 {% endif %}
39 {# Call method #}
40 {% if interface_name == 'EventTarget' and
41 method.name in ['addEventListener', 'removeEventListener'] %}
42 {{add_event_listener_remove_event_listener_method(method.name) | indent}}
43 {% else %}
43 {% for argument in method.arguments %} 44 {% for argument in method.arguments %}
44 {{generate_argument(method, argument, world_suffix) | indent}} 45 {{generate_argument(method, argument, world_suffix) | indent}}
45 {% endfor %} 46 {% endfor %}
46 {% if world_suffix %} 47 {% if world_suffix %}
47 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method. cpp_value) | indent}} 48 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method. cpp_value) | indent}}
48 {% else %} 49 {% else %}
49 {{cpp_method_call(method, method.v8_set_return_value, method.cpp_value) | in dent}} 50 {{cpp_method_call(method, method.v8_set_return_value, method.cpp_value) | in dent}}
50 {% endif %} 51 {% endif %}
51 {% endif %}{# addEventListener, removeEventListener #} 52 {% endif %}{# addEventListener, removeEventListener #}
52 } 53 }
53 {% endfilter %} 54 {% endfilter %}
54 {% endmacro %} 55 {% endmacro %}
55 56
56 57
57 {######################################} 58 {######################################}
58 {% macro add_event_listener_remove_event_listener_dispatch_event() %} 59 {% macro event_target_check_security_for_frame() %}
Nils Barth (inactive) 2014/03/18 03:34:46 Existing name was completely unclear (just listed
59 {# FIXME: Clean up: use the normal |imp| above, 60 {# FIXME: use the existing shouldAllowAccessToFrame check if possible. #}
haraken 2014/03/18 03:43:57 We should consider fixing this FIXME in a follow-u
Nils Barth (inactive) 2014/03/18 04:47:03 Yup, I'll look at it!
60 use the existing shouldAllowAccessToFrame check if possible. #} 61 if (DOMWindow* window = imp->toDOMWindow()) {
61 EventTarget* impl = {{v8_class}}::toNative(info.Holder());
62 if (DOMWindow* window = impl->toDOMWindow()) {
63 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), window->fr ame(), exceptionState)) { 62 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), window->fr ame(), exceptionState)) {
64 exceptionState.throwIfNeeded(); 63 exceptionState.throwIfNeeded();
65 return; 64 return;
66 } 65 }
67 if (!window->document()) 66 if (!window->document())
68 return; 67 return;
69 } 68 }
70 {% endmacro %} 69 {% endmacro %}
71 70
72 71
73 {######################################} 72 {######################################}
74 {% macro add_event_listener_remove_event_listener_method(method_name) %} 73 {% macro add_event_listener_remove_event_listener_method(method_name) %}
75 {# Set template values for addEventListener vs. removeEventListener #} 74 {# Set template values for addEventListener vs. removeEventListener #}
76 {% set listener_lookup_type, listener, hidden_dependency_action = 75 {% set listener_lookup_type, listener, hidden_dependency_action =
77 ('ListenerFindOrCreate', 'listener', 'addHiddenValueToArray') 76 ('ListenerFindOrCreate', 'listener', 'addHiddenValueToArray')
78 if method_name == 'addEventListener' else 77 if method_name == 'addEventListener' else
79 ('ListenerFindOnly', 'listener.get()', 'removeHiddenValueFromArray') 78 ('ListenerFindOnly', 'listener.get()', 'removeHiddenValueFromArray')
80 %} 79 %}
81 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(info[1], false, {{listener_lookup_type}}); 80 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(info[1], false, {{listener_lookup_type}});
82 if (listener) { 81 if (listener) {
83 V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<WithNullCheck>, eventN ame, info[0]); 82 V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<WithNullCheck>, eventN ame, info[0]);
84 impl->{{method_name}}(eventName, {{listener}}, info[2]->BooleanValue()); 83 imp->{{method_name}}(eventName, {{listener}}, info[2]->BooleanValue());
Nils Barth (inactive) 2014/03/18 03:34:46 |impl| => |imp| for consistency.
85 if (!impl->toNode()) 84 if (!imp->toNode())
86 {{hidden_dependency_action}}(info.Holder(), info[1], {{v8_class}}::event ListenerCacheIndex, info.GetIsolate()); 85 {{hidden_dependency_action}}(info.Holder(), info[1], {{v8_class}}::event ListenerCacheIndex, info.GetIsolate());
87 } 86 }
88 {% endmacro %} 87 {% endmacro %}
89 88
90 89
91 {######################################} 90 {######################################}
92 {% macro generate_argument(method, argument, world_suffix) %} 91 {% macro generate_argument(method, argument, world_suffix) %}
93 {% if argument.is_optional and not argument.has_default and 92 {% if argument.is_optional and not argument.has_default and
94 argument.idl_type != 'Dictionary' and 93 argument.idl_type != 'Dictionary' and
95 not argument.is_callback_interface %} 94 not argument.is_callback_interface %}
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 v8::Handle<v8::Object> wrapper = info.Holder(); 435 v8::Handle<v8::Object> wrapper = info.Holder();
437 {% if is_constructor_raises_exception %} 436 {% if is_constructor_raises_exception %}
438 if (exceptionState.throwIfNeeded()) 437 if (exceptionState.throwIfNeeded())
439 return; 438 return;
440 {% endif %} 439 {% endif %}
441 440
442 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{v8 _class}}Constructor::wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfigu ration::Dependent); 441 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{v8 _class}}Constructor::wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfigu ration::Dependent);
443 v8SetReturnValue(info, wrapper); 442 v8SetReturnValue(info, wrapper);
444 } 443 }
445 {% endmacro %} 444 {% endmacro %}
OLDNEW
« no previous file with comments | « LayoutTests/fast/events/event-listener-arguments-expected.txt ('k') | Source/bindings/tests/idls/TestObject.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698