Title: [177314] trunk
Revision
177314
Author
[email protected]
Date
2014-12-15 14:19:38 -0800 (Mon, 15 Dec 2014)

Log Message

cloneNode(true) does not clone nested template elements' contents
https://bugs.webkit.org/show_bug.cgi?id=137755

Reviewed by Darin Adler.

Source/WebCore:

The bug was caused by cloneChildNodes not copying template element's content.

Fixed the bug by adding the third behavior (CloneContent) to the polymorphic
cloneNodeInternal, which copies template element's content but not its children,
in addition to the existing CloneSelf (deep=false) and CloneChildren (deep=true).

Test: fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html

* dom/Attr.cpp:
(WebCore::Attr::cloneNodeInternal): Renamed from cloneNode.
* dom/Attr.h:
* dom/CDATASection.cpp:
(WebCore::CDATASection::cloneNodeInternal): Renamed from cloneNode.
* dom/CDATASection.h:
* dom/Comment.cpp:
(WebCore::Comment::cloneNodeInternal): Renamed from cloneNode.
* dom/Comment.h:
* dom/ContainerNode.cpp:
(WebCore::ContainerNode::cloneChildNodes): Calls cloneNode with CloneContent.
* dom/Document.cpp:
(WebCore::Document::cloneNodeInternal): Renamed from cloneNode.
* dom/Document.h:
* dom/DocumentFragment.cpp:
(WebCore::DocumentFragment::cloneNodeInternal): Renamed from cloneNode.
* dom/DocumentFragment.h:
* dom/DocumentType.cpp:
(WebCore::DocumentType::cloneNodeInternal): Renamed from cloneNode.
* dom/DocumentType.h:
* dom/Element.cpp:
(WebCore::Element::cloneNodeInternal): Renamed from cloneNode.
* dom/Element.h:
* dom/EntityReference.cpp:
(WebCore::EntityReference::cloneNodeInternal): Renamed from cloneNode.
* dom/EntityReference.h:
* dom/Node.h:
(WebCore::Node::cloneNode): Added. It calls cloneNodeInternal with CloneSelf or CloneChildren.
* dom/ProcessingInstruction.cpp:
(WebCore::ProcessingInstruction::cloneNodeInternal): Renamed from cloneNode.
* dom/ProcessingInstruction.h:
* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::cloneNodeInternal): Renamed from cloneNode. Also moved from ShadowRoot.h.
* dom/ShadowRoot.h:
* dom/Text.cpp:
(WebCore::Text::cloneNodeInternal): Renamed from cloneNode.
* dom/Text.h:
* html/HTMLTemplateElement.cpp:
(WebCore::HTMLTemplateElement::cloneNodeInternal): Renamed from cloneNode. This is the only
function in which CloneContent results in a different behavior from CloneSelf.
* html/HTMLTemplateElement.h:

LayoutTests:

Added a regression test.

* fast/dom/HTMLTemplateElement/cloneNode-nested-templates-expected.txt: Added.
* fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (177313 => 177314)


--- trunk/LayoutTests/ChangeLog	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/LayoutTests/ChangeLog	2014-12-15 22:19:38 UTC (rev 177314)
@@ -1,3 +1,15 @@
+2014-12-15  Ryosuke Niwa  <[email protected]>
+
+        cloneNode(true) does not clone nested template elements' contents
+        https://bugs.webkit.org/show_bug.cgi?id=137755
+
+        Reviewed by Darin Adler.
+
+        Added a regression test.
+
+        * fast/dom/HTMLTemplateElement/cloneNode-nested-templates-expected.txt: Added.
+        * fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html: Added.
+
 2014-12-15  Benjamin Poulain  <[email protected]>
 
         Unify the various serialization of selector list

Added: trunk/LayoutTests/fast/dom/HTMLTemplateElement/cloneNode-nested-templates-expected.txt (0 => 177314)


