summaryrefslogtreecommitdiffstats
path: root/dom/base/nsNodeUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/nsNodeUtils.cpp')
-rw-r--r--dom/base/nsNodeUtils.cpp64
1 files changed, 49 insertions, 15 deletions
diff --git a/dom/base/nsNodeUtils.cpp b/dom/base/nsNodeUtils.cpp
index 75d408151..384e56cde 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<FragmentOrElement::nsDOMSlots*>(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);
+ }
}
}
@@ -476,19 +479,33 @@ 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->IsHTMLElement()) {
// The cloned node may be a custom element that may require
- // enqueing created callback and prototype swizzling.
- Element* elem = clone->AsElement();
- if (nsContentUtils::IsCustomElementName(nodeInfo->NameAtom())) {
- nsContentUtils::SetupCustomElement(elem);
- } else {
- // Check if node may be custom element by type extension.
- // ex. <button is="x-button">
- nsAutoString extension;
- if (elem->GetAttr(kNameSpaceID_None, nsGkAtoms::is, extension) &&
- !extension.IsEmpty()) {
- nsContentUtils::SetupCustomElement(elem, &extension);
+ // enqueing upgrade reaction.
+ Element* cloneElem = clone->AsElement();
+ RefPtr<nsIAtom> tagAtom = nodeInfo->NameAtom();
+ CustomElementData* data = elem->GetCustomElementData();
+
+ // Check if node may be custom element by type extension.
+ // ex. <button is="x-button">
+ nsAutoString extension;
+ if (!data || data->GetCustomElementType() != tagAtom) {
+ cloneElem->GetAttr(kNameSpaceID_None, nsGkAtoms::is, extension);
+ }
+
+ if (data || !extension.IsEmpty()) {
+ RefPtr<nsIAtom> typeAtom = extension.IsEmpty() ? tagAtom : NS_Atomize(extension);
+ cloneElem->SetCustomElementData(new CustomElementData(typeAtom));
+
+ MOZ_ASSERT(nodeInfo->NameAtom()->Equals(nodeInfo->LocalName()));
+ CustomElementDefinition* definition =
+ nsContentUtils::LookupCustomElementDefinition(nodeInfo->GetDocument(),
+ nodeInfo->NameAtom(),
+ nodeInfo->NamespaceID(),
+ typeAtom);
+ if (definition) {
+ nsContentUtils::EnqueueUpgradeReaction(cloneElem, definition);
}
}
}
@@ -523,6 +540,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) {
+ CustomElementData* 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) {