87 lines
3.4 KiB
HTML
87 lines
3.4 KiB
HTML
<!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>
|