--- trunk/LayoutTests/fast/dom/HTMLTemplateElement/cloneNode-nested-templates-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/HTMLTemplateElement/cloneNode-nested-templates-expected.txt	2014-12-15 22:19:38 UTC (rev 177314)
@@ -0,0 +1,19 @@
+Test that template contents are not cloned when the template element is cloned
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+clonedOuterTemplate = outerTemplate.cloneNode(true)
+PASS clonedOuterTemplate.content is not outerTemplate.content
+PASS clonedOuterTemplate.content.childNodes.length is 1
+innerTemplate = outerTemplate.content.firstChild
+clonedInnerTemplate = clonedOuterTemplate.content.firstChild
+PASS clonedInnerTemplate.outerHTML is innerTemplate.outerHTML
+PASS clonedInnerTemplate.content is not innerTemplate.content
+PASS innerTemplate.content.childNodes.length is 1
+PASS clonedInnerTemplate.content.childNodes.length is 1
+PASS innerTemplate.content.firstChild.outerHTML is clonedInnerTemplate.content.firstChild.outerHTML
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html (0 => 177314)


--- trunk/LayoutTests/fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html	2014-12-15 22:19:38 UTC (rev 177314)
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<body>
+<template id="outerTemplate"><template id="innerTemplate"><span>Contents</span></template></template>
+<script src=""
+<script>
+
+description('Test that template contents are not cloned when the template element is cloned');
+
+if (!window.HTMLTemplateElement)
+    testFailed('This test requires ENABLE(TEMPLATE_ELEMENT)');
+
+var outerTemplate = document.getElementById('outerTemplate');
+evalAndLog('clonedOuterTemplate = outerTemplate.cloneNode(true)');
+shouldNotBe('clonedOuterTemplate.content', 'outerTemplate.content');
+shouldBe('clonedOuterTemplate.content.childNodes.length', '1');
+evalAndLog('innerTemplate = outerTemplate.content.firstChild');
+evalAndLog('clonedInnerTemplate = clonedOuterTemplate.content.firstChild');
+shouldBe('clonedInnerTemplate.outerHTML', 'innerTemplate.outerHTML');
+shouldNotBe('clonedInnerTemplate.content', 'innerTemplate.content');
+shouldBe('innerTemplate.content.childNodes.length', '1');
+shouldBe('clonedInnerTemplate.content.childNodes.length', '1');
+shouldBe('innerTemplate.content.firstChild.outerHTML', 'clonedInnerTemplate.content.firstChild.outerHTML');
+
+var successfullyParsed = true;
+
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (177313 => 177314)


