Chromium Code Reviews| Index: lib/dom/scripts/systemnative.py |
| diff --git a/lib/dom/scripts/systemnative.py b/lib/dom/scripts/systemnative.py |
| index bec4e5ea32943d8bddafab9b001c04d067b059e9..8be1dcf7a56da7b86818c6dc537cdd43a067d304 100644 |
| --- a/lib/dom/scripts/systemnative.py |
| +++ b/lib/dom/scripts/systemnative.py |
| @@ -10,13 +10,16 @@ import emitter |
| import os |
| from generator import * |
| from systembase import * |
| +from systemhtml import DomToHtmlEvent, DomToHtmlEvents |
| class NativeImplementationSystem(System): |
| - def __init__(self, templates, database, emitters, auxiliary_dir, output_dir): |
| + def __init__(self, templates, database, html_renames, emitters, auxiliary_dir, |
| + output_dir): |
| super(NativeImplementationSystem, self).__init__( |
| templates, database, emitters, output_dir) |
| + self._html_renames = html_renames |
| self._auxiliary_dir = auxiliary_dir |
| self._dom_public_files = [] |
| self._dom_impl_files = [] |
| @@ -245,6 +248,7 @@ class NativeImplementationGenerator(object): |
| self._cpp_resolver_emitter = emitter.Emitter() |
| self._GenerateConstructors() |
| + self._GenerateEvents() |
| def _GenerateConstructors(self): |
| if not self._IsConstructable(): |
| @@ -314,6 +318,56 @@ class NativeImplementationGenerator(object): |
| needs_receiver=False, invocation=invocation, |
| raises_exceptions=raises_exceptions) |
| + def _GenerateEvents(self): |
| + events_attributes = [attr for attr in self._interface.attributes |
| + if attr.type.id == 'EventListener'] |
| + if self._interface.id == 'DocumentFragment': |
|
Anton Muhin
2012/05/15 14:54:57
nit: move to the very beginning of the method?
podivilov
2012/05/16 12:32:24
Done.
|
| + self._EmitEventGetter('ElementEventsImplementation') |
| + return |
| + |
| + if not 'EventTarget' in self._interface.ext_attrs and not events_attributes: |
| + return |
| + |
| + is_root = not _HasEventTargetParent(self._system._database, self._interface) |
| + if is_root: |
| + self._members_emitter.Emit(' EventsImplementation _on;\n') |
| + |
| + if not events_attributes: |
| + if is_root: |
| + self._EmitEventGetter('EventsImplementation') |
| + return |
| + |
| + events_class = '%sEventsImplementation' % self._interface.id |
| + self._EmitEventGetter(events_class) |
| + |
| + parent = _ParentWithEventAttributes(self._system._database, self._interface) or '' |
|
Anton Muhin
2012/05/15 14:54:57
can it be ever a null?
podivilov
2012/05/16 12:32:24
Yes, for example Node doesn't have event target pa
Anton Muhin
2012/05/16 13:17:56
In this case, where are the guards?
On 2012/05/16
podivilov
2012/05/16 15:19:44
Note or ''. And see new version.
|
| + html_inteface = self._system._html_renames.get(self._interface.id, self._interface.id) |
|
Anton Muhin
2012/05/15 14:54:57
do not we have a helper for this operation?
podivilov
2012/05/16 12:32:24
Do we?
|
| + events_members = self._dart_impl_emitter.Emit( |
| + '\n' |
| + 'class $EVENTS_CLASS extends $PARENT_EVENTS_CLASS implements $EVENTS_INTERFACE {\n' |
| + ' $EVENTS_CLASS(_ptr) : super(_ptr);\n' |
| + '$!MEMBERS\n' |
| + '}\n', |
| + EVENTS_CLASS=events_class, |
| + PARENT_EVENTS_CLASS='%sEventsImplementation' % parent, |
| + EVENTS_INTERFACE='html.%sEvents' % html_inteface) |
| + |
| + events_attributes = DomToHtmlEvents(self._interface.id, events_attributes) |
| + for event_name in events_attributes: |
| + events_members.Emit( |
| + " EventListenerList get $HTML_NAME() => _get('$DOM_NAME');\n", |
|
Anton Muhin
2012/05/15 14:54:57
nit: shouldn't you use '' for outer and "" for inn
podivilov
2012/05/16 12:32:24
Done.
|
| + HTML_NAME=DomToHtmlEvent(event_name), |
| + DOM_NAME=event_name) |
| + |
| + def _EmitEventGetter(self, events_class): |
| + self._members_emitter.Emit( |
| + '\n' |
| + ' $EVENTS_CLASS get on() {\n' |
| + ' if (_on == null) _on = new $EVENTS_CLASS(this);\n' |
|
Anton Muhin
2012/05/15 14:54:57
nit: === null?
Anton Muhin
2012/05/15 14:54:57
btw, maybe not for this change, but I believe lazy
podivilov
2012/05/16 12:32:24
Done.
|
| + ' return _on;\n' |
| + ' }\n', |
| + EVENTS_CLASS=events_class) |
| + |
| def _ImplClassName(self, interface_name): |
| return interface_name + 'Implementation' |
| @@ -1150,3 +1204,28 @@ def _InstanceOfNode(database, interface): |
| if _InstanceOfNode(database, parent_interface): |
| return True |
| return False |
| + |
| +def _HasEventTargetParent(database, interface): |
|
Anton Muhin
2012/05/15 14:54:57
nit: I believe in generator database argument is u
podivilov
2012/05/16 12:32:24
Done.
|
| + for parent in interface.parents: |
| + parent_name = parent.type.id |
| + if parent_name == 'EventTarget' or not database.HasInterface(parent_name): |
|
Anton Muhin
2012/05/15 14:54:57
it's time to abstract away tree traversal, wdyt?
podivilov
2012/05/16 12:32:24
Done.
|
| + continue |
| + parent_interface = database.GetInterface(parent.type.id) |
| + if ('EventTarget' in parent_interface.ext_attrs or |
| + _HasEventTargetParent(database, parent_interface)): |
| + return True |
| + return False |
| + |
| +def _ParentWithEventAttributes(database, interface): |
| + for parent in interface.parents: |
| + parent_name = parent.type.id |
| + if parent_name == 'EventTarget' or not database.HasInterface(parent_name): |
| + continue |
| + parent_interface = database.GetInterface(parent_name) |
| + for attribute in parent_interface.attributes: |
| + if attribute.type.id == 'EventListener': |
| + return parent_interface.id |
| + parent_interface = _ParentWithEventAttributes(database, parent_interface) |
| + if parent_interface: |
| + return parent_interface |
| + return None |