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

Side by Side Diff: third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl

Issue 2446213002: [Bindings] [Reformat] Reformat template files (Closed)
Patch Set: Rebase (Split out Callbackfunctions) Created 4 years, 1 month 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 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable, v8_value_t o_local_cpp_value %} 1 {% from 'utilities.cpp.tmpl' import declare_enum_validation_variable, v8_value_t o_local_cpp_value %}
2 2
3 {##############################################################################} 3 {##############################################################################}
4 {% macro generate_method(method, world_suffix) %} 4 {% macro generate_method(method, world_suffix) %}
5 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) 5 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) {
6 {% filter format_remove_duplicates([ 6 {% filter format_remove_duplicates([
7 'ExceptionState exceptionState', 7 'ExceptionState exceptionState',
8 'ScriptState* scriptState = ']) %} 8 'ScriptState* scriptState = ']) %}
9 { 9 {% set define_exception_state -%}
10 {% set define_exception_state -%} 10 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCont ext, "{{interface_name}}", "{{method.name}}");
11 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, "{{interface_name}}", "{{method.name}}"); 11 {%- endset %}
12 {%- endset %}
13 12
14 {% set function_call = func_call_with_prep_of_args(method, world_suffix) %} 13 {% set function_call = func_call_with_prep_of_args(method, world_suffix) %}
15 14
16 {% if 'exceptionState' in function_call %} 15 {% if 'exceptionState' in function_call %}
17 {{define_exception_state}} 16 {{define_exception_state}}
18 {% if method.returns_promise %} 17 {% if method.returns_promise %}
19 ExceptionToRejectPromiseScope rejectPromiseScope(info, exceptionState); 18 ExceptionToRejectPromiseScope rejectPromiseScope(info, exceptionState);
20 {% endif %} 19 {% endif %}
21 {% endif %} 20 {% endif %}
22 21
23 {% if not method.is_static %} 22 {% if not method.is_static %}
24 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 23 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
25 {% endif %} 24 {% endif %}
26 25
27 {# Security checks #} 26 {# Security checks #}
28 {% if method.is_check_security_for_receiver %} 27 {% if method.is_check_security_for_receiver %}
29 {{define_exception_state}} 28 {{define_exception_state}}
30 {% if interface_name == 'EventTarget' %} 29 {% if interface_name == 'EventTarget' %}
31 // Performance hack for EventTarget. Checking whether it's a Window or not 30 // Performance hack for EventTarget. Checking whether it's a Window or not
32 // prior to the call to BindingSecurity::shouldAllowAccessTo increases 30% 31 // prior to the call to BindingSecurity::shouldAllowAccessTo increases 30%
33 // of speed performance on Android Nexus 7 as of Dec 2015. ALWAYS_INLINE 32 // of speed performance on Android Nexus 7 as of Dec 2015. ALWAYS_INLINE
34 // didn't work in this case. 33 // didn't work in this case.
35 if (const DOMWindow* window = impl->toDOMWindow()) { 34 if (const DOMWindow* window = impl->toDOMWindow()) {
36 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsola te()), window, exceptionState)) { 35 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate() ), window, exceptionState)) {
37 return; 36 return;
38 }
39 } 37 }
40 {% else %}{# interface_name == 'EventTarget' #} 38 }
41 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate() ), impl, exceptionState)) { 39 {% else %}{# interface_name == 'EventTarget' #}
42 return; 40 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate()), impl, exceptionState)) {
43 } 41 return;
44 {% endif %}{# interface_name == 'EventTarget' #} 42 }
45 {% endif %} 43 {% endif %}{# interface_name == 'EventTarget' #}
46 {% if method.is_check_security_for_return_value %} 44 {% endif %}
47 {{define_exception_state}} 45 {% if method.is_check_security_for_return_value %}
48 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate() ), {{method.cpp_value}}, exceptionState)) { 46 {{define_exception_state}}
49 v8SetReturnValueNull(info); 47 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate()), {{method.cpp_value}}, exceptionState)) {
50 return; 48 v8SetReturnValueNull(info);
51 } 49 return;
52 {% endif %} 50 }
51 {% endif %}
53 52
54 {% if 'scriptState' in function_call %} 53 {% if 'scriptState' in function_call %}
55 {% if method.is_static %} 54 {% if method.is_static %}
56 ScriptState* scriptState = ScriptState::forFunctionObject(info); 55 ScriptState* scriptState = ScriptState::forFunctionObject(info);
57 {% else %} 56 {% else %}
58 ScriptState* scriptState = ScriptState::forReceiverObject(info); 57 ScriptState* scriptState = ScriptState::forReceiverObject(info);
59 {% endif %} 58 {% endif %}
60 {% endif %} 59 {% endif %}
61 60
62 {% if method.is_custom_element_callbacks %} 61 {% if method.is_custom_element_callbacks %}
63 V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope; 62 V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
64 {% endif %} 63 {% endif %}
65 64
66 {{function_call | indent}} 65 {{function_call | indent(2)}}
67 } 66 }
68 {% endfilter %} 67 {% endfilter %}
69 {% endmacro %} 68 {% endmacro %}
70 69
71 70
72 {######################################} 71 {######################################}
73 {% macro func_call_with_prep_of_args(method, world_suffix) %} 72 {% macro func_call_with_prep_of_args(method, world_suffix) %}
74 {{generate_arguments(method, world_suffix)}} 73 {{generate_arguments(method, world_suffix)}}
75 {% if world_suffix %} 74 {% if world_suffix %}
76 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method.cpp_ value)}} 75 {{cpp_method_call(method, method.v8_set_return_value_for_main_world, method.cpp_ value)}}
77 {% else %} 76 {% else %}
78 {{cpp_method_call(method, method.v8_set_return_value, method.cpp_value)}} 77 {{cpp_method_call(method, method.v8_set_return_value, method.cpp_value)}}
79 {% endif %} 78 {% endif %}
80 {% endmacro %} 79 {% endmacro %}
81 80
82 81
83 {######################################} 82 {######################################}
84 {% macro generate_arguments(method, world_suffix) %} 83 {% macro generate_arguments(method, world_suffix) %}
85 {% if method.arguments %} 84 {% if method.arguments %}
86 85
87 {# Overloaded methods/constructors have length checked during overload resolutio n #} 86 {# Overloaded methods/constructors have length checked during overload resolutio n #}
88 {% if method.number_of_required_arguments and not method.overload_index %} 87 {% if method.number_of_required_arguments and not method.overload_index %}
89 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { 88 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
90 {{throw_type_error(method, 89 {{throw_type_error(method,
91 'ExceptionMessages::notEnoughArguments(%(expected)d, info.Length())' 90 'ExceptionMessages::notEnoughArguments(%(expected)d, info.Length())'
92 | format(expected=method.number_of_required_arguments))}} 91 | format(expected=method.number_of_required_arguments))}}
93 return; 92 return;
94 } 93 }
95 {% endif %} 94 {% endif %}
96 95
97 {% for argument in method.arguments %} 96 {% for argument in method.arguments %}
98 {{argument.cpp_type}} {{argument.name}}; 97 {{argument.cpp_type}} {{argument.name}};
99 {% endfor %} 98 {% endfor %}
100 {% if method.has_optional_argument_without_default_value %} 99 {% if method.has_optional_argument_without_default_value %}
101 {# Count the effective number of arguments. (arg1, arg2, undefined) is 100 {# Count the effective number of arguments. (arg1, arg2, undefined) is
102 interpreted as two arguments are passed and (arg1, undefined, arg3) is 101 interpreted as two arguments are passed and (arg1, undefined, arg3) is
103 interpreted as three arguments are passed. #} 102 interpreted as three arguments are passed. #}
104 int numArgsPassed = info.Length(); 103 int numArgsPassed = info.Length();
105 while (numArgsPassed > 0) { 104 while (numArgsPassed > 0) {
106 if (!info[numArgsPassed - 1]->IsUndefined()) 105 if (!info[numArgsPassed - 1]->IsUndefined())
107 break; 106 break;
108 --numArgsPassed; 107 --numArgsPassed;
109 } 108 }
110 {% endif %} 109 {% endif %}
111 {% for argument in method.arguments %} 110 {% for argument in method.arguments %}
112 {% if argument.set_default_value %} 111 {% if argument.set_default_value %}
113 if (!info[{{argument.index}}]->IsUndefined()) { 112 if (!info[{{argument.index}}]->IsUndefined()) {
114 {{generate_argument(method, argument, world_suffix) | indent}} 113 {{generate_argument(method, argument, world_suffix) | indent(2)}}
115 } else { 114 } else {
116 {{argument.set_default_value | indent}}; 115 {{argument.set_default_value | indent(2)}};
117 } 116 }
118 {% else %} 117 {% else %}
119 {{generate_argument(method, argument, world_suffix)}} 118 {{generate_argument(method, argument, world_suffix)}}
120 {% endif %} 119 {% endif %}
121 {% endfor %} 120 {% endfor %}
122 121
123 {% endif %}{# method.arguments #} 122 {% endif %}{# method.arguments #}
124 {% endmacro %} 123 {% endmacro %}
125 124
126 125
127 {######################################} 126 {######################################}
128 {% macro generate_argument(method, argument, world_suffix) %} 127 {% macro generate_argument(method, argument, world_suffix) %}
129 {% if argument.is_optional_without_default_value %} 128 {% if argument.is_optional_without_default_value %}
130 {# Optional arguments without a default value generate an early call with 129 {# Optional arguments without a default value generate an early call with
131 fewer arguments if they are omitted. 130 fewer arguments if they are omitted.
132 Optional Dictionary arguments default to empty dictionary. #} 131 Optional Dictionary arguments default to empty dictionary. #}
133 if (UNLIKELY(numArgsPassed <= {{argument.index}})) { 132 if (UNLIKELY(numArgsPassed <= {{argument.index}})) {
134 {% if world_suffix %} 133 {% if world_suffix %}
135 {{cpp_method_call(method, argument.v8_set_return_value_for_main_world, argum ent.cpp_value) | indent}} 134 {{cpp_method_call(method, argument.v8_set_return_value_for_main_world, argumen t.cpp_value) | indent(2)}}
136 {% else %} 135 {% else %}
137 {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent}} 136 {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent(2)}}
138 {% endif %} 137 {% endif %}
139 return; 138 return;
140 } 139 }
141 {% endif %} 140 {% endif %}
142 {% if argument.is_callback_interface %} 141 {% if argument.is_callback_interface %}
143 {# FIXME: remove EventListener special case #} 142 {# FIXME: remove EventListener special case #}
144 {% if argument.idl_type == 'EventListener' %} 143 {% if argument.idl_type == 'EventListener' %}
145 {% if method.name == 'removeEventListener' or method.name == 'removeListener' %} 144 {% if method.name == 'removeEventListener' or method.name == 'removeListener' %}
146 {{argument.name}} = V8EventListenerHelper::getEventListener(ScriptState::current (info.GetIsolate()), info[{{argument.index}}], false, ListenerFindOnly); 145 {{argument.name}} = V8EventListenerHelper::getEventListener(ScriptState::current (info.GetIsolate()), info[{{argument.index}}], false, ListenerFindOnly);
147 {% else %}{# method.name == 'addEventListener' #} 146 {% else %}{# method.name == 'addEventListener' #}
148 {{argument.name}} = V8EventListenerHelper::getEventListener(ScriptState::current (info.GetIsolate()), info[{{argument.index}}], false, ListenerFindOrCreate); 147 {{argument.name}} = V8EventListenerHelper::getEventListener(ScriptState::current (info.GetIsolate()), info[{{argument.index}}], false, ListenerFindOrCreate);
149 {% endif %}{# method.name #} 148 {% endif %}{# method.name #}
150 {% else %}{# argument.idl_type == 'EventListener' #} 149 {% else %}{# argument.idl_type == 'EventListener' #}
151 {# Callback functions must be functions: 150 {# Callback functions must be functions:
152 http://www.w3.org/TR/WebIDL/#es-callback-function #} 151 http://www.w3.org/TR/WebIDL/#es-callback-function #}
153 {% if argument.is_optional %} 152 {% if argument.is_optional %}
154 if (!isUndefinedOrNull(info[{{argument.index}}])) { 153 if (!isUndefinedOrNull(info[{{argument.index}}])) {
155 if (!info[{{argument.index}}]->IsFunction()) { 154 if (!info[{{argument.index}}]->IsFunction()) {
156 {{throw_argument_error(method, argument, "The callback provided as param eter %(index)d is not a function.")}} 155 {{throw_argument_error(method, argument, "The callback provided as parameter %(index)d is not a function.")}}
157 return; 156 return;
158 } 157 }
159 {{argument.name}} = V8{{argument.idl_type}}::create(v8::Local<v8::Function>: :Cast(info[{{argument.index}}]), ScriptState::current(info.GetIsolate())); 158 {{argument.name}} = V8{{argument.idl_type}}::create(v8::Local<v8::Function>::C ast(info[{{argument.index}}]), ScriptState::current(info.GetIsolate()));
160 } else { 159 } else {
161 {{argument.name}} = nullptr; 160 {{argument.name}} = nullptr;
162 } 161 }
163 {% else %}{# argument.is_optional #} 162 {% else %}{# argument.is_optional #}
164 if (info.Length() <= {{argument.index}} || !{% if argument.is_nullable %}(info[{ {argument.index}}]->IsFunction() || info[{{argument.index}}]->IsNull()){% else % }info[{{argument.index}}]->IsFunction(){% endif %}) { 163 if (info.Length() <= {{argument.index}} || !{% if argument.is_nullable %}(info[{ {argument.index}}]->IsFunction() || info[{{argument.index}}]->IsNull()){% else % }info[{{argument.index}}]->IsFunction(){% endif %}) {
165 {{throw_argument_error(method, argument, "The callback provided as parameter %(index)d is not a function.")}} 164 {{throw_argument_error(method, argument, "The callback provided as parameter % (index)d is not a function.")}}
166 return; 165 return;
167 } 166 }
168 {{argument.name}} = {% if argument.is_nullable %}info[{{argument.index}}]->IsNul l() ? nullptr : {% endif %}V8{{argument.idl_type}}::create(v8::Local<v8::Functio n>::Cast(info[{{argument.index}}]), ScriptState::current(info.GetIsolate())); 167 {{argument.name}} = {% if argument.is_nullable %}info[{{argument.index}}]->IsNul l() ? nullptr : {% endif %}V8{{argument.idl_type}}::create(v8::Local<v8::Functio n>::Cast(info[{{argument.index}}]), ScriptState::current(info.GetIsolate()));
169 {% endif %}{# argument.is_optional #} 168 {% endif %}{# argument.is_optional #}
170 {% endif %}{# argument.idl_type == 'EventListener' #} 169 {% endif %}{# argument.idl_type == 'EventListener' #}
171 {% elif argument.is_callback_function %} 170 {% elif argument.is_callback_function %}
172 if (!info[{{argument.index}}]->IsFunction(){% if argument.is_nullable %} && !inf o[{{argument.index}}]->IsNull(){% endif %}) { 171 if (!info[{{argument.index}}]->IsFunction(){% if argument.is_nullable %} && !inf o[{{argument.index}}]->IsNull(){% endif %}) {
173 {{throw_argument_error(method, argument, "The callback provided as parameter %(index)d is not a function.")}} 172 {{throw_argument_error(method, argument, "The callback provided as parameter % (index)d is not a function.")}}
174 return; 173 return;
175 } 174 }
176 {{v8_value_to_local_cpp_value(argument)}} 175 {{v8_value_to_local_cpp_value(argument)}}
177 {% elif argument.is_variadic_wrapper_type %} 176 {% elif argument.is_variadic_wrapper_type %}
178 for (int i = {{argument.index}}; i < info.Length(); ++i) { 177 for (int i = {{argument.index}}; i < info.Length(); ++i) {
179 if (!V8{{argument.idl_type}}::hasInstance(info[i], info.GetIsolate())) { 178 if (!V8{{argument.idl_type}}::hasInstance(info[i], info.GetIsolate())) {
180 {{throw_argument_error(method, argument, "parameter %(index)d is not of type '%(type)s'.")}} 179 {{throw_argument_error(method, argument, "parameter %(index)d is not of type '%(type)s'.")}}
181 return; 180 return;
182 } 181 }
183 {{argument.name}}.append(V8{{argument.idl_type}}::toImpl(v8::Local<v8::Objec t>::Cast(info[i]))); 182 {{argument.name}}.append(V8{{argument.idl_type}}::toImpl(v8::Local<v8::Object> ::Cast(info[i])));
184 } 183 }
185 {% elif argument.is_dictionary %} 184 {% elif argument.is_dictionary %}
186 {% if not argument.use_permissive_dictionary_conversion %} 185 {% if not argument.use_permissive_dictionary_conversion %}
187 {# Dictionaries must have type Undefined, Null or Object: 186 {# Dictionaries must have type Undefined, Null or Object:
188 http://heycam.github.io/webidl/#es-dictionary #} 187 http://heycam.github.io/webidl/#es-dictionary #}
189 if (!isUndefinedOrNull(info[{{argument.index}}]) && !info[{{argument.index}}]->I sObject()) { 188 if (!isUndefinedOrNull(info[{{argument.index}}]) && !info[{{argument.index}}]->I sObject()) {
190 {{throw_argument_error(method, argument, "parameter %(index)d ('%(name)s') i s not an object.")}} 189 {{throw_argument_error(method, argument, "parameter %(index)d ('%(name)s') is not an object.")}}
191 return; 190 return;
192 } 191 }
193 {% endif %}{# not argument.use_permissive_dictionary_conversion #} 192 {% endif %}{# not argument.use_permissive_dictionary_conversion #}
194 {{v8_value_to_local_cpp_value(argument)}} 193 {{v8_value_to_local_cpp_value(argument)}}
195 {% elif argument.is_explicit_nullable %} 194 {% elif argument.is_explicit_nullable %}
196 if (!isUndefinedOrNull(info[{{argument.index}}])) { 195 if (!isUndefinedOrNull(info[{{argument.index}}])) {
197 {{v8_value_to_local_cpp_value(argument) | indent}} 196 {{v8_value_to_local_cpp_value(argument) | indent(2)}}
198 } 197 }
199 {% else %}{# argument.is_nullable #} 198 {% else %}{# argument.is_nullable #}
200 {{v8_value_to_local_cpp_value(argument)}} 199 {{v8_value_to_local_cpp_value(argument)}}
201 {% endif %}{# argument.is_nullable #} 200 {% endif %}{# argument.is_nullable #}
202 {# Type checking, possibly throw a TypeError, per: 201 {# Type checking, possibly throw a TypeError, per:
203 http://www.w3.org/TR/WebIDL/#es-type-mapping #} 202 http://www.w3.org/TR/WebIDL/#es-type-mapping #}
204 {% if argument.has_type_checking_interface and not argument.is_variadic_wrapper_ type %} 203 {% if argument.has_type_checking_interface and not argument.is_variadic_wrapper_ type %}
205 {# Type checking for wrapper interface types (if interface not implemented, 204 {# Type checking for wrapper interface types (if interface not implemented,
206 throw a TypeError), per http://www.w3.org/TR/WebIDL/#es-interface 205 throw a TypeError), per http://www.w3.org/TR/WebIDL/#es-interface
207 Note: for variadic arguments, the type checking is done for each matched 206 Note: for variadic arguments, the type checking is done for each matched
208 argument instead; see argument.is_variadic_wrapper_type code-path above. #} 207 argument instead; see argument.is_variadic_wrapper_type code-path above. #}
209 if (!{{argument.name}}{% if argument.is_nullable %} && !isUndefinedOrNull(info[{ {argument.index}}]){% endif %}) { 208 if (!{{argument.name}}{% if argument.is_nullable %} && !isUndefinedOrNull(info[{ {argument.index}}]){% endif %}) {
210 {{throw_argument_error(method, argument, "parameter %(index)d is not of type '%(type)s'.")}} 209 {{throw_argument_error(method, argument, "parameter %(index)d is not of type ' %(type)s'.")}}
211 return; 210 return;
212 } 211 }
213 {% elif argument.enum_values %} 212 {% elif argument.enum_values %}
214 {# Invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #} 213 {# Invalid enum values: http://www.w3.org/TR/WebIDL/#idl-enums #}
215 {% set enum_variable = 'valid' + argument.name[0].upper() + argument.name[1:] + 'Values' %} 214 {% set enum_variable = 'valid' + argument.name[0].upper() + argument.name[1:] + 'Values' %}
216 {{declare_enum_validation_variable(argument.enum_values, enum_variable)}} 215 {{declare_enum_validation_variable(argument.enum_values, enum_variable)}}
217 if (!isValidEnum({{argument.name}}, {{enum_variable}}, WTF_ARRAY_LENGTH({{enum_v ariable}}), "{{argument.enum_type}}", exceptionState)) { 216 if (!isValidEnum({{argument.name}}, {{enum_variable}}, WTF_ARRAY_LENGTH({{enum_v ariable}}), "{{argument.enum_type}}", exceptionState)) {
218 return; 217 return;
219 } 218 }
220 {% elif argument.idl_type == 'Promise' %} 219 {% elif argument.idl_type == 'Promise' %}
221 {# We require this for our implementation of promises, though not in spec: 220 {# We require this for our implementation of promises, though not in spec:
222 http://heycam.github.io/webidl/#es-promise #} 221 http://heycam.github.io/webidl/#es-promise #}
223 if (!{{argument.name}}.isUndefinedOrNull() && !{{argument.name}}.isObject()) { 222 if (!{{argument.name}}.isUndefinedOrNull() && !{{argument.name}}.isObject()) {
224 {{throw_argument_error(method, argument, "parameter %(index)d ('%(name)s') i s not an object.")}} 223 {{throw_argument_error(method, argument, "parameter %(index)d ('%(name)s') is not an object.")}}
225 return; 224 return;
226 } 225 }
227 {% endif %} 226 {% endif %}
228 {% endmacro %} 227 {% endmacro %}
229 228
230 229
231 {######################################} 230 {######################################}
232 {% macro cpp_method_call(method, v8_set_return_value, cpp_value) %} 231 {% macro cpp_method_call(method, v8_set_return_value, cpp_value) %}
233 {% if method.is_custom_call_prologue %} 232 {% if method.is_custom_call_prologue %}
234 {{v8_class}}::{{method.name}}MethodPrologueCustom(info, impl); 233 {{v8_class}}::{{method.name}}MethodPrologueCustom(info, impl);
235 {% endif %} 234 {% endif %}
(...skipping 10 matching lines...) Expand all
246 {% if method.is_call_with_document %} 245 {% if method.is_call_with_document %}
247 {# [ConstructorCallWith=Document] #} 246 {# [ConstructorCallWith=Document] #}
248 Document& document = *toDocument(currentExecutionContext(info.GetIsolate())); 247 Document& document = *toDocument(currentExecutionContext(info.GetIsolate()));
249 {% endif %} 248 {% endif %}
250 {# Call #} 249 {# Call #}
251 {% if method.idl_type == 'void' %} 250 {% if method.idl_type == 'void' %}
252 {{cpp_value}}; 251 {{cpp_value}};
253 {% elif method.is_implemented_in_private_script %} 252 {% elif method.is_implemented_in_private_script %}
254 {{method.cpp_type}} result{{method.cpp_type_initializer}}; 253 {{method.cpp_type}} result{{method.cpp_type_initializer}};
255 if (!{{method.cpp_value}}) 254 if (!{{method.cpp_value}})
256 return; 255 return;
257 {% elif method.use_output_parameter_for_result %} 256 {% elif method.use_output_parameter_for_result %}
258 {{method.cpp_type}} result; 257 {{method.cpp_type}} result;
259 {{cpp_value}}; 258 {{cpp_value}};
260 {% elif method.is_constructor %} 259 {% elif method.is_constructor %}
261 {{method.cpp_type}} impl = {{cpp_value}}; 260 {{method.cpp_type}} impl = {{cpp_value}};
262 {% elif method.use_local_result %} 261 {% elif method.use_local_result %}
263 {{method.cpp_type}} result = {{cpp_value}}; 262 {{method.cpp_type}} result = {{cpp_value}};
264 {% endif %} 263 {% endif %}
265 {# Post-call #} 264 {# Post-call #}
266 {% if method.is_raises_exception %} 265 {% if method.is_raises_exception %}
267 if (exceptionState.hadException()) { 266 if (exceptionState.hadException()) {
268 return; 267 return;
269 } 268 }
270 {% endif %} 269 {% endif %}
271 {# Set return value #} 270 {# Set return value #}
272 {% if method.is_new_object and not method.do_not_test_new_object %} 271 {% if method.is_new_object and not method.do_not_test_new_object %}
273 // [NewObject] must always create a new wrapper. Check that a wrapper 272 // [NewObject] must always create a new wrapper. Check that a wrapper
274 // does not exist yet. 273 // does not exist yet.
275 DCHECK(!result || DOMDataStore::getWrapper(result, info.GetIsolate()).IsEmpty()) ; 274 DCHECK(!result || DOMDataStore::getWrapper(result, info.GetIsolate()).IsEmpty()) ;
276 {% endif %} 275 {% endif %}
277 {% if method.is_constructor %} 276 {% if method.is_constructor %}
278 {{generate_constructor_wrapper(method)}} 277 {{generate_constructor_wrapper(method)}}
279 {%- elif v8_set_return_value %} 278 {%- elif v8_set_return_value %}
280 {% if method.is_explicit_nullable %} 279 {% if method.is_explicit_nullable %}
281 if (result.isNull()) 280 if (result.isNull())
282 v8SetReturnValueNull(info); 281 v8SetReturnValueNull(info);
283 else 282 else
284 {{v8_set_return_value}}; 283 {{v8_set_return_value}};
285 {% else %} 284 {% else %}
286 {{v8_set_return_value}}; 285 {{v8_set_return_value}};
287 {% endif %} 286 {% endif %}
288 {%- endif %}{# None for void #} 287 {%- endif %}{# None for void #}
289 {% if method.is_custom_call_epilogue %} 288 {% if method.is_custom_call_epilogue %}
290 {{v8_class}}::{{method.name}}MethodEpilogueCustom(info, impl); 289 {{v8_class}}::{{method.name}}MethodEpilogueCustom(info, impl);
291 {% endif %} 290 {% endif %}
292 {% endmacro %} 291 {% endmacro %}
293 292
294 293
295 {##############################################################################} 294 {##############################################################################}
296 {% macro throw_type_error(method, error_message) %} 295 {% macro throw_type_error(method, error_message) %}
297 {% if method.has_exception_state or 296 {% if method.has_exception_state or method.returns_promise %}
298 method.returns_promise %}
299 exceptionState.throwTypeError({{error_message}}); 297 exceptionState.throwTypeError({{error_message}});
300 {%- elif method.is_constructor %} 298 {%- elif method.is_constructor %}
301 V8ThrowException::throwTypeError(info.GetIsolate(), ExceptionMessages::failedToC onstruct("{{interface_name}}", {{error_message}})); 299 V8ThrowException::throwTypeError(info.GetIsolate(), ExceptionMessages::failedToC onstruct("{{interface_name}}", {{error_message}}));
302 {%- else %} 300 {%- else %}
303 V8ThrowException::throwTypeError(info.GetIsolate(), ExceptionMessages::failedToE xecute("{{method.name}}", "{{interface_name}}", {{error_message}})); 301 V8ThrowException::throwTypeError(info.GetIsolate(), ExceptionMessages::failedToE xecute("{{method.name}}", "{{interface_name}}", {{error_message}}));
304 {%- endif %} 302 {%- endif %}
305 {% endmacro %} 303 {% endmacro %}
306 304
307 305
308 {##############################################################################} 306 {##############################################################################}
309 {% macro throw_argument_error(method, argument, error_message) %} 307 {% macro throw_argument_error(method, argument, error_message) %}
310 {% set quoted_message = '"%s"' % (error_message | replace('\"', '\\\"')) %} 308 {% set quoted_message = '"%s"' % (error_message | replace('\"', '\\\"')) %}
311 {{throw_type_error(method, quoted_message | format(index=(argument.index + 1), n ame=argument.name, type=argument.idl_type))}} 309 {{throw_type_error(method, quoted_message | format(index=(argument.index + 1), n ame=argument.name, type=argument.idl_type))}}
312 {% endmacro %} 310 {% endmacro %}
313 311
314 312
315 {##############################################################################} 313 {##############################################################################}
316 {% macro runtime_determined_length_method(overloads) %} 314 {% macro runtime_determined_length_method(overloads) %}
317 static int {{overloads.name}}MethodLength() 315 static int {{overloads.name}}MethodLength() {
318 { 316 {% for length, runtime_enabled_functions in overloads.runtime_determined_lengt hs %}
319 {% for length, runtime_enabled_functions in overloads.runtime_determined_len gths %} 317 {% for runtime_enabled_function in runtime_enabled_functions %}
320 {% for runtime_enabled_function in runtime_enabled_functions %} 318 {% filter runtime_enabled(runtime_enabled_function) %}
321 {% filter runtime_enabled(runtime_enabled_function) %} 319 return {{length}};
322 return {{length}}; 320 {% endfilter %}
323 {% endfilter %} 321 {% endfor %}
324 {% endfor %} 322 {% endfor %}
325 {% endfor %}
326 } 323 }
327 {% endmacro %} 324 {% endmacro %}
328 325
329 326
330 {##############################################################################} 327 {##############################################################################}
331 {% macro runtime_determined_maxarg_method(overloads) %} 328 {% macro runtime_determined_maxarg_method(overloads) %}
332 static int {{overloads.name}}MethodMaxArg() 329 static int {{overloads.name}}MethodMaxArg() {
333 { 330 {% for length, runtime_enabled_functions in overloads.runtime_determined_maxar gs %}
334 {% for length, runtime_enabled_functions in overloads.runtime_determined_max args %} 331 {% for runtime_enabled_function in runtime_enabled_functions %}
335 {% for runtime_enabled_function in runtime_enabled_functions %} 332 {% filter runtime_enabled(runtime_enabled_function) %}
336 {% filter runtime_enabled(runtime_enabled_function) %} 333 return {{length}};
337 return {{length}}; 334 {% endfilter %}
338 {% endfilter %} 335 {% endfor %}
339 {% endfor %} 336 {% endfor %}
340 {% endfor %}
341 } 337 }
342 {% endmacro %} 338 {% endmacro %}
343 339
344 340
345 {##############################################################################} 341 {##############################################################################}
346 {% macro overload_resolution_method(overloads, world_suffix) %} 342 {% macro overload_resolution_method(overloads, world_suffix) %}
347 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) 343 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) {
348 { 344 {% set fall_through_to_partial_overloads = not is_partial and overloads.has_pa rtial_overloads %}
349 {% set fall_through_to_partial_overloads = 345
350 not is_partial and overloads.has_partial_overloads %} 346 {% if overloads.measure_all_as %}
351 347 UseCounter::countIfNotPrivateScript(info.GetIsolate(), currentExecutionContext (info.GetIsolate()), UseCounter::{{overloads.measure_all_as}});
352 {% if overloads.measure_all_as %} 348 {% endif %}
353 UseCounter::countIfNotPrivateScript(info.GetIsolate(), currentExecutionConte xt(info.GetIsolate()), UseCounter::{{overloads.measure_all_as}}); 349 {% if overloads.deprecate_all_as %}
354 {% endif %} 350 Deprecation::countDeprecationIfNotPrivateScript(info.GetIsolate(), currentExec utionContext(info.GetIsolate()), UseCounter::{{overloads.deprecate_all_as}});
355 {% if overloads.deprecate_all_as %} 351 {% endif %}
356 Deprecation::countDeprecationIfNotPrivateScript(info.GetIsolate(), currentEx ecutionContext(info.GetIsolate()), UseCounter::{{overloads.deprecate_all_as}}); 352
357 {% endif %} 353 {# First resolve by length #}
358 354 {% if not fall_through_to_partial_overloads %}
359 {# First resolve by length #} 355 bool isArityError = false;
360 {% if not fall_through_to_partial_overloads %} 356 {% endif %}
361 bool isArityError = false; 357 {# 2. Initialize argcount to be min(maxarg, n). #}
362 {% endif %} 358 switch (std::min({{overloads.maxarg}}, info.Length())) {
363 {# 2. Initialize argcount to be min(maxarg, n). #}
364 switch (std::min({{overloads.maxarg}}, info.Length())) {
365 {# 3. Remove from S all entries whose type list is not of length argcount. # } 359 {# 3. Remove from S all entries whose type list is not of length argcount. # }
366 {% for length, tests_methods in overloads.length_tests_methods %} 360 {% for length, tests_methods in overloads.length_tests_methods %}
367 {# 10. If i = d, then: #} 361 {# 10. If i = d, then: #}
368 case {{length}}: 362 case {{length}}:
369 {# Then resolve by testing argument #} 363 {# Then resolve by testing argument #}
370 {% for test, method in tests_methods %} 364 {% for test, method in tests_methods %}
371 {% if method.visible %} 365 {% if method.visible %}
372 {% filter runtime_enabled(not overloads.runtime_enabled_function_all and 366 {% filter runtime_enabled(not overloads.runtime_enabled_function_all and
373 method.runtime_enabled_function) %} 367 method.runtime_enabled_function) %}
374 if ({{test}}) { 368 if ({{test}}) {
375 {% if method.measure_as and not overloads.measure_all_as %} 369 {% if method.measure_as and not overloads.measure_all_as %}
376 UseCounter::countIfNotPrivateScript(info.GetIsolate(), currentExecut ionContext(info.GetIsolate()), UseCounter::{{method.measure_as('Method')}}); 370 UseCounter::countIfNotPrivateScript(info.GetIsolate(), currentExecutionC ontext(info.GetIsolate()), UseCounter::{{method.measure_as('Method')}});
377 {% endif %}
378 {% if method.deprecate_as and not overloads.deprecate_all_as %}
379 Deprecation::countDeprecationIfNotPrivateScript(info.GetIsolate(), c urrentExecutionContext(info.GetIsolate()), UseCounter::{{method.deprecate_as}});
380 {% endif %}
381 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info) ;
382 return;
383 }
384 {% endfilter %}
385 {% endif %} 371 {% endif %}
386 {% endfor %} 372 {% if method.deprecate_as and not overloads.deprecate_all_as %}
387 break; 373 Deprecation::countDeprecationIfNotPrivateScript(info.GetIsolate(), curre ntExecutionContext(info.GetIsolate()), UseCounter::{{method.deprecate_as}});
388 {% endfor %} 374 {% endif %}
375 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info);
376 return;
377 }
378 {% endfilter %}
379 {% endif %}
380 {% endfor %}
381 break;
382 {% endfor %}{# length, tests_methods #}
389 {% if not fall_through_to_partial_overloads %} 383 {% if not fall_through_to_partial_overloads %}
390 default: 384 default:
391 {# 4. If S is empty, then throw a TypeError. #} 385 {# 4. If S is empty, then throw a TypeError. #}
392 isArityError = true; 386 isArityError = true;
393 {% endif %} 387 {% endif %}
394 } 388 }
395 389
396 {% if fall_through_to_partial_overloads %} 390 {% if fall_through_to_partial_overloads %}
397 391
398 DCHECK({{overloads.name}}MethodForPartialInterface); 392 DCHECK({{overloads.name}}MethodForPartialInterface);
399 ({{overloads.name}}MethodForPartialInterface)(info); 393 ({{overloads.name}}MethodForPartialInterface)(info);
400 394
401 {% else %}{# fall_through_to_partial_overloads #} 395 {% else %}{# fall_through_to_partial_overloads #}
402 396
403 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, "{{interface_name}}", "{{overloads.name}}"); 397 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCont ext, "{{interface_name}}", "{{overloads.name}}");
404 {% if overloads.returns_promise_all %} 398 {% if overloads.returns_promise_all %}
405 ExceptionToRejectPromiseScope rejectPromiseScope(info, exceptionState); 399 ExceptionToRejectPromiseScope rejectPromiseScope(info, exceptionState);
406 {% endif %} 400 {% endif %}
407 401
408 if (isArityError) { 402 if (isArityError) {
409 {% if overloads.length != 0 %} 403 {% if overloads.length != 0 %}
410 if (info.Length() < {{overloads.length}}) { 404 if (info.Length() < {{overloads.length}}) {
411 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments( {{overloads.length}}, info.Length())); 405 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{over loads.length}}, info.Length()));
412 return; 406 return;
413 }
414 {% endif %}
415 {% if overloads.valid_arities %}
416 if (info.Length() >= {{overloads.length}}) {
417 exceptionState.throwTypeError(ExceptionMessages::invalidArity("{{ove rloads.valid_arities}}", info.Length()));
418 return;
419 }
420 {% endif %}
421 }
422 exceptionState.throwTypeError("No function was found that matched the signat ure provided.");
423
424 {% endif %}{# fall_through_to_partial_overloads #}
425 }
426 {% endmacro %}
427
428
429 {##############################################################################}
430 {% macro generate_post_message_impl(method) %}
431 static void postMessageImpl(const char* interfaceName, {{cpp_class}}* instance, const v8::FunctionCallbackInfo<v8::Value>& info)
432 {
433 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, interfaceName, "postMessage");
434 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
435 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{me thod.number_of_required_arguments}}, info.Length()));
436 return;
437 }
438
439 Transferables transferables;
440 if (info.Length() > 1) {
441 const int transferablesArgIndex = 1;
442 if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info [transferablesArgIndex], transferablesArgIndex, transferables, exceptionState)) {
443 return;
444 }
445 }
446
447 RefPtr<SerializedScriptValue> message;
448 if (instance->canTransferArrayBuffer()) {
449 // This instance supports sending array buffers by move semantics.
450 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], & transferables, nullptr, exceptionState);
451 if (exceptionState.hadException())
452 return;
453 } else {
454 // This instance doesn't support sending array buffers by move
455 // semantics. Emulate it by copy-and-neuter semantics that sends array
456 // buffers by copy semantics and then neuters the original array
457 // buffers.
458
459 // Clear references to array buffers from transferables so that the
460 // serializer can consider the array buffers as non-transferable and
461 // copy them into the message.
462 ArrayBufferArray transferableArrayBuffers = transferables.arrayBuffers;
463 transferables.arrayBuffers.clear();
464 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], & transferables, nullptr, exceptionState);
465 if (exceptionState.hadException())
466 return;
467
468 // Neuter the original array buffers on the sender context.
469 SerializedScriptValue::transferArrayBufferContents(info.GetIsolate(), tr ansferableArrayBuffers, exceptionState);
470 if (exceptionState.hadException())
471 return;
472 }
473
474 // FIXME: Only pass context/exceptionState if instance really requires it.
475 ExecutionContext* context = currentExecutionContext(info.GetIsolate());
476 instance->postMessage(context, message.release(), transferables.messagePorts , exceptionState);
477 }
478 {% endmacro %}
479
480
481 {##############################################################################}
482 {% macro method_callback(method, world_suffix) %}
483 void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInf o<v8::Value>& info)
484 {
485 {% if not method.overloads %}{# Overloaded methods are measured in overload_ resolution_method() #}
486 {% if method.measure_as %}
487 UseCounter::countIfNotPrivateScript(info.GetIsolate(), currentExecutionConte xt(info.GetIsolate()), UseCounter::{{method.measure_as('Method')}});
488 {% endif %}
489 {% if method.deprecate_as %}
490 Deprecation::countDeprecationIfNotPrivateScript(info.GetIsolate(), currentEx ecutionContext(info.GetIsolate()), UseCounter::{{method.deprecate_as}});
491 {% endif %}
492 {% endif %}{# not method.overloads #}
493 {% if world_suffix in method.activity_logging_world_list %}
494 {% if method.is_static %}
495 ScriptState* scriptState = ScriptState::forFunctionObject(info);
496 {% else %}
497 ScriptState* scriptState = ScriptState::forReceiverObject(info);
498 {% endif %}
499 V8PerContextData* contextData = scriptState->perContextData();
500 if (contextData && contextData->activityLogger()) {
501 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::Executi onContext, "{{interface_name}}", "{{method.name}}");
502 Vector<v8::Local<v8::Value>> loggerArgs = toImplArguments<Vector<v8::Loc al<v8::Value>>>(info, 0, exceptionState);
503 contextData->activityLogger()->logMethod("{{interface_name}}.{{method.na me}}", info.Length(), loggerArgs.data());
504 } 407 }
505 {% endif %} 408 {% endif %}
506 {% if method.is_ce_reactions %} 409 {% if overloads.valid_arities %}
507 CEReactionsScope ceReactionsScope; 410 if (info.Length() >= {{overloads.length}}) {
411 exceptionState.throwTypeError(ExceptionMessages::invalidArity("{{overloads .valid_arities}}", info.Length()));
412 return;
413 }
508 {% endif %} 414 {% endif %}
509 {% if method.is_custom %} 415 }
510 {{v8_class}}::{{method.name}}MethodCustom(info); 416 exceptionState.throwTypeError("No function was found that matched the signatur e provided.");
511 {% elif method.is_post_message %} 417
512 postMessageImpl("{{interface_name}}", {{v8_class}}::toImpl(info.Holder()), i nfo); 418 {% endif %}{# fall_through_to_partial_overloads #}
513 {% else %} 419 }
514 {{cpp_class_or_partial}}V8Internal::{{method.name}}Method{{world_suffix}}(in fo); 420 {% endmacro %}
515 {% endif %} 421
422
423 {##############################################################################}
424 {% macro generate_post_message_impl(method) %}
425 static void postMessageImpl(const char* interfaceName, {{cpp_class}}* instance, const v8::FunctionCallbackInfo<v8::Value>& info) {
426 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCont ext, interfaceName, "postMessage");
427 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
428 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{method .number_of_required_arguments}}, info.Length()));
429 return;
430 }
431
432 Transferables transferables;
433 if (info.Length() > 1) {
434 const int transferablesArgIndex = 1;
435 if (!SerializedScriptValue::extractTransferables(info.GetIsolate(), info[tra nsferablesArgIndex], transferablesArgIndex, transferables, exceptionState)) {
436 return;
437 }
438 }
439
440 RefPtr<SerializedScriptValue> message;
441 if (instance->canTransferArrayBuffer()) {
442 // This instance supports sending array buffers by move semantics.
443 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], &tran sferables, nullptr, exceptionState);
444 if (exceptionState.hadException())
445 return;
446 } else {
447 // This instance doesn't support sending array buffers by move
448 // semantics. Emulate it by copy-and-neuter semantics that sends array
449 // buffers by copy semantics and then neuters the original array
450 // buffers.
451
452 // Clear references to array buffers from transferables so that the
453 // serializer can consider the array buffers as non-transferable and
454 // copy them into the message.
455 ArrayBufferArray transferableArrayBuffers = transferables.arrayBuffers;
456 transferables.arrayBuffers.clear();
457 message = SerializedScriptValue::serialize(info.GetIsolate(), info[0], &tran sferables, nullptr, exceptionState);
458 if (exceptionState.hadException())
459 return;
460
461 // Neuter the original array buffers on the sender context.
462 SerializedScriptValue::transferArrayBufferContents(info.GetIsolate(), transf erableArrayBuffers, exceptionState);
463 if (exceptionState.hadException())
464 return;
465 }
466
467 // FIXME: Only pass context/exceptionState if instance really requires it.
468 ExecutionContext* context = currentExecutionContext(info.GetIsolate());
469 instance->postMessage(context, message.release(), transferables.messagePorts, exceptionState);
470 }
471 {% endmacro %}
472
473
474 {##############################################################################}
475 {% macro method_callback(method, world_suffix) %}
476 void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInf o<v8::Value>& info) {
477 {% if not method.overloads %}{# Overloaded methods are measured in overload_re solution_method() #}
478 {% if method.measure_as %}
479 UseCounter::countIfNotPrivateScript(info.GetIsolate(), currentExecutionContext (info.GetIsolate()), UseCounter::{{method.measure_as('Method')}});
480 {% endif %}
481 {% if method.deprecate_as %}
482 Deprecation::countDeprecationIfNotPrivateScript(info.GetIsolate(), currentExec utionContext(info.GetIsolate()), UseCounter::{{method.deprecate_as}});
483 {% endif %}
484 {% endif %}{# not method.overloads #}
485 {% if world_suffix in method.activity_logging_world_list %}
486 {% if method.is_static %}
487 ScriptState* scriptState = ScriptState::forFunctionObject(info);
488 {% else %}
489 ScriptState* scriptState = ScriptState::forReceiverObject(info);
490 {% endif %}
491 V8PerContextData* contextData = scriptState->perContextData();
492 if (contextData && contextData->activityLogger()) {
493 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ExecutionCo ntext, "{{interface_name}}", "{{method.name}}");
494 Vector<v8::Local<v8::Value>> loggerArgs = toImplArguments<Vector<v8::Local<v 8::Value>>>(info, 0, exceptionState);
495 contextData->activityLogger()->logMethod("{{interface_name}}.{{method.name}} ", info.Length(), loggerArgs.data());
496 }
497 {% endif %}
498 {% if method.is_ce_reactions %}
499 CEReactionsScope ceReactionsScope;
500 {% endif %}
501 {% if method.is_custom %}
502 {{v8_class}}::{{method.name}}MethodCustom(info);
503 {% elif method.is_post_message %}
504 postMessageImpl("{{interface_name}}", {{v8_class}}::toImpl(info.Holder()), inf o);
505 {% else %}
506 {{cpp_class_or_partial}}V8Internal::{{method.name}}Method{{world_suffix}}(info );
507 {% endif %}
516 } 508 }
517 {% endmacro %} 509 {% endmacro %}
518 510
519 511
520 {##############################################################################} 512 {##############################################################################}
521 {% macro origin_safe_method_getter(method, world_suffix) %} 513 {% macro origin_safe_method_getter(method, world_suffix) %}
522 static void {{method.name}}OriginSafeMethodGetter{{world_suffix}}(const v8::Prop ertyCallbackInfo<v8::Value>& info) 514 static void {{method.name}}OriginSafeMethodGetter{{world_suffix}}(const v8::Prop ertyCallbackInfo<v8::Value>& info) {
523 { 515 static int domTemplateKey; // This address is used for a key to look up the do m template.
524 static int domTemplateKey; // This address is used for a key to look up the dom template. 516 V8PerIsolateData* data = V8PerIsolateData::from(info.GetIsolate());
525 V8PerIsolateData* data = V8PerIsolateData::from(info.GetIsolate()); 517 const DOMWrapperWorld& world = DOMWrapperWorld::world(info.GetIsolate()->GetCu rrentContext());
526 const DOMWrapperWorld& world = DOMWrapperWorld::world(info.GetIsolate()->Get CurrentContext()); 518 v8::Local<v8::FunctionTemplate> interfaceTemplate = data->findInterfaceTemplat e(world, &{{v8_class}}::wrapperTypeInfo);
527 v8::Local<v8::FunctionTemplate> interfaceTemplate = data->findInterfaceTempl ate(world, &{{v8_class}}::wrapperTypeInfo); 519 v8::Local<v8::Signature> signature = v8::Signature::New(info.GetIsolate(), int erfaceTemplate);
528 v8::Local<v8::Signature> signature = v8::Signature::New(info.GetIsolate(), i nterfaceTemplate); 520
529 521 v8::Local<v8::FunctionTemplate> methodTemplate = data->findOrCreateOperationTe mplate(world, &domTemplateKey, {{cpp_class}}V8Internal::{{method.name}}MethodCal lback{{world_suffix}}, v8Undefined(), signature, {{method.length}});
530 v8::Local<v8::FunctionTemplate> methodTemplate = data->findOrCreateOperation Template(world, &domTemplateKey, {{cpp_class}}V8Internal::{{method.name}}MethodC allback{{world_suffix}}, v8Undefined(), signature, {{method.length}}); 522 // Return the function by default, unless the user script has overwritten it.
531 // Return the function by default, unless the user script has overwritten it . 523 v8SetReturnValue(info, methodTemplate->GetFunction(info.GetIsolate()->GetCurre ntContext()).ToLocalChecked());
532 v8SetReturnValue(info, methodTemplate->GetFunction(info.GetIsolate()->GetCur rentContext()).ToLocalChecked()); 524
533 525 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
534 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 526 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate()), impl, BindingSecurity::ErrorReportOption::DoNotReport)) {
535 if (!BindingSecurity::shouldAllowAccessTo(currentDOMWindow(info.GetIsolate() ), impl, BindingSecurity::ErrorReportOption::DoNotReport)) { 527 return;
536 return; 528 }
537 } 529
538 530 v8::Local<v8::Value> hiddenValue = V8HiddenValue::getHiddenValue(ScriptState:: current(info.GetIsolate()), v8::Local<v8::Object>::Cast(info.Holder()), v8Atomic String(info.GetIsolate(), "{{method.name}}"));
539 v8::Local<v8::Value> hiddenValue = V8HiddenValue::getHiddenValue(ScriptState ::current(info.GetIsolate()), v8::Local<v8::Object>::Cast(info.Holder()), v8Atom icString(info.GetIsolate(), "{{method.name}}")); 531 if (!hiddenValue.IsEmpty()) {
540 if (!hiddenValue.IsEmpty()) { 532 v8SetReturnValue(info, hiddenValue);
541 v8SetReturnValue(info, hiddenValue); 533 }
542 } 534 }
543 } 535
544 536 void {{method.name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8: :Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
545 void {{method.name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8: :Name>, const v8::PropertyCallbackInfo<v8::Value>& info) 537 {{cpp_class}}V8Internal::{{method.name}}OriginSafeMethodGetter{{world_suffix}} (info);
546 {
547 {{cpp_class}}V8Internal::{{method.name}}OriginSafeMethodGetter{{world_suffix }}(info);
548 } 538 }
549 {% endmacro %} 539 {% endmacro %}
550 540
551 541
552 {##############################################################################} 542 {##############################################################################}
553 {% macro method_implemented_in_private_script(method) %} 543 {% macro method_implemented_in_private_script(method) %}
554 bool {{v8_class}}::PrivateScript::{{method.name}}Method({{method.argument_declar ations_for_private_script | join(', ')}}) 544 bool {{v8_class}}::PrivateScript::{{method.name}}Method({{method.argument_declar ations_for_private_script | join(', ')}}) {
555 { 545 if (!frame)
556 if (!frame) 546 return false;
557 return false; 547 v8::HandleScope handleScope(toIsolate(frame));
558 v8::HandleScope handleScope(toIsolate(frame)); 548 ScriptForbiddenScope::AllowUserAgentScript script;
559 ScriptForbiddenScope::AllowUserAgentScript script; 549 ScriptState* scriptState = ScriptState::forWorld(frame, DOMWrapperWorld::priva teScriptIsolatedWorld());
560 ScriptState* scriptState = ScriptState::forWorld(frame, DOMWrapperWorld::pri vateScriptIsolatedWorld()); 550 if (!scriptState)
561 if (!scriptState) 551 return false;
562 return false; 552 ScriptState* scriptStateInUserScript = ScriptState::forMainWorld(frame);
563 ScriptState* scriptStateInUserScript = ScriptState::forMainWorld(frame); 553 if (!scriptStateInUserScript)
564 if (!scriptStateInUserScript) 554 return false;
565 return false; 555
566 556 ScriptState::Scope scope(scriptState);
567 ScriptState::Scope scope(scriptState); 557 v8::Local<v8::Value> holder = toV8(holderImpl, scriptState->context()->Global( ), scriptState->isolate());
568 v8::Local<v8::Value> holder = toV8(holderImpl, scriptState->context()->Globa l(), scriptState->isolate()); 558 {% for argument in method.arguments %}
569 {% for argument in method.arguments %} 559 v8::Local<v8::Value> {{argument.handle}} = {{argument.private_script_cpp_value _to_v8_value}};
570 v8::Local<v8::Value> {{argument.handle}} = {{argument.private_script_cpp_val ue_to_v8_value}}; 560 {% endfor %}
571 {% endfor %} 561 {% if method.arguments %}
572 {% if method.arguments %} 562 v8::Local<v8::Value> argv[] = { {{method.arguments | join(', ', 'handle')}} };
573 v8::Local<v8::Value> argv[] = { {{method.arguments | join(', ', 'handle')}} }; 563 {% else %}
574 {% else %} 564 {# Empty array initializers are illegal, and don\t compile in MSVC. #}
575 {# Empty array initializers are illegal, and don\t compile in MSVC. #} 565 v8::Local<v8::Value> *argv = 0;
576 v8::Local<v8::Value> *argv = 0; 566 {% endif %}
577 {% endif %} 567 ExceptionState exceptionState(scriptState->isolate(), ExceptionState::Executio nContext, "{{cpp_class}}", "{{method.name}}");
578 ExceptionState exceptionState(scriptState->isolate(), ExceptionState::Execut ionContext, "{{cpp_class}}", "{{method.name}}"); 568 v8::Local<v8::Value> v8Value = PrivateScriptRunner::runDOMMethod(scriptState, scriptStateInUserScript, "{{cpp_class}}", "{{method.name}}", holder, {{method.ar guments | length}}, argv);
579 v8::Local<v8::Value> v8Value = PrivateScriptRunner::runDOMMethod(scriptState , scriptStateInUserScript, "{{cpp_class}}", "{{method.name}}", holder, {{method. arguments | length}}, argv); 569 if (v8Value.IsEmpty())
580 if (v8Value.IsEmpty()) 570 return false;
581 return false; 571 {% if method.idl_type != 'void' %}
582 {% if method.idl_type != 'void' %} 572 {{v8_value_to_local_cpp_value(method.private_script_v8_value_to_local_cpp_valu e) | indent(2)}}
583 {{v8_value_to_local_cpp_value(method.private_script_v8_value_to_local_cpp_va lue) | indent}} 573 *result = cppValue;
584 *result = cppValue; 574 {% endif %}
585 {% endif %} 575 CHECK(!exceptionState.hadException());
586 CHECK(!exceptionState.hadException()); 576 return true;
587 return true; 577 }
588 } 578 {% endmacro %}
589 {% endmacro %} 579
590
591 580
592 {##############################################################################} 581 {##############################################################################}
593 {% macro generate_constructor(constructor) %} 582 {% macro generate_constructor(constructor) %}
594 {% set name = '%sConstructorCallback' % v8_class 583 {% set name = '%sConstructorCallback' % v8_class
595 if constructor.is_named_constructor else 584 if constructor.is_named_constructor else
596 'constructor%s' % (constructor.overload_index or '') %} 585 'constructor%s' % (constructor.overload_index or '') %}
597 static void {{name}}(const v8::FunctionCallbackInfo<v8::Value>& info) 586 static void {{name}}(const v8::FunctionCallbackInfo<v8::Value>& info) {
598 { 587 {% set function_call = func_call_with_prep_of_args(constructor) %}
599 {% set function_call = func_call_with_prep_of_args(constructor) %}
600 588
601 {% if constructor.is_named_constructor %} 589 {% if constructor.is_named_constructor %}
602 if (!info.IsConstructCall()) { 590 if (!info.IsConstructCall()) {
603 V8ThrowException::throwTypeError(info.GetIsolate(), ExceptionMessages::c onstructorNotCallableAsFunction("{{constructor.name}}")); 591 V8ThrowException::throwTypeError(info.GetIsolate(), ExceptionMessages::const ructorNotCallableAsFunction("{{constructor.name}}"));
604 return; 592 return;
605 } 593 }
606 594
607 if (ConstructorMode::current(info.GetIsolate()) == ConstructorMode::WrapExis tingObject) { 595 if (ConstructorMode::current(info.GetIsolate()) == ConstructorMode::WrapExisti ngObject) {
608 v8SetReturnValue(info, info.Holder()); 596 v8SetReturnValue(info, info.Holder());
609 return; 597 return;
610 } 598 }
611 {% endif %} 599 {% endif %}
612 600
613 {% if 'exceptionState' in function_call %} 601 {% if 'exceptionState' in function_call %}
614 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::Constructio nContext, "{{interface_name}}"); 602 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::ConstructionC ontext, "{{interface_name}}");
615 {% endif %} 603 {% endif %}
616 {% if 'scriptState' in function_call %} 604 {% if 'scriptState' in function_call %}
617 ScriptState* scriptState = ScriptState::forReceiverObject(info); 605 ScriptState* scriptState = ScriptState::forReceiverObject(info);
618 {% endif %} 606 {% endif %}
619 607
620 {{function_call | indent}} 608 {{function_call | indent(2)}}
621 } 609 }
622 {% endmacro %} 610 {% endmacro %}
623 611
624 612
625 {##############################################################################} 613 {##############################################################################}
626 {% macro generate_constructor_wrapper(constructor) %} 614 {% macro generate_constructor_wrapper(constructor) %}
627 {% set constructor_class = v8_class + ('Constructor' 615 {% set constructor_class = v8_class + ('Constructor'
628 if constructor.is_named_constructor else 616 if constructor.is_named_constructor else
629 '') %} 617 '') %}
630 v8::Local<v8::Object> wrapper = info.Holder(); 618 v8::Local<v8::Object> wrapper = info.Holder();
(...skipping 24 matching lines...) Expand all
655 V8DOMConfiguration::installMethod(isolate, world, {{instance_template}}, {{proto type_template}}, {{interface_template}}, {{signature}}, {{method.name}}MethodCon figuration); 643 V8DOMConfiguration::installMethod(isolate, world, {{instance_template}}, {{proto type_template}}, {{interface_template}}, {{signature}}, {{method.name}}MethodCon figuration);
656 {%- endmacro %} 644 {%- endmacro %}
657 645
658 646
659 {######################################} 647 {######################################}
660 {% macro install_conditionally_enabled_methods() %} 648 {% macro install_conditionally_enabled_methods() %}
661 {% if methods | conditionally_exposed(is_partial) %} 649 {% if methods | conditionally_exposed(is_partial) %}
662 {# Define operations with limited exposure #} 650 {# Define operations with limited exposure #}
663 v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTempla te); 651 v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTempla te);
664 ExecutionContext* executionContext = toExecutionContext(prototypeObject->Creatio nContext()); 652 ExecutionContext* executionContext = toExecutionContext(prototypeObject->Creatio nContext());
665 ASSERT(executionContext); 653 DCHECK(executionContext);
666 {% for method in methods | conditionally_exposed(is_partial) %} 654 {% for method in methods | conditionally_exposed(is_partial) %}
667 {% filter secure_context(method.overloads.secure_context_test_all 655 {% filter secure_context(method.overloads.secure_context_test_all
668 if method.overloads else 656 if method.overloads else
669 method.secure_context_test) %} 657 method.secure_context_test) %}
670 {% filter exposed(method.overloads.exposed_test_all 658 {% filter exposed(method.overloads.exposed_test_all
671 if method.overloads else 659 if method.overloads else
672 method.exposed_test) %} 660 method.exposed_test) %}
673 {% filter runtime_enabled(method.overloads.runtime_enabled_function_all 661 {% filter runtime_enabled(method.overloads.runtime_enabled_function_all
674 if method.overloads else 662 if method.overloads else
675 method.runtime_enabled_function) %} 663 method.runtime_enabled_function) %}
676 const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfiguration = {{method_configuration(method)}}; 664 const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfiguration = {{method_configuration(method)}};
677 V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), proto typeObject, interfaceObject, signature, {{method.name}}MethodConfiguration); 665 V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), proto typeObject, interfaceObject, signature, {{method.name}}MethodConfiguration);
678 {% endfilter %}{# runtime_enabled() #} 666 {% endfilter %}{# runtime_enabled() #}
679 {% endfilter %}{# exposed() #} 667 {% endfilter %}{# exposed() #}
680 {% endfilter %}{# secure_context() #} 668 {% endfilter %}{# secure_context() #}
681 {% endfor %} 669 {% endfor %}
682 {% endif %} 670 {% endif %}
683 {%- endmacro %} 671 {%- endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698