Bug 1429959 - Make nsBindingManager::EnumerateBoundContentBindings yield each binding only once. r?bholley draft
authorXidorn Quan <me@upsuper.org>
Fri, 12 Jan 2018 11:59:51 +1100
changeset 719646 473c4526398706a72c13f9f5888051c3e23a271a
parent 719345 483e8545c4631f3dff6d369c7cdead65398f172c
child 745849 078f7dd5c6483886dfc13dbd5fd6629346632978
push id95312
push userxquan@mozilla.com
push dateFri, 12 Jan 2018 13:58:03 +0000
reviewersbholley
bugs1429959
milestone59.0a1
Bug 1429959 - Make nsBindingManager::EnumerateBoundContentBindings yield each binding only once. r?bholley MozReview-Commit-ID: LxiF2RngJmq
dom/xbl/nsBindingManager.cpp
--- a/dom/xbl/nsBindingManager.cpp
+++ b/dom/xbl/nsBindingManager.cpp
@@ -717,21 +717,28 @@ nsBindingManager::WalkRules(nsIStyleRule
 bool
 nsBindingManager::EnumerateBoundContentBindings(
   const BoundContentBindingCallback& aCallback) const
 {
   if (!mBoundContentSet) {
     return true;
   }
 
+  nsTHashtable<nsPtrHashKey<nsXBLBinding>> bindings;
   for (auto iter = mBoundContentSet->Iter(); !iter.Done(); iter.Next()) {
     nsIContent* boundContent = iter.Get()->GetKey();
     for (nsXBLBinding* binding = boundContent->GetXBLBinding();
          binding;
          binding = binding->GetBaseBinding()) {
+      // If we have already invoked the callback with a binding, we
+      // should have also invoked it for all its base bindings, so we
+      // don't need to continue this loop anymore.
+      if (!bindings.EnsureInserted(binding)) {
+        break;
+      }
       if (!aCallback(binding)) {
         return false;
       }
     }
   }
 
   return true;
 }