Diff
Modified: trunk/LayoutTests/ChangeLog (160329 => 160330)
--- trunk/LayoutTests/ChangeLog 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/ChangeLog 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,23 @@
+2013-12-09 Ryosuke Niwa <[email protected]>
+
+ Implement Document.cloneNode()
+ https://bugs.webkit.org/show_bug.cgi?id=11646
+
+ Reviewed by Darin Adler.
+
+ * dom/xhtml/level3/core/documentgetinputencoding04-expected.txt:
+ * dom/xhtml/level3/core/documentgetxmlencoding05-expected.txt:
+ * dom/xhtml/level3/core/nodeisequalnode01-expected.txt:
+ * dom/xhtml/level3/core/nodeisequalnode21-expected.txt:
+ * dom/xhtml/level3/core/nodeisequalnode25-expected.txt:
+ * dom/xhtml/level3/core/nodeisequalnode26-expected.txt:
+ * fast/dom/Document/clone-node-expected.txt: Added.
+ * fast/dom/Document/clone-node.html: Added.
+ * fast/dom/HTMLDocument/clone-node-quirks-mode-expected.txt: Added.
+ * fast/dom/HTMLDocument/clone-node-quirks-mode.html: Added.
+ * svg/custom/clone-node-expected.txt: Added.
+ * svg/custom/clone-node.html: Added.
+
2013-12-09 Mario Sanchez Prada <[email protected]>
[ATK] Translate ATK_ROLE_SECTION into "AXSection" in DRT/WKTR
Modified: trunk/LayoutTests/dom/xhtml/level3/core/documentgetinputencoding04-expected.txt (160329 => 160330)
--- trunk/LayoutTests/dom/xhtml/level3/core/documentgetinputencoding04-expected.txt 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/dom/xhtml/level3/core/documentgetinputencoding04-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,2 @@
Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetinputencoding04
-Status error
-Message Line 98: TypeError
+Status Success
Modified: trunk/LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding05-expected.txt (160329 => 160330)
--- trunk/LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding05-expected.txt 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding05-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,2 @@
Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlencoding05
-Status error
-Message Line 98: TypeError
+Status Success
Modified: trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode01-expected.txt (160329 => 160330)
--- trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode01-expected.txt 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode01-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,2 @@
Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodeisequalnode01
-Status failure
-Message nodeisequalnode01: assertTrue failed
+Status Success
Modified: trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode21-expected.txt (160329 => 160330)
--- trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode21-expected.txt 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode21-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,2 @@
Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodeisequalnode21
-Status failure
-Message nodeisequalnode21: assertTrue failed
+Status Success
Modified: trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode25-expected.txt (160329 => 160330)
--- trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode25-expected.txt 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode25-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,3 @@
Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodeisequalnode25
Status error
-Message Line 123: TypeError
+Message Line 125: TypeError
Modified: trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode26-expected.txt (160329 => 160330)
--- trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode26-expected.txt 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/LayoutTests/dom/xhtml/level3/core/nodeisequalnode26-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,3 @@
Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodeisequalnode26
Status error
-Message Line 123: TypeError
+Message Line 125: TypeError
Added: trunk/LayoutTests/fast/dom/Document/clone-node-expected.txt (0 => 160330)
--- trunk/LayoutTests/fast/dom/Document/clone-node-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/Document/clone-node-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -0,0 +1,16 @@
+Tests cloneNode for Document.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS doc.cloneNode(false).__proto__ is Document.prototype
+PASS className(doc.cloneNode(false)) is "Document"
+PASS doc.cloneNode(true).documentElement.localName is "root"
+PASS document.cloneNode(true).compatMode is "CSS1Compat"
+PASS document.cloneNode(false).URL is document.URL
+PASS document.cloneNode(false).baseURI is document.baseURI
+PASS document.cloneNode(false).characterSet is document.characterSet
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/dom/Document/clone-node.html (0 => 160330)
--- trunk/LayoutTests/fast/dom/Document/clone-node.html (rev 0)
+++ trunk/LayoutTests/fast/dom/Document/clone-node.html 2013-12-09 22:06:45 UTC (rev 160330)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src=""
+<script>
+description('Tests cloneNode for Document.');
+
+function className(object) {
+ return Object.prototype.toString.call(object).slice(8, -1);
+}
+
+var doc = document.implementation.createDocument('', 'root', null);
+
+shouldBe('doc.cloneNode(false).__proto__', 'Document.prototype');
+shouldBeEqualToString('className(doc.cloneNode(false))', 'Document');
+shouldBeEqualToString('doc.cloneNode(true).documentElement.localName', 'root');
+shouldBeEqualToString('document.cloneNode(true).compatMode', 'CSS1Compat');
+shouldBe('document.cloneNode(false).URL', 'document.URL');
+shouldBe('document.cloneNode(false).baseURI', 'document.baseURI');
+shouldBe('document.cloneNode(false).characterSet', 'document.characterSet');
+
+</script>
+<script src=""
+</body>
+</html>
Added: trunk/LayoutTests/fast/dom/HTMLDocument/clone-node-quirks-mode-expected.txt (0 => 160330)
--- trunk/LayoutTests/fast/dom/HTMLDocument/clone-node-quirks-mode-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/HTMLDocument/clone-node-quirks-mode-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -0,0 +1,17 @@
+Tests cloneNode for HTMLDocument.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS document.cloneNode(false).__proto__ is HTMLDocument.prototype
+PASS className(document.cloneNode(false)) is "HTMLDocument"
+PASS document.cloneNode(true).title is document.title
+PASS document.cloneNode(true).compatMode is "BackCompat"
+PASS doc.cloneNode(false).__proto__ is HTMLDocument.prototype
+PASS className(doc.cloneNode(false)) is "HTMLDocument"
+PASS doc.cloneNode(true).title is doc.title
+PASS doc.cloneNode(true).compatMode is "CSS1Compat"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/dom/HTMLDocument/clone-node-quirks-mode.html (0 => 160330)
--- trunk/LayoutTests/fast/dom/HTMLDocument/clone-node-quirks-mode.html (rev 0)
+++ trunk/LayoutTests/fast/dom/HTMLDocument/clone-node-quirks-mode.html 2013-12-09 22:06:45 UTC (rev 160330)
@@ -0,0 +1,22 @@
+<title>Tests HTMLDocument cloneNode</title>
+<script src=""
+<script>
+description('Tests cloneNode for HTMLDocument.');
+
+function className(object) {
+ return Object.prototype.toString.call(object).slice(8, -1);
+}
+
+shouldBe('document.cloneNode(false).__proto__', 'HTMLDocument.prototype');
+shouldBeEqualToString('className(document.cloneNode(false))', 'HTMLDocument');
+shouldBe('document.cloneNode(true).title', 'document.title');
+shouldBeEqualToString('document.cloneNode(true).compatMode', 'BackCompat');
+
+var doc = document.implementation.createHTMLDocument('title');
+shouldBe('doc.cloneNode(false).__proto__', 'HTMLDocument.prototype');
+shouldBeEqualToString('className(doc.cloneNode(false))', 'HTMLDocument');
+shouldBe('doc.cloneNode(true).title', 'doc.title');
+shouldBeEqualToString('doc.cloneNode(true).compatMode', 'CSS1Compat');
+
+</script>
+<script src=""
Added: trunk/LayoutTests/svg/custom/clone-node-expected.txt (0 => 160330)
--- trunk/LayoutTests/svg/custom/clone-node-expected.txt (rev 0)
+++ trunk/LayoutTests/svg/custom/clone-node-expected.txt 2013-12-09 22:06:45 UTC (rev 160330)
@@ -0,0 +1,12 @@
+Tests cloneNode for SVGDocument.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS svgDoc.cloneNode(false).__proto__ is SVGDocument.prototype
+PASS className(svgDoc.cloneNode(false)) is "SVGDocument"
+PASS svgDoc.cloneNode(true).compatMode is "CSS1Compat"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/svg/custom/clone-node.html (0 => 160330)
--- trunk/LayoutTests/svg/custom/clone-node.html (rev 0)
+++ trunk/LayoutTests/svg/custom/clone-node.html 2013-12-09 22:06:45 UTC (rev 160330)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<script src=""
+<script>
+
+description('Tests cloneNode for SVGDocument.');
+
+function className(object) {
+ return Object.prototype.toString.call(object).slice(8, -1);
+}
+
+var svgDoc = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg', null);
+
+shouldBe('svgDoc.cloneNode(false).__proto__', 'SVGDocument.prototype');
+shouldBeEqualToString('className(svgDoc.cloneNode(false))', 'SVGDocument');
+shouldBeEqualToString('svgDoc.cloneNode(true).compatMode', 'CSS1Compat');
+
+</script>
+<script src=""
Modified: trunk/Source/WebCore/ChangeLog (160329 => 160330)
--- trunk/Source/WebCore/ChangeLog 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/ChangeLog 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1,3 +1,31 @@
+2013-12-09 Ryosuke Niwa <[email protected]>
+
+ Implement Document.cloneNode()
+ https://bugs.webkit.org/show_bug.cgi?id=11646
+
+ Reviewed by Darin Adler.
+
+ Merge https://chromium.googlesource.com/chromium/blink/+/dc7879025e01d63be9fcf6a84ca6c9b8b5768a80
+
+ Implement the behavior specified in the current DOM4 working draft:
+ http://www.w3.org/TR/2013/WD-dom-20131107/#dom-node-clonenode
+
+ Tests: fast/dom/Document/clone-node.html
+ fast/dom/HTMLDocument/clone-node-quirks-mode.html
+ svg/custom/clone-node.html
+
+ * dom/Document.cpp:
+ (WebCore::Document::cloneNode):
+ (WebCore::Document::cloneDocumentWithoutChildren):
+ (WebCore::Document::cloneDataFromDocument):
+ * dom/Document.h:
+ * html/HTMLDocument.cpp:
+ (WebCore::HTMLDocument::cloneDocumentWithoutChildren):
+ * html/HTMLDocument.h:
+ * svg/SVGDocument.cpp:
+ (WebCore::SVGDocument::cloneDocumentWithoutChildren):
+ * svg/SVGDocument.h:
+
2013-12-09 Andreas Kling <[email protected]>
REGRESSION(r160260): Memory pressure signal causes web process to hang.
Modified: trunk/Source/WebCore/dom/Document.cpp (160329 => 160330)
--- trunk/Source/WebCore/dom/Document.cpp 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/dom/Document.cpp 2013-12-09 22:06:45 UTC (rev 160330)
@@ -3025,12 +3025,32 @@
return true;
}
-PassRefPtr<Node> Document::cloneNode(bool /*deep*/)
+PassRefPtr<Node> Document::cloneNode(bool deep)
{
- // Spec says cloning Document nodes is "implementation dependent" and we do not support it.
- return nullptr;
+ RefPtr<Document> clone = cloneDocumentWithoutChildren();
+ clone->cloneDataFromDocument(*this);
+ if (deep)
+ cloneChildNodes(clone.get());
+ return clone.release();
}
+PassRefPtr<Document> Document::cloneDocumentWithoutChildren() const
+{
+ return isXHTMLDocument() ? createXHTML(nullptr, url()) : create(nullptr, url());
+}
+
+void Document::cloneDataFromDocument(const Document& other)
+{
+ ASSERT(m_url == other.url());
+ m_baseURL = other.baseURL();
+ m_baseURLOverride = other.baseURLOverride();
+ m_documentURI = other.documentURI();
+
+ setCompatibilityMode(other.compatibilityMode());
+ setSecurityOrigin(other.securityOrigin());
+ setDecoder(other.decoder());
+}
+
StyleSheetList* Document::styleSheets()
{
if (!m_styleSheetList)
Modified: trunk/Source/WebCore/dom/Document.h (160329 => 160330)
--- trunk/Source/WebCore/dom/Document.h 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/dom/Document.h 2013-12-09 22:06:45 UTC (rev 160330)
@@ -1188,6 +1188,8 @@
void clearXMLVersion() { m_xmlVersion = String(); }
+ virtual PassRefPtr<Document> cloneDocumentWithoutChildren() const;
+
private:
friend class Node;
friend class IgnoreDestructiveWriteCountIncrementer;
@@ -1214,6 +1216,7 @@
virtual NodeType nodeType() const OVERRIDE;
virtual bool childTypeAllowed(NodeType) const OVERRIDE;
virtual PassRefPtr<Node> cloneNode(bool deep) OVERRIDE;
+ void cloneDataFromDocument(const Document&);
virtual void refScriptExecutionContext() OVERRIDE { ref(); }
virtual void derefScriptExecutionContext() OVERRIDE { deref(); }
Modified: trunk/Source/WebCore/html/HTMLDocument.cpp (160329 => 160330)
--- trunk/Source/WebCore/html/HTMLDocument.cpp 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/html/HTMLDocument.cpp 2013-12-09 22:06:45 UTC (rev 160330)
@@ -365,4 +365,9 @@
return bodyElement && isHTMLFrameSetElement(bodyElement);
}
+PassRefPtr<Document> HTMLDocument::cloneDocumentWithoutChildren() const
+{
+ return create(nullptr, url());
}
+
+}
Modified: trunk/Source/WebCore/html/HTMLDocument.h (160329 => 160330)
--- trunk/Source/WebCore/html/HTMLDocument.h 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/html/HTMLDocument.h 2013-12-09 22:06:45 UTC (rev 160330)
@@ -88,6 +88,8 @@
virtual bool isFrameSet() const;
virtual PassRefPtr<DocumentParser> createParser();
+ virtual PassRefPtr<Document> cloneDocumentWithoutChildren() const OVERRIDE FINAL;
+
DocumentOrderedMap m_documentNamedItem;
DocumentOrderedMap m_windowNamedItem;
};
Modified: trunk/Source/WebCore/svg/SVGDocument.cpp (160329 => 160330)
--- trunk/Source/WebCore/svg/SVGDocument.cpp 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/svg/SVGDocument.cpp 2013-12-09 22:06:45 UTC (rev 160330)
@@ -100,7 +100,12 @@
return true;
}
+PassRefPtr<Document> SVGDocument::cloneDocumentWithoutChildren() const
+{
+ return create(nullptr, url());
}
+}
+
// vim:ts=4:noet
#endif // ENABLE(SVG)
Modified: trunk/Source/WebCore/svg/SVGDocument.h (160329 => 160330)
--- trunk/Source/WebCore/svg/SVGDocument.h 2013-12-09 22:04:49 UTC (rev 160329)
+++ trunk/Source/WebCore/svg/SVGDocument.h 2013-12-09 22:06:45 UTC (rev 160330)
@@ -53,6 +53,8 @@
virtual bool childShouldCreateRenderer(const Node&) const OVERRIDE;
+ virtual PassRefPtr<Document> cloneDocumentWithoutChildren() const OVERRIDE;
+
FloatPoint m_translate;
};