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

Side by Side Diff: client/dom/scripts/systemhtml.py

Issue 9623017: Refactor the event-generation code to locate it in systemhtml.py. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/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 system to generate 6 """This module provides shared functionality for the system to generate
7 Dart:html APIs from the IDL database.""" 7 Dart:html APIs from the IDL database."""
8 8
9 from systemfrog import * 9 from systemfrog import *
10 from systeminterface import * 10 from systeminterface import *
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 'waiting': 'waiting', 376 'waiting': 'waiting',
377 'webkitAnimationEnd': 'animationEnd', 377 'webkitAnimationEnd': 'animationEnd',
378 'webkitAnimationIteration': 'animationIteration', 378 'webkitAnimationIteration': 'animationIteration',
379 'webkitAnimationStart': 'animationStart', 379 'webkitAnimationStart': 'animationStart',
380 'webkitfullscreenchange': 'fullscreenChange', 380 'webkitfullscreenchange': 'fullscreenChange',
381 'webkitfullscreenerror': 'fullscreenError', 381 'webkitfullscreenerror': 'fullscreenError',
382 'webkitSpeechChange': 'speechChange', 382 'webkitSpeechChange': 'speechChange',
383 'webkitTransitionEnd': 'transitionEnd' 383 'webkitTransitionEnd': 'transitionEnd'
384 } 384 }
385 385
386 # These classes require an explicit declaration for the "on" method even though
387 # they don't declare any unique events, because the concrete class hierarchy
388 # doesn't match the interface hierarchy.
389 _html_explicit_event_classes = set(['DocumentFragment'])
390
386 def _OnAttributeToEventName(on_method): 391 def _OnAttributeToEventName(on_method):
387 event_name = on_method.id[2:] 392 event_name = on_method.id[2:]
388 if event_name in _on_attribute_to_event_name_mapping: 393 if event_name in _on_attribute_to_event_name_mapping:
389 return _on_attribute_to_event_name_mapping[event_name] 394 return _on_attribute_to_event_name_mapping[event_name]
390 else: 395 else:
391 return event_name 396 return event_name
392 397
393 def _DomToHtmlEvents(interface_id, events): 398 def _DomToHtmlEvents(interface_id, events):
394 event_names = set(map(_OnAttributeToEventName, events)) 399 event_names = set(map(_OnAttributeToEventName, events))
395 if interface_id in _html_manual_events: 400 if interface_id in _html_manual_events:
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 return ['Events'] 494 return ['Events']
490 else: 495 else:
491 names = [] 496 names = []
492 for interface in interfaces_with_events: 497 for interface in interfaces_with_events:
493 names.append(interface.id + 'Events') 498 names.append(interface.id + 'Events')
494 return names 499 return names
495 500
496 def _ImplClassName(self, type_name): 501 def _ImplClassName(self, type_name):
497 return '_' + type_name + 'Impl' 502 return '_' + type_name + 'Impl'
498 503
504 def GetEventAttributes(self, interface):
505 events = set([attr for attr in interface.attributes
506 if self._generator._IsEventAttribute(interface, attr)])
507
508 if events or interface.id in _html_explicit_event_classes:
509 return events
510
499 class HtmlSystem(System): 511 class HtmlSystem(System):
500 512
501 def __init__(self, templates, database, emitters, output_dir, generator): 513 def __init__(self, templates, database, emitters, output_dir, generator):
502 super(HtmlSystem, self).__init__( 514 super(HtmlSystem, self).__init__(
503 templates, database, emitters, output_dir) 515 templates, database, emitters, output_dir)
504 self._shared = HtmlSystemShared(database, generator) 516 self._shared = HtmlSystemShared(database, generator)
505 517
506 class HtmlInterfacesSystem(HtmlSystem): 518 class HtmlInterfacesSystem(HtmlSystem):
507 519
508 def __init__(self, templates, database, emitters, output_dir, generator): 520 def __init__(self, templates, database, emitters, output_dir, generator):
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 self._members_emitter.Emit( 633 self._members_emitter.Emit(
622 '\n' 634 '\n'
623 ' $CTOR(int length);\n' 635 ' $CTOR(int length);\n'
624 '\n' 636 '\n'
625 ' $CTOR.fromList(List<$TYPE> list);\n' 637 ' $CTOR.fromList(List<$TYPE> list);\n'
626 '\n' 638 '\n'
627 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n', 639 ' $CTOR.fromBuffer(ArrayBuffer buffer);\n',
628 CTOR=self._interface.id, 640 CTOR=self._interface.id,
629 TYPE=DartType(element_type)) 641 TYPE=DartType(element_type))
630 642
643 events = self._shared.GetEventAttributes(self._interface)
644 if events == set():
Jacob 2012/03/08 18:38:09 writing if events == set(): looks really odd can
nweiz 2012/03/08 20:47:16 len(None) doesn't work, and I don't want to make t
645 self.AddParentEvent()
646 elif events:
647 self.AddEventAttributes(events)
648
631 def AddAttribute(self, getter, setter): 649 def AddAttribute(self, getter, setter):
632 html_getter_name = self._shared.RenameInHtmlLibrary( 650 html_getter_name = self._shared.RenameInHtmlLibrary(
633 self._interface, getter.id, 'get:') 651 self._interface, getter.id, 'get:')
634 html_setter_name = self._shared.RenameInHtmlLibrary( 652 html_setter_name = self._shared.RenameInHtmlLibrary(
635 self._interface, getter.id, 'set:') 653 self._interface, getter.id, 'set:')
636 654
637 if not html_getter_name: 655 if not html_getter_name:
638 getter = None 656 getter = None
639 if not html_setter_name: 657 if not html_setter_name:
640 setter = None 658 setter = None
(...skipping 30 matching lines...) Expand all
671 TYPE=info.type_name, 689 TYPE=info.type_name,
672 NAME=html_name, 690 NAME=html_name,
673 PARAMS=info.ParametersInterfaceDeclaration()) 691 PARAMS=info.ParametersInterfaceDeclaration())
674 692
675 def FinishInterface(self): 693 def FinishInterface(self):
676 pass 694 pass
677 695
678 def AddConstant(self, constant): 696 def AddConstant(self, constant):
679 self._EmitConstant(self._members_emitter, constant) 697 self._EmitConstant(self._members_emitter, constant)
680 698
699 def AddParentEvent(self):
700 parent_event_classes = self._shared.GetParentsEventsClasses(
701 self._interface)
702 if len(parent_event_classes) != 1:
703 raise Exception('Only one parent event class allowed '
704 + self._interface.id)
705
706 self._members_emitter.Emit('\n $TYPE get on();\n',
707 TYPE=parent_event_classes[0])
708
681 def AddEventAttributes(self, event_attrs): 709 def AddEventAttributes(self, event_attrs):
682 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs) 710 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs)
683 self._shared._event_classes.add(self._interface.id) 711 self._shared._event_classes.add(self._interface.id)
684 events_interface = self._interface.id + 'Events' 712 events_interface = self._interface.id + 'Events'
685 self._members_emitter.Emit('\n $TYPE get on();\n', 713 self._members_emitter.Emit('\n $TYPE get on();\n',
686 TYPE=events_interface) 714 TYPE=events_interface)
715
687 events_members = self._emitter.Emit( 716 events_members = self._emitter.Emit(
688 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', 717 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n',
689 INTERFACE=events_interface, 718 INTERFACE=events_interface,
690 PARENTS=', '.join( 719 PARENTS=', '.join(
691 self._shared.GetParentsEventsClasses(self._interface))) 720 self._shared.GetParentsEventsClasses(self._interface)))
692 721
693 for event_name in event_attrs: 722 for event_name in event_attrs:
694 if event_name in _html_event_names: 723 if event_name in _html_event_names:
695 events_members.Emit('\n EventListenerList get $NAME();\n', 724 events_members.Emit('\n EventListenerList get $NAME();\n',
696 NAME=_html_event_names[event_name]) 725 NAME=_html_event_names[event_name])
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 NATIVESPEC=' native "' + native_spec + '"') 780 NATIVESPEC=' native "' + native_spec + '"')
752 781
753 if element_type: 782 if element_type:
754 self.AddTypedArrayConstructors(element_type) 783 self.AddTypedArrayConstructors(element_type)
755 784
756 # Emit a factory provider class for the constructor. 785 # Emit a factory provider class for the constructor.
757 constructor_info = AnalyzeConstructor(interface) 786 constructor_info = AnalyzeConstructor(interface)
758 if constructor_info: 787 if constructor_info:
759 self._EmitFactoryProvider(interface_name, constructor_info) 788 self._EmitFactoryProvider(interface_name, constructor_info)
760 789
790 events = self._shared.GetEventAttributes(self._interface)
791 if events == set():
792 self.AddParentEvent()
793 elif events:
794 self.AddEventAttributes(events)
795
761 def _EmitFactoryProvider(self, interface_name, constructor_info): 796 def _EmitFactoryProvider(self, interface_name, constructor_info):
762 template_file = 'factoryprovider_%s.darttemplate' % interface_name 797 template_file = 'factoryprovider_%s.darttemplate' % interface_name
763 template = self._system._templates.TryLoad(template_file) 798 template = self._system._templates.TryLoad(template_file)
764 if not template: 799 if not template:
765 template = self._system._templates.Load('factoryprovider.darttemplate') 800 template = self._system._templates.Load('factoryprovider.darttemplate')
766 801
767 factory_provider = '_' + interface_name + 'FactoryProvider' 802 factory_provider = '_' + interface_name + 'FactoryProvider'
768 emitter = self._system._ImplFileEmitter(factory_provider) 803 emitter = self._system._ImplFileEmitter(factory_provider)
769 emitter.Emit( 804 emitter.Emit(
770 template, 805 template,
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 ' native "$(RETURN)$(THIS).$NAME($PARAMNAMES);";\n') 1010 ' native "$(RETURN)$(THIS).$NAME($PARAMNAMES);";\n')
976 else: 1011 else:
977 self._members_emitter.Emit( 1012 self._members_emitter.Emit(
978 '\n' 1013 '\n'
979 ' $TYPE $NAME($PARAMS) native;\n', 1014 ' $TYPE $NAME($PARAMS) native;\n',
980 TYPE=self._NarrowOutputType(info.type_name), 1015 TYPE=self._NarrowOutputType(info.type_name),
981 NAME=info.name, 1016 NAME=info.name,
982 PARAMS=info.ParametersImplementationDeclaration( 1017 PARAMS=info.ParametersImplementationDeclaration(
983 lambda type_name: self._NarrowInputType(type_name))) 1018 lambda type_name: self._NarrowInputType(type_name)))
984 1019
1020 def AddParentEvent(self):
Jacob 2012/03/08 18:38:09 seems like there is duplicated code in AddParentEv
nweiz 2012/03/08 20:47:16 Done.
1021 parent_event_classes = self._shared.GetParentsEventsClasses(
1022 self._interface)
1023 if len(parent_event_classes) != 1:
1024 raise Exception('Only one parent event class allowed '
1025 + self._interface.id)
1026
1027 self._members_emitter.Emit(
1028 '\n $TYPE get on() =>\n new $TYPE($EVENTTARGET);\n',
1029 TYPE=parent_event_classes[0],
1030 EVENTTARGET='_jsDocument' if self._interface.id == 'Document'
1031 else 'this')
1032
985 def AddEventAttributes(self, event_attrs): 1033 def AddEventAttributes(self, event_attrs):
986 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs) 1034 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs)
987 events_class = '_' + self._interface.id + 'EventsImpl' 1035 events_class = '_' + self._interface.id + 'EventsImpl'
988 events_interface = self._interface.id + 'Events' 1036 events_interface = self._interface.id + 'Events'
989 self._members_emitter.Emit( 1037 self._members_emitter.Emit(
990 '\n $TYPE get on() =>\n new $TYPE($EVENTTARGET);\n', 1038 '\n $TYPE get on() =>\n new $TYPE($EVENTTARGET);\n',
991 TYPE=events_class, 1039 TYPE=events_class,
992 EVENTTARGET='_jsDocument' if self._interface.id == 'Document' 1040 EVENTTARGET='_jsDocument' if self._interface.id == 'Document'
993 else 'this') 1041 else 'this')
994 1042
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 if dom_name != 'Document': 1278 if dom_name != 'Document':
1231 self._members_emitter.Emit( 1279 self._members_emitter.Emit(
1232 ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n', 1280 ' $(CLASSNAME)._wrap(ptr) : super._wrap(ptr);\n',
1233 CLASSNAME=self._class_name) 1281 CLASSNAME=self._class_name)
1234 1282
1235 # Emit a factory provider class for the constructor. 1283 # Emit a factory provider class for the constructor.
1236 constructor_info = AnalyzeConstructor(interface) 1284 constructor_info = AnalyzeConstructor(interface)
1237 if constructor_info: 1285 if constructor_info:
1238 self._EmitFactoryProvider(interface_name, constructor_info) 1286 self._EmitFactoryProvider(interface_name, constructor_info)
1239 1287
1288 events = self._shared.GetEventAttributes(self._interface)
1289 if events == set():
1290 self.AddParentEvent()
1291 elif events:
1292 self.AddEventAttributes(events)
1293
1240 def _EmitFactoryProvider(self, interface_name, constructor_info): 1294 def _EmitFactoryProvider(self, interface_name, constructor_info):
1241 template_file = 'factoryprovider_%s.darttemplate' % interface_name 1295 template_file = 'factoryprovider_%s.darttemplate' % interface_name
1242 template = self._system._templates.TryLoad(template_file) 1296 template = self._system._templates.TryLoad(template_file)
1243 if not template: 1297 if not template:
1244 template = self._system._templates.Load('factoryprovider.darttemplate') 1298 template = self._system._templates.Load('factoryprovider.darttemplate')
1245 1299
1246 factory_provider = '_' + interface_name + 'FactoryProvider' 1300 factory_provider = '_' + interface_name + 'FactoryProvider'
1247 emitter = self._system._ImplFileEmitter(factory_provider) 1301 emitter = self._system._ImplFileEmitter(factory_provider)
1248 emitter.Emit( 1302 emitter.Emit(
1249 template, 1303 template,
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 THIS=self.DomObjectName()) 1396 THIS=self.DomObjectName())
1343 1397
1344 def AddSecondaryAttribute(self, interface, getter, setter): 1398 def AddSecondaryAttribute(self, interface, getter, setter):
1345 self._SecondaryContext(interface) 1399 self._SecondaryContext(interface)
1346 self.AddAttribute(getter, setter) 1400 self.AddAttribute(getter, setter)
1347 1401
1348 def AddSecondaryOperation(self, interface, info): 1402 def AddSecondaryOperation(self, interface, info):
1349 self._SecondaryContext(interface) 1403 self._SecondaryContext(interface)
1350 self.AddOperation(info) 1404 self.AddOperation(info)
1351 1405
1406 def AddParentEvent(self):
1407 parent_event_classes = self._shared.GetParentsEventsClasses(
1408 self._interface)
1409 if len(parent_event_classes) != 1:
1410 raise Exception('Only one parent event class allowed '
1411 + self._interface.id)
1412
1413 self._members_emitter.Emit(
1414 '\n'
1415 ' $TYPE get on() {\n'
1416 ' if (_on == null) _on = new $TYPE($EVENTTARGET);\n'
1417 ' return _on;\n'
1418 ' }\n',
1419 TYPE=parent_event_classes[0],
1420 EVENTTARGET='_wrappedDocumentPtr' if self._interface.id == 'Document'
1421 else 'this')
1422
1352 def AddEventAttributes(self, event_attrs): 1423 def AddEventAttributes(self, event_attrs):
1353 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs) 1424 event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs)
1354 events_class = '_' + self._interface.id + 'EventsImpl' 1425 events_class = '_' + self._interface.id + 'EventsImpl'
1355 events_interface = self._interface.id + 'Events' 1426 events_interface = self._interface.id + 'Events'
1356 self._members_emitter.Emit( 1427 self._members_emitter.Emit(
1357 '\n' 1428 '\n'
1358 ' $TYPE get on() {\n' 1429 ' $TYPE get on() {\n'
1359 ' if (_on == null) _on = new $TYPE($EVENTTARGET);\n' 1430 ' if (_on == null) _on = new $TYPE($EVENTTARGET);\n'
1360 ' return _on;\n' 1431 ' return _on;\n'
1361 ' }\n', 1432 ' }\n',
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee 1786 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee
1716 # that Y = Z-X, so we need to check for Y. 1787 # that Y = Z-X, so we need to check for Y.
1717 true_code = emitter.Emit( 1788 true_code = emitter.Emit(
1718 '$(INDENT)if ($COND) {\n' 1789 '$(INDENT)if ($COND) {\n'
1719 '$!TRUE' 1790 '$!TRUE'
1720 '$(INDENT)}\n', 1791 '$(INDENT)}\n',
1721 COND=test, INDENT=indent) 1792 COND=test, INDENT=indent)
1722 self.GenerateDispatch( 1793 self.GenerateDispatch(
1723 true_code, info, indent + ' ', position + 1, positive) 1794 true_code, info, indent + ' ', position + 1, positive)
1724 return True 1795 return True
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698