2 <title>NodeIterator tests</title>
3 <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
4 <meta name=timeout content=long>
6 <script src=../../../../../resources/testharness.js></script>
7 <script src=../../../../../resources/testharnessreport.js></script>
8 <script src=../common.js></script>
12 function check_iter(iter, root, whatToShowValue) {
13 whatToShowValue = whatToShowValue === undefined ? 0xFFFFFFFF : whatToShowValue;
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');
29 var iter = document.createNodeIterator(document);
32 }, "detach() should be a no-op");
35 var iter = document.createNodeIterator(document);
36 check_iter(iter, document);
37 }, "createNodeIterator() parameter defaults");
40 var iter = document.createNodeIterator(document, null, null);
41 check_iter(iter, document, 0);
42 }, "createNodeIterator() with null as arguments");
45 var iter = document.createNodeIterator(document, undefined, undefined);
46 check_iter(iter, document);
47 }, "createNodeIterator() with undefined as arguments");
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");
55 function testIterator(root, whatToShow, filter) {
56 var iter = document.createNodeIterator(root, whatToShow, filter);
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");
65 var expectedReferenceNode = root;
66 var expectedBeforeNode = true;
67 // "Let node be the value of the referenceNode attribute."
69 // "Let before node be the value of the pointerBeforeReferenceNode
71 var beforeNode = true;
73 // Each loop iteration runs nextNode() once.
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)) {
85 // "If before node is true, set it to false."
88 // "Filter node and let result be the return value.
90 // "If result is FILTER_ACCEPT, go to the next step in the overall set of
93 // "Otherwise, run these substeps again."
94 if (!((1 << (node.nodeType - 1)) & whatToShow)
95 || (filter && filter(node) != NodeFilter.FILTER_ACCEPT)) {
99 // "Set the referenceNode attribute to node, set the
100 // pointerBeforeReferenceNode attribute to before node, and return node."
101 expectedReferenceNode = node;
102 expectedBeforeNode = beforeNode;
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)");
116 // Same but for previousNode() (mostly copy-pasted, oh well)
117 var iter = document.createNodeIterator(root, whatToShow, filter);
119 var expectedReferenceNode = root;
120 var expectedBeforeNode = true;
121 // "Let node be the value of the referenceNode attribute."
123 // "Let before node be the value of the pointerBeforeReferenceNode
125 var beforeNode = true;
127 // Each loop iteration runs previousNode() once.
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)) {
139 // "If before node is false, set it to true."
142 // "Filter node and let result be the return value.
144 // "If result is FILTER_ACCEPT, go to the next step in the overall set of
147 // "Otherwise, run these substeps again."
148 if (!((1 << (node.nodeType - 1)) & whatToShow)
149 || (filter && filter(node) != NodeFilter.FILTER_ACCEPT)) {
153 // "Set the referenceNode attribute to node, set the
154 // pointerBeforeReferenceNode attribute to before node, and return node."
155 expectedReferenceNode = node;
156 expectedBeforeNode = beforeNode;
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)");
174 "NodeFilter.SHOW_ELEMENT",
175 "NodeFilter.SHOW_ATTRIBUTE",
176 "NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_DOCUMENT",
181 "(function(node) { return true })",
182 "(function(node) { return false })",
183 "(function(node) { return node.nodeName[0] == '#' })",
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++) {
191 "document.createNodeIterator(" + testNodes[i]
192 + ", " + whatToShows[j] + ", " + callbacks[k] + ")",
193 eval(testNodes[i]), eval(whatToShows[j]), eval(callbacks[k])
199 generate_tests(testIterator, tests);
201 testDiv.style.display = "none";