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

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

Issue 203603005: Explicitly mark first 2 args of addEventListener/removeEventListener as optional (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Update test result (addEventListener.length now 0, not 2) 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 {# Local variables #}
6 {% if method.has_exception_state %} 7 {% if method.has_exception_state %}
7 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());
8 {% endif %} 9 {% endif %}
9 {# FIXME: remove these special cases: http://crbug.com/353484 #} 10 {% if method.number_of_required_arguments %}
10 {% if method.number_of_required_arguments and not
11 method.name in ['addEventListener', 'removeEventListener' ] %}
12 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { 11 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
13 {{throw_type_error(method, 12 {{throw_type_error(method,
14 'ExceptionMessages::notEnoughArguments(%s, info.Length())' % 13 'ExceptionMessages::notEnoughArguments(%s, info.Length())' %
15 method.number_of_required_arguments) | indent(8)}} 14 method.number_of_required_arguments) | indent(8)}}
16 return; 15 return;
17 } 16 }
18 {% endif %} 17 {% endif %}
19 {% if not method.is_static %} 18 {% if not method.is_static %}
20 {{cpp_class}}* impl = {{v8_class}}::toNative(info.Holder()); 19 {{cpp_class}}* impl = {{v8_class}}::toNative(info.Holder());
21 {% endif %} 20 {% endif %}
22 {% if method.is_custom_element_callbacks %} 21 {% if method.is_custom_element_callbacks %}
23 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope; 22 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope;
24 {% endif %} 23 {% endif %}
25 {# Security checks #} 24 {# Security checks #}
25 {# FIXME: change to method.is_check_security_for_window #}
26 {% if interface_name == 'EventTarget' %} 26 {% if interface_name == 'EventTarget' %}
27 {{event_target_check_security_for_frame() | indent }} 27 if (DOMWindow* window = impl->toDOMWindow()) {
28 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), window ->frame(), exceptionState)) {
29 exceptionState.throwIfNeeded();
30 return;
31 }
32 if (!window->document())
33 return;
34 }
28 {% elif method.is_check_security_for_frame %} 35 {% elif method.is_check_security_for_frame %}
29 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), impl->fram e(), exceptionState)) { 36 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), impl->fram e(), exceptionState)) {
30 exceptionState.throwIfNeeded(); 37 exceptionState.throwIfNeeded();
31 return; 38 return;
32 } 39 }
33 {% endif %} 40 {% endif %}
34 {% if method.is_check_security_for_node %} 41 {% if method.is_check_security_for_node %}
35 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), impl->{{met hod.name}}(exceptionState), exceptionState)) { 42 if (!BindingSecurity::shouldAllowAccessToNode(info.GetIsolate(), impl->{{met hod.name}}(exceptionState), exceptionState)) {
36 v8SetReturnValueNull(info); 43 v8SetReturnValueNull(info);
37 exceptionState.throwIfNeeded(); 44 exceptionState.throwIfNeeded();
38 return; 45 return;
39 } 46 }
40 {% endif %} 47 {% endif %}
41 {# Call method #} 48 {# Call method #}
42 {% for argument in method.arguments %} 49 {% for argument in method.arguments %}
43 {{generate_argument(method, argument, world_suffix) | indent}} 50 {{generate_argument(method, argument, world_suffix) | indent}}
44 {% endfor %} 51 {% endfor %}
45 {% if interface_name == 'EventTarget' and
46 method.name in ['addEventListener', 'removeEventListener'] %}
47 {# FIXME: can we move this |listener| check into Blink and
48 hidden_dependency_action? I.e., "if (!listener) return;" in Blink
49 and "if (listener && !impl->toNode())" in hidden_dependency_action} #}
50 if (!listener)
51 return;
52 {% endif %}
53 {% if world_suffix %} 52 {% if world_suffix %}
54 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method. cpp_value) | indent}} 53 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method. cpp_value) | indent}}
55 {% else %} 54 {% else %}
56 {{cpp_method_call(method, method.v8_set_return_value, method.cpp_value) | in dent}} 55 {{cpp_method_call(method, method.v8_set_return_value, method.cpp_value) | in dent}}
57 {% endif %} 56 {% endif %}
58 {% if interface_name == 'EventTarget' and 57 {# Post-call #}
59 method.name in ['addEventListener', 'removeEventListener'] %} 58 {% if method.has_event_listener_argument %}
60 {{hidden_dependency_action(method.name) | indent}} 59 {{hidden_dependency_action(method.name) | indent}}
61 {% endif %} 60 {% endif %}
62 } 61 }
63 {% endfilter %} 62 {% endfilter %}
64 {% endmacro %} 63 {% endmacro %}
65 64
66 65
67 {######################################} 66 {######################################}
68 {% macro event_target_check_security_for_frame() %}
69 {# FIXME: use the existing shouldAllowAccessToFrame check if possible. #}
70 if (DOMWindow* window = impl->toDOMWindow()) {
71 if (!BindingSecurity::shouldAllowAccessToFrame(info.GetIsolate(), window->fr ame(), exceptionState)) {
72 exceptionState.throwIfNeeded();
73 return;
74 }
75 if (!window->document())
76 return;
77 }
78 {% endmacro %}
79
80
81 {######################################}
82 {% macro hidden_dependency_action(method_name) %} 67 {% macro hidden_dependency_action(method_name) %}
83 if (!impl->toNode()) 68 if (listener && !impl->toNode())
84 {% if method_name == 'addEventListener' %} 69 {% if method_name == 'addEventListener' %}
85 addHiddenValueToArray(info.Holder(), info[1], {{v8_class}}::eventListenerCac heIndex, info.GetIsolate()); 70 addHiddenValueToArray(info.Holder(), info[1], {{v8_class}}::eventListenerCac heIndex, info.GetIsolate());
86 {% else %}{# method_name == 'removeEventListener' #} 71 {% else %}{# method_name == 'removeEventListener' #}
87 removeHiddenValueFromArray(info.Holder(), info[1], {{v8_class}}::eventListen erCacheIndex, info.GetIsolate()); 72 removeHiddenValueFromArray(info.Holder(), info[1], {{v8_class}}::eventListen erCacheIndex, info.GetIsolate());
88 {% endif %} 73 {% endif %}
89 {% endmacro %} 74 {% endmacro %}
90 75
91 76
92 {######################################} 77 {######################################}
93 {% macro generate_argument(method, argument, world_suffix) %} 78 {% macro generate_argument(method, argument, world_suffix) %}
94 {% if argument.is_optional and not argument.has_default and 79 {% if argument.is_optional and not argument.has_default and
95 argument.idl_type != 'Dictionary' and 80 argument.idl_type != 'Dictionary' and
96 not argument.is_callback_interface %} 81 not argument.is_callback_interface %}
97 {# Optional arguments without a default value generate an early call with 82 {# Optional arguments without a default value generate an early call with
98 fewer arguments if they are omitted. 83 fewer arguments if they are omitted.
99 Optional Dictionary arguments default to empty dictionary. #} 84 Optional Dictionary arguments default to empty dictionary. #}
100 if (UNLIKELY(info.Length() <= {{argument.index}})) { 85 if (UNLIKELY(info.Length() <= {{argument.index}})) {
101 {% if interface_name == 'EventTarget' %}
102 {# FIXME: can we move this |listener| check into Blink? (see above) #}
103 if (!listener)
104 return;
105 {% endif %}
106 {% if world_suffix %} 86 {% if world_suffix %}
107 {{cpp_method_call(method, argument.v8_set_return_value_for_main_world, argum ent.cpp_value) | indent}} 87 {{cpp_method_call(method, argument.v8_set_return_value_for_main_world, argum ent.cpp_value) | indent}}
108 {% else %} 88 {% else %}
109 {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent}} 89 {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent}}
110 {% endif %} 90 {% endif %}
111 {% if interface_name == 'EventTarget' %} 91 {% if argument.has_event_listener_argument %}
112 {{hidden_dependency_action(method.name) | indent}} 92 {{hidden_dependency_action(method.name) | indent}}
113 {% endif %} 93 {% endif %}
114 return; 94 return;
115 } 95 }
116 {% endif %} 96 {% endif %}
117 {% if method.is_strict_type_checking and argument.is_wrapper_type %} 97 {% if method.is_strict_type_checking and argument.is_wrapper_type %}
118 {# Type checking for wrapper interface types (if interface not implemented, 98 {# Type checking for wrapper interface types (if interface not implemented,
119 throw TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} 99 throw TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
120 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())) { 100 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())) {
121 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' % 101 {{throw_type_error(method, '"parameter %s is not of type \'%s\'."' %
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 {{throw_type_error(method, '"parameter %s (\'%s\') is not an object."' % 173 {{throw_type_error(method, '"parameter %s (\'%s\') is not an object."' %
194 (argument.index + 1, argument.name)) | indent}} 174 (argument.index + 1, argument.name)) | indent}}
195 return; 175 return;
196 } 176 }
197 {% endif %} 177 {% endif %}
198 {% endmacro %} 178 {% endmacro %}
199 179
200 180
201 {######################################} 181 {######################################}
202 {% macro cpp_method_call(method, v8_set_return_value, cpp_value) %} 182 {% macro cpp_method_call(method, v8_set_return_value, cpp_value) %}
183 {# Local variables #}
203 {% if method.is_implemented_by and not method.is_static %} 184 {% if method.is_implemented_by and not method.is_static %}
204 ASSERT(impl); 185 ASSERT(impl);
205 {% endif %} 186 {% endif %}
206 {% if method.is_call_with_script_state %} 187 {% if method.is_call_with_script_state %}
207 ScriptState* currentState = ScriptState::current(); 188 ScriptState* currentState = ScriptState::current();
208 if (!currentState) 189 if (!currentState)
209 return; 190 return;
210 ScriptState& state = *currentState; 191 ScriptState& state = *currentState;
211 {% endif %} 192 {% endif %}
212 {% if method.is_call_with_execution_context %} 193 {% if method.is_call_with_execution_context %}
213 ExecutionContext* scriptContext = currentExecutionContext(info.GetIsolate()); 194 ExecutionContext* scriptContext = currentExecutionContext(info.GetIsolate());
214 {% endif %} 195 {% endif %}
215 {% if method.is_call_with_script_arguments %} 196 {% if method.is_call_with_script_arguments %}
216 RefPtr<ScriptArguments> scriptArguments(createScriptArguments(info, {{method.num ber_of_arguments}})); 197 RefPtr<ScriptArguments> scriptArguments(createScriptArguments(info, {{method.num ber_of_arguments}}));
217 {% endif %} 198 {% endif %}
199 {# Call #}
218 {% if method.idl_type == 'void' %} 200 {% if method.idl_type == 'void' %}
219 {{cpp_value}}; 201 {{cpp_value}};
220 {% elif method.is_call_with_script_state or method.is_raises_exception %} 202 {% elif method.is_call_with_script_state or method.is_raises_exception %}
221 {# FIXME: consider always using a local variable #} 203 {# FIXME: consider always using a local variable #}
222 {{method.cpp_type}} result = {{cpp_value}}; 204 {{method.cpp_type}} result = {{cpp_value}};
223 {% endif %} 205 {% endif %}
206 {# Post-call #}
224 {% if method.is_raises_exception %} 207 {% if method.is_raises_exception %}
225 if (exceptionState.throwIfNeeded()) 208 if (exceptionState.throwIfNeeded())
226 return; 209 return;
227 {% endif %} 210 {% endif %}
228 {% if method.is_call_with_script_state %} 211 {% if method.is_call_with_script_state %}
229 if (state.hadException()) { 212 if (state.hadException()) {
230 v8::Local<v8::Value> exception = state.exception(); 213 v8::Local<v8::Value> exception = state.exception();
231 state.clearException(); 214 state.clearException();
232 throwError(exception, info.GetIsolate()); 215 throwError(exception, info.GetIsolate());
233 return; 216 return;
234 } 217 }
235 {% endif %} 218 {% endif %}
219 {# Set return value #}
236 {% if method.union_arguments %} 220 {% if method.union_arguments %}
237 {{union_type_method_call(method)}} 221 {{union_type_method_call_and_set_return_value(method)}}
238 {% elif v8_set_return_value %}{{v8_set_return_value}};{% endif %}{# None for voi d #} 222 {% elif v8_set_return_value %}{{v8_set_return_value}};{% endif %}{# None for voi d #}
239 {% endmacro %} 223 {% endmacro %}
240 224
225
241 {######################################} 226 {######################################}
242 {% macro union_type_method_call(method) %} 227 {% macro union_type_method_call_and_set_return_value(method) %}
243 {% for cpp_type in method.cpp_type %} 228 {% for cpp_type in method.cpp_type %}
244 bool result{{loop.index0}}Enabled = false; 229 bool result{{loop.index0}}Enabled = false;
245 {{cpp_type}} result{{loop.index0}}; 230 {{cpp_type}} result{{loop.index0}};
246 {% endfor %} 231 {% endfor %}
247 {{method.cpp_value}}; 232 {{method.cpp_value}};
248 {% if method.is_null_expression %}{# used by getters #} 233 {% if method.is_null_expression %}{# used by getters #}
249 if ({{method.is_null_expression}}) 234 if ({{method.is_null_expression}})
250 return; 235 return;
251 {% endif %} 236 {% endif %}
252 {% for v8_set_return_value in method.v8_set_return_value %} 237 {% for v8_set_return_value in method.v8_set_return_value %}
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 v8::Handle<v8::Object> wrapper = info.Holder(); 439 v8::Handle<v8::Object> wrapper = info.Holder();
455 {% if is_constructor_raises_exception %} 440 {% if is_constructor_raises_exception %}
456 if (exceptionState.throwIfNeeded()) 441 if (exceptionState.throwIfNeeded())
457 return; 442 return;
458 {% endif %} 443 {% endif %}
459 444
460 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{v8 _class}}Constructor::wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfigu ration::Dependent); 445 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{v8 _class}}Constructor::wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfigu ration::Dependent);
461 v8SetReturnValue(info, wrapper); 446 v8SetReturnValue(info, wrapper);
462 } 447 }
463 {% endmacro %} 448 {% endmacro %}
OLDNEW
« no previous file with comments | « Source/bindings/templates/interface.cpp ('k') | Source/bindings/tests/results/V8TestObjectPython.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698