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

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

Issue 2321073002: binding: Let indexed interceptor falls through to named interceptor. (Closed)
Patch Set: . Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 {% extends 'interface_base.cpp' %} 1 {% extends 'interface_base.cpp' %}
2 2
3 {% set has_prepare_prototype_and_interface_object = 3 {% set has_prepare_prototype_and_interface_object =
4 unscopeables or has_conditional_attributes_on_prototype or 4 unscopeables or has_conditional_attributes_on_prototype or
5 methods | conditionally_exposed(is_partial) %} 5 methods | conditionally_exposed(is_partial) %}
6 {% set prepare_prototype_and_interface_object_func = 6 {% set prepare_prototype_and_interface_object_func =
7 '%s::preparePrototypeAndInterfaceObject' % v8_class 7 '%s::preparePrototypeAndInterfaceObject' % v8_class
8 if has_prepare_prototype_and_interface_object 8 if has_prepare_prototype_and_interface_object
9 else 'nullptr' %} 9 else 'nullptr' %}
10 10
11 11
12 {##############################################################################} 12 {##############################################################################}
13 {% block indexed_property_getter %} 13 {% block indexed_property_getter %}
14 {% if indexed_property_getter and not indexed_property_getter.is_custom %} 14 {% if indexed_property_getter and not indexed_property_getter.is_custom %}
15 {% set getter = indexed_property_getter %} 15 {% set getter = indexed_property_getter %}
16 static void indexedPropertyGetter(uint32_t index, const v8::PropertyCallbackInfo <v8::Value>& info) 16 static void indexedPropertyGetter(uint32_t index, const v8::PropertyCallbackInfo <v8::Value>& info)
17 { 17 {
18 {% if getter.is_raises_exception %}
19 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::IndexedGett erContext, "{{interface_name}}");
20 {% endif %}
21
18 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 22 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
19 {% if getter.is_raises_exception %} 23
20 ExceptionState exceptionState(ExceptionState::IndexedGetterContext, "{{inter face_name}}", info.Holder(), info.GetIsolate());
21 {% endif %}
22 {% set getter_name = getter.name or 'anonymousIndexedGetter' %} 24 {% set getter_name = getter.name or 'anonymousIndexedGetter' %}
23 {% set getter_arguments = ['index'] %} 25 {% set getter_arguments = ['index'] %}
24 {% if getter.is_call_with_script_state %} 26 {% if getter.is_call_with_script_state %}
25 ScriptState* scriptState = ScriptState::current(info.GetIsolate()); 27 ScriptState* scriptState = ScriptState::forReceiverObject(info);
26 {% set getter_arguments = ['scriptState'] + getter_arguments %} 28 {% set getter_arguments = ['scriptState'] + getter_arguments %}
27 {% endif %} 29 {% endif %}
28 {% if getter.is_raises_exception %} 30 {% if getter.is_raises_exception %}
29 {% set getter_arguments = getter_arguments + ['exceptionState'] %} 31 {% set getter_arguments = getter_arguments + ['exceptionState'] %}
30 {% endif %} 32 {% endif %}
31 {{getter.cpp_type}} result = impl->{{getter_name}}({{getter_arguments | join (', ')}}); 33 {{getter.cpp_type}} result = impl->{{getter_name}}({{getter_arguments | join (', ')}});
32 {% if getter.is_raises_exception %}
33 if (exceptionState.hadException())
34 return;
35 {% endif %}
36 if ({{getter.is_null_expression}}) 34 if ({{getter.is_null_expression}})
37 return; 35 return;
38 {{getter.v8_set_return_value}}; 36 {{getter.v8_set_return_value}};
39 } 37 }
40 38
41 {% endif %} 39 {% endif %}
42 {% endblock %} 40 {% endblock %}
43 41
44 42
45 {##############################################################################} 43 {##############################################################################}
46 {% block indexed_property_getter_callback %} 44 {% block indexed_property_getter_callback %}
47 {% if indexed_property_getter %} 45 {% if indexed_property_getter or named_property_getter %}
48 {% set getter = indexed_property_getter %} 46 {% set getter = indexed_property_getter or named_property_getter %}
49 void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInf o<v8::Value>& info) 47 void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInf o<v8::Value>& info)
50 { 48 {
49 {% if indexed_property_getter %}
50
51 {% if getter.is_custom %} 51 {% if getter.is_custom %}
52 {{v8_class}}::indexedPropertyGetterCustom(index, info); 52 {{v8_class}}::indexedPropertyGetterCustom(index, info);
53 {% else %} 53 {% else %}
54 {{cpp_class}}V8Internal::indexedPropertyGetter(index, info); 54 {{cpp_class}}V8Internal::indexedPropertyGetter(index, info);
55 {% endif %} 55 {% endif %}
56
57 {% else %}{# otherwise, named property #}
58
59 const AtomicString& propertyName = AtomicString::number(index);
60
61 {% if getter.is_custom %}
62 {{v8_class}}::namedPropertyGetterCustom(propertyName, info);
63 {% else %}
64 {{cpp_class}}V8Internal::namedPropertyGetter(propertyName, info);
65 {% endif %}
66
67 {% endif %}{# indexed_property_getter #}
56 } 68 }
57 69
58 {% endif %} 70 {% endif %}
59 {% endblock %} 71 {% endblock %}
60 72
61 73
62 {##############################################################################} 74 {##############################################################################}
63 {% block indexed_property_setter %} 75 {% block indexed_property_setter %}
64 {% from 'utilities.cpp' import v8_value_to_local_cpp_value %} 76 {% from 'utilities.cpp' import v8_value_to_local_cpp_value %}
65 {% if indexed_property_setter and not indexed_property_setter.is_custom %} 77 {% if indexed_property_setter and not indexed_property_setter.is_custom %}
66 {% set setter = indexed_property_setter %} 78 {% set setter = indexed_property_setter %}
67 static void indexedPropertySetter(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) 79 static void indexedPropertySetter(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info)
68 { 80 {
81 {% if setter.has_exception_state %}
82 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::IndexedSett erContext, "{{interface_name}}");
83 {% endif %}
84
69 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 85 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
70 {{v8_value_to_local_cpp_value(setter) | indent}} 86 {{v8_value_to_local_cpp_value(setter) | indent}}
71 {% if setter.has_exception_state %}
72 ExceptionState exceptionState(ExceptionState::IndexedSetterContext, "{{inter face_name}}", info.Holder(), info.GetIsolate());
73 {% endif %}
74 {% if setter.has_type_checking_interface %} 87 {% if setter.has_type_checking_interface %}
75 {# Type checking for interface types (if interface not implemented, throw 88 {# Type checking for interface types (if interface not implemented, throw
76 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} 89 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
77 if (!propertyValue{% if setter.is_nullable %} && !isUndefinedOrNull(v8Value) {% endif %}) { 90 if (!propertyValue{% if setter.is_nullable %} && !isUndefinedOrNull(v8Value) {% endif %}) {
78 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'."); 91 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'.");
79 return; 92 return;
80 } 93 }
81 {% endif %} 94 {% endif %}
95
82 {% set setter_name = setter.name or 'anonymousIndexedSetter' %} 96 {% set setter_name = setter.name or 'anonymousIndexedSetter' %}
83 {% set setter_arguments = ['index', 'propertyValue'] %} 97 {% set setter_arguments = ['index', 'propertyValue'] %}
84 {% if setter.is_call_with_script_state %} 98 {% if setter.is_call_with_script_state %}
85 ScriptState* scriptState = ScriptState::current(info.GetIsolate()); 99 ScriptState* scriptState = ScriptState::forReceiverObject(info);
86 {% set setter_arguments = ['scriptState'] + setter_arguments %} 100 {% set setter_arguments = ['scriptState'] + setter_arguments %}
87 {% endif %} 101 {% endif %}
88 {% if setter.is_raises_exception %} 102 {% if setter.is_raises_exception %}
89 {% set setter_arguments = setter_arguments + ['exceptionState'] %} 103 {% set setter_arguments = setter_arguments + ['exceptionState'] %}
90 {% endif %} 104 {% endif %}
91 bool result = impl->{{setter_name}}({{setter_arguments | join(', ')}}); 105 impl->{{setter_name}}({{setter_arguments | join(', ')}});
92 {% if setter.is_raises_exception %}
93 if (exceptionState.hadException())
94 return;
95 {% endif %}
96 if (!result)
97 return;
98 v8SetReturnValue(info, v8Value);
99 } 106 }
100 107
101 {% endif %} 108 {% endif %}
102 {% endblock %} 109 {% endblock %}
103 110
104 111
105 {##############################################################################} 112 {##############################################################################}
106 {% block indexed_property_setter_callback %} 113 {% block indexed_property_setter_callback %}
107 {% if indexed_property_setter %} 114 {% if indexed_property_setter or named_property_setter %}
108 {% set setter = indexed_property_setter %} 115 {% set setter = indexed_property_setter or named_property_setter %}
109 void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) 116 void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info)
110 { 117 {
111 {% if setter.is_ce_reactions %} 118 {% if setter.is_ce_reactions %}
112 CEReactionsScope ceReactionsScope; 119 CEReactionsScope ceReactionsScope;
113 {% endif %} 120 {% endif %}
121
122 {% if indexed_property_setter %}
123
114 {% if setter.is_custom %} 124 {% if setter.is_custom %}
115 {{v8_class}}::indexedPropertySetterCustom(index, v8Value, info); 125 {{v8_class}}::indexedPropertySetterCustom(index, v8Value, info);
116 {% else %} 126 {% else %}
117 {{cpp_class}}V8Internal::indexedPropertySetter(index, v8Value, info); 127 {{cpp_class}}V8Internal::indexedPropertySetter(index, v8Value, info);
118 {% endif %} 128 {% endif %}
129
130 {% else %}{# otherwise, named property #}
131
132 const AtomicString& propertyName = AtomicString::number(index);
133
134 {% if setter.is_custom %}
135 {{v8_class}}::namedPropertySetterCustom(propertyName, v8Value, info);
136 {% else %}
137 {{cpp_class}}V8Internal::namedPropertySetter(propertyName, v8Value, info);
138 {% endif %}
139
140 {% endif %}{# indexed_property_setter #}
119 } 141 }
120 142
121 {% endif %} 143 {% endif %}
122 {% endblock %} 144 {% endblock %}
123 145
124 146
125 {##############################################################################} 147 {##############################################################################}
126 {% block indexed_property_deleter %} 148 {% block indexed_property_deleter %}
127 {% if indexed_property_deleter and not indexed_property_deleter.is_custom %} 149 {% if indexed_property_deleter and not indexed_property_deleter.is_custom %}
128 {% set deleter = indexed_property_deleter %} 150 {% set deleter = indexed_property_deleter %}
129 static void indexedPropertyDeleter(uint32_t index, const v8::PropertyCallbackInf o<v8::Boolean>& info) 151 static void indexedPropertyDeleter(uint32_t index, const v8::PropertyCallbackInf o<v8::Boolean>& info)
130 { 152 {
153 {% if deleter.is_raises_exception %}
154 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::IndexedDele tionContext, "{{interface_name}}");
155 {% endif %}
156
131 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 157 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
132 {% if deleter.is_raises_exception %} 158
133 ExceptionState exceptionState(ExceptionState::IndexedDeletionContext, "{{int erface_name}}", info.Holder(), info.GetIsolate());
134 {% endif %}
135 {% set deleter_name = deleter.name or 'anonymousIndexedDeleter' %} 159 {% set deleter_name = deleter.name or 'anonymousIndexedDeleter' %}
136 {% set deleter_arguments = ['index'] %} 160 {% set deleter_arguments = ['index'] %}
137 {% if deleter.is_call_with_script_state %} 161 {% if deleter.is_call_with_script_state %}
138 ScriptState* scriptState = ScriptState::current(info.GetIsolate()); 162 ScriptState* scriptState = ScriptState::forReceiverObject(info);
139 {% set deleter_arguments = ['scriptState'] + deleter_arguments %} 163 {% set deleter_arguments = ['scriptState'] + deleter_arguments %}
140 {% endif %} 164 {% endif %}
141 {% if deleter.is_raises_exception %} 165 {% if deleter.is_raises_exception %}
142 {% set deleter_arguments = deleter_arguments + ['exceptionState'] %} 166 {% set deleter_arguments = deleter_arguments + ['exceptionState'] %}
143 {% endif %} 167 {% endif %}
144 DeleteResult result = impl->{{deleter_name}}({{deleter_arguments | join(', ' )}}); 168 DeleteResult result = impl->{{deleter_name}}({{deleter_arguments | join(', ' )}});
145 {% if deleter.is_raises_exception %} 169 v8SetReturnValue(info, result != DeleteReject);
146 if (exceptionState.hadException())
147 return;
148 {% endif %}
149 if (result != DeleteUnknownProperty)
150 return v8SetReturnValueBool(info, result == DeleteSuccess);
151 } 170 }
152 171
153 {% endif %} 172 {% endif %}
154 {% endblock %} 173 {% endblock %}
155 174
156 175
157 {##############################################################################} 176 {##############################################################################}
158 {% block indexed_property_deleter_callback %} 177 {% block indexed_property_deleter_callback %}
159 {% if indexed_property_deleter %} 178 {% if indexed_property_deleter or named_property_deleter %}
160 {% set deleter = indexed_property_deleter %} 179 {% set deleter = indexed_property_deleter or named_property_deleter %}
161 void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackIn fo<v8::Boolean>& info) 180 void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackIn fo<v8::Boolean>& info)
162 { 181 {
163 {% if deleter.is_ce_reactions %} 182 {% if deleter.is_ce_reactions %}
164 CEReactionsScope ceReactionsScope; 183 CEReactionsScope ceReactionsScope;
165 {% endif %} 184 {% endif %}
185
186 {% if indexed_property_deleter %}
187
166 {% if deleter.is_custom %} 188 {% if deleter.is_custom %}
167 {{v8_class}}::indexedPropertyDeleterCustom(index, info); 189 {{v8_class}}::indexedPropertyDeleterCustom(index, info);
168 {% else %} 190 {% else %}
169 {{cpp_class}}V8Internal::indexedPropertyDeleter(index, info); 191 {{cpp_class}}V8Internal::indexedPropertyDeleter(index, info);
170 {% endif %} 192 {% endif %}
193
194 {% else %}{# otherwise, named property #}
195
196 const AtomicString& propertyName = AtomicString::number(index);
197
198 {% if deleter.is_custom %}
199 {{v8_class}}::namedPropertyDeleterCustom(propertyName, info);
200 {% else %}
201 {{cpp_class}}V8Internal::namedPropertyDeleter(propertyName, info);
202 {% endif %}
203
204 {% endif %}{# indexed_property_deleter #}
171 } 205 }
172 206
173 {% endif %} 207 {% endif %}
174 {% endblock %} 208 {% endblock %}
175 209
176 210
177 {##############################################################################} 211 {##############################################################################}
178 {% block named_property_getter %} 212 {% block named_property_getter %}
179 {% if named_property_getter and not named_property_getter.is_custom %} 213 {% if named_property_getter and not named_property_getter.is_custom %}
180 {% set getter = named_property_getter %} 214 {% set getter = named_property_getter %}
181 static void namedPropertyGetter(v8::Local<v8::Name> name, const v8::PropertyCall backInfo<v8::Value>& info) 215 static void namedPropertyGetter(const AtomicString& name, const v8::PropertyCall backInfo<v8::Value>& info)
182 { 216 {
183 auto nameString = name.As<v8::String>();
184 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
185 AtomicString propertyName = toCoreAtomicString(nameString);
186 {% if getter.is_raises_exception %} 217 {% if getter.is_raises_exception %}
187 v8::String::Utf8Value namedProperty(nameString); 218 const CString& nameInUtf8 = name.utf8();
188 ExceptionState exceptionState(ExceptionState::GetterContext, *namedProperty, "{{interface_name}}", info.Holder(), info.GetIsolate()); 219 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::GetterConte xt, "{{interface_name}}", nameInUtf8.data());
189 {% endif %} 220 {% endif %}
190 {% if getter.is_call_with_script_state %} 221 {% if getter.is_call_with_script_state %}
191 ScriptState* scriptState = ScriptState::current(info.GetIsolate()); 222 ScriptState* scriptState = ScriptState::forReceiverObject(info);
192 {% endif %} 223 {% endif %}
224
225 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
193 {% if getter.use_output_parameter_for_result %} 226 {% if getter.use_output_parameter_for_result %}
194 {{getter.cpp_type}} result; 227 {{getter.cpp_type}} result;
195 {{getter.cpp_value}}; 228 {{getter.cpp_value}};
196 {% else %} 229 {% else %}
197 {{getter.cpp_type}} result = {{getter.cpp_value}}; 230 {{getter.cpp_type}} result = {{getter.cpp_value}};
198 {% endif %} 231 {% endif %}
199 {% if getter.is_raises_exception %}
200 if (exceptionState.hadException())
201 return;
202 {% endif %}
203 if ({{getter.is_null_expression}}) 232 if ({{getter.is_null_expression}})
204 return; 233 return;
205 {{getter.v8_set_return_value}}; 234 {{getter.v8_set_return_value}};
206 } 235 }
207 236
208 {% endif %} 237 {% endif %}
209 {% endblock %} 238 {% endblock %}
210 239
211 240
212 {##############################################################################} 241 {##############################################################################}
213 {% block named_property_getter_callback %} 242 {% block named_property_getter_callback %}
214 {% if named_property_getter %} 243 {% if named_property_getter %}
215 {% set getter = named_property_getter %} 244 {% set getter = named_property_getter %}
216 void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCal lbackInfo<v8::Value>& info) 245 void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCal lbackInfo<v8::Value>& info)
217 { 246 {
218 if (!name->IsString()) 247 if (!name->IsString())
219 return; 248 return;
249 const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>()) ;
250
220 {% if getter.is_custom %} 251 {% if getter.is_custom %}
221 {{v8_class}}::namedPropertyGetterCustom(name, info); 252 {{v8_class}}::namedPropertyGetterCustom(propertyName, info);
222 {% else %} 253 {% else %}
223 {{cpp_class}}V8Internal::namedPropertyGetter(name, info); 254 {{cpp_class}}V8Internal::namedPropertyGetter(propertyName, info);
224 {% endif %} 255 {% endif %}
225 } 256 }
226 257
227 {% endif %} 258 {% endif %}
228 {% endblock %} 259 {% endblock %}
229 260
230 261
231 {##############################################################################} 262 {##############################################################################}
232 {% block named_property_setter %} 263 {% block named_property_setter %}
233 {% from 'utilities.cpp' import v8_value_to_local_cpp_value %} 264 {% from 'utilities.cpp' import v8_value_to_local_cpp_value %}
234 {% if named_property_setter and not named_property_setter.is_custom %} 265 {% if named_property_setter and not named_property_setter.is_custom %}
235 {% set setter = named_property_setter %} 266 {% set setter = named_property_setter %}
236 static void namedPropertySetter(v8::Local<v8::Name> name, v8::Local<v8::Value> v 8Value, const v8::PropertyCallbackInfo<v8::Value>& info) 267 static void namedPropertySetter(const AtomicString& name, v8::Local<v8::Value> v 8Value, const v8::PropertyCallbackInfo<v8::Value>& info)
237 { 268 {
238 auto nameString = name.As<v8::String>();
239 {% if setter.has_exception_state %} 269 {% if setter.has_exception_state %}
240 v8::String::Utf8Value namedProperty(nameString); 270 const CString& nameInUtf8 = name.utf8();
241 ExceptionState exceptionState(ExceptionState::SetterContext, *namedProperty, "{{interface_name}}", info.Holder(), info.GetIsolate()); 271 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::SetterConte xt, "{{interface_name}}", nameInUtf8.data());
242 {% endif %} 272 {% endif %}
273 {% if setter.is_call_with_script_state %}
274 ScriptState* scriptState = ScriptState::forReceiverObject(info);
275 {% endif %}
276
243 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 277 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
244 {# v8_value_to_local_cpp_value('DOMString', 'nameString', 'propertyName') #}
245 V8StringResource<> propertyName(nameString);
246 if (!propertyName.prepare())
247 return;
248 {{v8_value_to_local_cpp_value(setter) | indent}} 278 {{v8_value_to_local_cpp_value(setter) | indent}}
249 {% if setter.has_type_checking_interface %} 279 {% if setter.has_type_checking_interface %}
250 {# Type checking for interface types (if interface not implemented, throw 280 {# Type checking for interface types (if interface not implemented, throw
251 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #} 281 TypeError), per http://www.w3.org/TR/WebIDL/#es-interface #}
252 if (!propertyValue{% if setter.is_nullable %} && !isUndefinedOrNull(v8Value) {% endif %}) { 282 if (!propertyValue{% if setter.is_nullable %} && !isUndefinedOrNull(v8Value) {% endif %}) {
253 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'."); 283 exceptionState.throwTypeError("The provided value is not of type '{{sett er.idl_type}}'.");
254 return; 284 return;
255 } 285 }
256 {% endif %} 286 {% endif %}
257 {% if setter.is_call_with_script_state %} 287
258 ScriptState* scriptState = ScriptState::current(info.GetIsolate());
259 {% endif %}
260 {% set setter_name = setter.name or 'anonymousNamedSetter' %} 288 {% set setter_name = setter.name or 'anonymousNamedSetter' %}
261 {% set setter_arguments = ['propertyName', 'propertyValue'] %} 289 {% set setter_arguments = ['name', 'propertyValue'] %}
262 {% if setter.is_call_with_script_state %} 290 {% if setter.is_call_with_script_state %}
263 {% set setter_arguments = ['scriptState'] + setter_arguments %} 291 {% set setter_arguments = ['scriptState'] + setter_arguments %}
264 {% endif %} 292 {% endif %}
265 {% if setter.is_raises_exception %} 293 {% if setter.is_raises_exception %}
266 {% set setter_arguments = setter_arguments + ['exceptionState'] %} 294 {% set setter_arguments = setter_arguments + ['exceptionState'] %}
267 {% endif %} 295 {% endif %}
268 bool result = impl->{{setter_name}}({{setter_arguments | join(', ')}}); 296 impl->{{setter_name}}({{setter_arguments | join(', ')}});
269 {% if setter.is_raises_exception %}
270 if (exceptionState.hadException())
271 return;
272 {% endif %}
273 if (!result)
274 return;
275 v8SetReturnValue(info, v8Value);
276 } 297 }
277 298
278 {% endif %} 299 {% endif %}
279 {% endblock %} 300 {% endblock %}
280 301
281 302
282 {##############################################################################} 303 {##############################################################################}
283 {% block named_property_setter_callback %} 304 {% block named_property_setter_callback %}
284 {% if named_property_setter %} 305 {% if named_property_setter %}
285 {% set setter = named_property_setter %} 306 {% set setter = named_property_setter %}
286 void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) 307 void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info)
287 { 308 {
288 if (!name->IsString()) 309 if (!name->IsString())
289 return; 310 return;
311 const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>()) ;
312
290 {% if setter.is_ce_reactions %} 313 {% if setter.is_ce_reactions %}
291 CEReactionsScope ceReactionsScope; 314 CEReactionsScope ceReactionsScope;
292 {% endif %} 315 {% endif %}
316
293 {% if setter.is_custom %} 317 {% if setter.is_custom %}
294 {{v8_class}}::namedPropertySetterCustom(name, v8Value, info); 318 {{v8_class}}::namedPropertySetterCustom(propertyName, v8Value, info);
295 {% else %} 319 {% else %}
296 {{cpp_class}}V8Internal::namedPropertySetter(name, v8Value, info); 320 {{cpp_class}}V8Internal::namedPropertySetter(propertyName, v8Value, info);
297 {% endif %} 321 {% endif %}
298 } 322 }
299 323
300 {% endif %} 324 {% endif %}
301 {% endblock %} 325 {% endblock %}
302 326
303 327
304 {##############################################################################} 328 {##############################################################################}
305 {% block named_property_query %} 329 {% block named_property_deleter %}
306 {% if named_property_getter and named_property_getter.is_enumerable and 330 {% if named_property_deleter and not named_property_deleter.is_custom %}
307 not named_property_getter.is_custom_property_query %} 331 {% set deleter = named_property_deleter %}
308 {% set getter = named_property_getter %} 332 static void namedPropertyDeleter(const AtomicString& name, const v8::PropertyCal lbackInfo<v8::Boolean>& info)
309 {# If there is an enumerator, there MUST be a query method to properly
310 communicate property attributes. #}
311 static void namedPropertyQuery(v8::Local<v8::Name> name, const v8::PropertyCallb ackInfo<v8::Integer>& info)
312 { 333 {
334 {% if deleter.is_raises_exception %}
335 const CString& nameInUtf8 = name.utf8();
336 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::DeletionCon text, "{{interface_name}}", nameInUtf8.data());
337 {% endif %}
338 {% if deleter.is_call_with_script_state %}
339 ScriptState* scriptState = ScriptState::forReceiverObject(info);
340 {% endif %}
341
313 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 342 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
314 AtomicString propertyName = toCoreAtomicString(name.As<v8::String>()); 343
315 v8::String::Utf8Value namedProperty(name); 344 {% set deleter_name = deleter.name or 'anonymousNamedDeleter' %}
316 ExceptionState exceptionState(ExceptionState::GetterContext, *namedProperty, "{{interface_name}}", info.Holder(), info.GetIsolate()); 345 {% set deleter_arguments = ['name'] %}
317 {% set getter_arguments = ['propertyName', 'exceptionState'] %} 346 {% if deleter.is_call_with_script_state %}
318 {% if getter.is_call_with_script_state %} 347 {% set deleter_arguments = ['scriptState'] + deleter_arguments %}
319 ScriptState* scriptState = ScriptState::current(info.GetIsolate());
320 {% set getter_arguments = ['scriptState'] + getter_arguments %}
321 {% endif %} 348 {% endif %}
322 bool result = impl->namedPropertyQuery({{getter_arguments | join(', ')}}); 349 {% if deleter.is_raises_exception %}
323 if (exceptionState.hadException()) 350 {% set deleter_arguments = deleter_arguments + ['exceptionState'] %}
324 return; 351 {% endif %}
325 if (!result) 352 DeleteResult result = impl->{{deleter_name}}({{deleter_arguments | join(', ' )}});
326 return; 353 v8SetReturnValue(info, result != DeleteReject);
327 v8SetReturnValueInt(info, v8::None);
328 } 354 }
329 355
330 {% endif %} 356 {% endif %}
331 {% endblock %} 357 {% endblock %}
332 358
333 359
334 {##############################################################################} 360 {##############################################################################}
335 {% block named_property_query_callback %} 361 {% block named_property_deleter_callback %}
336 {% if named_property_getter and named_property_getter.is_enumerable %} 362 {% if named_property_deleter %}
337 {% set getter = named_property_getter %} 363 {% set deleter = named_property_deleter %}
338 void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCall backInfo<v8::Integer>& info) 364 void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCa llbackInfo<v8::Boolean>& info)
339 { 365 {
340 if (!name->IsString()) 366 if (!name->IsString())
341 return; 367 return;
342 {% if getter.is_custom_property_query %} 368 const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>()) ;
343 {{v8_class}}::namedPropertyQueryCustom(name, info); 369
370 {% if deleter.is_ce_reactions %}
371 CEReactionsScope ceReactionsScope;
372 {% endif %}
373
374 {% if deleter.is_custom %}
375 {{v8_class}}::namedPropertyDeleterCustom(propertyName, info);
344 {% else %} 376 {% else %}
345 {{cpp_class}}V8Internal::namedPropertyQuery(name, info); 377 {{cpp_class}}V8Internal::namedPropertyDeleter(propertyName, info);
346 {% endif %} 378 {% endif %}
347 } 379 }
348 380
349 {% endif %} 381 {% endif %}
350 {% endblock %} 382 {% endblock %}
351 383
352 384
353 {##############################################################################} 385 {##############################################################################}
354 {% block named_property_deleter %} 386 {% block named_property_query %}
355 {% if named_property_deleter and not named_property_deleter.is_custom %} 387 {% if named_property_getter and named_property_getter.is_enumerable and
356 {% set deleter = named_property_deleter %} 388 not named_property_getter.is_custom_property_query %}
357 static void namedPropertyDeleter(v8::Local<v8::Name> name, const v8::PropertyCal lbackInfo<v8::Boolean>& info) 389 {% set getter = named_property_getter %}
390 {# If there is an enumerator, there MUST be a query method to properly
391 communicate property attributes. #}
peria 2016/09/09 02:44:51 TODO
392 static void namedPropertyQuery(const AtomicString& name, const v8::PropertyCallb ackInfo<v8::Integer>& info)
358 { 393 {
394 const CString& nameInUtf8 = name.utf8();
395 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::GetterConte xt, "{{interface_name}}", nameInUtf8.data());
396 {% if getter.is_call_with_script_state %}
397 ScriptState* scriptState = ScriptState::forReceiverObject(info);
398 {% endif %}
399
359 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 400 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
360 AtomicString propertyName = toCoreAtomicString(name.As<v8::String>()); 401
361 {% if deleter.is_raises_exception %} 402 {% set getter_arguments = ['name', 'exceptionState'] %}
362 v8::String::Utf8Value namedProperty(name); 403 {% if getter.is_call_with_script_state %}
363 ExceptionState exceptionState(ExceptionState::DeletionContext, *namedPropert y, "{{interface_name}}", info.Holder(), info.GetIsolate()); 404 {% set getter_arguments = ['scriptState'] + getter_arguments %}
364 {% endif %} 405 {% endif %}
365 {% if deleter.is_call_with_script_state %} 406 bool result = impl->namedPropertyQuery({{getter_arguments | join(', ')}});
366 ScriptState* scriptState = ScriptState::current(info.GetIsolate()); 407 if (!result)
367 {% endif %}
368 {% set deleter_name = deleter.name or 'anonymousNamedDeleter' %}
369 {% set deleter_arguments = ['propertyName'] %}
370 {% if deleter.is_call_with_script_state %}
371 {% set deleter_arguments = ['scriptState'] + deleter_arguments %}
372 {% endif %}
373 {% if deleter.is_raises_exception %}
374 {% set deleter_arguments = deleter_arguments + ['exceptionState'] %}
375 {% endif %}
376 DeleteResult result = impl->{{deleter_name}}({{deleter_arguments | join(', ' )}});
377 {% if deleter.is_raises_exception %}
378 if (exceptionState.hadException())
379 return; 408 return;
380 {% endif %} 409 v8SetReturnValueInt(info, v8::None);
381 if (result != DeleteUnknownProperty)
382 return v8SetReturnValueBool(info, result == DeleteSuccess);
383 } 410 }
384 411
385 {% endif %} 412 {% endif %}
386 {% endblock %} 413 {% endblock %}
387 414
388 415
389 {##############################################################################} 416 {##############################################################################}
390 {% block named_property_deleter_callback %} 417 {% block named_property_query_callback %}
391 {% if named_property_deleter %} 418 {% if named_property_getter and named_property_getter.is_enumerable %}
392 {% set deleter = named_property_deleter %} 419 {% set getter = named_property_getter %}
393 void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCa llbackInfo<v8::Boolean>& info) 420 void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCall backInfo<v8::Integer>& info)
394 { 421 {
395 if (!name->IsString()) 422 if (!name->IsString())
396 return; 423 return;
397 {% if deleter.is_ce_reactions %} 424 const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>()) ;
398 CEReactionsScope ceReactionsScope; 425
399 {% endif %} 426 {% if getter.is_custom_property_query %}
400 {% if deleter.is_custom %} 427 {{v8_class}}::namedPropertyQueryCustom(propertyName, info);
401 {{v8_class}}::namedPropertyDeleterCustom(name, info);
402 {% else %} 428 {% else %}
403 {{cpp_class}}V8Internal::namedPropertyDeleter(name, info); 429 {{cpp_class}}V8Internal::namedPropertyQuery(propertyName, info);
404 {% endif %} 430 {% endif %}
405 } 431 }
406 432
407 {% endif %} 433 {% endif %}
408 {% endblock %} 434 {% endblock %}
409 435
410 436
411 {##############################################################################} 437 {##############################################################################}
412 {% block named_property_enumerator %} 438 {% block named_property_enumerator %}
413 {% if named_property_getter and named_property_getter.is_enumerable and 439 {% if named_property_getter and named_property_getter.is_enumerable and
414 not named_property_getter.is_custom_property_enumerator %} 440 not named_property_getter.is_custom_property_enumerator %}
415 static void namedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& i nfo) 441 static void namedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& i nfo)
416 { 442 {
443 ExceptionState exceptionState(info.GetIsolate(), ExceptionState::Enumeration Context, "{{interface_name}}");
444
417 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder()); 445 {{cpp_class}}* impl = {{v8_class}}::toImpl(info.Holder());
446
418 Vector<String> names; 447 Vector<String> names;
419 ExceptionState exceptionState(ExceptionState::EnumerationContext, "{{interfa ce_name}}", info.Holder(), info.GetIsolate());
420 impl->namedPropertyEnumerator(names, exceptionState); 448 impl->namedPropertyEnumerator(names, exceptionState);
421 if (exceptionState.hadException()) 449 if (exceptionState.hadException())
422 return; 450 return;
423 v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size( )); 451 v8SetReturnValue(info, toV8(names, info.Holder(), info.GetIsolate()).As<v8:: Array>());
424 for (size_t i = 0; i < names.size(); ++i) {
425 if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCur rentContext(), i, v8String(info.GetIsolate(), names[i]))))
426 return;
427 }
428 v8SetReturnValue(info, v8names);
429 } 452 }
430 453
431 {% endif %} 454 {% endif %}
432 {% endblock %} 455 {% endblock %}
433 456
434 457
435 {##############################################################################} 458 {##############################################################################}
436 {% block named_property_enumerator_callback %} 459 {% block named_property_enumerator_callback %}
437 {% if named_property_getter and named_property_getter.is_enumerable %} 460 {% if named_property_getter and named_property_getter.is_enumerable %}
438 {% set getter = named_property_getter %} 461 {% set getter = named_property_getter %}
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 V8DOMConfiguration::installAttribute(isolate, world, {{instance_template}}, {{pr ototype_template}}, {{method.name}}OriginSafeAttributeConfiguration); 675 V8DOMConfiguration::installAttribute(isolate, world, {{instance_template}}, {{pr ototype_template}}, {{method.name}}OriginSafeAttributeConfiguration);
653 {%- endmacro %} 676 {%- endmacro %}
654 677
655 678
656 {##############################################################################} 679 {##############################################################################}
657 {% macro install_indexed_property_handler(target) %} 680 {% macro install_indexed_property_handler(target) %}
658 {% set indexed_property_getter_callback = 681 {% set indexed_property_getter_callback =
659 '%sV8Internal::indexedPropertyGetterCallback' % cpp_class %} 682 '%sV8Internal::indexedPropertyGetterCallback' % cpp_class %}
660 {% set indexed_property_setter_callback = 683 {% set indexed_property_setter_callback =
661 '%sV8Internal::indexedPropertySetterCallback' % cpp_class 684 '%sV8Internal::indexedPropertySetterCallback' % cpp_class
662 if indexed_property_setter else '0' %} 685 if indexed_property_setter or named_property_setter else '0' %}
663 {% set indexed_property_query_callback = '0' %}{# Unused #} 686 {% set indexed_property_query_callback = '0' %}{# Unused #}
664 {% set indexed_property_deleter_callback = 687 {% set indexed_property_deleter_callback =
665 '%sV8Internal::indexedPropertyDeleterCallback' % cpp_class 688 '%sV8Internal::indexedPropertyDeleterCallback' % cpp_class
666 if indexed_property_deleter else '0' %} 689 if indexed_property_deleter or named_property_deleter else '0' %}
667 {% set indexed_property_enumerator_callback = 690 {% set indexed_property_enumerator_callback =
668 'indexedPropertyEnumerator<%s>' % cpp_class 691 'indexedPropertyEnumerator<%s>' % cpp_class
669 if indexed_property_getter.is_enumerable else '0' %} 692 if indexed_property_getter.is_enumerable else '0' %}
670 {% set property_handler_flags = 693 {% set property_handler_flags =
671 'v8::PropertyHandlerFlags::kAllCanRead' 694 'v8::PropertyHandlerFlags::kAllCanRead'
672 if indexed_property_getter.do_not_check_security 695 if indexed_property_getter.do_not_check_security
673 else 'v8::PropertyHandlerFlags::kNone' %} 696 else 'v8::PropertyHandlerFlags::kNone' %}
674 v8::IndexedPropertyHandlerConfiguration indexedPropertyHandlerConfig({{indexed_p roperty_getter_callback}}, {{indexed_property_setter_callback}}, {{indexed_prope rty_query_callback}}, {{indexed_property_deleter_callback}}, {{indexed_property_ enumerator_callback}}, v8::Local<v8::Value>(), {{property_handler_flags}}); 697 v8::IndexedPropertyHandlerConfiguration indexedPropertyHandlerConfig({{indexed_p roperty_getter_callback}}, {{indexed_property_setter_callback}}, {{indexed_prope rty_query_callback}}, {{indexed_property_deleter_callback}}, {{indexed_property_ enumerator_callback}}, v8::Local<v8::Value>(), {{property_handler_flags}});
675 {{target}}->SetHandler(indexedPropertyHandlerConfig); 698 {{target}}->SetHandler(indexedPropertyHandlerConfig);
676 {%- endmacro %} 699 {%- endmacro %}
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 957
935 {% for method in methods if method.overloads and method.overloads.has_partial_ov erloads %} 958 {% for method in methods if method.overloads and method.overloads.has_partial_ov erloads %}
936 void {{v8_class}}::register{{method.name | blink_capitalize}}MethodForPartialInt erface(void (*method)(const v8::FunctionCallbackInfo<v8::Value>&)) 959 void {{v8_class}}::register{{method.name | blink_capitalize}}MethodForPartialInt erface(void (*method)(const v8::FunctionCallbackInfo<v8::Value>&))
937 { 960 {
938 {{cpp_class}}V8Internal::{{method.name}}MethodForPartialInterface = method; 961 {{cpp_class}}V8Internal::{{method.name}}MethodForPartialInterface = method;
939 } 962 }
940 963
941 {% endfor %} 964 {% endfor %}
942 {% endif %} 965 {% endif %}
943 {% endblock %} 966 {% endblock %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698