--- trunk/Source/WebCore/ChangeLog	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/ChangeLog	2014-12-15 22:19:38 UTC (rev 177314)
@@ -1,3 +1,60 @@
+2014-12-15  Ryosuke Niwa  <[email protected]>
+
+        cloneNode(true) does not clone nested template elements' contents
+        https://bugs.webkit.org/show_bug.cgi?id=137755
+
+        Reviewed by Darin Adler.
+
+        The bug was caused by cloneChildNodes not copying template element's content.
+
+        Fixed the bug by adding the third behavior (CloneContent) to the polymorphic
+        cloneNodeInternal, which copies template element's content but not its children,
+        in addition to the existing CloneSelf (deep=false) and CloneChildren (deep=true).
+
+        Test: fast/dom/HTMLTemplateElement/cloneNode-nested-templates.html
+
+        * dom/Attr.cpp:
+        (WebCore::Attr::cloneNodeInternal): Renamed from cloneNode.
+        * dom/Attr.h:
+        * dom/CDATASection.cpp:
+        (WebCore::CDATASection::cloneNodeInternal): Renamed from cloneNode.
+        * dom/CDATASection.h:
+        * dom/Comment.cpp:
+        (WebCore::Comment::cloneNodeInternal): Renamed from cloneNode.
+        * dom/Comment.h:
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::cloneChildNodes): Calls cloneNode with CloneContent.
+        * dom/Document.cpp:
+        (WebCore::Document::cloneNodeInternal): Renamed from cloneNode.
+        * dom/Document.h:
+        * dom/DocumentFragment.cpp:
+        (WebCore::DocumentFragment::cloneNodeInternal): Renamed from cloneNode.
+        * dom/DocumentFragment.h:
+        * dom/DocumentType.cpp:
+        (WebCore::DocumentType::cloneNodeInternal): Renamed from cloneNode.
+        * dom/DocumentType.h:
+        * dom/Element.cpp:
+        (WebCore::Element::cloneNodeInternal): Renamed from cloneNode.
+        * dom/Element.h:
+        * dom/EntityReference.cpp:
+        (WebCore::EntityReference::cloneNodeInternal): Renamed from cloneNode.
+        * dom/EntityReference.h:
+        * dom/Node.h:
+        (WebCore::Node::cloneNode): Added. It calls cloneNodeInternal with CloneSelf or CloneChildren.
+        * dom/ProcessingInstruction.cpp:
+        (WebCore::ProcessingInstruction::cloneNodeInternal): Renamed from cloneNode.
+        * dom/ProcessingInstruction.h:
+        * dom/ShadowRoot.cpp:
+        (WebCore::ShadowRoot::cloneNodeInternal): Renamed from cloneNode. Also moved from ShadowRoot.h.
+        * dom/ShadowRoot.h:
+        * dom/Text.cpp:
+        (WebCore::Text::cloneNodeInternal): Renamed from cloneNode.
+        * dom/Text.h:
+        * html/HTMLTemplateElement.cpp:
+        (WebCore::HTMLTemplateElement::cloneNodeInternal): Renamed from cloneNode. This is the only
+        function in which CloneContent results in a different behavior from CloneSelf.
+        * html/HTMLTemplateElement.h:
+
 2014-12-15  Benjamin Poulain  <[email protected]>
 
         Unify the various serialization of selector list

Modified: trunk/Source/WebCore/dom/Attr.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/Attr.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Attr.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -137,7 +137,7 @@
     setValue(v, ec);
 }
 
-RefPtr<Node> Attr::cloneNode(bool /*deep*/)
+RefPtr<Node> Attr::cloneNodeInternal(CloningOperation)
 {
     RefPtr<Attr> clone = adoptRef(new Attr(document(), qualifiedName(), value()));
     cloneChildNodes(clone.get());

Modified: trunk/Source/WebCore/dom/Attr.h (177313 => 177314)


--- trunk/Source/WebCore/dom/Attr.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Attr.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -80,7 +80,7 @@
 
     virtual String nodeValue() const override { return value(); }
     virtual void setNodeValue(const String&, ExceptionCode&) override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
 
     virtual bool isAttributeNode() const override { return true; }
     virtual bool childTypeAllowed(NodeType) const override;

Modified: trunk/Source/WebCore/dom/CDATASection.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/CDATASection.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/CDATASection.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -46,7 +46,7 @@
     return CDATA_SECTION_NODE;
 }
 
-RefPtr<Node> CDATASection::cloneNode(bool /*deep*/)
+RefPtr<Node> CDATASection::cloneNodeInternal(CloningOperation)
 {
     return create(document(), data());
 }

Modified: trunk/Source/WebCore/dom/CDATASection.h (177313 => 177314)


--- trunk/Source/WebCore/dom/CDATASection.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/CDATASection.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -36,7 +36,7 @@
 
     virtual String nodeName() const override;
     virtual NodeType nodeType() const override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
     virtual bool childTypeAllowed(NodeType) const override;
     virtual RefPtr<Text> virtualCreate(const String&) override;
 };

Modified: trunk/Source/WebCore/dom/Comment.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/Comment.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Comment.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -51,7 +51,7 @@
     return COMMENT_NODE;
 }
 
