summaryrefslogtreecommitdiff
path: root/dom
diff options
context:
space:
mode:
authorGaming4JC <g4jc@hyperbola.info>2020-01-05 18:26:21 -0500
committerGaming4JC <g4jc@hyperbola.info>2020-01-26 15:50:30 -0500
commit59f9d7c28d0df19be73d9c231518ac724d9a327d (patch)
tree017f97253f737cc6f6ffb0864c74ac889d286d6b /dom
parent85488126cd11977d1552b23ac22c5899576a578a (diff)
downloadaura-central-59f9d7c28d0df19be73d9c231518ac724d9a327d.tar.gz
Bug 1319342 - Clone a node should enqueue an upgrade reaction.
Tag UXP Issue mcp-graveyard/UXP%1344
Diffstat (limited to 'dom')
-rw-r--r--dom/base/nsNodeUtils.cpp28
-rw-r--r--dom/tests/mochitest/webcomponents/mochitest.ini1
-rw-r--r--dom/tests/mochitest/webcomponents/test_custom_element_clone_callbacks.html54
3 files changed, 23 insertions, 60 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);
+ }
}
}
}
diff --git a/dom/tests/mochitest/webcomponents/mochitest.ini b/dom/tests/mochitest/webcomponents/mochitest.ini
index 76c8abc38..e8f632e39 100644
--- a/dom/tests/mochitest/webcomponents/mochitest.ini
+++ b/dom/tests/mochitest/webcomponents/mochitest.ini
@@ -10,7 +10,6 @@ support-files =
[test_content_element.html]
[test_custom_element_adopt_callbacks.html]
[test_custom_element_callback_innerhtml.html]
-[test_custom_element_clone_callbacks.html]
[test_custom_element_clone_callbacks_extended.html]
[test_custom_element_htmlconstructor.html]
skip-if = os == 'android' # bug 1323645
diff --git a/dom/tests/mochitest/webcomponents/test_custom_element_clone_callbacks.html b/dom/tests/mochitest/webcomponents/test_custom_element_clone_callbacks.html
deleted file mode 100644
index eea9bafe0..000000000
--- a/dom/tests/mochitest/webcomponents/test_custom_element_clone_callbacks.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=1081039
--->
-<head>
- <title>Test callbacks for cloned custom elements.</title>
- <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1081039">Bug 1081039</a>
-<script>
-
-SimpleTest.waitForExplicitFinish();
-
-// Test to make sure created callback is called on clones that are upgraded and clones
-// created after registering the custom element.
-
-var callbackCalledOnUpgrade = false;
-var callbackCalledOnClone = false;
-
-var foo = document.createElement("x-foo");
-var fooClone = foo.cloneNode(true);
-
-var p = Object.create(HTMLElement.prototype);
-p.createdCallback = function() {
- is(this.__proto__, p, "Correct prototype should be set on custom elements.");
-
- if (this == fooClone) {
- // Callback called for the element created before registering the custom element.
- // Should be called on element upgrade.
- is(callbackCalledOnUpgrade, false, "Upgrade should only be called once per clone.");
- callbackCalledOnUpgrade = true;
- } else if (this != foo) {
- // Callback called for the element created after registering the custom element.
- is(callbackCalledOnClone, false, "Upgrade should only be called once per clone.");
- callbackCalledOnClone = true;
- }
-
- if (callbackCalledOnUpgrade && callbackCalledOnClone) {
- SimpleTest.finish();
- }
-};
-
-document.registerElement("x-foo", { prototype: p });
-
-var anotherFooClone = foo.cloneNode(true);
-
-SimpleTest.waitForExplicitFinish();
-
-</script>
-</body>
-</html>