| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="../resources/js-test-pre.js"></script> |
| </head> |
| <body> |
| <p id="description"></p> |
| <div id="console"></div> |
| <script> |
| description("Test of behavior NodeIterator when nodes are removed, from Acid3."); |
| |
| var iframe = document.createElement("iframe"); |
| iframe.setAttribute("src", "about:blank"); |
| document.body.appendChild(iframe); |
| var doc = iframe.contentDocument; |
| for (var i = doc.documentElement.childNodes.length-1; i >= 0; i -= 1) |
| doc.documentElement.removeChild(doc.documentElement.childNodes[i]); |
| doc.documentElement.appendChild(doc.createElement('head')); |
| doc.documentElement.firstChild.appendChild(doc.createElement('title')); |
| doc.documentElement.appendChild(doc.createElement('body')); |
| |
| // test 2: Removing nodes during iteration |
| var count = 0; |
| var t1 = doc.body.appendChild(doc.createElement('t1')); |
| var t2 = doc.body.appendChild(doc.createElement('t2')); |
| var t3 = doc.body.appendChild(doc.createElement('t3')); |
| var t4 = doc.body.appendChild(doc.createElement('t4')); |
| var expect = function(n, node1, node2) { |
| count += 1; |
| shouldBe("count", "" + n); |
| nodea = node1; |
| nodeb = node2; |
| shouldBe("nodea", "nodeb"); |
| }; |
| var callCount = 0; |
| var filterFunctions = [ |
| function (node) { expect(1, node, doc.body); return true; }, // filter 0 |
| function (node) { expect(3, node, t1); return true; }, // filter 1 |
| function (node) { expect(5, node, t2); return true; }, // filter 2 |
| function (node) { expect(7, node, t3); doc.body.removeChild(t4); return true; }, // filter 3 |
| function (node) { expect(9, node, t4); return true; }, // filter 4 |
| function (node) { expect(11, node, t4); doc.body.removeChild(t4); return 2 /* REJECT */; }, // filter 5 |
| function (node) { expect(12, node, t3); return true; }, // filter 6 |
| function (node) { expect(14, node, t2); doc.body.removeChild(t2); return true; }, // filter 7 |
| function (node) { expect(16, node, t1); return true; }, // filter 8 |
| ]; |
| var i = doc.createNodeIterator(doc.documentElement.lastChild, 0xFFFFFFFF, function (node) { return filterFunctions[callCount++](node); }, true); |
| // * B 1 2 3 4 |
| expect(2, i.nextNode(), doc.body); // filter 0 |
| // [B] * 1 2 3 4 |
| expect(4, i.nextNode(), t1); // filter 1 |
| // B [1] * 2 3 4 |
| expect(6, i.nextNode(), t2); // filter 2 |
| // B 1 [2] * 3 4 |
| expect(8, i.nextNode(), t3); // filter 3 |
| // B 1 2 [3] * |
| doc.body.appendChild(t4); |
| // B 1 2 [3] * 4 |
| expect(10, i.nextNode(), t4); // filter 4 |
| // B 1 2 3 [4] * |
| expect(13, i.previousNode(), t3); // filters 5, 6 |
| // B 1 2 3 * (4) // filter 5 |
| // B 1 2 [3] * // between 5 and 6 |
| // B 1 2 * (3) // filter 6 |
| // B 1 2 * [3] |
| expect(15, i.previousNode(), t2); // filter 7 |
| // B 1 * (2) [3] |
| // -- spec says "For instance, if a NodeFilter removes a node |
| // from a document, it can still accept the node, which |
| // means that the node may be returned by the NodeIterator |
| // or TreeWalker even though it is no longer in the subtree |
| // being traversed." |
| // -- but it also says "If changes to the iterated list do not |
| // remove the reference node, they do not affect the state |
| // of the NodeIterator." |
| // B 1 * [3] |
| expect(17, i.previousNode(), t1); // filter 8 |
| // B [1] * 3 |
| |
| document.body.removeChild(iframe); |
| |
| var successfullyParsed = true; |
| </script> |
| <script src="../resources/js-test-post.js"></script> |
| </body> |
| </html> |