Refactoring: Pull all fullscreen code out of Document and into its own helper class
[WebKit-https.git] / LayoutTests / traversal / acid3-test-2.html
1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
2 <html>
3 <head>
4 <script src="../resources/js-test-pre.js"></script>
5 </head>
6 <body>
7 <p id="description"></p>
8 <div id="console"></div>
9 <script>
10 description("Test of behavior NodeIterator when nodes are removed, from Acid3.");
11
12 var iframe = document.createElement("iframe");
13 iframe.setAttribute("src", "about:blank");
14 document.body.appendChild(iframe);
15 var doc = iframe.contentDocument;
16 for (var i = doc.documentElement.childNodes.length-1; i >= 0; i -= 1)
17     doc.documentElement.removeChild(doc.documentElement.childNodes[i]);
18 doc.documentElement.appendChild(doc.createElement('head'));
19 doc.documentElement.firstChild.appendChild(doc.createElement('title'));
20 doc.documentElement.appendChild(doc.createElement('body'));
21
22 // test 2: Removing nodes during iteration
23 var count = 0;
24 var t1 = doc.body.appendChild(doc.createElement('t1'));
25 var t2 = doc.body.appendChild(doc.createElement('t2'));
26 var t3 = doc.body.appendChild(doc.createElement('t3'));
27 var t4 = doc.body.appendChild(doc.createElement('t4'));
28 var expect = function(n, node1, node2) {
29     count += 1;
30     shouldBe("count", "" + n);
31     nodea = node1;
32     nodeb = node2;
33     shouldBe("nodea", "nodeb");
34   };
35 var callCount = 0;
36 var filterFunctions = [
37     function (node) { expect(1, node, doc.body); return true; }, // filter 0
38     function (node) { expect(3, node, t1); return true; }, // filter 1
39     function (node) { expect(5, node, t2); return true; }, // filter 2
40     function (node) { expect(7, node, t3); doc.body.removeChild(t4); return true; }, // filter 3
41     function (node) { expect(9, node, t4); return true; }, // filter 4
42     function (node) { expect(11, node, t4); doc.body.removeChild(t4); return 2 /* REJECT */; }, // filter 5
43     function (node) { expect(12, node, t3); return true; }, // filter 6
44     function (node) { expect(14, node, t2); doc.body.removeChild(t2); return true; }, // filter 7
45     function (node) { expect(16, node, t1); return true; }, // filter 8
46 ];
47 var i = doc.createNodeIterator(doc.documentElement.lastChild, 0xFFFFFFFF, function (node) { return filterFunctions[callCount++](node); }, true);
48     // * B 1 2 3 4
49 expect(2, i.nextNode(), doc.body); // filter 0
50     // [B] * 1 2 3 4     
51 expect(4, i.nextNode(), t1); // filter 1
52     // B [1] * 2 3 4
53 expect(6, i.nextNode(), t2); // filter 2
54     // B 1 [2] * 3 4
55 expect(8, i.nextNode(), t3); // filter 3
56     // B 1 2 [3] *
57 doc.body.appendChild(t4);
58     // B 1 2 [3] * 4
59 expect(10, i.nextNode(), t4); // filter 4
60     // B 1 2 3 [4] *
61 expect(13, i.previousNode(), t3); // filters 5, 6
62     // B 1 2 3 * (4) // filter 5
63     // B 1 2 [3] *   // between 5 and 6
64     // B 1 2 * (3)   // filter 6
65     // B 1 2 * [3]
66 expect(15, i.previousNode(), t2); // filter 7
67     // B 1 * (2) [3]
68     // -- spec says "For instance, if a NodeFilter removes a node
69     //    from a document, it can still accept the node, which
70     //    means that the node may be returned by the NodeIterator
71     //    or TreeWalker even though it is no longer in the subtree
72     //    being traversed."
73     // -- but it also says "If changes to the iterated list do not
74     //    remove the reference node, they do not affect the state
75     //    of the NodeIterator."
76     // B 1 * [3]
77 expect(17, i.previousNode(), t1); // filter 8
78     // B [1] * 3
79
80 document.body.removeChild(iframe);
81
82 var successfullyParsed = true;
83 </script>
84 <script src="../resources/js-test-post.js"></script>
85 </body>
86 </html>