Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-replaceChild.html |
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-replaceChild.html b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-replaceChild.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6088f62e0c038e0949fe525f04e0ebdef8c9beb8 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/Node-replaceChild.html |
@@ -0,0 +1,346 @@ |
+<!DOCTYPE html> |
+<meta charset=utf-8> |
+<title>Node.replaceChild</title> |
+<script src="../../../../resources/testharness.js"></script> |
+<script src="../../../../resources/testharnessreport.js"></script> |
+<body><a><b></b><c></c></a> |
+<div id="log"></div> |
+<script> |
+// IDL. |
+test(function() { |
+ var a = document.createElement("div"); |
+ assert_throws(new TypeError(), function() { |
+ a.replaceChild(null, null); |
+ }); |
+ |
+ var b = document.createElement("div"); |
+ assert_throws(new TypeError(), function() { |
+ a.replaceChild(b, null); |
+ }); |
+ assert_throws(new TypeError(), function() { |
+ a.replaceChild(null, b); |
+ }); |
+}, "Passing null to replaceChild should throw a TypeError.") |
+ |
+// Step 1. |
+test(function() { |
+ var a = document.createElement("div"); |
+ var b = document.createElement("div"); |
+ var c = document.createElement("div"); |
+ assert_throws("NotFoundError", function() { |
+ a.replaceChild(b, c); |
+ }); |
+ |
+ var d = document.createElement("div"); |
+ d.appendChild(b); |
+ assert_throws("NotFoundError", function() { |
+ a.replaceChild(b, c); |
+ }); |
+ assert_throws("NotFoundError", function() { |
+ a.replaceChild(a, c); |
+ }); |
+ assert_throws("NotFoundError", function() { |
+ a.replaceChild(b, a); |
+ }); |
+ assert_throws("NotFoundError", function() { |
+ a.replaceChild(a, a); |
+ }); |
+}, "If child's parent is not the context node, a NotFoundError exception should be thrown") |
+test(function() { |
+ var nodes = [ |
+ document.implementation.createDocumentType("html", "", ""), |
+ document.createTextNode("text"), |
+ document.implementation.createDocument(null, "foo", null).createProcessingInstruction("foo", "bar"), |
+ document.createComment("comment") |
+ ]; |
+ |
+ var a = document.createElement("div"); |
+ var b = document.createElement("div"); |
+ nodes.forEach(function(node) { |
+ assert_throws("HierarchyRequestError", function() { |
+ node.replaceChild(a, b); |
+ }); |
+ }); |
+}, "If the context node is not a node that can contain children, a NotFoundError exception should be thrown") |
+ |
+// Step 2. |
+test(function() { |
+ var a = document.createElement("div"); |
+ var b = document.createElement("div"); |
+ a.appendChild(b); |
+ assert_throws("HierarchyRequestError", function() { |
+ a.replaceChild(a, b); |
+ }); |
+ |
+ var c = document.createElement("div"); |
+ c.appendChild(a); |
+ assert_throws("HierarchyRequestError", function() { |
+ a.replaceChild(c, b); |
+ }); |
+}, "If node is an inclusive ancestor of the context node, a HierarchyRequestError should be thrown.") |
+ |
+// Step 3.1. |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var doc2 = document.implementation.createHTMLDocument("title2"); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(doc2, doc.documentElement); |
+ }); |
+ |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(doc.createTextNode("text"), doc.documentElement); |
+ }); |
+}, "If the context node is a document, inserting a document or text node should throw a HierarchyRequestError.") |
+ |
+// Step 3.2.1. |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ |
+ var df = doc.createDocumentFragment(); |
+ df.appendChild(doc.createElement("a")); |
+ df.appendChild(doc.createElement("b")); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, doc.documentElement); |
+ }); |
+ |
+ df = doc.createDocumentFragment(); |
+ df.appendChild(doc.createTextNode("text")); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, doc.documentElement); |
+ }); |
+ |
+ df = doc.createDocumentFragment(); |
+ df.appendChild(doc.createComment("comment")); |
+ df.appendChild(doc.createTextNode("text")); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, doc.documentElement); |
+ }); |
+}, "If the context node is a document, inserting a DocumentFragment that contains a text node or too many elements should throw a HierarchyRequestError.") |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ doc.removeChild(doc.documentElement); |
+ |
+ var df = doc.createDocumentFragment(); |
+ df.appendChild(doc.createElement("a")); |
+ df.appendChild(doc.createElement("b")); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, doc.doctype); |
+ }); |
+}, "If the context node is a document (without element children), inserting a DocumentFragment that contains multiple elements should throw a HierarchyRequestError.") |
+ |
+// Step 3.2.2. |
+test(function() { |
+ // The context node has an element child that is not /child/. |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var comment = doc.appendChild(doc.createComment("foo")); |
+ assert_array_equals(doc.childNodes, [doc.doctype, doc.documentElement, comment]); |
+ |
+ var df = doc.createDocumentFragment(); |
+ df.appendChild(doc.createElement("a")); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, comment); |
+ }); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, doc.doctype); |
+ }); |
+}, "If the context node is a document, inserting a DocumentFragment with an element if there already is an element child should throw a HierarchyRequestError.") |
+test(function() { |
+ // A doctype is following /child/. |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var comment = doc.insertBefore(doc.createComment("foo"), doc.firstChild); |
+ doc.removeChild(doc.documentElement); |
+ assert_array_equals(doc.childNodes, [comment, doc.doctype]); |
+ |
+ var df = doc.createDocumentFragment(); |
+ df.appendChild(doc.createElement("a")); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(df, comment); |
+ }); |
+}, "If the context node is a document, inserting a DocumentFragment with an element before the doctype should throw a HierarchyRequestError.") |
+ |
+// Step 3.3. |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var comment = doc.appendChild(doc.createComment("foo")); |
+ assert_array_equals(doc.childNodes, [doc.doctype, doc.documentElement, comment]); |
+ |
+ var a = doc.createElement("a"); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(a, comment); |
+ }); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(a, doc.doctype); |
+ }); |
+}, "If the context node is a document, inserting an element if there already is an element child should throw a HierarchyRequestError.") |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var comment = doc.insertBefore(doc.createComment("foo"), doc.firstChild); |
+ doc.removeChild(doc.documentElement); |
+ assert_array_equals(doc.childNodes, [comment, doc.doctype]); |
+ |
+ var a = doc.createElement("a"); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(a, comment); |
+ }); |
+}, "If the context node is a document, inserting an element before the doctype should throw a HierarchyRequestError.") |
+ |
+// Step 3.4. |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var comment = doc.insertBefore(doc.createComment("foo"), doc.firstChild); |
+ assert_array_equals(doc.childNodes, [comment, doc.doctype, doc.documentElement]); |
+ |
+ var doctype = document.implementation.createDocumentType("html", "", ""); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(doctype, comment); |
+ }); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(doctype, doc.documentElement); |
+ }); |
+}, "If the context node is a document, inserting a doctype if there already is a doctype child should throw a HierarchyRequestError.") |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var comment = doc.appendChild(doc.createComment("foo")); |
+ doc.removeChild(doc.doctype); |
+ assert_array_equals(doc.childNodes, [doc.documentElement, comment]); |
+ |
+ var doctype = document.implementation.createDocumentType("html", "", ""); |
+ assert_throws("HierarchyRequestError", function() { |
+ doc.replaceChild(doctype, comment); |
+ }); |
+}, "If the context node is a document, inserting a doctype after the document element should throw a HierarchyRequestError.") |
+ |
+// Step 4. |
+test(function() { |
+ var df = document.createDocumentFragment(); |
+ var a = df.appendChild(document.createElement("a")); |
+ |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ assert_throws("HierarchyRequestError", function() { |
+ df.replaceChild(doc, a); |
+ }); |
+ |
+ var doctype = document.implementation.createDocumentType("html", "", ""); |
+ assert_throws("HierarchyRequestError", function() { |
+ df.replaceChild(doctype, a); |
+ }); |
+}, "If the context node is a DocumentFragment, inserting a document or a doctype should throw a HierarchyRequestError.") |
+test(function() { |
+ var el = document.createElement("div"); |
+ var a = el.appendChild(document.createElement("a")); |
+ |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ assert_throws("HierarchyRequestError", function() { |
+ el.replaceChild(doc, a); |
+ }); |
+ |
+ var doctype = document.implementation.createDocumentType("html", "", ""); |
+ assert_throws("HierarchyRequestError", function() { |
+ el.replaceChild(doctype, a); |
+ }); |
+}, "If the context node is an element, inserting a document or a doctype should throw a HierarchyRequestError.") |
+ |
+// Step 6. |
+test(function() { |
+ var a = document.createElement("div"); |
+ var b = document.createElement("div"); |
+ var c = document.createElement("div"); |
+ a.appendChild(b); |
+ a.appendChild(c); |
+ assert_array_equals(a.childNodes, [b, c]); |
+ assert_equals(a.replaceChild(c, b), b); |
+ assert_array_equals(a.childNodes, [c]); |
+}, "Replacing a node with its next sibling should work (2 children)"); |
+test(function() { |
+ var a = document.createElement("div"); |
+ var b = document.createElement("div"); |
+ var c = document.createElement("div"); |
+ var d = document.createElement("div"); |
+ var e = document.createElement("div"); |
+ a.appendChild(b); |
+ a.appendChild(c); |
+ a.appendChild(d); |
+ a.appendChild(e); |
+ assert_array_equals(a.childNodes, [b, c, d, e]); |
+ assert_equals(a.replaceChild(d, c), c); |
+ assert_array_equals(a.childNodes, [b, d, e]); |
+}, "Replacing a node with its next sibling should work (4 children)"); |
+test(function() { |
+ var a = document.createElement("div"); |
+ var b = document.createElement("div"); |
+ var c = document.createElement("div"); |
+ a.appendChild(b); |
+ a.appendChild(c); |
+ assert_array_equals(a.childNodes, [b, c]); |
+ assert_equals(a.replaceChild(b, b), b); |
+ assert_array_equals(a.childNodes, [b, c]); |
+ assert_equals(a.replaceChild(c, c), c); |
+ assert_array_equals(a.childNodes, [b, c]); |
+}, "Replacing a node with itself should not move the node"); |
+ |
+// Step 7. |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var doctype = doc.doctype; |
+ assert_array_equals(doc.childNodes, [doctype, doc.documentElement]); |
+ |
+ var doc2 = document.implementation.createHTMLDocument("title2"); |
+ var doctype2 = doc2.doctype; |
+ assert_array_equals(doc2.childNodes, [doctype2, doc2.documentElement]); |
+ |
+ doc.replaceChild(doc2.doctype, doc.doctype); |
+ assert_array_equals(doc.childNodes, [doctype2, doc.documentElement]); |
+ assert_array_equals(doc2.childNodes, [doc2.documentElement]); |
+ assert_equals(doctype.parentNode, null); |
+ assert_equals(doctype.ownerDocument, doc); |
+ assert_equals(doctype2.parentNode, doc); |
+ assert_equals(doctype2.ownerDocument, doc); |
+}, "If the context node is a document, inserting a new doctype should work.") |
+ |
+// Bugs. |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var df = doc.createDocumentFragment(); |
+ var a = df.appendChild(doc.createElement("a")); |
+ assert_equals(doc.documentElement, doc.replaceChild(df, doc.documentElement)); |
+ assert_array_equals(doc.childNodes, [doc.doctype, a]); |
+}, "Replacing the document element with a DocumentFragment containing a single element should work."); |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var df = doc.createDocumentFragment(); |
+ var a = df.appendChild(doc.createComment("a")); |
+ var b = df.appendChild(doc.createElement("b")); |
+ var c = df.appendChild(doc.createComment("c")); |
+ assert_equals(doc.documentElement, doc.replaceChild(df, doc.documentElement)); |
+ assert_array_equals(doc.childNodes, [doc.doctype, a, b, c]); |
+}, "Replacing the document element with a DocumentFragment containing a single element and comments should work."); |
+test(function() { |
+ var doc = document.implementation.createHTMLDocument("title"); |
+ var a = doc.createElement("a"); |
+ assert_equals(doc.documentElement, doc.replaceChild(a, doc.documentElement)); |
+ assert_array_equals(doc.childNodes, [doc.doctype, a]); |
+}, "Replacing the document element with a single element should work."); |
+test(function() { |
+ document.addEventListener("DOMNodeRemoved", function(e) { |
+ document.body.appendChild(document.createElement("x")); |
+ }, false); |
+ var a = document.body.firstChild, b = a.firstChild, c = b.nextSibling; |
+ assert_equals(a.replaceChild(c, b), b); |
+ assert_equals(b.parentNode, null); |
+ assert_equals(a.firstChild, c); |
+ assert_equals(c.parentNode, a); |
+}, "replaceChild should work in the presence of mutation events.") |
+test(function() { |
+ var TEST_ID = "findme"; |
+ var gBody = document.getElementsByTagName("body")[0]; |
+ var parent = document.createElement("div"); |
+ gBody.appendChild(parent); |
+ var child = document.createElement("div"); |
+ parent.appendChild(child); |
+ var df = document.createDocumentFragment(); |
+ var fragChild = df.appendChild(document.createElement("div")); |
+ fragChild.setAttribute("id", TEST_ID); |
+ parent.replaceChild(df, child); |
+ assert_equals(document.getElementById(TEST_ID), fragChild, "should not be null"); |
+}, "Replacing an element with a DocumentFragment should allow a child of the DocumentFragment to be found by Id.") |
+</script> |