OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |