<script>
function doLog(msg)
{
var d = document.createElement("div");
d.innerHTML = msg;
document.body.appendChild(d);
}
function report(msg, res)
{
if (res)
msg = "<font color=green>PASS:</font>" + msg;
else
msg = "<font color=red>FAIL:</font>" + msg;
doLog(msg);
}
/*
Tree:
a
b
c
d
e
f
g
h
b, c are rejected,
d is skipped.
g is rejected
*/
function kid(parent) {
var newKid = document.createElement("div");
parent.appendChild(newKid);
return newKid;
}
function test() {
if (window.testRunner)
testRunner.dumpAsText();
var wrapper = document.createElement("div"); // just to have one more level up.
var a = kid(wrapper);
var b = kid(a);
var c = kid(b);
var d = kid(a);
var e = kid(d);
var f = kid(a);
var g = kid(a);
var h = kid(g);
a.setAttribute("id", "a");
b.setAttribute("id", "b");
c.setAttribute("id", "c");
d.setAttribute("id", "d");
e.setAttribute("id", "e");
f.setAttribute("id", "f");
g.setAttribute("id", "g");
h.setAttribute("id", "h");
function filter(node) {
if (node == b || node == c || node == g)
return NodeFilter.FILTER_REJECT;
if (node == d)
return NodeFilter.FILTER_SKIP;
return NodeFilter.FILTER_ACCEPT;
}
var tw = document.createTreeWalker(a, NodeFilter.SHOW_ALL, filter, true);
report("Proper a.firstChild()", tw.firstChild() == e);
tw.currentNode = b;
report("Proper b.firstChild()", tw.firstChild() == null);
// shouldn't move.
report("Shouldn't move", tw.currentNode == b);
tw.currentNode = b;
report("Proper b.nextSibling()", tw.nextSibling() == e);
// This is because we should treat 'b' as skipped when we are under it.
tw.currentNode = c;
report("Proper c.nextSibling()", tw.nextSibling() == e);
tw.currentNode = e;
report("Proper e.nextSibling()", tw.nextSibling() == f);
tw.currentNode = f;
report("Proper f.previousSibling()", tw.previousSibling() == e);
tw.currentNode = e;
report("Proper e.previousSibling()", tw.previousSibling() == null);
report("Shouldn't move", tw.currentNode == e);
tw.currentNode = h;
report("Proper h.previousSibling()", tw.previousSibling() == f);
tw.currentNode = g;
report("Proper g.previousSibling()", tw.previousSibling() == f);
// f is g's previous sibling, but not the other way around :-)
tw.currentNode = f;
report("Proper f.nextSibling()", tw.nextSibling() == null);
report("Proper f.parentNode()", tw.parentNode() == a);
report("Proper a.parentNode()", tw.parentNode() == null);
// Test exit/capture.
tw.currentNode = a.parentNode;
report("Proper a's parent.nextNode()", tw.nextNode() == a);
// Should get caught..
report("Re-capture #1", tw.previousNode() == null);
report("Re-capture #2", tw.parentNode() == null);
report("nextNode from a", tw.nextNode() == e);
report("prevNode to a", tw.previousNode() == a);
doLog("All done!");
}
</script>
<body onload="test()">