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 | 8 import logging |
9 | 9 |
10 _logger = logging.getLogger('dartgenerator') | 10 _logger = logging.getLogger('dartgenerator') |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 | 189 |
190 class HtmlEventGenerator(object): | 190 class HtmlEventGenerator(object): |
191 | 191 |
192 def __init__(self, database, template_loader): | 192 def __init__(self, database, template_loader): |
193 self._event_classes = set() | 193 self._event_classes = set() |
194 self._database = database | 194 self._database = database |
195 self._template_loader = template_loader | 195 self._template_loader = template_loader |
196 | 196 |
197 def ProcessInterface(self, interface, html_interface_name, custom_events, | 197 def ProcessInterface(self, interface, html_interface_name, custom_events, |
198 events_implementation_emitter): | 198 events_implementation_emitter): |
199 events = set([attr for attr in interface.attributes | 199 event_names = set([attr.id[2:] for attr in interface.attributes |
200 if attr.type.id == 'EventListener']) | 200 if attr.type.id == 'EventListener']) |
201 if not events and interface.id not in _html_explicit_event_classes: | 201 |
202 # Document and DocumentFragment actually derive from Element, so omit | |
sra1
2012/11/21 05:35:09
I think it would be better to walk the parent inte
blois
2012/11/26 17:23:19
Yeah, I tried that approach first- they are actual
| |
203 # any events which are duplicated with that. | |
204 if interface.id == 'Document' or interface.id == 'DocumentFragment': | |
205 element_interface = self._database.GetInterface('Element') | |
206 for attr in element_interface.attributes: | |
207 if attr.type.id == 'EventListener' and attr.id[2:] in event_names: | |
208 event_names.remove(attr.id[2:]) | |
209 | |
210 if not event_names and interface.id not in _html_explicit_event_classes: | |
202 return None | 211 return None |
203 | 212 |
204 self._event_classes.add(interface.id) | 213 self._event_classes.add(interface.id) |
205 events_class_name = html_interface_name + 'Events' | 214 events_class_name = html_interface_name + 'Events' |
206 parent_events_class_name = self._GetParentEventsClassName(interface) | 215 parent_events_class_name = self._GetParentEventsClassName(interface) |
207 | 216 |
208 if not events: | 217 if not event_names: |
209 return parent_events_class_name | 218 return parent_events_class_name |
210 | 219 |
211 template_file = 'impl_%s.darttemplate' % events_class_name | 220 template_file = 'impl_%s.darttemplate' % events_class_name |
212 template = (self._template_loader.TryLoad(template_file) or | 221 template = (self._template_loader.TryLoad(template_file) or |
213 '\n' | 222 '\n' |
214 'class $CLASSNAME extends $SUPER {\n' | 223 'class $CLASSNAME extends $SUPER {\n' |
215 ' $CLASSNAME(EventTarget _ptr) : super(_ptr);\n' | 224 ' $CLASSNAME(EventTarget _ptr) : super(_ptr);\n' |
216 '$!MEMBERS}\n') | 225 '$!MEMBERS}\n') |
217 | 226 |
218 # TODO(jacobr): specify the type of _ptr as EventTarget | 227 # TODO(jacobr): specify the type of _ptr as EventTarget |
219 implementation_events_members = events_implementation_emitter.Emit( | 228 implementation_events_members = events_implementation_emitter.Emit( |
220 template, | 229 template, |
221 CLASSNAME=events_class_name, | 230 CLASSNAME=events_class_name, |
222 SUPER='%s' % parent_events_class_name) | 231 SUPER='%s' % parent_events_class_name) |
223 | 232 |
224 dom_event_names = set() | 233 dom_event_names = set() |
225 for event in events: | 234 for event in event_names: |
226 dom_name = event.id[2:] | 235 dom_name = event |
227 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) | 236 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) |
228 dom_event_names.add(dom_name) | 237 dom_event_names.add(dom_name) |
229 if html_interface_name in _html_manual_events: | 238 if html_interface_name in _html_manual_events: |
230 dom_event_names.update(_html_manual_events[html_interface_name]) | 239 dom_event_names.update(_html_manual_events[html_interface_name]) |
231 for dom_name in sorted(dom_event_names): | 240 for dom_name in sorted(dom_event_names): |
232 if dom_name not in _html_event_names: | 241 if dom_name not in _html_event_names: |
233 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n ame) | 242 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n ame) |
234 continue | 243 continue |
235 | 244 |
236 html_name = _html_event_names[dom_name] | 245 html_name = _html_event_names[dom_name] |
237 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) | 246 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) |
238 if not full_event_name in custom_events: | 247 if not full_event_name in custom_events: |
239 implementation_events_members.Emit( | 248 implementation_events_members.Emit( |
240 "\n" | 249 "\n" |
241 " EventListenerList get $NAME => this['$DOM_NAME'];\n", | 250 " EventListenerList get $NAME => this['$DOM_NAME'];\n", |
242 NAME=html_name, | 251 NAME=html_name, |
243 DOM_NAME=dom_name) | 252 DOM_NAME=dom_name) |
244 | 253 |
245 return events_class_name | 254 return events_class_name |
246 | 255 |
247 # TODO(jacobr): this isn't quite right.... | 256 # TODO(jacobr): this isn't quite right.... |
248 def _GetParentEventsClassName(self, interface): | 257 def _GetParentEventsClassName(self, interface): |
249 # Ugly hack as we don't specify that Document and DocumentFragment inherit | 258 # Ugly hack as we don't specify that Document and DocumentFragment inherit |
250 # from Element in our IDL. | 259 # from Element in our IDL. |
251 if interface.id == 'Document' or interface.id == 'DocumentFragment': | 260 if interface.id == 'Document' or interface.id == 'DocumentFragment': |
252 return 'ElementEvents' | 261 return 'ElementEvents' |
253 | 262 |
254 parent_events_class_name = 'Events' | 263 parent_events_class_name = 'Events' |
255 interfaces_with_events = set() | 264 interfaces_with_events = set() |
256 for parent in self._database.Hierarchy(interface): | 265 for parent in self._database.Hierarchy(interface): |
257 if parent != interface and parent.id in self._event_classes: | 266 if parent != interface and parent.id in self._event_classes: |
258 parent_events_class_name = parent.id + 'Events' | 267 parent_events_class_name = parent.id + 'Events' |
259 interfaces_with_events.add(parent) | 268 interfaces_with_events.add(parent) |
260 if len(interfaces_with_events) > 1: | 269 if len(interfaces_with_events) > 1: |
261 raise Exception('Only one parent event class allowed ' + interface.id) | 270 raise Exception('Only one parent event class allowed ' + interface.id) |
262 return parent_events_class_name | 271 return parent_events_class_name |
OLD | NEW |