-RefPtr<Node> Comment::cloneNode(bool /*deep*/)
+RefPtr<Node> Comment::cloneNodeInternal(CloningOperation)
 {
     return create(document(), data());
 }

Modified: trunk/Source/WebCore/dom/Comment.h (177313 => 177314)


--- trunk/Source/WebCore/dom/Comment.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Comment.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -37,7 +37,7 @@
 
     virtual String nodeName() const override;
     virtual NodeType nodeType() const override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
     virtual bool childTypeAllowed(NodeType) const override;
 };
 

Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/ContainerNode.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -769,7 +769,7 @@
 {
     ExceptionCode ec = 0;
     for (Node* child = firstChild(); child && !ec; child = child->nextSibling()) {
-        RefPtr<Node> clonedChild = child->cloneNode(false);
+        RefPtr<Node> clonedChild = child->cloneNodeInternal(CloningOperation::SelfWithTemplateContent);
         clone->appendChild(clonedChild, ec);
 
         if (!ec && is<ContainerNode>(child))

Modified: trunk/Source/WebCore/dom/Document.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/Document.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Document.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -3183,12 +3183,18 @@
     return true;
 }
 
-RefPtr<Node> Document::cloneNode(bool deep)
+RefPtr<Node> Document::cloneNodeInternal(CloningOperation type)
 {
     RefPtr<Document> clone = cloneDocumentWithoutChildren();
     clone->cloneDataFromDocument(*this);
-    if (deep)
+    switch (type) {
+    case CloningOperation::OnlySelf:
+    case CloningOperation::SelfWithTemplateContent:
+        break;
+    case CloningOperation::Everything:
         cloneChildNodes(clone.get());
+        break;
+    }
     return clone;
 }
 

Modified: trunk/Source/WebCore/dom/Document.h (177313 => 177314)


--- trunk/Source/WebCore/dom/Document.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Document.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -1308,7 +1308,7 @@
     virtual String nodeName() const override final;
     virtual NodeType nodeType() const override final;
     virtual bool childTypeAllowed(NodeType) const override final;
-    virtual RefPtr<Node> cloneNode(bool deep) override final;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override final;
     void cloneDataFromDocument(const Document&);
 
     virtual void refScriptExecutionContext() override final { ref(); }

Modified: trunk/Source/WebCore/dom/DocumentFragment.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/DocumentFragment.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/DocumentFragment.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -71,11 +71,17 @@
     }
 }
 
-RefPtr<Node> DocumentFragment::cloneNode(bool deep)
+RefPtr<Node> DocumentFragment::cloneNodeInternal(CloningOperation type)
 {
     RefPtr<DocumentFragment> clone = create(document());
-    if (deep)
+    switch (type) {
+    case CloningOperation::OnlySelf:
+    case CloningOperation::SelfWithTemplateContent:
+        break;
+    case CloningOperation::Everything:
         cloneChildNodes(clone.get());
+        break;
+    }
     return clone;
 }
 

Modified: trunk/Source/WebCore/dom/DocumentFragment.h (177313 => 177314)


--- trunk/Source/WebCore/dom/DocumentFragment.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/DocumentFragment.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -48,7 +48,7 @@
 
 private:
     virtual NodeType nodeType() const override final;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
     virtual bool childTypeAllowed(NodeType) const override;
 };
 

Modified: trunk/Source/WebCore/dom/DocumentType.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/DocumentType.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/DocumentType.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -51,7 +51,7 @@
     return DOCUMENT_TYPE_NODE;
 }
 
-RefPtr<Node> DocumentType::cloneNode(bool /*deep*/)
+RefPtr<Node> DocumentType::cloneNodeInternal(CloningOperation)
 {
     return create(document(), m_name, m_publicId, m_systemId);
 }

Modified: trunk/Source/WebCore/dom/DocumentType.h (177313 => 177314)


