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

Side by Side Diff: sdk/lib/html/scripts/htmleventgenerator.py

Issue 11414096: Removing duplicated events. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 1 month 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
« no previous file with comments | « sdk/lib/html/dartium/html_dartium.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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
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
OLDNEW
« no previous file with comments | « sdk/lib/html/dartium/html_dartium.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698