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

Side by Side Diff: tools/dom/scripts/systemnative.py

Issue 254463006: This CL contains all of the changes for splitting off all of the native (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/dom/scripts/systemhtml.py ('k') | tools/dom/scripts/templateloader_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module provides shared functionality for the systems to generate 6 """This module provides shared functionality for the systems to generate
7 native binding from the IDL database.""" 7 native binding from the IDL database."""
8 8
9 import emitter 9 import emitter
10 import os 10 import os
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 # track the necessary info. 164 # track the necessary info.
165 _url_utils = ['hash', 'host', 'hostname', 'origin', 165 _url_utils = ['hash', 'host', 'hostname', 'origin',
166 'password', 'pathname', 'port', 'protocol', 166 'password', 'pathname', 'port', 'protocol',
167 'search', 'username'] 167 'search', 'username']
168 _cpp_static_call_map = { 168 _cpp_static_call_map = {
169 'DOMURL': _url_utils + ['href', 'toString'], 169 'DOMURL': _url_utils + ['href', 'toString'],
170 'HTMLAnchorElement': _url_utils, 170 'HTMLAnchorElement': _url_utils,
171 'HTMLAreaElement': _url_utils, 171 'HTMLAreaElement': _url_utils,
172 } 172 }
173 173
174 _single_blink = True
vsm 2014/04/24 23:16:58 Can you add a comment here to indicate that this s
Leaf 2014/04/25 00:38:04 Done.
175 dart_use_blink = False
176
174 def _GetCPPPartialNames(interface): 177 def _GetCPPPartialNames(interface):
175 interface_name = interface.ext_attrs.get('ImplementedAs', interface.id) 178 interface_name = interface.ext_attrs.get('ImplementedAs', interface.id)
176 if not _cpp_partial_map: 179 if not _cpp_partial_map:
177 for (type, member) in _cpp_callback_map.keys(): 180 for (type, member) in _cpp_callback_map.keys():
178 if type not in _cpp_partial_map: 181 if type not in _cpp_partial_map:
179 _cpp_partial_map[type] = set([]) 182 _cpp_partial_map[type] = set([])
180 183
181 name_with_path = _cpp_callback_map[(type, member)] 184 name_with_path = _cpp_callback_map[(type, member)]
182 if name_with_path in _cpp_import_map: 185 if name_with_path in _cpp_import_map:
183 name_with_path = _cpp_import_map[name_with_path] 186 name_with_path = _cpp_import_map[name_with_path]
(...skipping 21 matching lines...) Expand all
205 208
206 cpp_tuple = (interface_name, callback_name) 209 cpp_tuple = (interface_name, callback_name)
207 if cpp_tuple in _cpp_callback_map: 210 if cpp_tuple in _cpp_callback_map:
208 cpp_type_name = _cpp_callback_map[cpp_tuple] 211 cpp_type_name = _cpp_callback_map[cpp_tuple]
209 elif (interface_name, cpp_name) in _cpp_overloaded_callback_map: 212 elif (interface_name, cpp_name) in _cpp_overloaded_callback_map:
210 cpp_type_name = _cpp_overloaded_callback_map[(interface_name, cpp_name)] 213 cpp_type_name = _cpp_overloaded_callback_map[(interface_name, cpp_name)]
211 else: 214 else:
212 cpp_type_name = interface_name 215 cpp_type_name = interface_name
213 return cpp_type_name 216 return cpp_type_name
214 217
218 def DeriveNativeLibraryName(library_name):
219 if _single_blink:
vsm 2014/04/24 23:16:58 Is this ever false now? If not, perhaps remove no
Leaf 2014/04/25 00:38:04 Done.
220 return "blink"
221 else:
222 return "blink_" + library_name
223
224 def DeriveNativeLibraryNames():
225 if _single_blink:
226 return ["blink"]
227 else:
228 return [DeriveNativeLibraryName(l) for l in HTML_LIBRARY_NAMES]
229
230 def DeriveQualifiedName(library_name, name):
231 return library_name + "." + name
232
233 def DeriveNativeName(interface_name, name, suffix):
234 fields = ["Native", interface_name, name]
235 if suffix != "":
236 fields.append(suffix)
237 return "_".join(fields)
238
239 def GetNativeLibraryEmitter(emitters, template_loader,
240 dartium_output_dir, dart_output_dir,
241 auxiliary_dir):
242 if _single_blink:
243 def massage_path(path):
244 # The most robust way to emit path separators is to use / always.
245 return path.replace('\\', '/')
246 template = template_loader.Load('blink_dartium.darttemplate')
247 dart_path = os.path.join(dartium_output_dir, 'blink_dartium.dart')
248 library_emitter = emitters.FileEmitter(dart_path)
249 auxiliary_dir = os.path.relpath(auxiliary_dir, dartium_output_dir)
250 emitter = \
251 library_emitter.Emit(template,
252 AUXILIARY_DIR=massage_path(auxiliary_dir))
253 return emitter
254 else:
255 blink_library_names = DeriveNativeLibraryNames()
256 blink_libraries = DartLibraries(
257 blink_library_names, template_loader, 'dartium', dartium_output_dir)
258 native_library_emitter = DartLibraryEmitter(
259 emitters, dart_output_dir, blink_libraries)
260 return native_library_emitter
261
262 def EmitNativeLibrary(native_library_emitter, auxiliary_dir):
263 if not _single_blink:
264 native_library_emitter.EmitLibraries(auxiliary_dir)
265
215 class DartiumBackend(HtmlDartGenerator): 266 class DartiumBackend(HtmlDartGenerator):
216 """Generates Dart implementation for one DOM IDL interface.""" 267 """Generates Dart implementation for one DOM IDL interface."""
217 268
218 def __init__(self, interface, cpp_library_emitter, options): 269 def __init__(self, interface, native_library_emitter,
270 cpp_library_emitter, options):
219 super(DartiumBackend, self).__init__(interface, options) 271 super(DartiumBackend, self).__init__(interface, options)
220 272
221 self._interface = interface 273 self._interface = interface
222 self._cpp_library_emitter = cpp_library_emitter 274 self._cpp_library_emitter = cpp_library_emitter
275 self._native_library_emitter = native_library_emitter
223 self._database = options.database 276 self._database = options.database
224 self._template_loader = options.templates 277 self._template_loader = options.templates
225 self._type_registry = options.type_registry 278 self._type_registry = options.type_registry
226 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) 279 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
227 self._metadata = options.metadata 280 self._metadata = options.metadata
281 self._native_library_name = DeriveNativeLibraryName(self._library_name)
282 # These get initialized by StartInterface
283 self._cpp_header_emitter = None
284 self._cpp_impl_emitter = None
285 self._members_emitter = None
286 self._cpp_declarations_emitter = None
287 self._cpp_impl_includes = None
288 self._cpp_definitions_emitter = None
289 self._cpp_resolver_emitter = None
228 290
229 def ImplementsMergedMembers(self): 291 def ImplementsMergedMembers(self):
230 # We could not add merged functions to implementation class because 292 # We could not add merged functions to implementation class because
231 # underlying c++ object doesn't implement them. Merged functions are 293 # underlying c++ object doesn't implement them. Merged functions are
232 # generated on merged interface implementation instead. 294 # generated on merged interface implementation instead.
233 return False 295 return False
234 296
235 def CustomJSMembers(self): 297 def CustomJSMembers(self):
236 return {} 298 return {}
237 299
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 def ImplementationTemplate(self): 408 def ImplementationTemplate(self):
347 template = None 409 template = None
348 interface_name = self._interface.doc_js_name 410 interface_name = self._interface.doc_js_name
349 if interface_name == self._interface.id or not self._database.HasInterface(i nterface_name): 411 if interface_name == self._interface.id or not self._database.HasInterface(i nterface_name):
350 template_file = 'impl_%s.darttemplate' % interface_name 412 template_file = 'impl_%s.darttemplate' % interface_name
351 template = self._template_loader.TryLoad(template_file) 413 template = self._template_loader.TryLoad(template_file)
352 if not template: 414 if not template:
353 template = self._template_loader.Load('dart_implementation.darttemplate') 415 template = self._template_loader.Load('dart_implementation.darttemplate')
354 return template 416 return template
355 417
418 def _NativeImplementationTemplate(self):
419 template = None
420 interface_name = self._interface.doc_js_name
421 if (interface_name == self._interface.id or
422 not self._database.HasInterface(interface_name)):
423 template_file = 'impl_blink_%s.darttemplate' % interface_name
424 template = self._template_loader.TryLoad(template_file)
425 if not template:
426 template = \
427 self._template_loader.Load('dart_blink_implementation.darttemplate')
428 return template
429
356 def RootClassName(self): 430 def RootClassName(self):
357 return 'NativeFieldWrapperClass2' 431 return 'NativeFieldWrapperClass2'
358 432
359 def NativeSpec(self): 433 def NativeSpec(self):
360 return '' 434 return ''
361 435
362 def StartInterface(self, members_emitter): 436 def _NativeInterfaceEmitter(self):
437 basename = self._interface_type_info.implementation_name()
438 emitter = \
439 self._native_library_emitter.FileEmitter(basename,
440 self._native_library_name)
441 return emitter.Emit(self._NativeImplementationTemplate(),
442 LIBRARYNAME='dart.dom.%s' % self._native_library_name)
443
444 def StartInterface(self, members_emitter, toplevel_emitter):
363 # Create emitters for c++ implementation. 445 # Create emitters for c++ implementation.
364 if not IsPureInterface(self._interface.id) and not IsCustomType(self._interf ace.id): 446 if not IsPureInterface(self._interface.id) and \
447 not IsCustomType(self._interface.id):
365 self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter( 448 self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
366 self._interface.id, 449 self._interface.id,
367 self._renamer.GetLibraryName(self._interface)) 450 self._renamer.GetLibraryName(self._interface))
368 self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(sel f._interface.id) 451 self._cpp_impl_emitter = \
452 self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
369 else: 453 else:
370 self._cpp_header_emitter = emitter.Emitter() 454 self._cpp_header_emitter = emitter.Emitter()
371 self._cpp_impl_emitter = emitter.Emitter() 455 self._cpp_impl_emitter = emitter.Emitter()
372 456
373 self._interface_type_info = self._TypeInfo(self._interface.id) 457 self._interface_type_info = self._TypeInfo(self._interface.id)
374 self._members_emitter = members_emitter 458 self._members_emitter = members_emitter
459 if _single_blink:
460 self._native_interface_emitter = self._native_library_emitter
461 else:
462 self._native_interface_emitter = self._NativeInterfaceEmitter()
463
375 self._cpp_declarations_emitter = emitter.Emitter() 464 self._cpp_declarations_emitter = emitter.Emitter()
376 465
377 self._cpp_impl_includes = set(['"' + partial + '.h"' 466 self._cpp_impl_includes = \
378 for partial in _GetCPPPartialNames(self._inte rface)]) 467 set(['"' + partial + '.h"'
468 for partial in _GetCPPPartialNames(self._interface)])
379 469
380 # This is a hack to work around a strange C++ compile error that we weren't 470 # This is a hack to work around a strange C++ compile error that we weren't
381 # able to track down the true cause of. 471 # able to track down the true cause of.
382 if self._interface.id == 'Timing': 472 if self._interface.id == 'Timing':
383 self._cpp_impl_includes.add('"core/animation/TimedItem.h"') 473 self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
384 474
385 self._cpp_definitions_emitter = emitter.Emitter() 475 self._cpp_definitions_emitter = emitter.Emitter()
386 self._cpp_resolver_emitter = emitter.Emitter() 476 self._cpp_resolver_emitter = emitter.Emitter()
387 477
388 # We need to revisit our treatment of typed arrays, right now 478 # We need to revisit our treatment of typed arrays, right now
(...skipping 13 matching lines...) Expand all
402 '}\n', 492 '}\n',
403 INTERFACE_NAME=self._interface.id); 493 INTERFACE_NAME=self._interface.id);
404 494
405 def _EmitConstructorInfrastructure(self, 495 def _EmitConstructorInfrastructure(self,
406 constructor_info, constructor_callback_cpp_name, factory_method_name, 496 constructor_info, constructor_callback_cpp_name, factory_method_name,
407 argument_count=None): 497 argument_count=None):
408 constructor_callback_id = self._interface.id + '_' + constructor_callback_cp p_name 498 constructor_callback_id = self._interface.id + '_' + constructor_callback_cp p_name
409 if argument_count is None: 499 if argument_count is None:
410 argument_count = len(constructor_info.param_infos) 500 argument_count = len(constructor_info.param_infos)
411 501
412 self._members_emitter.Emit( 502 typed_formals = constructor_info.ParametersAsArgumentList(argument_count)
413 '\n @DocsEditable()\n' 503 parameters = constructor_info.ParametersAsStringOfVariables(argument_count)
414 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) ' 504 interface_name = self._interface_type_info.interface_name()
505
506 if dart_use_blink:
507 # First we emit the toplevel function
508 dart_native_name = \
509 DeriveNativeName(self._interface.id, constructor_callback_cpp_name, "")
510 self._native_interface_emitter.Emit(
511 '\n'
512 '$FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
513 FACTORY_METHOD_NAME=dart_native_name,
514 PARAMETERS=parameters,
515 ID=constructor_callback_id)
516
517 # Then we emit the impedance matching wrapper to call out to the
518 # toplevel wrapper
519 self._members_emitter.Emit(
520 '\n @DocsEditable()\n'
521 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
522 '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
523 INTERFACE_NAME=self._interface_type_info.interface_name(),
524 FACTORY_METHOD_NAME=factory_method_name,
525 PARAMETERS=typed_formals,
526 TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
527 dart_native_name),
528 OUTPARAMETERS=parameters)
529 else:
530 self._members_emitter.Emit(
531 '\n @DocsEditable()\n'
532 ' static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) '
415 'native "$ID";\n', 533 'native "$ID";\n',
416 INTERFACE_NAME=self._interface_type_info.interface_name(), 534 INTERFACE_NAME=self._interface_type_info.interface_name(),
417 FACTORY_METHOD_NAME=factory_method_name, 535 FACTORY_METHOD_NAME=factory_method_name,
418 # TODO: add types to parameters. 536 PARAMETERS=typed_formals,
419 PARAMETERS=constructor_info.ParametersAsArgumentList(argument_count), 537 ID=constructor_callback_id)
420 ID=constructor_callback_id)
421 538
422 self._cpp_resolver_emitter.Emit( 539 self._cpp_resolver_emitter.Emit(
423 ' if (name == "$ID")\n' 540 ' if (name == "$ID")\n'
424 ' return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n', 541 ' return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n',
425 ID=constructor_callback_id, 542 ID=constructor_callback_id,
426 WEBKIT_INTERFACE_NAME=self._interface.id, 543 WEBKIT_INTERFACE_NAME=self._interface.id,
427 CPP_CALLBACK=constructor_callback_cpp_name) 544 CPP_CALLBACK=constructor_callback_cpp_name)
428 545
429 def GenerateCustomFactory(self, constructor_info): 546 def GenerateCustomFactory(self, constructor_info):
430 if 'CustomConstructor' not in self._interface.ext_attrs: 547 if 'CustomConstructor' not in self._interface.ext_attrs:
431 return False 548 return False
432 549
433 annotations = self._metadata.GetFormattedMetadata(self._library_name, 550 annotations = self._metadata.GetFormattedMetadata(self._library_name,
434 self._interface, self._interface.id, ' ') 551 self._interface, self._interface.id, ' ')
435 552
436 self._members_emitter.Emit( 553 self._members_emitter.Emit(
437 '\n $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n ', 554 '\n $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n ',
438 ANNOTATIONS=annotations, 555 ANNOTATIONS=annotations,
439 CTOR=constructor_info._ConstructorFullName(self._DartType), 556 CTOR=constructor_info._ConstructorFullName(self._DartType),
440 PARAMS=constructor_info.ParametersDeclaration(self._DartType), 557 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
441 FACTORY_PARAMS= \ 558 FACTORY_PARAMS= \
442 constructor_info.ParametersAsArgumentList()) 559 constructor_info.ParametersAsArgumentList())
443 560
444 constructor_callback_cpp_name = 'constructorCallback' 561 constructor_callback_cpp_name = 'constructorCallback'
445 self._EmitConstructorInfrastructure( 562 self._EmitConstructorInfrastructure(
446 constructor_info, constructor_callback_cpp_name, '_create') 563 constructor_info, constructor_callback_cpp_name, '_create')
447 564
448 self._cpp_declarations_emitter.Emit( 565 self._cpp_declarations_emitter.Emit(
449 '\n' 566 '\n'
450 'void $CPP_CALLBACK(Dart_NativeArguments);\n', 567 'void $CPP_CALLBACK(Dart_NativeArguments);\n',
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 786
670 def _GenerateAutoSetupScope(self, idl_name, native_suffix): 787 def _GenerateAutoSetupScope(self, idl_name, native_suffix):
671 return (self._interface.id, idl_name, native_suffix) not in _cpp_no_auto_sco pe_list 788 return (self._interface.id, idl_name, native_suffix) not in _cpp_no_auto_sco pe_list
672 789
673 def _AddGetter(self, attr, html_name, read_only): 790 def _AddGetter(self, attr, html_name, read_only):
674 # Temporary hack to force dart:scalarlist clamped array for ImageData.data. 791 # Temporary hack to force dart:scalarlist clamped array for ImageData.data.
675 # TODO(antonm): solve in principled way. 792 # TODO(antonm): solve in principled way.
676 if self._interface.id == 'ImageData' and html_name == 'data': 793 if self._interface.id == 'ImageData' and html_name == 'data':
677 html_name = '_data' 794 html_name = '_data'
678 type_info = self._TypeInfo(attr.type.id) 795 type_info = self._TypeInfo(attr.type.id)
679 dart_declaration = '%s get %s' % ( 796 return_type = self.SecureOutputType(attr.type.id, False, read_only)
680 self.SecureOutputType(attr.type.id, False, read_only), html_name) 797 parameters = []
798 dart_declaration = '%s get %s' % (return_type, html_name)
681 is_custom = ('Custom' in attr.ext_attrs and 799 is_custom = ('Custom' in attr.ext_attrs and
682 (attr.ext_attrs['Custom'] == None or 800 (attr.ext_attrs['Custom'] == None or
683 attr.ext_attrs['Custom'] == 'Getter')) 801 attr.ext_attrs['Custom'] == 'Getter'))
684 # This seems to have been replaced with Custom=Getter (see above), but 802 # This seems to have been replaced with Custom=Getter (see above), but
685 # check to be sure we don't see the old syntax 803 # check to be sure we don't see the old syntax
686 assert(not ('CustomGetter' in attr.ext_attrs)) 804 assert(not ('CustomGetter' in attr.ext_attrs))
687 native_suffix = 'Getter' 805 native_suffix = 'Getter'
688 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) 806 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
689 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1, 807 cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
690 dart_declaration, native_suffix, is_custom, auto_scope_setup) 808 dart_declaration, False, return_type, parameters,
809 native_suffix, is_custom, auto_scope_setup)
691 if is_custom: 810 if is_custom:
692 return 811 return
693 812
694 if 'Reflect' in attr.ext_attrs: 813 if 'Reflect' in attr.ext_attrs:
695 webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name() 814 webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name()
696 if 'URL' in attr.ext_attrs: 815 if 'URL' in attr.ext_attrs:
697 if 'NonEmpty' in attr.ext_attrs: 816 if 'NonEmpty' in attr.ext_attrs:
698 webcore_function_name = 'getNonEmptyURLAttribute' 817 webcore_function_name = 'getNonEmptyURLAttribute'
699 else: 818 else:
700 webcore_function_name = 'getURLAttribute' 819 webcore_function_name = 'getURLAttribute'
(...skipping 18 matching lines...) Expand all
719 function_expression, 838 function_expression,
720 attr, 839 attr,
721 [], 840 [],
722 attr.type.id, 841 attr.type.id,
723 attr.type.nullable, 842 attr.type.nullable,
724 raises, 843 raises,
725 auto_scope_setup) 844 auto_scope_setup)
726 845
727 def _AddSetter(self, attr, html_name): 846 def _AddSetter(self, attr, html_name):
728 type_info = self._TypeInfo(attr.type.id) 847 type_info = self._TypeInfo(attr.type.id)
729 dart_declaration = 'void set %s(%s value)' % (html_name, self._DartType(attr .type.id)) 848 return_type = 'void'
849 parameters = ['value']
850 ptype = self._DartType(attr.type.id)
851 dart_declaration = 'void set %s(%s value)' % (html_name, ptype)
730 is_custom = ('Custom' in attr.ext_attrs and 852 is_custom = ('Custom' in attr.ext_attrs and
731 (attr.ext_attrs['Custom'] == None or 853 (attr.ext_attrs['Custom'] == None or
732 attr.ext_attrs['Custom'] == 'Setter')) 854 attr.ext_attrs['Custom'] == 'Setter'))
733 # This seems to have been replaced with Custom=Setter (see above), but 855 # This seems to have been replaced with Custom=Setter (see above), but
734 # check to be sure we don't see the old syntax 856 # check to be sure we don't see the old syntax
735 assert(not ('CustomSetter' in attr.ext_attrs)) 857 assert(not ('CustomSetter' in attr.ext_attrs))
736 assert(not ('V8CustomSetter' in attr.ext_attrs)) 858 assert(not ('V8CustomSetter' in attr.ext_attrs))
737 native_suffix = 'Setter' 859 native_suffix = 'Setter'
738 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix) 860 auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
739 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, 861 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
740 dart_declaration, native_suffix, is_custom, auto_scope_setup) 862 dart_declaration, False, return_type, parameters,
863 native_suffix, is_custom, auto_scope_setup)
741 if is_custom: 864 if is_custom:
742 return 865 return
743 866
744 if 'Reflect' in attr.ext_attrs: 867 if 'Reflect' in attr.ext_attrs:
745 webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name() 868 webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name()
746 else: 869 else:
747 if 'ImplementedAs' in attr.ext_attrs: 870 if 'ImplementedAs' in attr.ext_attrs:
748 attr_name = attr.ext_attrs['ImplementedAs'] 871 attr_name = attr.ext_attrs['ImplementedAs']
749 else: 872 else:
750 attr_name = attr.id 873 attr_name = attr.id
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 # and 909 # and
787 # 910 #
788 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } 911 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
789 # 912 #
790 dart_element_type = self._DartType(element_type) 913 dart_element_type = self._DartType(element_type)
791 if self._HasNativeIndexGetter(): 914 if self._HasNativeIndexGetter():
792 self._EmitNativeIndexGetter(dart_element_type) 915 self._EmitNativeIndexGetter(dart_element_type)
793 elif self._HasExplicitIndexedGetter(): 916 elif self._HasExplicitIndexedGetter():
794 self._EmitExplicitIndexedGetter(dart_element_type) 917 self._EmitExplicitIndexedGetter(dart_element_type)
795 else: 918 else:
796 self._members_emitter.Emit( 919 if dart_use_blink:
797 '\n' 920 dart_native_name = \
798 ' $TYPE operator[](int index) {\n' 921 DeriveNativeName(self._interface.id, "NativeIndexed", "Getter")
799 ' if (index < 0 || index >= length)\n' 922 # First emit a toplevel function to do the native call
800 ' throw new RangeError.range(index, 0, length);\n' 923 # Calls to this are emitted elsewhere,
801 ' return _nativeIndexedGetter(index);\n' 924 self._native_interface_emitter.Emit(
802 ' }\n' 925 '\n'
803 ' $TYPE _nativeIndexedGetter(int index) native "$(INTERFACE)_item_Cal lback";\n', 926 '$(DART_NATIVE_NAME)(mthis, index) '
804 TYPE=self.SecureOutputType(element_type), 927 'native "$(INTERFACE)_item_Callback";\n',
805 INTERFACE=self._interface.id) 928 DART_NATIVE_NAME = dart_native_name,
929 INTERFACE=self._interface.id)
930
931 # Emit the method which calls the toplevel function, along with
932 # the [] operator.
933 self._members_emitter.Emit(
934 '\n'
935 ' $TYPE operator[](int index) {\n'
936 ' if (index < 0 || index >= length)\n'
937 ' throw new RangeError.range(index, 0, length);\n'
938 ' return $(DART_NATIVE_NAME)(this, index);\n'
939 ' }\n\n'
940 ' $TYPE _nativeIndexedGetter(int index) =>'
941 ' $(DART_NATIVE_NAME)(this, index);\n',
942 DART_NATIVE_NAME=DeriveQualifiedName(self._native_library_name,
943 dart_native_name),
944 TYPE=self.SecureOutputType(element_type),
945 INTERFACE=self._interface.id)
946 else:
947 # Emit the method which calls the toplevel function, along with
948 # the [] operator.
949 self._members_emitter.Emit(
950 '\n'
951 ' $TYPE operator[](int index) {\n'
952 ' if (index < 0 || index >= length)\n'
953 ' throw new RangeError.range(index, 0, length);\n'
954 ' return _nativeIndexedGetter(index);\n'
955 ' }\n\n'
956 ' $TYPE _nativeIndexedGetter(int index) '
957 ' native "$(INTERFACE)_item_Callback";\n',
958 TYPE=self.SecureOutputType(element_type),
959 INTERFACE=self._interface.id)
806 960
807 if self._HasNativeIndexSetter(): 961 if self._HasNativeIndexSetter():
808 self._EmitNativeIndexSetter(dart_element_type) 962 self._EmitNativeIndexSetter(dart_element_type)
809 else: 963 else:
810 self._members_emitter.Emit( 964 self._members_emitter.Emit(
811 '\n' 965 '\n'
812 ' void operator[]=(int index, $TYPE value) {\n' 966 ' void operator[]=(int index, $TYPE value) {\n'
813 ' throw new UnsupportedError("Cannot assign element of immutable Li st.");\n' 967 ' throw new UnsupportedError("Cannot assign element of immutable Li st.");\n'
814 ' }\n', 968 ' }\n',
815 TYPE=dart_element_type) 969 TYPE=dart_element_type)
(...skipping 12 matching lines...) Expand all
828 982
829 if self._HasNativeIndexGetter(): 983 if self._HasNativeIndexGetter():
830 self._EmitNativeIndexGetter(dart_element_type) 984 self._EmitNativeIndexGetter(dart_element_type)
831 if self._HasNativeIndexSetter(): 985 if self._HasNativeIndexSetter():
832 self._EmitNativeIndexSetter(dart_element_type) 986 self._EmitNativeIndexSetter(dart_element_type)
833 987
834 def _HasNativeIndexGetter(self): 988 def _HasNativeIndexGetter(self):
835 return 'CustomIndexedGetter' in self._interface.ext_attrs 989 return 'CustomIndexedGetter' in self._interface.ext_attrs
836 990
837 def _EmitNativeIndexGetter(self, element_type): 991 def _EmitNativeIndexGetter(self, element_type):
838 dart_declaration = '%s operator[](int index)' % \ 992 return_type = self.SecureOutputType(element_type, True)
839 self.SecureOutputType(element_type, True) 993 parameters = ['index']
840 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration, 994 dart_declaration = '%s operator[](int index)' % return_type
841 'Callback', True, False) 995 self._GenerateNativeBinding('numericIndexGetter', 2,
996 dart_declaration, False, return_type, parameters,
997 'Callback', True, False)
842 998
843 def _HasExplicitIndexedGetter(self): 999 def _HasExplicitIndexedGetter(self):
844 return any(op.id == 'getItem' for op in self._interface.operations) 1000 return any(op.id == 'getItem' for op in self._interface.operations)
845 1001
846 def _EmitExplicitIndexedGetter(self, dart_element_type): 1002 def _EmitExplicitIndexedGetter(self, dart_element_type):
847 if any(op.id == 'getItem' for op in self._interface.operations): 1003 if any(op.id == 'getItem' for op in self._interface.operations):
848 indexed_getter = 'getItem' 1004 indexed_getter = 'getItem'
849 1005
850 self._members_emitter.Emit( 1006 self._members_emitter.Emit(
851 '\n' 1007 '\n'
852 ' $TYPE operator[](int index) {\n' 1008 ' $TYPE operator[](int index) {\n'
853 ' if (index < 0 || index >= length)\n' 1009 ' if (index < 0 || index >= length)\n'
854 ' throw new RangeError.range(index, 0, length);\n' 1010 ' throw new RangeError.range(index, 0, length);\n'
855 ' return $INDEXED_GETTER(index);\n' 1011 ' return $INDEXED_GETTER(index);\n'
856 ' }\n', 1012 ' }\n',
857 TYPE=dart_element_type, 1013 TYPE=dart_element_type,
858 INDEXED_GETTER=indexed_getter) 1014 INDEXED_GETTER=indexed_getter)
859 1015
860 def _HasNativeIndexSetter(self): 1016 def _HasNativeIndexSetter(self):
861 return 'CustomIndexedSetter' in self._interface.ext_attrs 1017 return 'CustomIndexedSetter' in self._interface.ext_attrs
862 1018
863 def _EmitNativeIndexSetter(self, element_type): 1019 def _EmitNativeIndexSetter(self, element_type):
864 dart_declaration = 'void operator[]=(int index, %s value)' % element_type 1020 return_type = 'void'
865 self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration, 1021 formals = ', '.join(['int index', '%s value' % element_type])
866 'Callback', True, False) 1022 parameters = ['index', 'value']
1023 dart_declaration = 'void operator[]=(%s)' % formals
1024 self._GenerateNativeBinding('numericIndexSetter', 3,
1025 dart_declaration, False, return_type, parameters,
1026 'Callback', True, False)
867 1027
868 def EmitOperation(self, info, html_name): 1028 def EmitOperation(self, info, html_name):
869 """ 1029 """
870 Arguments: 1030 Arguments:
871 info: An OperationInfo object. 1031 info: An OperationInfo object.
872 """ 1032 """
873 1033 return_type = self.SecureOutputType(info.type_name, False, True)
1034 formals = info.ParametersAsDeclaration(self._DartType)
1035 parameters = info.ParametersAsListOfVariables()
874 dart_declaration = '%s%s %s(%s)' % ( 1036 dart_declaration = '%s%s %s(%s)' % (
875 'static ' if info.IsStatic() else '', 1037 'static ' if info.IsStatic() else '',
876 self.SecureOutputType(info.type_name, False, True), 1038 return_type,
877 html_name, 1039 html_name,
878 info.ParametersDeclaration(self._DartType)) 1040 formals)
879 1041
880 operation = info.operations[0] 1042 operation = info.operations[0]
881 is_custom = 'Custom' in operation.ext_attrs 1043 is_custom = 'Custom' in operation.ext_attrs
882 has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, ar gument) for argument in operation.arguments) 1044 has_optional_arguments = any(self._IsArgumentOptionalInWebCore(operation, ar gument) for argument in operation.arguments)
883 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option al_arguments) 1045 needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_option al_arguments)
884 1046
885 if info.callback_args: 1047 if info.callback_args:
886 self._AddFutureifiedOperation(info, html_name) 1048 self._AddFutureifiedOperation(info, html_name)
887 elif not needs_dispatcher: 1049 elif not needs_dispatcher:
888 # Bind directly to native implementation 1050 # Bind directly to native implementation
889 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos) 1051 argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos)
890 native_suffix = 'Callback' 1052 native_suffix = 'Callback'
891 auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix) 1053 auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix)
892 cpp_callback_name = self._GenerateNativeBinding( 1054 cpp_callback_name = self._GenerateNativeBinding(
893 info.name, argument_count, dart_declaration, native_suffix, is_custom, 1055 info.name, argument_count, dart_declaration,
894 auto_scope_setup) 1056 info.IsStatic(), return_type, parameters,
1057 native_suffix, is_custom, auto_scope_setup)
895 if not is_custom: 1058 if not is_custom:
896 self._GenerateOperationNativeCallback(operation, operation.arguments, cp p_callback_name, auto_scope_setup) 1059 self._GenerateOperationNativeCallback(operation, operation.arguments, cp p_callback_name, auto_scope_setup)
897 else: 1060 else:
898 self._GenerateDispatcher(info, info.operations, dart_declaration) 1061 self._GenerateDispatcher(info, info.operations, dart_declaration)
899 1062
900 def _GenerateDispatcher(self, info, operations, dart_declaration): 1063 def _GenerateDispatcher(self, info, operations, dart_declaration):
901 1064
902 def GenerateCall( 1065 def GenerateCall(
903 stmts_emitter, call_emitter, version, operation, argument_count): 1066 stmts_emitter, call_emitter, version, operation, argument_count):
904 overload_name = '_%s_%s' % (operation.id, version) 1067 overload_name = '_%s_%s' % (operation.id, version)
905 argument_list = ', '.join( 1068 return_type = self.SecureOutputType(operation.type.id)
906 [p.name for p in info.param_infos[:argument_count]]) 1069 actuals = info.ParametersAsListOfVariables(argument_count)
907 call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=argument_list) 1070 actuals_s = ", ".join(actuals)
908 1071 call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
909 dart_declaration = '%s%s %s(%s)' % ( 1072 dart_declaration = '%s%s %s(%s)' % (
910 'static ' if operation.is_static else '', 1073 'static ' if operation.is_static else '',
911 self.SecureOutputType(operation.type.id), 1074 return_type,
912 overload_name, argument_list) 1075 overload_name, actuals_s)
913 is_custom = 'Custom' in operation.ext_attrs 1076 is_custom = 'Custom' in operation.ext_attrs
914 native_suffix = 'Callback' 1077 native_suffix = 'Callback'
915 auto_scope_setup = self._GenerateAutoSetupScope(overload_name, native_suff ix) 1078 auto_scope_setup = \
1079 self._GenerateAutoSetupScope(overload_name, native_suffix)
916 cpp_callback_name = self._GenerateNativeBinding( 1080 cpp_callback_name = self._GenerateNativeBinding(
917 overload_name, (0 if operation.is_static else 1) + argument_count, 1081 overload_name, (0 if operation.is_static else 1) + argument_count,
918 dart_declaration, 'Callback', is_custom, auto_scope_setup, 1082 dart_declaration, operation.is_static, return_type, actuals,
919 emit_metadata=False) 1083 'Callback', is_custom, auto_scope_setup, emit_metadata=False)
920 if not is_custom: 1084 if not is_custom:
921 self._GenerateOperationNativeCallback(operation, operation.arguments[:ar gument_count], cpp_callback_name, auto_scope_setup) 1085 self._GenerateOperationNativeCallback(operation,
1086 operation.arguments[:argument_count], cpp_callback_name,
1087 auto_scope_setup)
922 1088
923 self._GenerateDispatcherBody( 1089 self._GenerateDispatcherBody(
924 info, 1090 info,
925 operations, 1091 operations,
926 dart_declaration, 1092 dart_declaration,
927 GenerateCall, 1093 GenerateCall,
928 self._IsArgumentOptionalInWebCore) 1094 self._IsArgumentOptionalInWebCore)
929 1095
930 def SecondaryContext(self, interface): 1096 def SecondaryContext(self, interface):
931 pass 1097 pass
(...skipping 26 matching lines...) Expand all
958 auto_scope_setup=True, 1124 auto_scope_setup=True,
959 generate_custom_element_scope_if_needed=False): 1125 generate_custom_element_scope_if_needed=False):
960 1126
961 ext_attrs = node.ext_attrs 1127 ext_attrs = node.ext_attrs
962 1128
963 if self._IsStatic(node.id): 1129 if self._IsStatic(node.id):
964 needs_receiver = True 1130 needs_receiver = True
965 1131
966 cpp_arguments = [] 1132 cpp_arguments = []
967 runtime_check = None 1133 runtime_check = None
968 raises_exceptions = raises_dom_exception or arguments 1134 raises_exceptions = raises_dom_exception or arguments or needs_receiver
969 needs_custom_element_callbacks = False 1135 needs_custom_element_callbacks = False
970 1136
971 # TODO(antonm): unify with ScriptState below. 1137 # TODO(antonm): unify with ScriptState below.
972 requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptS tate' or 1138 requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptS tate' or
973 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts|ScriptState' or 1139 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts|ScriptState' or
974 ext_attrs.get('CallWith') == 'ScriptArguments&ScriptS tate' or 1140 ext_attrs.get('CallWith') == 'ScriptArguments&ScriptS tate' or
975 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts&ScriptState') 1141 ext_attrs.get('ConstructorCallWith') == 'ScriptArgume nts&ScriptState')
976 if requires_stack_info: 1142 if requires_stack_info:
977 raises_exceptions = True 1143 raises_exceptions = True
978 cpp_arguments = ['&state', 'scriptArguments.release()'] 1144 cpp_arguments = ['&state', 'scriptArguments.release()']
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 1274
1109 body_emitter.Emit( 1275 body_emitter.Emit(
1110 ' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsol ate();\n' 1276 ' DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsol ate();\n'
1111 ' if (!domWindow) {\n' 1277 ' if (!domWindow) {\n'
1112 ' exception = Dart_NewStringFromCString("Failed to fetch do mWindow");\n' 1278 ' exception = Dart_NewStringFromCString("Failed to fetch do mWindow");\n'
1113 ' goto fail;\n' 1279 ' goto fail;\n'
1114 ' }\n' 1280 ' }\n'
1115 ' Document& document = *domWindow->document();\n') 1281 ' Document& document = *domWindow->document();\n')
1116 1282
1117 if needs_receiver: 1283 if needs_receiver:
1118 body_emitter.Emit( 1284 if dart_use_blink:
1119 ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WE BCORE_CLASS_NAME >(args);\n', 1285 body_emitter.Emit(
1120 WEBCORE_CLASS_NAME=self._interface_type_info.native_type()) 1286 ' $WEBCORE_CLASS_NAME* receiver = '
1287 'DartDOMWrapper::receiverChecked<Dart$INTERFACE>(args, exception);\n '
1288 ' if (exception)\n'
1289 ' goto fail;\n',
1290 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
1291 INTERFACE=self._interface.id)
1292 else:
1293 body_emitter.Emit(
1294 ' $WEBCORE_CLASS_NAME* receiver = '
1295 'DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n'
1296 ' if (exception)\n'
1297 ' goto fail;\n',
1298 WEBCORE_CLASS_NAME=self._interface_type_info.native_type())
1121 1299
1122 if requires_stack_info: 1300 if requires_stack_info:
1123 self._cpp_impl_includes.add('"ScriptArguments.h"') 1301 self._cpp_impl_includes.add('"ScriptArguments.h"')
1124 body_emitter.Emit( 1302 body_emitter.Emit(
1125 '\n' 1303 '\n'
1126 ' ScriptState* currentState = DartUtilities::currentScriptState ();\n' 1304 ' ScriptState* currentState = DartUtilities::currentScriptState ();\n'
1127 ' if (!currentState) {\n' 1305 ' if (!currentState) {\n'
1128 ' exception = Dart_NewStringFromCString("Failed to retrieve a script state");\n' 1306 ' exception = Dart_NewStringFromCString("Failed to retrieve a script state");\n'
1129 ' goto fail;\n' 1307 ' goto fail;\n'
1130 ' }\n' 1308 ' }\n'
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 value_expression, 1477 value_expression,
1300 auto_scope_setup, 1478 auto_scope_setup,
1301 self._interface.id, 1479 self._interface.id,
1302 ext_attrs) 1480 ext_attrs)
1303 set_return_value = '%s' % (return_to_dart_conversion) 1481 set_return_value = '%s' % (return_to_dart_conversion)
1304 invocation_emitter.Emit( 1482 invocation_emitter.Emit(
1305 ' $RETURN_VALUE;\n', 1483 ' $RETURN_VALUE;\n',
1306 RETURN_VALUE=set_return_value) 1484 RETURN_VALUE=set_return_value)
1307 1485
1308 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration, 1486 def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
1309 native_suffix, is_custom, auto_scope_setup=True, emit_metadata=True): 1487 static, return_type, parameters, native_suffix, is_custom,
1310 1488 auto_scope_setup=True, emit_metadata=True):
1311 metadata = [] 1489 metadata = []
1312 if emit_metadata: 1490 if emit_metadata:
1313 metadata = self._metadata.GetFormattedMetadata( 1491 metadata = self._metadata.GetFormattedMetadata(
1314 self._renamer.GetLibraryName(self._interface), 1492 self._renamer.GetLibraryName(self._interface),
1315 self._interface, idl_name, ' ') 1493 self._interface, idl_name, ' ')
1494 dart_native_name = \
1495 DeriveNativeName(self._interface.id, idl_name, native_suffix)
1496 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix)
1497 if dart_use_blink:
1498 if not static:
1499 formals = ", ".join(['mthis'] + parameters)
1500 actuals = ", ".join(['this'] + parameters)
1501 else:
1502 formals = ", ".join(parameters)
1503 actuals = ", ".join(parameters)
1316 1504
1317 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix) 1505 self._native_interface_emitter.Emit(
1318 self._members_emitter.Emit( 1506 '\n'
1319 '\n' 1507 '$DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
1320 ' $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n', 1508 DART_NAME=dart_native_name,
1321 DOMINTERFACE=self._interface.id, 1509 FORMALS=formals,
1322 METADATA=metadata, 1510 NATIVE_BINDING=native_binding)
1323 DART_DECLARATION=dart_declaration,
1324 NATIVE_BINDING=native_binding)
1325 1511
1512 # We then emit a class method which calls out to the mangled toplevel
1513 # function. Eventually this will be replaced with a call to an
1514 # interceptor
1515 self._members_emitter.Emit(
1516 '\n'
1517 ' $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
1518 METADATA=metadata,
1519 DART_DECLARATION=dart_declaration,
1520 DART_NAME=DeriveQualifiedName(self._native_library_name,
1521 dart_native_name),
1522 ACTUALS=actuals)
1523 else:
1524 self._members_emitter.Emit(
1525 '\n'
1526 ' $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n',
1527 METADATA=metadata,
1528 DART_DECLARATION=dart_declaration,
1529 NATIVE_BINDING=native_binding)
1326 cpp_callback_name = '%s%s' % (idl_name, native_suffix) 1530 cpp_callback_name = '%s%s' % (idl_name, native_suffix)
1327 1531
1328 self._cpp_resolver_emitter.Emit( 1532 self._cpp_resolver_emitter.Emit(
1329 ' if (argumentCount == $ARGC && name == "$NATIVE_BINDING") {\n' 1533 ' if (argumentCount == $ARGC && name == "$NATIVE_BINDING") {\n'
1330 ' *autoSetupScope = $AUTO_SCOPE_SETUP;\n' 1534 ' *autoSetupScope = $AUTO_SCOPE_SETUP;\n'
1331 ' return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n' 1535 ' return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n'
1332 ' }\n', 1536 ' }\n',
1333 ARGC=argument_count, 1537 ARGC=argument_count,
1334 NATIVE_BINDING=native_binding, 1538 NATIVE_BINDING=native_binding,
1335 INTERFACE_NAME=self._interface.id, 1539 INTERFACE_NAME=self._interface.id,
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1584 e.Emit("};\n"); 1788 e.Emit("};\n");
1585 e.Emit('\n'); 1789 e.Emit('\n');
1586 e.Emit('} // namespace WebCore\n'); 1790 e.Emit('} // namespace WebCore\n');
1587 1791
1588 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): 1792 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument):
1589 return ( 1793 return (
1590 interface.id.endswith('Event') and 1794 interface.id.endswith('Event') and
1591 operation.id.startswith('init') and 1795 operation.id.startswith('init') and
1592 argument.ext_attrs.get('Default') == 'Undefined' and 1796 argument.ext_attrs.get('Default') == 'Undefined' and
1593 argument.type.id == 'DOMString') 1797 argument.type.id == 'DOMString')
OLDNEW
« no previous file with comments | « tools/dom/scripts/systemhtml.py ('k') | tools/dom/scripts/templateloader_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698