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 | |
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
6 files changed, 23 insertions, 97 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> diff --git a/testing/web-platform/meta/custom-elements/reaction-timing.html.ini b/testing/web-platform/meta/custom-elements/reaction-timing.html.ini deleted file mode 100644 index 0697f7014..000000000 --- a/testing/web-platform/meta/custom-elements/reaction-timing.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[reaction-timing.html] - type: testharness - [Calling Node.prototype.cloneNode(false) must push a new element queue to the processing stack] - expected: FAIL - diff --git a/testing/web-platform/meta/custom-elements/reactions/Node.html.ini b/testing/web-platform/meta/custom-elements/reactions/Node.html.ini deleted file mode 100644 index c14ca17df..000000000 --- a/testing/web-platform/meta/custom-elements/reactions/Node.html.ini +++ /dev/null @@ -1,22 +0,0 @@ -[Node.html] - type: testharness - [nodeValue on Node must enqueue an attributeChanged reaction when replacing an existing attribute] - expected: FAIL - - [nodeValue on Node must not enqueue an attributeChanged reaction when replacing an existing unobserved attribute] - expected: FAIL - - [textContent on Node must enqueue an attributeChanged reaction when replacing an existing attribute] - expected: FAIL - - [textContent on Node must not enqueue an attributeChanged reaction when replacing an existing unobserved attribute] - expected: FAIL - - [cloneNode on Node must enqueue an attributeChanged reaction when cloning an element with an observed attribute] - expected: FAIL - - [cloneNode on Node must not enqueue an attributeChanged reaction when cloning an element with an unobserved attribute] - expected: FAIL - - [cloneNode on Node must enqueue an attributeChanged reaction when cloning an element only for observed attributes] - expected: FAIL diff --git a/testing/web-platform/meta/custom-elements/reactions/Range.html.ini b/testing/web-platform/meta/custom-elements/reactions/Range.html.ini deleted file mode 100644 index 62ab491ad..000000000 --- a/testing/web-platform/meta/custom-elements/reactions/Range.html.ini +++ /dev/null @@ -1,10 +0,0 @@ -[Range.html] - type: testharness - [cloneContents on Range must enqueue an attributeChanged reaction when cloning an element with an observed attribute] - expected: FAIL - - [cloneContents on Range must not enqueue an attributeChanged reaction when cloning an element with an unobserved attribute] - expected: FAIL - - [cloneContents on Range must enqueue an attributeChanged reaction when cloning an element only for observed attributes] - expected: FAIL |