0f618efb4d7a4c0cbbf7109b965d2087173221cf
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / dom / traversal / NodeIterator.html
1 <!doctype html>
2 <title>NodeIterator tests</title>
3 <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
4 <meta name=timeout content=long>
5 <div id=log></div>
6 <script src=/resources/testharness.js></script>
7 <script src=/resources/testharnessreport.js></script>
8 <script src=../common.js></script>
9 <script>
10 "use strict";
11
12 function check_iter(iter, root, whatToShowValue) {
13     whatToShowValue = whatToShowValue === undefined ? 0xFFFFFFFF : whatToShowValue;
14
15     assert_equals(iter.toString(), '[object NodeIterator]', 'toString');
16     assert_equals(iter.root, root, 'root');
17     assert_equals(iter.whatToShow, whatToShowValue, 'whatToShow');
18     assert_equals(iter.filter, null, 'filter');
19     assert_equals(iter.referenceNode, root, 'referenceNode');
20     assert_equals(iter.pointerBeforeReferenceNode, true, 'pointerBeforeReferenceNode');
21     assert_readonly(iter, 'root');
22     assert_readonly(iter, 'whatToShow');
23     assert_readonly(iter, 'filter');
24     assert_readonly(iter, 'referenceNode');
25     assert_readonly(iter, 'pointerBeforeReferenceNode');
26 }
27
28 test(function() {
29   var iter = document.createNodeIterator(document);
30   iter.detach();
31   iter.detach();
32 }, "detach() should be a no-op");
33
34 test(function() {
35   var iter = document.createNodeIterator(document);
36   check_iter(iter, document);
37 }, "createNodeIterator() parameter defaults");
38
39 test(function() {
40   var iter = document.createNodeIterator(document, null, null);
41   check_iter(iter, document, 0);
42 }, "createNodeIterator() with null as arguments");
43
44 test(function() {
45   var iter = document.createNodeIterator(document, undefined, undefined);
46   check_iter(iter, document);
47 }, "createNodeIterator() with undefined as arguments");
48
49 test(function() {
50   var iter = document.createNodeIterator(document, NodeFilter.SHOW_ALL,
51                                         function() { throw {name: "failed"} });
52   assert_throws({name: "failed"}, function() { iter.nextNode() });
53 }, "Propagate exception from filter function");
54
55 function testIterator(root, whatToShow, filter) {
56   var iter = document.createNodeIterator(root, whatToShow, filter);
57
58   assert_equals(iter.root, root, ".root");
59   assert_equals(iter.referenceNode, root, "Initial .referenceNode");
60   assert_equals(iter.pointerBeforeReferenceNode, true,
61                 ".pointerBeforeReferenceNode");
62   assert_equals(iter.whatToShow, whatToShow, ".whatToShow");
63   assert_equals(iter.filter, filter, ".filter");
64
65   var expectedReferenceNode = root;
66   var expectedBeforeNode = true;
67   // "Let node be the value of the referenceNode attribute."
68   var node = root;
69   // "Let before node be the value of the pointerBeforeReferenceNode
70   // attribute."
71   var beforeNode = true;
72   var i = 1;
73   // Each loop iteration runs nextNode() once.
74   while (node) {
75     do {
76       if (!beforeNode) {
77         // "If before node is false, let node be the first node following node
78         // in the iterator collection. If there is no such node return null."
79         node = nextNode(node);
80         if (!isInclusiveDescendant(node, root)) {
81           node = null;
82           break;
83         }
84       } else {
85         // "If before node is true, set it to false."
86         beforeNode = false;
87       }
88       // "Filter node and let result be the return value.
89       //
90       // "If result is FILTER_ACCEPT, go to the next step in the overall set of
91       // steps.
92       //
93       // "Otherwise, run these substeps again."
94       if (!((1 << (node.nodeType - 1)) & whatToShow)
95           || (filter && filter(node) != NodeFilter.FILTER_ACCEPT)) {
96         continue;
97       }
98
99       // "Set the referenceNode attribute to node, set the
100       // pointerBeforeReferenceNode attribute to before node, and return node."
101       expectedReferenceNode = node;
102       expectedBeforeNode = beforeNode;
103
104       break;
105     } while (true);
106
107     assert_equals(iter.nextNode(), node, ".nextNode() " + i + " time(s)");
108     assert_equals(iter.referenceNode, expectedReferenceNode,
109                   ".referenceNode after nextNode() " + i + " time(s)");
110     assert_equals(iter.pointerBeforeReferenceNode, expectedBeforeNode,
111              ".pointerBeforeReferenceNode after nextNode() " + i + " time(s)");
112
113     i++;
114   }
115
116   // Same but for previousNode() (mostly copy-pasted, oh well)
117   var iter = document.createNodeIterator(root, whatToShow, filter);
118
119   var expectedReferenceNode = root;
120   var expectedBeforeNode = true;
121   // "Let node be the value of the referenceNode attribute."
122   var node = root;
123   // "Let before node be the value of the pointerBeforeReferenceNode
124   // attribute."
125   var beforeNode = true;
126   var i = 1;
127   // Each loop iteration runs previousNode() once.
128   while (node) {
129     do {
130       if (beforeNode) {
131         // "If before node is true, let node be the first node preceding node
132         // in the iterator collection. If there is no such node return null."
133         node = previousNode(node);
134         if (!isInclusiveDescendant(node, root)) {
135           node = null;
136           break;
137         }
138       } else {
139         // "If before node is false, set it to true."
140         beforeNode = true;
141       }
142       // "Filter node and let result be the return value.
143       //
144       // "If result is FILTER_ACCEPT, go to the next step in the overall set of
145       // steps.
146       //
147       // "Otherwise, run these substeps again."
148       if (!((1 << (node.nodeType - 1)) & whatToShow)
149           || (filter && filter(node) != NodeFilter.FILTER_ACCEPT)) {
150         continue;
151       }
152
153       // "Set the referenceNode attribute to node, set the
154       // pointerBeforeReferenceNode attribute to before node, and return node."
155       expectedReferenceNode = node;
156       expectedBeforeNode = beforeNode;
157
158       break;
159     } while (true);
160
161     assert_equals(iter.previousNode(), node, ".previousNode() " + i + " time(s)");
162     assert_equals(iter.referenceNode, expectedReferenceNode,
163                   ".referenceNode after previousNode() " + i + " time(s)");
164     assert_equals(iter.pointerBeforeReferenceNode, expectedBeforeNode,
165          ".pointerBeforeReferenceNode after previousNode() " + i + " time(s)");
166
167     i++;
168   }
169 }
170
171 var whatToShows = [
172   "0",
173   "0xFFFFFFFF",
174   "NodeFilter.SHOW_ELEMENT",
175   "NodeFilter.SHOW_ATTRIBUTE",
176   "NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_DOCUMENT",
177 ];
178
179 var callbacks = [
180   "null",
181   "(function(node) { return true })",
182   "(function(node) { return false })",
183   "(function(node) { return node.nodeName[0] == '#' })",
184 ];
185
186 var tests = [];
187 for (var i = 0; i < testNodes.length; i++) {
188   for (var j = 0; j < whatToShows.length; j++) {
189     for (var k = 0; k < callbacks.length; k++) {
190       tests.push([
191         "document.createNodeIterator(" + testNodes[i]
192           + ", " + whatToShows[j] + ", " + callbacks[k] + ")",
193         eval(testNodes[i]), eval(whatToShows[j]), eval(callbacks[k])
194       ]);
195     }
196   }
197 }
198
199 generate_tests(testIterator, tests);
200
201 testDiv.style.display = "none";
202 </script>