From 02b71da95a48af0458bb2142dc86ca323bfffb4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 25 Feb 2018 17:33:28 +0100 Subject: [PATCH] Bug 1441014: Deindent / Simplify some code for slot removal. r=smaug MozReview-Commit-ID: LcbZSXnbVLL --HG-- extra : rebase_source : 4837bad53294892b7b625f565e99b14a75cb3a5c --- dom/base/ShadowRoot.cpp | 73 +++++++++++++++++++++-------------------- dom/base/ShadowRoot.h | 3 +- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/dom/base/ShadowRoot.cpp b/dom/base/ShadowRoot.cpp index afc737fdbe48..9ee28d1b62b8 100644 --- a/dom/base/ShadowRoot.cpp +++ b/dom/base/ShadowRoot.cpp @@ -104,14 +104,13 @@ ShadowRoot::AddSlot(HTMLSlotElement* aSlot) MOZ_ASSERT(aSlot); // Note that if name attribute missing, the slot is a default slot. - nsAutoString name; + nsAutoString name; aSlot->GetName(name); nsTArray* currentSlots = mSlotMap.LookupOrAdd(name); MOZ_ASSERT(currentSlots); - HTMLSlotElement* oldSlot = currentSlots->IsEmpty() ? - nullptr : currentSlots->ElementAt(0); + HTMLSlotElement* oldSlot = currentSlots->SafeElementAt(0); TreeOrderComparator comparator; currentSlots->InsertElementSorted(aSlot, comparator); @@ -166,41 +165,43 @@ ShadowRoot::RemoveSlot(HTMLSlotElement* aSlot) nsAutoString name; aSlot->GetName(name); - nsTArray* currentSlots = mSlotMap.Get(name); + SlotArray* currentSlots = mSlotMap.Get(name); + MOZ_DIAGNOSTIC_ASSERT(currentSlots && currentSlots->Contains(aSlot), + "Slot to deregister wasn't found?"); + if (currentSlots->Length() == 1) { + MOZ_ASSERT(currentSlots->ElementAt(0) == aSlot); + mSlotMap.Remove(name); - if (currentSlots) { - if (currentSlots->Length() == 1) { - MOZ_ASSERT(currentSlots->ElementAt(0) == aSlot); - mSlotMap.Remove(name); - - if (aSlot->AssignedNodes().Length() > 0) { - aSlot->ClearAssignedNodes(); - aSlot->EnqueueSlotChangeEvent(); - } - } else { - bool doEnqueueSlotChange = false; - bool doReplaceSlot = currentSlots->ElementAt(0) == aSlot; - currentSlots->RemoveElement(aSlot); - HTMLSlotElement* replacementSlot = currentSlots->ElementAt(0); - - // Move assigned nodes from removed slot to the next slot in - // tree order with the same name. - if (doReplaceSlot) { - const nsTArray>& assignedNodes = aSlot->AssignedNodes(); - while (assignedNodes.Length() > 0) { - nsINode* assignedNode = assignedNodes[0]; - - aSlot->RemoveAssignedNode(assignedNode); - replacementSlot->AppendAssignedNode(assignedNode); - doEnqueueSlotChange = true; - } - - if (doEnqueueSlotChange) { - aSlot->EnqueueSlotChangeEvent(); - replacementSlot->EnqueueSlotChangeEvent(); - } - } + if (!aSlot->AssignedNodes().IsEmpty()) { + aSlot->ClearAssignedNodes(); + aSlot->EnqueueSlotChangeEvent(); } + + return; + } + + const bool wasFirstSlot = currentSlots->ElementAt(0) == aSlot; + currentSlots->RemoveElement(aSlot); + + // Move assigned nodes from removed slot to the next slot in + // tree order with the same name. + if (!wasFirstSlot) { + return; + } + + HTMLSlotElement* replacementSlot = currentSlots->ElementAt(0); + const nsTArray>& assignedNodes = aSlot->AssignedNodes(); + bool slottedNodesChanged = !assignedNodes.IsEmpty(); + while (!assignedNodes.IsEmpty()) { + nsINode* assignedNode = assignedNodes[0]; + + aSlot->RemoveAssignedNode(assignedNode); + replacementSlot->AppendAssignedNode(assignedNode); + } + + if (slottedNodesChanged) { + aSlot->EnqueueSlotChangeEvent(); + replacementSlot->EnqueueSlotChangeEvent(); } } diff --git a/dom/base/ShadowRoot.h b/dom/base/ShadowRoot.h index e7faec15f9be..314e225fe4a0 100644 --- a/dom/base/ShadowRoot.h +++ b/dom/base/ShadowRoot.h @@ -149,10 +149,11 @@ protected: ShadowRootMode mMode; + using SlotArray = AutoTArray; // Map from name of slot to an array of all slots in the shadow DOM with with // the given name. The slots are stored as a weak pointer because the elements // are in the shadow tree and should be kept alive by its parent. - nsClassHashtable> mSlotMap; + nsClassHashtable mSlotMap; nsXBLPrototypeBinding* mProtoBinding; // It is necessary to hold a reference to the associated nsXBLBinding