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

Unified Diff: client/dom/scripts/systemhtml.py

Issue 9623017: Refactor the event-generation code to locate it in systemhtml.py. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 8 years, 9 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « client/dom/scripts/systemfrog.py ('k') | client/dom/scripts/systeminterface.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/dom/scripts/systemhtml.py
diff --git a/client/dom/scripts/systemhtml.py b/client/dom/scripts/systemhtml.py
index 4c4945780abf44ed016d8882e35531a62661add9..3c5928d10490d206c2dfa4f7a3ec09c672aea148 100644
--- a/client/dom/scripts/systemhtml.py
+++ b/client/dom/scripts/systemhtml.py
@@ -383,6 +383,11 @@ _html_event_names = {
'webkitTransitionEnd': 'transitionEnd'
}
+# These classes require an explicit declaration for the "on" method even though
+# they don't declare any unique events, because the concrete class hierarchy
+# doesn't match the interface hierarchy.
+_html_explicit_event_classes = set(['DocumentFragment'])
+
def _OnAttributeToEventName(on_method):
event_name = on_method.id[2:]
if event_name in _on_attribute_to_event_name_mapping:
@@ -474,9 +479,9 @@ class HtmlSystemShared(object):
# TODO(jacobr): this isn't quite right....
def GetParentsEventsClasses(self, interface):
- # Ugly hack as we don't specify that Document inherits from Element
- # in our IDL.
- if interface.id == 'Document':
+ # Ugly hack as we don't specify that Document and DocumentFragment inherit
+ # from Element in our IDL.
+ if interface.id == 'Document' or interface.id == 'DocumentFragment':
return ['ElementEvents']
interfaces_with_events = set()
@@ -493,9 +498,27 @@ class HtmlSystemShared(object):
names.append(interface.id + 'Events')
return names
+ def GetParentEventsClass(self, interface):
+ parent_event_classes = self.GetParentsEventsClasses(interface)
+ if len(parent_event_classes) != 1:
+ raise Exception('Only one parent event class allowed ' + interface.id)
+ return parent_event_classes[0]
+
def _ImplClassName(self, type_name):
return '_' + type_name + 'Impl'
+ # This returns two values: the first is whether or not an "on" property should
+ # be generated for the interface, and the second is the event attributes to
+ # generate if it should.
+ def GetEventAttributes(self, interface):
+ events = set([attr for attr in interface.attributes
+ if self._generator._IsEventAttribute(interface, attr)])
+
+ if events or interface.id in _html_explicit_event_classes:
+ return True, events
+ else:
+ return False
+
class HtmlSystem(System):
def __init__(self, templates, database, emitters, output_dir, generator):
@@ -628,6 +651,14 @@ class HtmlDartInterfaceGenerator(DartInterfaceGenerator):
CTOR=self._interface.id,
TYPE=DartType(element_type))
+ emit_events, events = self._shared.GetEventAttributes(self._interface)
+ if not emit_events:
+ return
+ elif events:
+ self.AddEventAttributes(events)
+ else:
+ self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface))
+
def AddAttribute(self, getter, setter):
html_getter_name = self._shared.RenameInHtmlLibrary(
self._interface, getter.id, 'get:')
@@ -682,8 +713,8 @@ class HtmlDartInterfaceGenerator(DartInterfaceGenerator):
event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs)
self._shared._event_classes.add(self._interface.id)
events_interface = self._interface.id + 'Events'
- self._members_emitter.Emit('\n $TYPE get on();\n',
- TYPE=events_interface)
+ self._EmitEventGetter(events_interface)
+
events_members = self._emitter.Emit(
'\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n',
INTERFACE=events_interface,
@@ -697,6 +728,10 @@ class HtmlDartInterfaceGenerator(DartInterfaceGenerator):
else:
raise Exception('No known html even name for event: ' + event_name)
+ def _EmitEventGetter(self, interface):
+ self._members_emitter.Emit('\n $TYPE get on();\n',
+ TYPE=interface)
+
# ------------------------------------------------------------------------------
# TODO(jmesserly): inheritance is probably not the right way to factor this long
@@ -758,6 +793,14 @@ class HtmlFrogClassGenerator(FrogInterfaceGenerator):
if constructor_info:
self._EmitFactoryProvider(interface_name, constructor_info)
+ emit_events, events = self._shared.GetEventAttributes(self._interface)
+ if not emit_events:
+ return
+ elif events:
+ self.AddEventAttributes(events)
+ else:
+ self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface))
+
def _EmitFactoryProvider(self, interface_name, constructor_info):
template_file = 'factoryprovider_%s.darttemplate' % interface_name
template = self._system._templates.TryLoad(template_file)
@@ -986,19 +1029,11 @@ class HtmlFrogClassGenerator(FrogInterfaceGenerator):
event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs)
events_class = '_' + self._interface.id + 'EventsImpl'
events_interface = self._interface.id + 'Events'
- self._members_emitter.Emit(
- '\n $TYPE get on() =>\n new $TYPE($EVENTTARGET);\n',
- TYPE=events_class,
- EVENTTARGET='_jsDocument' if self._interface.id == 'Document'
- else 'this')
+ self._EmitEventGetter(events_class)
self._shared._event_classes.add(self._interface.id)
- parent_event_classes = self._shared.GetParentsEventsClasses(
- self._interface)
- if len(parent_event_classes) != 1:
- raise Exception('Only one parent event class allowed '
- + self._interface.id)
+ parent_event_class = self._shared.GetParentEventsClass(self._interface)
# TODO(jacobr): specify the type of _ptr as EventTarget
events_members = self._dart_code.Emit(
@@ -1008,7 +1043,7 @@ class HtmlFrogClassGenerator(FrogInterfaceGenerator):
'$!MEMBERS}\n',
CLASSNAME=events_class,
INTERFACE=events_interface,
- SUPER='_' + parent_event_classes[0] + 'Impl')
+ SUPER='_' + parent_event_class + 'Impl')
for event_name in event_attrs:
if event_name in _html_event_names:
@@ -1020,6 +1055,13 @@ class HtmlFrogClassGenerator(FrogInterfaceGenerator):
else:
raise Exception('No known html even name for event: ' + event_name)
+ def _EmitEventGetter(self, interface):
+ self._members_emitter.Emit(
+ '\n $TYPE get on() =>\n new $TYPE($EVENTTARGET);\n',
+ TYPE=interface,
+ EVENTTARGET='_jsDocument' if self._interface.id == 'Document'
+ else 'this')
+
# ------------------------------------------------------------------------------
class HtmlFrogSystem(HtmlSystem):
@@ -1237,6 +1279,14 @@ class HtmlDartiumInterfaceGenerator(object):
if constructor_info:
self._EmitFactoryProvider(interface_name, constructor_info)
+ emit_events, events = self._shared.GetEventAttributes(self._interface)
+ if not emit_events:
+ return
+ elif events:
+ self.AddEventAttributes(events)
+ else:
+ self._EmitEventGetter(self._shared.GetParentEventsClass(self._interface))
+
def _EmitFactoryProvider(self, interface_name, constructor_info):
template_file = 'factoryprovider_%s.darttemplate' % interface_name
template = self._system._templates.TryLoad(template_file)
@@ -1353,23 +1403,11 @@ class HtmlDartiumInterfaceGenerator(object):
event_attrs = _DomToHtmlEvents(self._interface.id, event_attrs)
events_class = '_' + self._interface.id + 'EventsImpl'
events_interface = self._interface.id + 'Events'
- self._members_emitter.Emit(
- '\n'
- ' $TYPE get on() {\n'
- ' if (_on == null) _on = new $TYPE($EVENTTARGET);\n'
- ' return _on;\n'
- ' }\n',
- TYPE=events_class,
- EVENTTARGET='_wrappedDocumentPtr' if self._interface.id == 'Document'
- else 'this')
+ self._EmitEventGetter(events_class)
self._shared._event_classes.add(self._interface.id)
- parent_event_classes = self._shared.GetParentsEventsClasses(
- self._interface)
- if len(parent_event_classes) != 1:
- raise Exception('Only one parent event class allowed '
- + self._interface.id)
+ parent_event_class = self._shared.GetParentEventsClass(self._interface)
# TODO(jacobr): specify the type of _ptr as EventTarget
events_members = self._dart_code.Emit(
@@ -1379,7 +1417,7 @@ class HtmlDartiumInterfaceGenerator(object):
'$!MEMBERS}\n',
CLASSNAME=events_class,
INTERFACE=events_interface,
- SUPER='_' + parent_event_classes[0] + 'Impl')
+ SUPER='_' + parent_event_class + 'Impl')
for event_name in event_attrs:
if event_name in _html_event_names:
@@ -1391,6 +1429,17 @@ class HtmlDartiumInterfaceGenerator(object):
else:
raise Exception('No known html even name for event: ' + event_name)
+ def _EmitEventGetter(self, events_class):
+ self._members_emitter.Emit(
+ '\n'
+ ' $TYPE get on() {\n'
+ ' if (_on == null) _on = new $TYPE($EVENTTARGET);\n'
+ ' return _on;\n'
+ ' }\n',
+ TYPE=events_class,
+ EVENTTARGET='_wrappedDocumentPtr' if self._interface.id == 'Document'
+ else 'this')
+
def _SecondaryContext(self, interface):
if interface is not self._current_secondary_parent:
self._current_secondary_parent = interface
« no previous file with comments | « client/dom/scripts/systemfrog.py ('k') | client/dom/scripts/systeminterface.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698