Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator.html |
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator.html b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..544a63bf0f38be14acc5f320f5ae39b800166f8c |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator.html |
@@ -0,0 +1,202 @@ |
+<!doctype html> |
+<title>NodeIterator tests</title> |
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name> |
+<meta name=timeout content=long> |
+<div id=log></div> |
+<script src=../../../../resources/testharness.js></script> |
+<script src=../../../../resources/testharnessreport.js></script> |
+<script src=../common.js></script> |
+<script> |
+"use strict"; |
+ |
+function check_iter(iter, root, whatToShowValue) { |
+ whatToShowValue = whatToShowValue === undefined ? 0xFFFFFFFF : whatToShowValue; |
+ |
+ assert_equals(iter.toString(), '[object NodeIterator]', 'toString'); |
+ assert_equals(iter.root, root, 'root'); |
+ assert_equals(iter.whatToShow, whatToShowValue, 'whatToShow'); |
+ assert_equals(iter.filter, null, 'filter'); |
+ assert_equals(iter.referenceNode, root, 'referenceNode'); |
+ assert_equals(iter.pointerBeforeReferenceNode, true, 'pointerBeforeReferenceNode'); |
+ assert_readonly(iter, 'root'); |
+ assert_readonly(iter, 'whatToShow'); |
+ assert_readonly(iter, 'filter'); |
+ assert_readonly(iter, 'referenceNode'); |
+ assert_readonly(iter, 'pointerBeforeReferenceNode'); |
+} |
+ |
+test(function() { |
+ var iter = document.createNodeIterator(document); |
+ iter.detach(); |
+ iter.detach(); |
+}, "detach() should be a no-op"); |
+ |
+test(function() { |
+ var iter = document.createNodeIterator(document); |
+ check_iter(iter, document); |
+}, "createNodeIterator() parameter defaults"); |
+ |
+test(function() { |
+ var iter = document.createNodeIterator(document, null, null); |
+ check_iter(iter, document, 0); |
+}, "createNodeIterator() with null as arguments"); |
+ |
+test(function() { |
+ var iter = document.createNodeIterator(document, undefined, undefined); |
+ check_iter(iter, document); |
+}, "createNodeIterator() with undefined as arguments"); |
+ |
+test(function() { |
+ var iter = document.createNodeIterator(document, NodeFilter.SHOW_ALL, |
+ function() { throw {name: "failed"} }); |
+ assert_throws({name: "failed"}, function() { iter.nextNode() }); |
+}, "Propagate exception from filter function"); |
+ |
+function testIterator(root, whatToShow, filter) { |
+ var iter = document.createNodeIterator(root, whatToShow, filter); |
+ |
+ assert_equals(iter.root, root, ".root"); |
+ assert_equals(iter.referenceNode, root, "Initial .referenceNode"); |
+ assert_equals(iter.pointerBeforeReferenceNode, true, |
+ ".pointerBeforeReferenceNode"); |
+ assert_equals(iter.whatToShow, whatToShow, ".whatToShow"); |
+ assert_equals(iter.filter, filter, ".filter"); |
+ |
+ var expectedReferenceNode = root; |
+ var expectedBeforeNode = true; |
+ // "Let node be the value of the referenceNode attribute." |
+ var node = root; |
+ // "Let before node be the value of the pointerBeforeReferenceNode |
+ // attribute." |
+ var beforeNode = true; |
+ var i = 1; |
+ // Each loop iteration runs nextNode() once. |
+ while (node) { |
+ do { |
+ if (!beforeNode) { |
+ // "If before node is false, let node be the first node following node |
+ // in the iterator collection. If there is no such node return null." |
+ node = nextNode(node); |
+ if (!isInclusiveDescendant(node, root)) { |
+ node = null; |
+ break; |
+ } |
+ } else { |
+ // "If before node is true, set it to false." |
+ beforeNode = false; |
+ } |
+ // "Filter node and let result be the return value. |
+ // |
+ // "If result is FILTER_ACCEPT, go to the next step in the overall set of |
+ // steps. |
+ // |
+ // "Otherwise, run these substeps again." |
+ if (!((1 << (node.nodeType - 1)) & whatToShow) |
+ || (filter && filter(node) != NodeFilter.FILTER_ACCEPT)) { |
+ continue; |
+ } |
+ |
+ // "Set the referenceNode attribute to node, set the |
+ // pointerBeforeReferenceNode attribute to before node, and return node." |
+ expectedReferenceNode = node; |
+ expectedBeforeNode = beforeNode; |
+ |
+ break; |
+ } while (true); |
+ |
+ assert_equals(iter.nextNode(), node, ".nextNode() " + i + " time(s)"); |
+ assert_equals(iter.referenceNode, expectedReferenceNode, |
+ ".referenceNode after nextNode() " + i + " time(s)"); |
+ assert_equals(iter.pointerBeforeReferenceNode, expectedBeforeNode, |
+ ".pointerBeforeReferenceNode after nextNode() " + i + " time(s)"); |
+ |
+ i++; |
+ } |
+ |
+ // Same but for previousNode() (mostly copy-pasted, oh well) |
+ var iter = document.createNodeIterator(root, whatToShow, filter); |
+ |
+ var expectedReferenceNode = root; |
+ var expectedBeforeNode = true; |
+ // "Let node be the value of the referenceNode attribute." |
+ var node = root; |
+ // "Let before node be the value of the pointerBeforeReferenceNode |
+ // attribute." |
+ var beforeNode = true; |
+ var i = 1; |
+ // Each loop iteration runs previousNode() once. |
+ while (node) { |
+ do { |
+ if (beforeNode) { |
+ // "If before node is true, let node be the first node preceding node |
+ // in the iterator collection. If there is no such node return null." |
+ node = previousNode(node); |
+ if (!isInclusiveDescendant(node, root)) { |
+ node = null; |
+ break; |
+ } |
+ } else { |
+ // "If before node is false, set it to true." |
+ beforeNode = true; |
+ } |
+ // "Filter node and let result be the return value. |
+ // |
+ // "If result is FILTER_ACCEPT, go to the next step in the overall set of |
+ // steps. |
+ // |
+ // "Otherwise, run these substeps again." |
+ if (!((1 << (node.nodeType - 1)) & whatToShow) |
+ || (filter && filter(node) != NodeFilter.FILTER_ACCEPT)) { |
+ continue; |
+ } |
+ |
+ // "Set the referenceNode attribute to node, set the |
+ // pointerBeforeReferenceNode attribute to before node, and return node." |
+ expectedReferenceNode = node; |
+ expectedBeforeNode = beforeNode; |
+ |
+ break; |
+ } while (true); |
+ |
+ assert_equals(iter.previousNode(), node, ".previousNode() " + i + " time(s)"); |
+ assert_equals(iter.referenceNode, expectedReferenceNode, |
+ ".referenceNode after previousNode() " + i + " time(s)"); |
+ assert_equals(iter.pointerBeforeReferenceNode, expectedBeforeNode, |
+ ".pointerBeforeReferenceNode after previousNode() " + i + " time(s)"); |
+ |
+ i++; |
+ } |
+} |
+ |
+var whatToShows = [ |
+ "0", |
+ "0xFFFFFFFF", |
+ "NodeFilter.SHOW_ELEMENT", |
+ "NodeFilter.SHOW_ATTRIBUTE", |
+ "NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_DOCUMENT", |
+]; |
+ |
+var callbacks = [ |
+ "null", |
+ "(function(node) { return true })", |
+ "(function(node) { return false })", |
+ "(function(node) { return node.nodeName[0] == '#' })", |
+]; |
+ |
+var tests = []; |
+for (var i = 0; i < testNodes.length; i++) { |
+ for (var j = 0; j < whatToShows.length; j++) { |
+ for (var k = 0; k < callbacks.length; k++) { |
+ tests.push([ |
+ "document.createNodeIterator(" + testNodes[i] |
+ + ", " + whatToShows[j] + ", " + callbacks[k] + ")", |
+ eval(testNodes[i]), eval(whatToShows[j]), eval(callbacks[k]) |
+ ]); |
+ } |
+ } |
+} |
+ |
+generate_tests(testIterator, tests); |
+ |
+testDiv.style.display = "none"; |
+</script> |