Index: client/dom/scripts/dartgenerator.py |
diff --git a/client/dom/scripts/dartgenerator.py b/client/dom/scripts/dartgenerator.py |
index ae597173232e4c74fc3e345fde2afef2caad215b..a17687c2975b45203cfaf1d1c985adddc76f6b48 100755 |
--- a/client/dom/scripts/dartgenerator.py |
+++ b/client/dom/scripts/dartgenerator.py |
@@ -376,11 +376,17 @@ class DartGenerator(object): |
self._systems = [] |
+ # TODO(jmesserly): only create these if needed |
interface_system = InterfacesSystem( |
TemplateLoader(self._template_dir, ['dom/interface', 'dom', '']), |
self._database, self._emitters, self._output_dir) |
self._systems.append(interface_system) |
+ html_interface_system = HtmlInterfacesSystem( |
+ TemplateLoader(self._template_dir, ['html/interface', 'html', '']), |
+ self._database, self._emitters, self._output_dir) |
+ self._systems.append(html_interface_system) |
+ |
if 'native' in systems: |
native_system = NativeImplementationSystem( |
TemplateLoader(self._template_dir, ['dom/native', 'dom', '']), |
@@ -417,6 +423,21 @@ class DartGenerator(object): |
frog_system._interface_system = interface_system |
self._systems.append(frog_system) |
+ if 'htmlfrog' in systems: |
+ html_system = HtmlFrogSystem( |
+ TemplateLoader(self._template_dir, ['html/frog', 'html', '']), |
+ self._database, self._emitters, self._output_dir) |
+ |
+ html_system._interface_system = html_interface_system |
+ self._systems.append(html_system) |
+ |
+ if 'htmldartium' in systems: |
+ html_system = HtmlDartiumSystem( |
+ TemplateLoader(self._template_dir, ['html/dartium', 'html', '']), |
+ self._database, self._emitters, self._output_dir) |
+ |
+ html_system._interface_system = html_interface_system |
+ self._systems.append(html_system) |
# Render all interfaces into Dart and save them in files. |
for interface in database.GetInterfaces(): |
@@ -483,11 +504,17 @@ class DartGenerator(object): |
generator.AddConstant(const) |
attributes = [attr for attr in interface.attributes |
- if not self._OmitAttribute(interface, attr)] |
+ if not self._IsEventAttribute(interface, attr)] |
for (getter, setter) in _PairUpAttributes(attributes): |
for generator in generators: |
generator.AddAttribute(getter, setter) |
+ events = _PairUpAttributes([attr for attr in interface.attributes |
+ if self._IsEventAttribute(interface, attr)]) |
+ if events: |
+ for generator in generators: |
+ generator.AddEventAttributes(events) |
+ |
# The implementation should define an indexer if the interface directly |
# extends List. |
element_type = MaybeListElementType(interface) |
@@ -542,7 +569,7 @@ class DartGenerator(object): |
generator.FinishInterface() |
return |
- def _OmitAttribute(self, interface, attr): |
+ def _IsEventAttribute(self, interface, attr): |
# Remove EventListener attributes like 'onclick' when addEventListener |
# is available. |
if attr.type.id == 'EventListener': |
@@ -982,6 +1009,56 @@ class InterfacesSystem(System): |
# ------------------------------------------------------------------------------ |
+class HtmlInterfacesSystem(System): |
+ |
+ def __init__(self, templates, database, emitters, output_dir): |
+ super(HtmlInterfacesSystem, self).__init__( |
+ templates, database, emitters, output_dir) |
+ self._dart_interface_file_paths = [] |
+ |
+ def InterfaceGenerator(self, |
+ interface, |
+ common_prefix, |
+ super_interface_name, |
+ source_filter): |
+ """.""" |
+ interface_name = interface.id |
+ dart_interface_file_path = self._FilePathForDartInterface(interface_name) |
+ |
+ self._dart_interface_file_paths.append(dart_interface_file_path) |
+ |
+ dart_interface_code = self._emitters.FileEmitter(dart_interface_file_path) |
+ |
+ template_file = 'interface_%s.darttemplate' % interface_name |
+ template = self._templates.TryLoad(template_file) |
+ if not template: |
+ template = self._templates.Load('interface.darttemplate') |
+ |
+ return HtmlDartInterfaceGenerator( |
+ interface, dart_interface_code, |
+ template, |
+ common_prefix, super_interface_name, |
+ source_filter) |
+ |
+ def ProcessCallback(self, interface, info): |
+ """Generates a typedef for the callback interface.""" |
+ interface_name = interface.id |
+ file_path = self._FilePathForDartInterface(interface_name) |
+ self._ProcessCallback(interface, info, file_path) |
+ |
+ def GenerateLibraries(self, lib_dir): |
+ pass |
+ |
+ |
+ def _FilePathForDartInterface(self, interface_name): |
+ """Returns the file path of the Dart interface definition.""" |
+ # TODO(jmesserly): is this the right path |
+ return os.path.join(self._output_dir, 'html', 'interface', |
+ '%s.dart' % interface_name) |
+ |
+ |
+# ------------------------------------------------------------------------------ |
+ |
class DummyImplementationSystem(System): |
"""Generates a dummy implementation for use by the editor analysis. |
@@ -1094,15 +1171,9 @@ class FrogSystem(System): |
template = self._templates.Load('frog_impl.darttemplate') |
dart_code = self._emitters.FileEmitter(dart_frog_file_path) |
- # dart_code.Emit(self._templates.Load('frog_impl.darttemplate')) |
return FrogInterfaceGenerator(self, interface, template, |
super_interface_name, dart_code) |
- #def ProcessCallback(self, interface, info): |
- # """Generates a typedef for the callback interface.""" |
- # file_path = self._FilePathForFrogImpl(interface.id) |
- # self._ProcessCallback(interface, info, file_path) |
- |
def GenerateLibraries(self, lib_dir): |
self._GenerateLibFile( |
'frog_dom.darttemplate', |
@@ -1119,6 +1190,51 @@ class FrogSystem(System): |
return os.path.join(self._output_dir, 'src', 'frog', |
'%s.dart' % interface_name) |
+ |
+# ------------------------------------------------------------------------------ |
+ |
+class HtmlFrogSystem(System): |
+ |
+ def __init__(self, templates, database, emitters, output_dir): |
+ super(HtmlFrogSystem, self).__init__( |
+ templates, database, emitters, output_dir) |
+ self._dart_frog_file_paths = [] |
+ |
+ def InterfaceGenerator(self, |
+ interface, |
+ common_prefix, |
+ super_interface_name, |
+ source_filter): |
+ """.""" |
+ dart_frog_file_path = self._FilePathForFrogImpl(interface.id) |
+ self._dart_frog_file_paths.append(dart_frog_file_path) |
+ |
+ template_file = 'impl_%s.darttemplate' % interface.id |
+ template = self._templates.TryLoad(template_file) |
+ if not template: |
+ template = self._templates.Load('frog_impl.darttemplate') |
+ |
+ dart_code = self._emitters.FileEmitter(dart_frog_file_path) |
+ return HtmlFrogInterfaceGenerator(self, interface, template, |
+ super_interface_name, dart_code) |
+ |
+ def GenerateLibraries(self, lib_dir): |
+ self._GenerateLibFile( |
+ 'html_frog.darttemplate', |
+ os.path.join(lib_dir, 'html_frog.dart'), |
+ (self._interface_system._dart_interface_file_paths + |
+ self._interface_system._dart_callback_file_paths + |
+ self._dart_frog_file_paths)) |
+ |
+ def Finish(self): |
+ pass |
+ |
+ def _FilePathForFrogImpl(self, interface_name): |
+ """Returns the file path of the Frog implementation.""" |
+ # TODO(jmesserly): is this the right path |
+ return os.path.join(self._output_dir, 'html', 'frog', |
+ '%s.dart' % interface_name) |
+ |
# ------------------------------------------------------------------------------ |
class DartInterfaceGenerator(object): |
@@ -1261,6 +1377,8 @@ class DartInterfaceGenerator(object): |
def AddSecondaryOperation(self, interface, attr): |
pass |
+ def AddEventAttributes(self, event_attrs): |
+ pass |
# Given a sorted sequence of type identifiers, return an appropriate type |
# name |
@@ -1268,6 +1386,30 @@ def TypeName(typeIds, interface): |
# Dynamically type this field for now. |
return 'var' |
+# ------------------------------------------------------------------------------ |
+ |
+# TODO(jmesserly): inheritance is probably not the right way to factor this long |
+# term, but it makes merging better for now. |
+class HtmlDartInterfaceGenerator(DartInterfaceGenerator): |
+ """Generates Dart Interface definition for one DOM IDL interface.""" |
+ |
+ def __init__(self, interface, emitter, template, |
+ common_prefix, super_interface, source_filter): |
+ super(HtmlDartInterfaceGenerator, self).__init__(interface, |
+ emitter, template, common_prefix, super_interface, source_filter) |
+ |
+ def AddEventAttributes(self, event_attrs): |
+ events_interface = self._interface.id + 'Events' |
+ self._members_emitter.Emit('\n $TYPE get on();\n', |
+ TYPE=events_interface) |
+ events_members = self._emitter.Emit( |
+ '\ninterface $INTERFACE {\n$!MEMBERS}\n', |
+ INTERFACE=events_interface) |
+ |
+ for getter, setter in event_attrs: |
+ event = getter or setter |
+ events_members.Emit('\n EventListenerList get $NAME();\n', NAME=event.id) |
+ |
# ------------------------------------------------------------------------------ |
@@ -1304,6 +1446,9 @@ class DummyInterfaceGenerator(object): |
def AddOperation(self, info): |
pass |
+ def AddEventAttributes(self, event_attrs): |
+ pass |
+ |
# ------------------------------------------------------------------------------ |
class WrappingInterfaceGenerator(object): |
@@ -1432,6 +1577,9 @@ class WrappingInterfaceGenerator(object): |
self._SecondaryContext(interface) |
self.AddOperation(info) |
+ def AddEventAttributes(self, event_attrs): |
+ pass |
+ |
def _SecondaryContext(self, interface): |
if interface is not self._current_secondary_parent: |
self._current_secondary_parent = interface |
@@ -1929,6 +2077,9 @@ class FrogInterfaceGenerator(object): |
self._SecondaryContext(interface) |
self.AddOperation(info) |
+ def AddEventAttributes(self, event_attrs): |
+ pass |
+ |
def _SecondaryContext(self, interface): |
if interface is not self._current_secondary_parent: |
self._current_secondary_parent = interface |
@@ -2009,6 +2160,42 @@ class FrogInterfaceGenerator(object): |
# ------------------------------------------------------------------------------ |
+# TODO(jmesserly): inheritance is probably not the right way to factor this long |
+# term, but it makes merging better for now. |
+class HtmlFrogInterfaceGenerator(FrogInterfaceGenerator): |
+ """Generates a Frog class for the dart:html library from a DOM IDL |
+ interface. |
+ """ |
+ |
+ def __init__(self, system, interface, template, super_interface, dart_code): |
+ super(HtmlFrogInterfaceGenerator, self).__init__( |
+ system, interface, template, super_interface, dart_code) |
+ |
+ def AddEventAttributes(self, 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(this);\n', |
+ TYPE=events_class) |
+ |
+ events_members = self._dart_code.Emit( |
+ '\n' |
+ 'class $CLASSNAME extends EventsImplementation ' |
+ 'implements $INTERFACE {\n' |
+ ' $CLASSNAME(_ptr) : super._wrap(_ptr);\n' |
+ '$!MEMBERS}\n', |
+ CLASSNAME=events_class, |
+ INTERFACE=events_interface) |
+ |
+ for getter, setter in event_attrs: |
+ event = getter or setter |
+ events_members.Emit( |
+ "\n" |
+ "EventListenerList get $NAME() => _get('$NAME');\n", |
+ NAME=event.id) |
+ |
+ |
+# ------------------------------------------------------------------------------ |
+ |
class NativeImplementationSystem(System): |
def __init__(self, templates, database, emitters, auxiliary_dir, output_dir): |