| 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 import emitter | 9 import emitter |
| 10 | 10 |
| 11 from systemdart2js import * | 11 from systemdart2js import * |
| 12 from systeminterface import * | 12 from systeminterface import * |
| 13 | 13 |
| 14 _js_custom_members = set([ | 14 _js_custom_members = set([ |
| 15 'CSSStyleDeclaration.setProperty', | 15 'CSSStyleDeclaration.setProperty', |
| 16 'Element.insertAdjacentElement', | 16 'Element.insertAdjacentElement', |
| 17 'Element.insertAdjacentHTML', | 17 'Element.insertAdjacentHTML', |
| 18 'Element.insertAdjacentText', | 18 'Element.insertAdjacentText', |
| 19 'ElementEvents.mouseWheel', |
| 19 'IDBDatabase.transaction', | 20 'IDBDatabase.transaction', |
| 20 'IFrameElement.contentWindow', | 21 'IFrameElement.contentWindow', |
| 21 'MouseEvent.offsetX', | 22 'MouseEvent.offsetX', |
| 22 'MouseEvent.offsetY', | 23 'MouseEvent.offsetY', |
| 23 'TableElement.createTBody', | 24 'TableElement.createTBody', |
| 24 'Window.document', | 25 'Window.document', |
| 25 'Window.top', | 26 'Window.top', |
| 26 'Window.location', | 27 'Window.location', |
| 27 'Window.open', | 28 'Window.open', |
| 28 ]) | 29 ]) |
| (...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 return | 704 return |
| 704 | 705 |
| 705 self._EmitEventGetter(events_interface, events_class) | 706 self._EmitEventGetter(events_interface, events_class) |
| 706 | 707 |
| 707 events_members = self._interface_emitter.Emit( | 708 events_members = self._interface_emitter.Emit( |
| 708 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n', | 709 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n', |
| 709 INTERFACE=events_interface, | 710 INTERFACE=events_interface, |
| 710 PARENTS=', '.join( | 711 PARENTS=', '.join( |
| 711 self._shared.GetParentsEventsClasses(self._interface))) | 712 self._shared.GetParentsEventsClasses(self._interface))) |
| 712 | 713 |
| 713 # TODO(jacobr): specify the type of _ptr as EventTarget | 714 template_file = 'impl_%s.darttemplate' % events_interface |
| 714 implementation_events_members = self._implementation_emitter.Emit( | 715 template = (self._backend._system._templates.TryLoad(template_file) or |
| 715 '\n' | 716 '\n' |
| 716 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | 717 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' |
| 717 ' $CLASSNAME(_ptr) : super(_ptr);\n' | 718 ' $CLASSNAME(_ptr) : super(_ptr);\n' |
| 718 '$!MEMBERS}\n', | 719 '$!MEMBERS}\n') |
| 720 |
| 721 # TODO(jacobr): specify the type of _ptr as EventTarget |
| 722 implementation_events_members = self._implementation_emitter.Emit( |
| 723 template, |
| 719 CLASSNAME=events_class, | 724 CLASSNAME=events_class, |
| 720 INTERFACE=events_interface, | 725 INTERFACE=events_interface, |
| 721 SUPER=parent_events_class) | 726 SUPER=parent_events_class) |
| 722 | 727 |
| 723 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) | 728 event_attrs = DomToHtmlEvents(self._html_interface_name, event_attrs) |
| 724 for event_name in event_attrs: | 729 for event_name in event_attrs: |
| 725 if event_name in _html_event_names: | 730 if event_name in _html_event_names: |
| 731 dart_event_name = _html_event_names[event_name] |
| 726 events_members.Emit('\n EventListenerList get $NAME;\n', | 732 events_members.Emit('\n EventListenerList get $NAME;\n', |
| 727 NAME=_html_event_names[event_name]) | 733 NAME=dart_event_name) |
| 728 implementation_events_members.Emit( | 734 if not self._backend.HasCustomEventImplementation(dart_event_name): |
| 729 "\n" | 735 implementation_events_members.Emit( |
| 730 " EventListenerList get $NAME => this['$DOM_NAME'];\n", | 736 "\n" |
| 731 NAME=_html_event_names[event_name], | 737 " EventListenerList get $NAME => this['$DOM_NAME'];\n", |
| 732 DOM_NAME=event_name) | 738 NAME=dart_event_name, |
| 739 DOM_NAME=event_name) |
| 733 else: | 740 else: |
| 734 raise Exception('No known html even name for event: ' + event_name) | 741 raise Exception('No known html even name for event: ' + event_name) |
| 735 | 742 |
| 736 def _EmitEventGetter(self, events_interface, events_class): | 743 def _EmitEventGetter(self, events_interface, events_class): |
| 737 self._members_emitter.Emit( | 744 self._members_emitter.Emit( |
| 738 '\n /**' | 745 '\n /**' |
| 739 '\n * @domName EventTarget.addEventListener, ' | 746 '\n * @domName EventTarget.addEventListener, ' |
| 740 'EventTarget.removeEventListener, EventTarget.dispatchEvent' | 747 'EventTarget.removeEventListener, EventTarget.dispatchEvent' |
| 741 '\n */' | 748 '\n */' |
| 742 '\n $TYPE get on;\n', | 749 '\n $TYPE get on;\n', |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1203 def _OutputConversion(self, idl_type, member): | 1210 def _OutputConversion(self, idl_type, member): |
| 1204 return FindConversion(idl_type, 'get', self._interface.id, member) | 1211 return FindConversion(idl_type, 'get', self._interface.id, member) |
| 1205 | 1212 |
| 1206 def _InputConversion(self, idl_type, member): | 1213 def _InputConversion(self, idl_type, member): |
| 1207 return FindConversion(idl_type, 'set', self._interface.id, member) | 1214 return FindConversion(idl_type, 'set', self._interface.id, member) |
| 1208 | 1215 |
| 1209 def _HasCustomImplementation(self, member_name): | 1216 def _HasCustomImplementation(self, member_name): |
| 1210 member_name = '%s.%s' % (self._html_interface_name, member_name) | 1217 member_name = '%s.%s' % (self._html_interface_name, member_name) |
| 1211 return member_name in _js_custom_members | 1218 return member_name in _js_custom_members |
| 1212 | 1219 |
| 1220 def HasCustomEventImplementation(self, member_name): |
| 1221 member_name = '%sEvents.%s' % (self._html_interface_name, member_name) |
| 1222 return member_name in _js_custom_members |
| 1223 |
| 1213 def _HasJavaScriptIndexingBehaviour(self): | 1224 def _HasJavaScriptIndexingBehaviour(self): |
| 1214 """Returns True if the native object has an indexer and length property.""" | 1225 """Returns True if the native object has an indexer and length property.""" |
| 1215 (element_type, requires_indexer) = ListImplementationInfo( | 1226 (element_type, requires_indexer) = ListImplementationInfo( |
| 1216 self._interface, self._database) | 1227 self._interface, self._database) |
| 1217 if element_type and requires_indexer: return True | 1228 if element_type and requires_indexer: return True |
| 1218 return False | 1229 return False |
| 1219 | 1230 |
| 1220 # ------------------------------------------------------------------------------ | 1231 # ------------------------------------------------------------------------------ |
| 1221 | 1232 |
| 1222 class HtmlDart2JSSystem(System): | 1233 class HtmlDart2JSSystem(System): |
| 1223 | 1234 |
| 1224 def __init__(self, options): | 1235 def __init__(self, options): |
| 1225 super(HtmlDart2JSSystem, self).__init__(options) | 1236 super(HtmlDart2JSSystem, self).__init__(options) |
| 1226 | 1237 |
| 1227 def ImplementationGenerator(self, interface): | 1238 def ImplementationGenerator(self, interface): |
| 1228 return HtmlDart2JSClassGenerator(self, interface) | 1239 return HtmlDart2JSClassGenerator(self, interface) |
| 1229 | 1240 |
| 1230 def GenerateLibraries(self, dart_files): | 1241 def GenerateLibraries(self, dart_files): |
| 1231 auxiliary_dir = os.path.relpath(self._auxiliary_dir, self._output_dir) | 1242 auxiliary_dir = os.path.relpath(self._auxiliary_dir, self._output_dir) |
| 1232 self._GenerateLibFile( | 1243 self._GenerateLibFile( |
| 1233 'html_dart2js.darttemplate', | 1244 'html_dart2js.darttemplate', |
| 1234 os.path.join(self._output_dir, 'html_dart2js.dart'), | 1245 os.path.join(self._output_dir, 'html_dart2js.dart'), |
| 1235 dart_files, | 1246 dart_files, |
| 1236 AUXILIARY_DIR=systembase.MassagePath(auxiliary_dir)) | 1247 AUXILIARY_DIR=systembase.MassagePath(auxiliary_dir)) |
| 1237 | 1248 |
| 1238 def Finish(self): | 1249 def Finish(self): |
| 1239 pass | 1250 pass |
| OLD | NEW |