Bug 743198 part 5 - Check legacy event listener only if listener is found in the current group. draft
authorXidorn Quan <quanxunzhen@gmail.com>
Tue, 16 Feb 2016 09:36:08 +0800
changeset 331139 b7f14086de5dbddccc058d9d9a5741861db98952
parent 331131 2ab4a795e9f0dda71d51bb4ca05eafe7ab48c234
child 331140 a23139b04f374c124f7c2c3658f26bf38ce8c0c5
push id10906
push userxquan@mozilla.com
push dateTue, 16 Feb 2016 01:37:28 +0000
bugs743198
milestone47.0a1
Bug 743198 part 5 - Check legacy event listener only if listener is found in the current group. MozReview-Commit-ID: LL0bxS56vHv
dom/events/EventListenerManager.cpp
--- a/dom/events/EventListenerManager.cpp
+++ b/dom/events/EventListenerManager.cpp
@@ -1187,31 +1187,34 @@ EventListenerManager::HandleEventInterna
   }
 
   Maybe<nsAutoPopupStatePusher> popupStatePusher;
   if (mIsMainThreadELM) {
     popupStatePusher.emplace(Event::GetEventPopupControlState(aEvent, *aDOMEvent));
   }
 
   bool hasListener = false;
+  bool hasListenerForCurrentGroup = false;
   bool usingLegacyMessage = false;
   EventMessage eventMessage = aEvent->mMessage;
 
   while (true) {
     nsAutoTObserverArray<Listener, 2>::EndLimitedIterator iter(mListeners);
     Maybe<EventMessageAutoOverride> legacyAutoOverride;
     while (iter.HasMore()) {
       if (aEvent->mFlags.mImmediatePropagationStopped) {
         break;
       }
       Listener* listener = &iter.GetNext();
       // Check that the phase is same in event and event listener.
       // Handle only trusted events, except when listener permits untrusted events.
       if (ListenerCanHandle(listener, aEvent, eventMessage)) {
         hasListener = true;
+        hasListenerForCurrentGroup = hasListenerForCurrentGroup ||
+          listener->mFlags.mInSystemGroup == aEvent->mFlags.mInSystemGroup;
         if (listener->IsListening(aEvent) &&
             (aEvent->mFlags.mIsTrusted ||
              listener->mFlags.mAllowUntrustedEvents)) {
           if (!*aDOMEvent) {
             // This is tiny bit slow, but happens only once per event.
             nsCOMPtr<EventTarget> et =
               do_QueryInterface(aEvent->originalTarget);
             RefPtr<Event> event = EventDispatcher::CreateEvent(et, aPresContext,
@@ -1266,17 +1269,17 @@ EventListenerManager::HandleEventInterna
           }
         }
       }
     }
 
     // If we didn't find any matching listeners, and our event has a legacy
     // version, we'll now switch to looking for that legacy version and we'll
     // recheck our listeners.
-    if (hasListener || usingLegacyMessage) {
+    if (hasListenerForCurrentGroup || usingLegacyMessage) {
       // (No need to recheck listeners, because we already found a match, or we
       // already rechecked them.)
       break;
     }
     EventMessage legacyEventMessage = GetLegacyEventMessage(eventMessage);
     if (legacyEventMessage == eventMessage) {
       break; // There's no legacy version of our event; no need to recheck.
     }