--- trunk/Source/WebCore/dom/DocumentType.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/DocumentType.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -52,7 +52,7 @@
     virtual URL baseURI() const override;
     virtual String nodeName() const override;
     virtual NodeType nodeType() const override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
 
     String m_name;
     String m_publicId;

Modified: trunk/Source/WebCore/dom/Element.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/Element.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Element.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -289,9 +289,17 @@
 DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, focus);
 DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, load);
 
-RefPtr<Node> Element::cloneNode(bool deep)
+RefPtr<Node> Element::cloneNodeInternal(CloningOperation type)
 {
-    return deep ? cloneElementWithChildren() : cloneElementWithoutChildren();
+    switch (type) {
+    case CloningOperation::OnlySelf:
+    case CloningOperation::SelfWithTemplateContent:
+        return cloneElementWithoutChildren();
+    case CloningOperation::Everything:
+        return cloneElementWithChildren();
+    }
+    ASSERT_NOT_REACHED();
+    return nullptr;
 }
 
 RefPtr<Element> Element::cloneElementWithChildren()

Modified: trunk/Source/WebCore/dom/Element.h (177313 => 177314)


--- trunk/Source/WebCore/dom/Element.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Element.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -632,7 +632,7 @@
 
     // cloneNode is private so that non-virtual cloneElementWithChildren and cloneElementWithoutChildren
     // are used instead.
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
     virtual RefPtr<Element> cloneElementWithoutAttributesAndChildren();
 
     void addShadowRoot(PassRefPtr<ShadowRoot>);

Modified: trunk/Source/WebCore/dom/EntityReference.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/EntityReference.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/EntityReference.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -46,7 +46,7 @@
     return ENTITY_REFERENCE_NODE;
 }
 
-RefPtr<Node> EntityReference::cloneNode(bool)
+RefPtr<Node> EntityReference::cloneNodeInternal(CloningOperation)
 {
     return create(document(), m_entityName);
 }

Modified: trunk/Source/WebCore/dom/EntityReference.h (177313 => 177314)


--- trunk/Source/WebCore/dom/EntityReference.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/EntityReference.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -35,7 +35,7 @@
 
     virtual String nodeName() const override;
     virtual NodeType nodeType() const override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
 
     String m_entityName;
 };

Modified: trunk/Source/WebCore/dom/Node.h (177313 => 177314)


--- trunk/Source/WebCore/dom/Node.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Node.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -203,7 +203,15 @@
 
     WEBCORE_EXPORT void remove(ExceptionCode&);
     bool hasChildNodes() const { return firstChild(); }
-    virtual RefPtr<Node> cloneNode(bool deep) = 0;
+
+    enum class CloningOperation {
+        OnlySelf,
+        SelfWithTemplateContent,
+        Everything,
+    };
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) = 0;
+    RefPtr<Node> cloneNode(bool deep) { return cloneNodeInternal(deep ? CloningOperation::Everything : CloningOperation::OnlySelf); }
+
     virtual const AtomicString& localName() const;
     virtual const AtomicString& namespaceURI() const;
     virtual const AtomicString& prefix() const;

Modified: trunk/Source/WebCore/dom/ProcessingInstruction.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/ProcessingInstruction.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/ProcessingInstruction.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -79,7 +79,7 @@
     return PROCESSING_INSTRUCTION_NODE;
 }
 
-RefPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/)
+RefPtr<Node> ProcessingInstruction::cloneNodeInternal(CloningOperation)
 {
     // FIXME: Is it a problem that this does not copy m_localHref?
     // What about other data members?

Modified: trunk/Source/WebCore/dom/ProcessingInstruction.h (177313 => 177314)


--- trunk/Source/WebCore/dom/ProcessingInstruction.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/ProcessingInstruction.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -58,7 +58,7 @@
 
     virtual String nodeName() const override;
     virtual NodeType nodeType() const override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
 
     virtual InsertionNotificationRequest insertedInto(ContainerNode&) override;
     virtual void removedFrom(ContainerNode&) override;

Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/ShadowRoot.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -131,6 +131,11 @@
     invalidateDistribution();
 }
 
