mirror of
				https://github.com/lightpanda-io/browser.git
				synced 2025-10-30 07:31:47 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			350 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!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>
 | |
| <!-- First test shared pre-insertion checks that work similarly for replaceChild
 | |
|      and insertBefore -->
 | |
| <script>
 | |
|   var insertFunc = Node.prototype.replaceChild;
 | |
| </script>
 | |
| <script src="pre-insertion-validation-notfound.js"></script>
 | |
| <script>
 | |
| // IDL.
 | |
| test(function() {
 | |
|   var a = document.createElement("div");
 | |
|   assert_throws_js(TypeError, function() {
 | |
|     a.replaceChild(null, null);
 | |
|   });
 | |
| 
 | |
|   var b = document.createElement("div");
 | |
|   assert_throws_js(TypeError, function() {
 | |
|     a.replaceChild(b, null);
 | |
|   });
 | |
|   assert_throws_js(TypeError, function() {
 | |
|     a.replaceChild(null, b);
 | |
|   });
 | |
| }, "Passing null to replaceChild should throw a TypeError.")
 | |
| 
 | |
| // Step 3.
 | |
| test(function() {
 | |
|   var a = document.createElement("div");
 | |
|   var b = document.createElement("div");
 | |
|   var c = document.createElement("div");
 | |
|   assert_throws_dom("NotFoundError", function() {
 | |
|     a.replaceChild(b, c);
 | |
|   });
 | |
| 
 | |
|   var d = document.createElement("div");
 | |
|   d.appendChild(b);
 | |
|   assert_throws_dom("NotFoundError", function() {
 | |
|     a.replaceChild(b, c);
 | |
|   });
 | |
|   assert_throws_dom("NotFoundError", function() {
 | |
|     a.replaceChild(b, a);
 | |
|   });
 | |
| }, "If child's parent is not the context node, a NotFoundError exception should be thrown");
 | |
| 
 | |
| // Step 1.
 | |
| test(function() {
 | |
|   var nodes = getNonParentNodes();
 | |
| 
 | |
|   var a = document.createElement("div");
 | |
|   var b = document.createElement("div");
 | |
|   nodes.forEach(function(node) {
 | |
|     assert_throws_dom("HierarchyRequestError", function() {
 | |
|       node.replaceChild(a, b);
 | |
|     });
 | |
|   });
 | |
| }, "If the context node is not a node that can contain children, a HierarchyRequestError exception should be thrown")
 | |
| 
 | |
| // Step 2.
 | |
| test(function() {
 | |
|   var a = document.createElement("div");
 | |
|   var b = document.createElement("div");
 | |
| 
 | |
|   assert_throws_dom("HierarchyRequestError", function() {
 | |
|     a.replaceChild(a, a);
 | |
|   });
 | |
| 
 | |
|   a.appendChild(b);
 | |
|   assert_throws_dom("HierarchyRequestError", function() {
 | |
|     a.replaceChild(a, b);
 | |
|   });
 | |
| 
 | |
|   var c = document.createElement("div");
 | |
|   c.appendChild(a);
 | |
|   assert_throws_dom("HierarchyRequestError", function() {
 | |
|     a.replaceChild(c, b);
 | |
|   });
 | |
| }, "If node is an inclusive ancestor of the context node, a HierarchyRequestError should be thrown.")
 | |
| 
 | |
| // Steps 4/5.
 | |
| test(function() {
 | |
|   var doc = document.implementation.createHTMLDocument("title");
 | |
|   var doc2 = document.implementation.createHTMLDocument("title2");
 | |
|   assert_throws_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(doc2, doc.documentElement);
 | |
|   });
 | |
| 
 | |
|   assert_throws_dom("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 6.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_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(df, doc.documentElement);
 | |
|   });
 | |
| 
 | |
|   df = doc.createDocumentFragment();
 | |
|   df.appendChild(doc.createTextNode("text"));
 | |
|   assert_throws_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(df, doc.documentElement);
 | |
|   });
 | |
| 
 | |
|   df = doc.createDocumentFragment();
 | |
|   df.appendChild(doc.createComment("comment"));
 | |
|   df.appendChild(doc.createTextNode("text"));
 | |
|   assert_throws_dom("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_dom("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 6.1.
 | |
| 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_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(df, comment);
 | |
|   });
 | |
|   assert_throws_dom("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_dom("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 6.2.
 | |
| 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_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(a, comment);
 | |
|   });
 | |
|   assert_throws_dom("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_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(a, comment);
 | |
|   });
 | |
| }, "If the context node is a document, inserting an element before the doctype should throw a HierarchyRequestError.")
 | |
| 
 | |
| // Step 6.3.
 | |
| 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_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(doctype, comment);
 | |
|   });
 | |
|   assert_throws_dom("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_dom("HierarchyRequestError", function() {
 | |
|     doc.replaceChild(doctype, comment);
 | |
|   });
 | |
| }, "If the context node is a document, inserting a doctype after the document element should throw a HierarchyRequestError.")
 | |
| 
 | |
| // Steps 4/5.
 | |
| test(function() {
 | |
|   var df = document.createDocumentFragment();
 | |
|   var a = df.appendChild(document.createElement("a"));
 | |
| 
 | |
|   var doc = document.implementation.createHTMLDocument("title");
 | |
|   assert_throws_dom("HierarchyRequestError", function() {
 | |
|     df.replaceChild(doc, a);
 | |
|   });
 | |
| 
 | |
|   var doctype = document.implementation.createDocumentType("html", "", "");
 | |
|   assert_throws_dom("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_dom("HierarchyRequestError", function() {
 | |
|     el.replaceChild(doc, a);
 | |
|   });
 | |
| 
 | |
|   var doctype = document.implementation.createDocumentType("html", "", "");
 | |
|   assert_throws_dom("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>
 | 
