From cc533eaee5b800a534b93484598779debcdf5591 Mon Sep 17 00:00:00 2001 From: Gaming4JC Date: Sat, 4 Jan 2020 19:48:30 -0500 Subject: Bug 1377993 - Make node slots less memory hungry in common cases. Tag UXP Issue #1344 --- dom/base/nsNodeUtils.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'dom/base/nsNodeUtils.cpp') diff --git a/dom/base/nsNodeUtils.cpp b/dom/base/nsNodeUtils.cpp index 75d408151..c38f08a3d 100644 --- a/dom/base/nsNodeUtils.cpp +++ b/dom/base/nsNodeUtils.cpp @@ -301,9 +301,12 @@ nsNodeUtils::LastRelease(nsINode* aNode) Element* elem = aNode->AsElement(); FragmentOrElement::nsDOMSlots* domSlots = static_cast(slots); - for (auto iter = domSlots->mRegisteredIntersectionObservers.Iter(); !iter.Done(); iter.Next()) { - DOMIntersectionObserver* observer = iter.Key(); - observer->UnlinkTarget(*elem); + if (domSlots->mExtendedSlots) { + for (auto iter = domSlots->mExtendedSlots->mRegisteredIntersectionObservers.Iter(); + !iter.Done(); iter.Next()) { + DOMIntersectionObserver* observer = iter.Key(); + observer->UnlinkTarget(*elem); + } } } -- cgit v1.2.3 From 8e6ce5fae721e5a4caf38b0b72e1c4a0324ae55e Mon Sep 17 00:00:00 2001 From: Gaming4JC Date: Sun, 5 Jan 2020 18:15:57 -0500 Subject: Bug 1121994 - Implement adopted callback for custom elements. Tag UXP Issue #1344 --- dom/base/nsNodeUtils.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'dom/base/nsNodeUtils.cpp') diff --git a/dom/base/nsNodeUtils.cpp b/dom/base/nsNodeUtils.cpp index c38f08a3d..ce023ccfa 100644 --- a/dom/base/nsNodeUtils.cpp +++ b/dom/base/nsNodeUtils.cpp @@ -526,6 +526,23 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep, nsIDocument* newDoc = aNode->OwnerDoc(); if (newDoc) { + if (CustomElementRegistry::IsCustomElementEnabled()) { + // Adopted callback must be enqueued whenever a node’s + // shadow-including inclusive descendants that is custom. + Element* element = aNode->IsElement() ? aNode->AsElement() : nullptr; + if (element) { + RefPtr data = element->GetCustomElementData(); + if (data && data->mState == CustomElementData::State::eCustom) { + LifecycleAdoptedCallbackArgs args = { + oldDoc, + newDoc + }; + nsContentUtils::EnqueueLifecycleCallback(nsIDocument::eAdopted, + element, nullptr, &args); + } + } + } + // XXX what if oldDoc is null, we don't know if this should be // registered or not! Can that really happen? if (wasRegistered) { -- cgit v1.2.3 From 6ec385fbdb2523fb2876055a054ba1cdf6916784 Mon Sep 17 00:00:00 2001 From: Gaming4JC Date: Sun, 5 Jan 2020 18:26:21 -0500 Subject: Bug 1319342 - Clone a node should enqueue an upgrade reaction. Tag UXP Issue #1344 --- dom/base/nsNodeUtils.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'dom/base/nsNodeUtils.cpp') diff --git a/dom/base/nsNodeUtils.cpp b/dom/base/nsNodeUtils.cpp index ce023ccfa..862b5db14 100644 --- a/dom/base/nsNodeUtils.cpp +++ b/dom/base/nsNodeUtils.cpp @@ -479,19 +479,37 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep, rv = aNode->Clone(nodeInfo, getter_AddRefs(clone)); NS_ENSURE_SUCCESS(rv, rv); - if (clone->IsElement()) { + if (CustomElementRegistry::IsCustomElementEnabled() && clone->IsElement()) { // The cloned node may be a custom element that may require - // enqueing created callback and prototype swizzling. + // enqueing upgrade reaction. Element* elem = clone->AsElement(); - if (nsContentUtils::IsCustomElementName(nodeInfo->NameAtom())) { - nsContentUtils::SetupCustomElement(elem); + CustomElementDefinition* definition = nullptr; + RefPtr tagAtom = nodeInfo->NameAtom(); + if (nsContentUtils::IsCustomElementName(tagAtom)) { + definition = + nsContentUtils::LookupCustomElementDefinition(nodeInfo->GetDocument(), + nodeInfo->LocalName(), + nodeInfo->NamespaceID()); + if (definition) { + elem->SetCustomElementData(new CustomElementData(tagAtom)); + nsContentUtils::EnqueueUpgradeReaction(elem, definition); + } } else { // Check if node may be custom element by type extension. // ex.