| 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 functionality to generate dart:html event classes.""" | 6 """This module provides functionality to generate dart:html event classes.""" |
| 7 | 7 |
| 8 import logging |
| 9 |
| 10 _logger = logging.getLogger('dartgenerator') |
| 11 |
| 8 # Events without onEventName attributes in the IDL we want to support. | 12 # Events without onEventName attributes in the IDL we want to support. |
| 9 # We can automatically extract most event names by checking for | 13 # We can automatically extract most event names by checking for |
| 10 # onEventName methods in the IDL but some events aren't listed so we need | 14 # onEventName methods in the IDL but some events aren't listed so we need |
| 11 # to manually add them here so that they are easy for users to find. | 15 # to manually add them here so that they are easy for users to find. |
| 12 _html_manual_events = { | 16 _html_manual_events = { |
| 13 'Element': ['touchleave', 'touchenter', 'webkitTransitionEnd'], | 17 'Element': ['touchleave', 'touchenter', 'webkitTransitionEnd'], |
| 14 'Window': ['DOMContentLoaded'] | 18 'Window': ['DOMContentLoaded'] |
| 15 } | 19 } |
| 16 | 20 |
| 17 # These event names must be camel case when attaching event listeners | 21 # These event names must be camel case when attaching event listeners |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 INTERFACE=events_interface, | 227 INTERFACE=events_interface, |
| 224 SUPER='_%sImpl' % parent_events_interface) | 228 SUPER='_%sImpl' % parent_events_interface) |
| 225 | 229 |
| 226 dom_event_names = set() | 230 dom_event_names = set() |
| 227 for event in events: | 231 for event in events: |
| 228 dom_name = event.id[2:] | 232 dom_name = event.id[2:] |
| 229 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) | 233 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) |
| 230 dom_event_names.add(dom_name) | 234 dom_event_names.add(dom_name) |
| 231 if html_interface_name in _html_manual_events: | 235 if html_interface_name in _html_manual_events: |
| 232 dom_event_names.update(_html_manual_events[html_interface_name]) | 236 dom_event_names.update(_html_manual_events[html_interface_name]) |
| 233 dom_event_names = sorted(dom_event_names, | 237 for dom_name in sorted(dom_event_names): |
| 234 key=lambda name: _html_event_names[name]) | |
| 235 for dom_name in dom_event_names: | |
| 236 if dom_name not in _html_event_names: | 238 if dom_name not in _html_event_names: |
| 237 raise Exception('No known html even name for event: ' + dom_name) | 239 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n
ame) |
| 240 continue |
| 241 |
| 238 html_name = _html_event_names[dom_name] | 242 html_name = _html_event_names[dom_name] |
| 239 interface_events_members.Emit('\n EventListenerList get $NAME;\n', | 243 interface_events_members.Emit('\n EventListenerList get $NAME;\n', |
| 240 NAME=html_name) | 244 NAME=html_name) |
| 241 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) | 245 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) |
| 242 if not full_event_name in custom_events: | 246 if not full_event_name in custom_events: |
| 243 implementation_events_members.Emit( | 247 implementation_events_members.Emit( |
| 244 "\n" | 248 "\n" |
| 245 " EventListenerList get $NAME => this['$DOM_NAME'];\n", | 249 " EventListenerList get $NAME => this['$DOM_NAME'];\n", |
| 246 NAME=html_name, | 250 NAME=html_name, |
| 247 DOM_NAME=dom_name) | 251 DOM_NAME=dom_name) |
| 248 | 252 |
| 249 return events_interface | 253 return events_interface |
| 250 | 254 |
| 251 # TODO(jacobr): this isn't quite right.... | 255 # TODO(jacobr): this isn't quite right.... |
| 252 def _GetParentEventsInterface(self, interface): | 256 def _GetParentEventsInterface(self, interface): |
| 253 # Ugly hack as we don't specify that Document and DocumentFragment inherit | 257 # Ugly hack as we don't specify that Document and DocumentFragment inherit |
| 254 # from Element in our IDL. | 258 # from Element in our IDL. |
| 255 if interface.id == 'Document' or interface.id == 'DocumentFragment': | 259 if interface.id == 'Document' or interface.id == 'DocumentFragment': |
| 256 return 'ElementEvents' | 260 return 'ElementEvents' |
| 257 | 261 |
| 258 parent_events_interface = 'Events' | 262 parent_events_interface = 'Events' |
| 259 interfaces_with_events = set() | 263 interfaces_with_events = set() |
| 260 for parent in self._database.Hierarchy(interface): | 264 for parent in self._database.Hierarchy(interface): |
| 261 if parent != interface and parent.id in self._event_classes: | 265 if parent != interface and parent.id in self._event_classes: |
| 262 parent_events_interface = parent.id + 'Events' | 266 parent_events_interface = parent.id + 'Events' |
| 263 interfaces_with_events.add(parent) | 267 interfaces_with_events.add(parent) |
| 264 if len(interfaces_with_events) > 1: | 268 if len(interfaces_with_events) > 1: |
| 265 raise Exception('Only one parent event class allowed ' + interface.id) | 269 raise Exception('Only one parent event class allowed ' + interface.id) |
| 266 return parent_events_interface | 270 return parent_events_interface |
| OLD | NEW |