OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <meta charset=utf-8> | |
3 <title>Node.replaceChild</title> | |
4 <script src="../../../../resources/testharness.js"></script> | |
5 <script src="../../../../resources/testharnessreport.js"></script> | |
6 <body><a><b></b><c></c></a> | |
7 <div id="log"></div> | |
8 <script> | |
9 // IDL. | |
10 test(function() { | |
11 var a = document.createElement("div"); | |
12 assert_throws(new TypeError(), function() { | |
13 a.replaceChild(null, null); | |
14 }); | |
15 | |
16 var b = document.createElement("div"); | |
17 assert_throws(new TypeError(), function() { | |
18 a.replaceChild(b, null); | |
19 }); | |
20 assert_throws(new TypeError(), function() { | |
21 a.replaceChild(null, b); | |
22 }); | |
23 }, "Passing null to replaceChild should throw a TypeError.") | |
24 | |
25 // Step 1. | |
26 test(function() { | |
27 var a = document.createElement("div"); | |
28 var b = document.createElement("div"); | |
29 var c = document.createElement("div"); | |
30 assert_throws("NotFoundError", function() { | |
31 a.replaceChild(b, c); | |
32 }); | |
33 | |
34 var d = document.createElement("div"); | |
35 d.appendChild(b); | |
36 assert_throws("NotFoundError", function() { | |
37 a.replaceChild(b, c); | |
38 }); | |
39 assert_throws("NotFoundError", function() { | |
40 a.replaceChild(b, a); | |
41 }); | |
42 }, "If child's parent is not the context node, a NotFoundError exception should
be thrown") | |
43 test(function() { | |
44 var nodes = [ | |
45 document.implementation.createDocumentType("html", "", ""), | |
46 document.createTextNode("text"), | |
47 document.implementation.createDocument(null, "foo", null).createProcessingIn
struction("foo", "bar"), | |
48 document.createComment("comment") | |
49 ]; | |
50 | |
51 var a = document.createElement("div"); | |
52 var b = document.createElement("div"); | |
53 nodes.forEach(function(node) { | |
54 assert_throws("HierarchyRequestError", function() { | |
55 node.replaceChild(a, b); | |
56 }); | |
57 }); | |
58 }, "If the context node is not a node that can contain children, a NotFoundError
exception should be thrown") | |
59 | |
60 // Step 2. | |
61 test(function() { | |
62 var a = document.createElement("div"); | |
63 var b = document.createElement("div"); | |
64 | |
65 assert_throws("HierarchyRequestError", function() { | |
66 a.replaceChild(a, a); | |
67 }); | |
68 | |
69 a.appendChild(b); | |
70 assert_throws("HierarchyRequestError", function() { | |
71 a.replaceChild(a, b); | |
72 }); | |
73 | |
74 var c = document.createElement("div"); | |
75 c.appendChild(a); | |
76 assert_throws("HierarchyRequestError", function() { | |
77 a.replaceChild(c, b); | |
78 }); | |
79 }, "If node is an inclusive ancestor of the context node, a HierarchyRequestErro
r should be thrown.") | |
80 | |
81 // Step 3.1. | |
82 test(function() { | |
83 var doc = document.implementation.createHTMLDocument("title"); | |
84 var doc2 = document.implementation.createHTMLDocument("title2"); | |
85 assert_throws("HierarchyRequestError", function() { | |
86 doc.replaceChild(doc2, doc.documentElement); | |
87 }); | |
88 | |
89 assert_throws("HierarchyRequestError", function() { | |
90 doc.replaceChild(doc.createTextNode("text"), doc.documentElement); | |
91 }); | |
92 }, "If the context node is a document, inserting a document or text node should
throw a HierarchyRequestError.") | |
93 | |
94 // Step 3.2.1. | |
95 test(function() { | |
96 var doc = document.implementation.createHTMLDocument("title"); | |
97 | |
98 var df = doc.createDocumentFragment(); | |
99 df.appendChild(doc.createElement("a")); | |
100 df.appendChild(doc.createElement("b")); | |
101 assert_throws("HierarchyRequestError", function() { | |
102 doc.replaceChild(df, doc.documentElement); | |
103 }); | |
104 | |
105 df = doc.createDocumentFragment(); | |
106 df.appendChild(doc.createTextNode("text")); | |
107 assert_throws("HierarchyRequestError", function() { | |
108 doc.replaceChild(df, doc.documentElement); | |
109 }); | |
110 | |
111 df = doc.createDocumentFragment(); | |
112 df.appendChild(doc.createComment("comment")); | |
113 df.appendChild(doc.createTextNode("text")); | |
114 assert_throws("HierarchyRequestError", function() { | |
115 doc.replaceChild(df, doc.documentElement); | |
116 }); | |
117 }, "If the context node is a document, inserting a DocumentFragment that contain
s a text node or too many elements should throw a HierarchyRequestError.") | |
118 test(function() { | |
119 var doc = document.implementation.createHTMLDocument("title"); | |
120 doc.removeChild(doc.documentElement); | |
121 | |
122 var df = doc.createDocumentFragment(); | |
123 df.appendChild(doc.createElement("a")); | |
124 df.appendChild(doc.createElement("b")); | |
125 assert_throws("HierarchyRequestError", function() { | |
126 doc.replaceChild(df, doc.doctype); | |
127 }); | |
128 }, "If the context node is a document (without element children), inserting a Do
cumentFragment that contains multiple elements should throw a HierarchyRequestEr
ror.") | |
129 | |
130 // Step 3.2.2. | |
131 test(function() { | |
132 // The context node has an element child that is not /child/. | |
133 var doc = document.implementation.createHTMLDocument("title"); | |
134 var comment = doc.appendChild(doc.createComment("foo")); | |
135 assert_array_equals(doc.childNodes, [doc.doctype, doc.documentElement, comment
]); | |
136 | |
137 var df = doc.createDocumentFragment(); | |
138 df.appendChild(doc.createElement("a")); | |
139 assert_throws("HierarchyRequestError", function() { | |
140 doc.replaceChild(df, comment); | |
141 }); | |
142 assert_throws("HierarchyRequestError", function() { | |
143 doc.replaceChild(df, doc.doctype); | |
144 }); | |
145 }, "If the context node is a document, inserting a DocumentFragment with an elem
ent if there already is an element child should throw a HierarchyRequestError.") | |
146 test(function() { | |
147 // A doctype is following /child/. | |
148 var doc = document.implementation.createHTMLDocument("title"); | |
149 var comment = doc.insertBefore(doc.createComment("foo"), doc.firstChild); | |
150 doc.removeChild(doc.documentElement); | |
151 assert_array_equals(doc.childNodes, [comment, doc.doctype]); | |
152 | |
153 var df = doc.createDocumentFragment(); | |
154 df.appendChild(doc.createElement("a")); | |
155 assert_throws("HierarchyRequestError", function() { | |
156 doc.replaceChild(df, comment); | |
157 }); | |
158 }, "If the context node is a document, inserting a DocumentFragment with an elem
ent before the doctype should throw a HierarchyRequestError.") | |
159 | |
160 // Step 3.3. | |
161 test(function() { | |
162 var doc = document.implementation.createHTMLDocument("title"); | |
163 var comment = doc.appendChild(doc.createComment("foo")); | |
164 assert_array_equals(doc.childNodes, [doc.doctype, doc.documentElement, comment
]); | |
165 | |
166 var a = doc.createElement("a"); | |
167 assert_throws("HierarchyRequestError", function() { | |
168 doc.replaceChild(a, comment); | |
169 }); | |
170 assert_throws("HierarchyRequestError", function() { | |
171 doc.replaceChild(a, doc.doctype); | |
172 }); | |
173 }, "If the context node is a document, inserting an element if there already is
an element child should throw a HierarchyRequestError.") | |
174 test(function() { | |
175 var doc = document.implementation.createHTMLDocument("title"); | |
176 var comment = doc.insertBefore(doc.createComment("foo"), doc.firstChild); | |
177 doc.removeChild(doc.documentElement); | |
178 assert_array_equals(doc.childNodes, [comment, doc.doctype]); | |
179 | |
180 var a = doc.createElement("a"); | |
181 assert_throws("HierarchyRequestError", function() { | |
182 doc.replaceChild(a, comment); | |
183 }); | |
184 }, "If the context node is a document, inserting an element before the doctype s
hould throw a HierarchyRequestError.") | |
185 | |
186 // Step 3.4. | |
187 test(function() { | |
188 var doc = document.implementation.createHTMLDocument("title"); | |
189 var comment = doc.insertBefore(doc.createComment("foo"), doc.firstChild); | |
190 assert_array_equals(doc.childNodes, [comment, doc.doctype, doc.documentElement
]); | |
191 | |
192 var doctype = document.implementation.createDocumentType("html", "", ""); | |
193 assert_throws("HierarchyRequestError", function() { | |
194 doc.replaceChild(doctype, comment); | |
195 }); | |
196 assert_throws("HierarchyRequestError", function() { | |
197 doc.replaceChild(doctype, doc.documentElement); | |
198 }); | |
199 }, "If the context node is a document, inserting a doctype if there already is a
doctype child should throw a HierarchyRequestError.") | |
200 test(function() { | |
201 var doc = document.implementation.createHTMLDocument("title"); | |
202 var comment = doc.appendChild(doc.createComment("foo")); | |
203 doc.removeChild(doc.doctype); | |
204 assert_array_equals(doc.childNodes, [doc.documentElement, comment]); | |
205 | |
206 var doctype = document.implementation.createDocumentType("html", "", ""); | |
207 assert_throws("HierarchyRequestError", function() { | |
208 doc.replaceChild(doctype, comment); | |
209 }); | |
210 }, "If the context node is a document, inserting a doctype after the document el
ement should throw a HierarchyRequestError.") | |
211 | |
212 // Step 4. | |
213 test(function() { | |
214 var df = document.createDocumentFragment(); | |
215 var a = df.appendChild(document.createElement("a")); | |
216 | |
217 var doc = document.implementation.createHTMLDocument("title"); | |
218 assert_throws("HierarchyRequestError", function() { | |
219 df.replaceChild(doc, a); | |
220 }); | |
221 | |
222 var doctype = document.implementation.createDocumentType("html", "", ""); | |
223 assert_throws("HierarchyRequestError", function() { | |
224 df.replaceChild(doctype, a); | |
225 }); | |
226 }, "If the context node is a DocumentFragment, inserting a document or a doctype
should throw a HierarchyRequestError.") | |
227 test(function() { | |
228 var el = document.createElement("div"); | |
229 var a = el.appendChild(document.createElement("a")); | |
230 | |
231 var doc = document.implementation.createHTMLDocument("title"); | |
232 assert_throws("HierarchyRequestError", function() { | |
233 el.replaceChild(doc, a); | |
234 }); | |
235 | |
236 var doctype = document.implementation.createDocumentType("html", "", ""); | |
237 assert_throws("HierarchyRequestError", function() { | |
238 el.replaceChild(doctype, a); | |
239 }); | |
240 }, "If the context node is an element, inserting a document or a doctype should
throw a HierarchyRequestError.") | |
241 | |
242 // Step 6. | |
243 test(function() { | |
244 var a = document.createElement("div"); | |
245 var b = document.createElement("div"); | |
246 var c = document.createElement("div"); | |
247 a.appendChild(b); | |
248 a.appendChild(c); | |
249 assert_array_equals(a.childNodes, [b, c]); | |
250 assert_equals(a.replaceChild(c, b), b); | |
251 assert_array_equals(a.childNodes, [c]); | |
252 }, "Replacing a node with its next sibling should work (2 children)"); | |
253 test(function() { | |
254 var a = document.createElement("div"); | |
255 var b = document.createElement("div"); | |
256 var c = document.createElement("div"); | |
257 var d = document.createElement("div"); | |
258 var e = document.createElement("div"); | |
259 a.appendChild(b); | |
260 a.appendChild(c); | |
261 a.appendChild(d); | |
262 a.appendChild(e); | |
263 assert_array_equals(a.childNodes, [b, c, d, e]); | |
264 assert_equals(a.replaceChild(d, c), c); | |
265 assert_array_equals(a.childNodes, [b, d, e]); | |
266 }, "Replacing a node with its next sibling should work (4 children)"); | |
267 test(function() { | |
268 var a = document.createElement("div"); | |
269 var b = document.createElement("div"); | |
270 var c = document.createElement("div"); | |
271 a.appendChild(b); | |
272 a.appendChild(c); | |
273 assert_array_equals(a.childNodes, [b, c]); | |
274 assert_equals(a.replaceChild(b, b), b); | |
275 assert_array_equals(a.childNodes, [b, c]); | |
276 assert_equals(a.replaceChild(c, c), c); | |
277 assert_array_equals(a.childNodes, [b, c]); | |
278 }, "Replacing a node with itself should not move the node"); | |
279 | |
280 // Step 7. | |
281 test(function() { | |
282 var doc = document.implementation.createHTMLDocument("title"); | |
283 var doctype = doc.doctype; | |
284 assert_array_equals(doc.childNodes, [doctype, doc.documentElement]); | |
285 | |
286 var doc2 = document.implementation.createHTMLDocument("title2"); | |
287 var doctype2 = doc2.doctype; | |
288 assert_array_equals(doc2.childNodes, [doctype2, doc2.documentElement]); | |
289 | |
290 doc.replaceChild(doc2.doctype, doc.doctype); | |
291 assert_array_equals(doc.childNodes, [doctype2, doc.documentElement]); | |
292 assert_array_equals(doc2.childNodes, [doc2.documentElement]); | |
293 assert_equals(doctype.parentNode, null); | |
294 assert_equals(doctype.ownerDocument, doc); | |
295 assert_equals(doctype2.parentNode, doc); | |
296 assert_equals(doctype2.ownerDocument, doc); | |
297 }, "If the context node is a document, inserting a new doctype should work.") | |
298 | |
299 // Bugs. | |
300 test(function() { | |
301 var doc = document.implementation.createHTMLDocument("title"); | |
302 var df = doc.createDocumentFragment(); | |
303 var a = df.appendChild(doc.createElement("a")); | |
304 assert_equals(doc.documentElement, doc.replaceChild(df, doc.documentElement)); | |
305 assert_array_equals(doc.childNodes, [doc.doctype, a]); | |
306 }, "Replacing the document element with a DocumentFragment containing a single e
lement should work."); | |
307 test(function() { | |
308 var doc = document.implementation.createHTMLDocument("title"); | |
309 var df = doc.createDocumentFragment(); | |
310 var a = df.appendChild(doc.createComment("a")); | |
311 var b = df.appendChild(doc.createElement("b")); | |
312 var c = df.appendChild(doc.createComment("c")); | |
313 assert_equals(doc.documentElement, doc.replaceChild(df, doc.documentElement)); | |
314 assert_array_equals(doc.childNodes, [doc.doctype, a, b, c]); | |
315 }, "Replacing the document element with a DocumentFragment containing a single e
lement and comments should work."); | |
316 test(function() { | |
317 var doc = document.implementation.createHTMLDocument("title"); | |
318 var a = doc.createElement("a"); | |
319 assert_equals(doc.documentElement, doc.replaceChild(a, doc.documentElement)); | |
320 assert_array_equals(doc.childNodes, [doc.doctype, a]); | |
321 }, "Replacing the document element with a single element should work."); | |
322 test(function() { | |
323 document.addEventListener("DOMNodeRemoved", function(e) { | |
324 document.body.appendChild(document.createElement("x")); | |
325 }, false); | |
326 var a = document.body.firstChild, b = a.firstChild, c = b.nextSibling; | |
327 assert_equals(a.replaceChild(c, b), b); | |
328 assert_equals(b.parentNode, null); | |
329 assert_equals(a.firstChild, c); | |
330 assert_equals(c.parentNode, a); | |
331 }, "replaceChild should work in the presence of mutation events.") | |
332 test(function() { | |
333 var TEST_ID = "findme"; | |
334 var gBody = document.getElementsByTagName("body")[0]; | |
335 var parent = document.createElement("div"); | |
336 gBody.appendChild(parent); | |
337 var child = document.createElement("div"); | |
338 parent.appendChild(child); | |
339 var df = document.createDocumentFragment(); | |
340 var fragChild = df.appendChild(document.createElement("div")); | |
341 fragChild.setAttribute("id", TEST_ID); | |
342 parent.replaceChild(df, child); | |
343 assert_equals(document.getElementById(TEST_ID), fragChild, "should not be null
"); | |
344 }, "Replacing an element with a DocumentFragment should allow a child of the Doc
umentFragment to be found by Id.") | |
345 </script> | |
OLD | NEW |