Bug 1441014: Deindent / Simplify some code for slot removal. r=smaug

MozReview-Commit-ID: LcbZSXnbVLL

--HG--
extra : rebase_source : 4837bad53294892b7b625f565e99b14a75cb3a5c
This commit is contained in:
Emilio Cobos Álvarez 2018-02-25 17:33:28 +01:00
Родитель dd24e9bc5f
Коммит 02b71da95a
2 изменённых файлов: 39 добавлений и 37 удалений

Просмотреть файл

@ -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<HTMLSlotElement*>* 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<HTMLSlotElement*>* 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<RefPtr<nsINode>>& 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<RefPtr<nsINode>>& 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();
}
}

Просмотреть файл

@ -149,10 +149,11 @@ protected:
ShadowRootMode mMode;
using SlotArray = AutoTArray<HTMLSlotElement*, 1>;
// 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<nsStringHashKey, nsTArray<mozilla::dom::HTMLSlotElement*>> mSlotMap;
nsClassHashtable<nsStringHashKey, SlotArray> mSlotMap;
nsXBLPrototypeBinding* mProtoBinding;
// It is necessary to hold a reference to the associated nsXBLBinding