diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2020-01-05 18:26:21 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2020-01-26 15:50:30 -0500 |
commit | 6ec385fbdb2523fb2876055a054ba1cdf6916784 (patch) | |
tree | 017f97253f737cc6f6ffb0864c74ac889d286d6b /dom/base | |
parent | 8e6ce5fae721e5a4caf38b0b72e1c4a0324ae55e (diff) | |
download | UXP-6ec385fbdb2523fb2876055a054ba1cdf6916784.tar UXP-6ec385fbdb2523fb2876055a054ba1cdf6916784.tar.gz UXP-6ec385fbdb2523fb2876055a054ba1cdf6916784.tar.lz UXP-6ec385fbdb2523fb2876055a054ba1cdf6916784.tar.xz UXP-6ec385fbdb2523fb2876055a054ba1cdf6916784.zip |
Bug 1319342 - Clone a node should enqueue an upgrade reaction.
Tag UXP Issue #1344
Diffstat (limited to 'dom/base')
-rw-r--r-- | dom/base/nsNodeUtils.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
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<nsIAtom> 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. <button is="x-button"> nsAutoString extension; if (elem->GetAttr(kNameSpaceID_None, nsGkAtoms::is, extension) && !extension.IsEmpty()) { - nsContentUtils::SetupCustomElement(elem, &extension); + definition = + nsContentUtils::LookupCustomElementDefinition(nodeInfo->GetDocument(), + nodeInfo->LocalName(), + nodeInfo->NamespaceID(), + &extension); + if (definition) { + RefPtr<nsIAtom> typeAtom = NS_Atomize(extension); + elem->SetCustomElementData(new CustomElementData(typeAtom)); + nsContentUtils::EnqueueUpgradeReaction(elem, definition); + } } } } |