OLD | NEW |
(Empty) | |
| 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 : whatToShowVal
ue; |
| 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, 'pointerBeforeReference
Node'); |
| 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> |
OLD | NEW |