+RefPtr<Node> ShadowRoot::cloneNodeInternal(CloningOperation)
+{
+    return nullptr; // ShadowRoots should never be cloned.
+}
+
 void ShadowRoot::removeAllEventListeners()
 {
     DocumentFragment::removeAllEventListeners();

Modified: trunk/Source/WebCore/dom/ShadowRoot.h (177313 => 177314)


--- trunk/Source/WebCore/dom/ShadowRoot.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/ShadowRoot.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -76,8 +76,7 @@
     virtual bool childTypeAllowed(NodeType) const override;
     virtual void childrenChanged(const ChildChange&) override;
 
-    // ShadowRoots should never be cloned.
-    virtual RefPtr<Node> cloneNode(bool) override { return 0; }
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
 
     // FIXME: This shouldn't happen. https://bugs.webkit.org/show_bug.cgi?id=88834
     bool isOrphan() const { return !hostElement(); }

Modified: trunk/Source/WebCore/dom/Text.cpp (177313 => 177314)


--- trunk/Source/WebCore/dom/Text.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Text.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -169,7 +169,7 @@
     return TEXT_NODE;
 }
 
-RefPtr<Node> Text::cloneNode(bool /*deep*/)
+RefPtr<Node> Text::cloneNodeInternal(CloningOperation)
 {
     return create(document(), data());
 }

Modified: trunk/Source/WebCore/dom/Text.h (177313 => 177314)


--- trunk/Source/WebCore/dom/Text.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/dom/Text.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -64,7 +64,7 @@
 private:
     virtual String nodeName() const override;
     virtual NodeType nodeType() const override;
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
     virtual bool childTypeAllowed(NodeType) const override;
 
     virtual RefPtr<Text> virtualCreate(const String&);

Modified: trunk/Source/WebCore/html/HTMLTemplateElement.cpp (177313 => 177314)


--- trunk/Source/WebCore/html/HTMLTemplateElement.cpp	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/html/HTMLTemplateElement.cpp	2014-12-15 22:19:38 UTC (rev 177314)
@@ -68,12 +68,19 @@
     return m_content.get();
 }
 
-RefPtr<Node> HTMLTemplateElement::cloneNode(bool deep)
+RefPtr<Node> HTMLTemplateElement::cloneNodeInternal(CloningOperation type)
 {
-    if (!deep)
+    RefPtr<Node> clone;
+    switch (type) {
+    case CloningOperation::OnlySelf:
         return cloneElementWithoutChildren();
-
-    RefPtr<Node> clone = cloneElementWithChildren();
+    case CloningOperation::SelfWithTemplateContent:
+        clone = cloneElementWithoutChildren();
+        break;
+    case CloningOperation::Everything:
+        clone = cloneElementWithChildren();
+        break;
+    }
     if (m_content)
         content()->cloneChildNodes(downcast<HTMLTemplateElement>(clone.get())->content());
     return clone.release();

Modified: trunk/Source/WebCore/html/HTMLTemplateElement.h (177313 => 177314)


--- trunk/Source/WebCore/html/HTMLTemplateElement.h	2014-12-15 22:18:35 UTC (rev 177313)
+++ trunk/Source/WebCore/html/HTMLTemplateElement.h	2014-12-15 22:19:38 UTC (rev 177314)
@@ -50,7 +50,7 @@
 private:
     HTMLTemplateElement(const QualifiedName&, Document&);
 
-    virtual RefPtr<Node> cloneNode(bool deep) override;
+    virtual RefPtr<Node> cloneNodeInternal(CloningOperation) override;
     virtual void didMoveToNewDocument(Document* oldDocument) override;
 
     mutable RefPtr<TemplateContentDocumentFragment> m_content;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to