Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator-removal.html |
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator-removal.html b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator-removal.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f752461e5584998c522423819c7d44ff4374587d |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/traversal/NodeIterator-removal.html |
@@ -0,0 +1,100 @@ |
+<!doctype html> |
+<title>NodeIterator removal 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"; |
+ |
+for (var i = 0; i < testNodes.length; i++) { |
+ var node = eval(testNodes[i]); |
+ if (!node.parentNode) { |
+ // Nothing to test |
+ continue; |
+ } |
+ test(function() { |
+ var iters = []; |
+ var descs = []; |
+ var expectedReferenceNodes = []; |
+ var expectedPointers = []; |
+ |
+ for (var j = 0; j < testNodes.length; j++) { |
+ var root = eval(testNodes[j]); |
+ // Add all distinct iterators with this root, calling nextNode() |
+ // repeatedly until it winds up with the same iterator. |
+ for (var k = 0; ; k++) { |
+ var iter = document.createNodeIterator(root); |
+ for (var l = 0; l < k; l++) { |
+ iter.nextNode(); |
+ } |
+ if (k && iter.referenceNode == iters[iters.length - 1].referenceNode |
+ && iter.pointerBeforeReferenceNode |
+ == iters[iters.length - 1].pointerBeforeReferenceNode) { |
+ break; |
+ } else { |
+ iters.push(iter); |
+ descs.push("document.createNodeIterator(" + testNodes[j] |
+ + ") advanced " + k + " times"); |
+ expectedReferenceNodes.push(iter.referenceNode); |
+ expectedPointers.push(iter.pointerBeforeReferenceNode); |
+ |
+ var idx = iters.length - 1; |
+ |
+ // "If the node is root or is not an inclusive ancestor of the |
+ // referenceNode attribute value, terminate these steps." |
+ // |
+ // We also have to rule out the case where node is an ancestor of |
+ // root, which is implicitly handled by the spec since such a node |
+ // was not part of the iterator collection to start with. |
+ if (isInclusiveAncestor(node, root) |
+ || !isInclusiveAncestor(node, iter.referenceNode)) { |
+ continue; |
+ } |
+ |
+ // "If the pointerBeforeReferenceNode attribute value is false, set |
+ // the referenceNode attribute to the first node preceding the node |
+ // that is being removed, and terminate these steps." |
+ if (!iter.pointerBeforeReferenceNode) { |
+ expectedReferenceNodes[idx] = previousNode(node); |
+ continue; |
+ } |
+ |
+ // "If there is a node following the last inclusive descendant of the |
+ // node that is being removed, set the referenceNode attribute to the |
+ // first such node, and terminate these steps." |
+ var next = nextNodeDescendants(node); |
+ if (next) { |
+ expectedReferenceNodes[idx] = next; |
+ continue; |
+ } |
+ |
+ // "Set the referenceNode attribute to the first node preceding the |
+ // node that is being removed and set the pointerBeforeReferenceNode |
+ // attribute to false." |
+ expectedReferenceNodes[idx] = previousNode(node); |
+ expectedPointers[idx] = false; |
+ } |
+ } |
+ } |
+ |
+ var oldParent = node.parentNode; |
+ var oldSibling = node.nextSibling; |
+ oldParent.removeChild(node); |
+ |
+ for (var j = 0; j < iters.length; j++) { |
+ var iter = iters[j]; |
+ assert_equals(iter.referenceNode, expectedReferenceNodes[j], |
+ ".referenceNode of " + descs[j]); |
+ assert_equals(iter.pointerBeforeReferenceNode, expectedPointers[j], |
+ ".pointerBeforeReferenceNode of " + descs[j]); |
+ } |
+ |
+ oldParent.insertBefore(node, oldSibling); |
+ }, "Test removing node " + testNodes[i]); |
+} |
+ |
+testDiv.style.display = "none"; |
+</script> |