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

Unified Diff: tools/dom/scripts/htmleventgenerator.py

Issue 11956021: Removing redundant event streams. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Suppressing events on classes which are ignored. Created 7 years, 11 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 | « tools/dom/scripts/htmldartgenerator.py ('k') | tools/dom/scripts/htmlrenamer.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/dom/scripts/htmleventgenerator.py
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 4c6966c297c9c715fdb81721793d4d3c85c66b8d..43811ae2f89e5778349d5efc22948c6385333c0b 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -380,14 +380,19 @@ class HtmlEventGenerator(object):
self._renamer = renamer
self._template_loader = template_loader
- def EmitStreamProviders(self, interface, html_interface_name, custom_events,
+ def EmitStreamProviders(self, interface, custom_events,
members_emitter):
- events = self._GetEvents(interface, html_interface_name, custom_events)
+ events = self._GetEvents(interface, custom_events)
if not events:
return
for event_info in events:
(dom_name, html_name, event_type) = event_info
+
+ # If we're using a different provider, then don't declare one.
+ if self._GetEventRedirection(interface, html_name, event_type):
+ continue
+
members_emitter.Emit(
"\n"
" static const EventStreamProvider<$TYPE> $(NAME)Event = "
@@ -396,9 +401,9 @@ class HtmlEventGenerator(object):
DOM_NAME=dom_name,
TYPE=event_type)
- def EmitStreamGetters(self, interface, html_interface_name, custom_events,
+ def EmitStreamGetters(self, interface, custom_events,
members_emitter):
- events = self._GetEvents(interface, html_interface_name, custom_events)
+ events = self._GetEvents(interface, custom_events)
if not events:
return
@@ -406,19 +411,30 @@ class HtmlEventGenerator(object):
(dom_name, html_name, event_type) = event_info
getter_name = 'on%s%s' % (html_name[:1].upper(), html_name[1:])
+ # If the provider is declared elsewhere, point to that.
+ redirection = self._GetEventRedirection(interface, html_name, event_type)
+ if redirection:
+ provider = '%s.%sEvent' % (redirection, html_name)
+ else:
+ provider = html_name + 'Event'
+
members_emitter.Emit(
"\n"
" Stream<$TYPE> get $(NAME) => $PROVIDER.forTarget(this);\n",
NAME=getter_name,
- PROVIDER=html_name + 'Event',
+ PROVIDER=provider,
TYPE=event_type)
- def _GetEvents(self, interface, html_interface_name, custom_events):
+ def _GetEvents(self, interface, custom_events):
+ """ Gets a list of all of the events for the specified interface.
+ """
events = set([attr for attr in interface.attributes
if attr.type.id == 'EventListener'])
if not events and interface.id not in _html_explicit_event_classes:
return None
+ html_interface_name = interface.doc_js_name
+
dom_event_names = set()
for event in events:
dom_name = event.id[2:]
@@ -434,12 +450,49 @@ class HtmlEventGenerator(object):
continue
(html_name, event_type) = event_info
+ if self._IsEventSuppressed(interface, html_name, event_type):
+ continue
+
full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
if not full_event_name in custom_events:
events.append((dom_name, html_name, event_type))
return events
+ def _HasEvent(self, events, event_name, event_type):
+ """ Checks if the event is declared in the list of events (from _GetEvents),
+ with the same event type.
+ """
+ for (dom_name, html_name, found_type) in events:
+ if html_name == event_name and event_type == found_type:
+ return True
+ return False
+
+ def _IsEventSuppressed(self, interface, event_name, event_type):
+ """ Checks if the event should not be emitted.
+ """
+ if self._renamer.ShouldSuppressMember(interface, event_name, 'on:'):
+ return True
+
+ if interface.doc_js_name == 'Window':
+ media_interface = self._database.GetInterface('HTMLMediaElement')
+ media_events = self._GetEvents(media_interface, [])
+ if self._HasEvent(media_events, event_name, event_type):
+ return True
+
+ def _GetEventRedirection(self, interface, event_name, event_type):
+ """ For events which are declared in one place, but exposed elsewhere,
+ this gets the source of the event (where the provider is declared)
+ """
+ if interface.doc_js_name == 'Window' or interface.doc_js_name == 'Document':
+ element_interface = self._database.GetInterface('Element')
+ element_events = self._GetEvents(element_interface, [])
+ if self._HasEvent(element_events, event_name, event_type):
+ return 'Element'
+ return None
+
def _FindEventInfo(self, html_interface_name, dom_event_name):
+ """ Finds the event info (event name and type).
+ """
key = '%s.%s' % (html_interface_name, dom_event_name)
if key in _html_event_types:
return _html_event_types[key]
« no previous file with comments | « tools/dom/scripts/htmldartgenerator.py ('k') | tools/dom/scripts/htmlrenamer.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698