summaryrefslogtreecommitdiffstats
path: root/LayoutTests/fast/dom/TreeWalker
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/fast/dom/TreeWalker')
-rw-r--r--LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode-expected.txt36
-rw-r--r--LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/acceptNode-filter-expected.txt53
-rw-r--r--LayoutTests/fast/dom/TreeWalker/acceptNode-filter.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/filter-throw-expected.txt21
-rw-r--r--LayoutTests/fast/dom/TreeWalker/filter-throw.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject-expected.txt14
-rw-r--r--LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip-expected.txt16
-rw-r--r--LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/resources/TreeWalker-currentNode.js55
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/TEMPLATE.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/acceptNode-filter.js81
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/filter-throw.js32
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/previousNodeLastChildReject.js21
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/previousSiblingLastChildSkip.js23
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/traversal-reject.js58
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip-most.js27
-rw-r--r--LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip.js60
-rw-r--r--LayoutTests/fast/dom/TreeWalker/traversal-reject-expected.txt33
-rw-r--r--LayoutTests/fast/dom/TreeWalker/traversal-reject.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/traversal-skip-expected.txt35
-rw-r--r--LayoutTests/fast/dom/TreeWalker/traversal-skip-most-expected.txt16
-rw-r--r--LayoutTests/fast/dom/TreeWalker/traversal-skip-most.html13
-rw-r--r--LayoutTests/fast/dom/TreeWalker/traversal-skip.html13
25 files changed, 698 insertions, 0 deletions
diff --git a/LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode-expected.txt b/LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode-expected.txt
new file mode 100644
index 0000000..d9ea239
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode-expected.txt
@@ -0,0 +1,36 @@
+Tests the TreeWalker.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Test that TreeWalker.parent() doesn't set the currentNode to a node not under the root.
+
+PASS w.currentNode is subTree
+PASS w.parentNode() is null
+PASS w.currentNode is subTree
+
+Test that we handle setting the currentNode to arbitrary nodes not under the root element.
+
+PASS w.parentNode() is null
+PASS w.currentNode is document.documentElement
+PASS w.nextNode() is document.documentElement.firstChild
+PASS w.currentNode is document.documentElement.firstChild
+PASS w.previousNode() is null
+PASS w.currentNode is document.documentElement
+PASS w.firstChild() is document.documentElement.firstChild
+PASS w.currentNode is document.documentElement.firstChild
+PASS w.lastChild() is document.documentElement.lastChild
+PASS w.currentNode is document.documentElement.lastChild
+PASS w.nextSibling() is null
+PASS w.currentNode is document.documentElement
+PASS w.previousSibling() is null
+PASS w.currentNode is document.documentElement
+
+Test how we handle the case when the traversed to node within the root, but the currentElement is not.
+
+PASS w.nextNode() is subTree
+PASS w.lastChild() is subTree
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode.html b/LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode.html
new file mode 100644
index 0000000..fa8cad3
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/TreeWalker-currentNode.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/acceptNode-filter-expected.txt b/LayoutTests/fast/dom/TreeWalker/acceptNode-filter-expected.txt
new file mode 100644
index 0000000..ca5da84
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/acceptNode-filter-expected.txt
@@ -0,0 +1,53 @@
+Test JS objects as NodeFilters.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Testing with raw function filter
+ filtering node A1
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+ filtering node B1
+ filtering node B2
+PASS walker.nextNode(); walker.currentNode.id is 'B2'
+
+Testing with object filter
+ filtering node A1
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+ filtering node B1
+ filtering node B2
+PASS walker.nextNode(); walker.currentNode.id is 'B2'
+
+Testing with null filter
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'B1'
+
+Testing with undefined filter
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'B1'
+
+Testing with object lacking acceptNode property
+PASS walker.firstChild(); threw exception TypeError: NodeFilter object does not have an acceptNode function.
+PASS walker.currentNode.id; is 'root'
+PASS walker.nextNode(); threw exception TypeError: NodeFilter object does not have an acceptNode function.
+PASS walker.currentNode.id; is 'root'
+
+Testing with object with non-function acceptNode property
+PASS walker.firstChild(); threw exception TypeError: NodeFilter object does not have an acceptNode function.
+PASS walker.currentNode.id; is 'root'
+PASS walker.nextNode(); threw exception TypeError: NodeFilter object does not have an acceptNode function.
+PASS walker.currentNode.id; is 'root'
+
+Testing with function having acceptNode function
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'B1'
+
+Testing acceptNode callee
+Callee: function (node) {
+ debug('Callee: ' + arguments.callee);
+ return NodeFilter.FILTER_ACCEPT;
+ }
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/acceptNode-filter.html b/LayoutTests/fast/dom/TreeWalker/acceptNode-filter.html
new file mode 100644
index 0000000..a6398f9
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/acceptNode-filter.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/acceptNode-filter.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/filter-throw-expected.txt b/LayoutTests/fast/dom/TreeWalker/filter-throw-expected.txt
new file mode 100644
index 0000000..c7213aa
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/filter-throw-expected.txt
@@ -0,0 +1,21 @@
+Test JS objects as NodeFilters.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Testing with object filter
+Test with filter function
+PASS walker.firstChild(); threw exception filter exception.
+PASS walker.currentNode.id is 'root'
+PASS walker.nextNode();walker.currentNode.id threw exception filter exception.
+PASS walker.currentNode.id is 'root'
+
+Test with filter object
+PASS walker.firstChild(); threw exception filter exception.
+PASS walker.currentNode.id is 'root'
+PASS walker.nextNode();walker.currentNode.id threw exception filter exception.
+PASS walker.currentNode.id is 'root'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/filter-throw.html b/LayoutTests/fast/dom/TreeWalker/filter-throw.html
new file mode 100644
index 0000000..e1ad777
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/filter-throw.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/filter-throw.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject-expected.txt b/LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject-expected.txt
new file mode 100644
index 0000000..0ba7bb4
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject-expected.txt
@@ -0,0 +1,14 @@
+Test for a specific problem with previousNode that failed in older versions of WebKit.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'B1'
+PASS walker.nextNode(); walker.currentNode.id is 'C1'
+PASS walker.nextNode(); walker.currentNode.id is 'B2'
+PASS walker.previousNode(); walker.currentNode.id is 'C1'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject.html b/LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject.html
new file mode 100644
index 0000000..9445675
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/previousNodeLastChildReject.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/previousNodeLastChildReject.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip-expected.txt b/LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip-expected.txt
new file mode 100644
index 0000000..4cc3b5e
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip-expected.txt
@@ -0,0 +1,16 @@
+Test for a specific problem with previousSibling that failed in older versions of WebKit.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'C1'
+PASS walker.nextNode(); walker.currentNode.id is 'C2'
+PASS walker.nextNode(); walker.currentNode.id is 'D1'
+PASS walker.nextNode(); walker.currentNode.id is 'D2'
+PASS walker.nextNode(); walker.currentNode.id is 'B2'
+PASS walker.previousSibling(); walker.currentNode.id is 'C2'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip.html b/LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip.html
new file mode 100644
index 0000000..5f44a37
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/previousSiblingLastChildSkip.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/previousSiblingLastChildSkip.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/resources/TreeWalker-currentNode.js b/LayoutTests/fast/dom/TreeWalker/resources/TreeWalker-currentNode.js
new file mode 100644
index 0000000..4a6768b
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/resources/TreeWalker-currentNode.js
@@ -0,0 +1,55 @@
+description("Tests the TreeWalker.")
+
+var subTree = document.createElement('div');
+subTree.innerHTML = "<p>Lorem ipsum <span>dolor <b>sit</b> amet</span>, consectetur <i>adipisicing</i> elit, sed do eiusmod <tt>tempor <b><i>incididunt ut</i> labore</b> et dolore magna</tt> aliqua.</p>"
+document.body.appendChild(subTree);
+
+var all = function(node) { return true; }
+var w = document.createTreeWalker(subTree, 0x01 | 0x08 | 0x10 | 0x20, all, true);
+
+debug("Test that TreeWalker.parent() doesn't set the currentNode to a node not under the root.");
+debug("");
+
+shouldBe("w.currentNode", "subTree");
+shouldBeNull("w.parentNode()");
+shouldBe("w.currentNode", "subTree");
+
+debug("");
+debug("Test that we handle setting the currentNode to arbitrary nodes not under the root element.");
+debug("");
+
+w.currentNode = document.documentElement;
+shouldBeNull("w.parentNode()");
+shouldBe("w.currentNode", "document.documentElement");
+w.currentNode = document.documentElement;
+shouldBe("w.nextNode()", "document.documentElement.firstChild");
+shouldBe("w.currentNode", "document.documentElement.firstChild");
+w.currentNode = document.documentElement;
+shouldBeNull("w.previousNode()");
+shouldBe("w.currentNode", "document.documentElement");
+w.currentNode = document.documentElement;
+shouldBe("w.firstChild()", "document.documentElement.firstChild");
+shouldBe("w.currentNode", "document.documentElement.firstChild");
+w.currentNode = document.documentElement;
+shouldBe("w.lastChild()", "document.documentElement.lastChild");
+shouldBe("w.currentNode", "document.documentElement.lastChild");
+w.currentNode = document.documentElement;
+shouldBeNull("w.nextSibling()");
+shouldBe("w.currentNode", "document.documentElement");
+w.currentNode = document.documentElement;
+shouldBeNull("w.previousSibling()");
+shouldBe("w.currentNode", "document.documentElement");
+
+debug("");
+debug("Test how we handle the case when the traversed to node within the root, but the currentElement is not.");
+debug("");
+
+w.currentNode = subTree.previousSibling;
+shouldBe("w.nextNode()", "subTree");
+w.currentNode = document.body;
+shouldBe("w.lastChild()", "subTree");
+
+// Cleanup
+document.body.removeChild(subTree);
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/TEMPLATE.html b/LayoutTests/fast/dom/TreeWalker/script-tests/TEMPLATE.html
new file mode 100644
index 0000000..1951c43
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/TEMPLATE.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="YOUR_JS_FILE_HERE"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/acceptNode-filter.js b/LayoutTests/fast/dom/TreeWalker/script-tests/acceptNode-filter.js
new file mode 100644
index 0000000..79c26cc
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/acceptNode-filter.js
@@ -0,0 +1,81 @@
+description('Test JS objects as NodeFilters.');
+
+var walker;
+var testElement = document.createElement("div");
+testElement.id = 'root';
+testElement.innerHTML='<div id="A1"><div id="B1"></div><div id="B2"></div></div>';
+
+function filter(node)
+{
+ debug(" filtering node " + node.id);
+ if (node.id == "B1")
+ return NodeFilter.FILTER_SKIP;
+ return NodeFilter.FILTER_ACCEPT;
+}
+
+debug("Testing with raw function filter");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B2'");
+
+debug("<br>Testing with object filter");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, {
+ acceptNode : function(node) {
+ debug(" filtering node " + node.id);
+ if (node.id == "B1")
+ return NodeFilter.FILTER_SKIP;
+ return NodeFilter.FILTER_ACCEPT;
+ }
+ }, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B2'");
+
+debug("<br>Testing with null filter");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, null, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B1'");
+
+debug("<br>Testing with undefined filter");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, undefined, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B1'");
+
+debug("<br>Testing with object lacking acceptNode property");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, {}, false);
+
+shouldThrow("walker.firstChild();");
+shouldBe("walker.currentNode.id;", "'root'");
+shouldThrow("walker.nextNode();");
+shouldBe("walker.currentNode.id;", "'root'");
+
+debug("<br>Testing with object with non-function acceptNode property");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, { acceptNode: "foo" }, false);
+
+shouldThrow("walker.firstChild();");
+shouldBe("walker.currentNode.id;", "'root'");
+shouldThrow("walker.nextNode();");
+shouldBe("walker.currentNode.id;", "'root'");
+
+debug("<br>Testing with function having acceptNode function");
+var filter = function() { return NodeFilter.FILTER_ACCEPT; };
+filter.acceptNode = function(node) { return NodeFilter.FILTER_SKIP; };
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B1'");
+
+debug("<br>Testing acceptNode callee");
+var filter = {
+ acceptNode: function(node) {
+ debug('Callee: ' + arguments.callee);
+ return NodeFilter.FILTER_ACCEPT;
+ }
+};
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/filter-throw.js b/LayoutTests/fast/dom/TreeWalker/script-tests/filter-throw.js
new file mode 100644
index 0000000..1127f77
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/filter-throw.js
@@ -0,0 +1,32 @@
+description('Test JS objects as NodeFilters.');
+
+var walker;
+var testElement = document.createElement("div");
+testElement.id = 'root';
+testElement.innerHTML='<div id="A1"><div id="B1"></div><div id="B2"></div></div>';
+debug("Testing with object filter");
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, function(node) {
+ throw('filter exception');
+ return NodeFilter.FILTER_ACCEPT;
+}, false);
+
+debug("Test with filter function");
+shouldThrow("walker.firstChild();");
+shouldBe("walker.currentNode.id", "'root'")
+shouldThrow("walker.nextNode();walker.currentNode.id");
+shouldBe("walker.currentNode.id", "'root'")
+
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, {
+ acceptNode : function(node) {
+ throw('filter exception');
+ return NodeFilter.FILTER_ACCEPT;
+ }
+ }, false);
+
+debug("<br>Test with filter object");
+shouldThrow("walker.firstChild();");
+shouldBe("walker.currentNode.id", "'root'")
+shouldThrow("walker.nextNode();walker.currentNode.id");
+shouldBe("walker.currentNode.id", "'root'")
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/previousNodeLastChildReject.js b/LayoutTests/fast/dom/TreeWalker/script-tests/previousNodeLastChildReject.js
new file mode 100644
index 0000000..dcc7e58
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/previousNodeLastChildReject.js
@@ -0,0 +1,21 @@
+description('Test for a specific problem with previousNode that failed in older versions of WebKit.');
+
+var testElement = document.createElement("div");
+testElement.innerHTML='<div id="A1"><div id="B1"><div id="C1"></div><div id="C2"><div id="D1"></div><div id="D2"></div></div></div><div id="B2"><div id="C3"></div><div id="C4"></div></div></div>';
+
+function filter(node)
+{
+ if (node.id == "C2")
+ return NodeFilter.FILTER_REJECT;
+ return NodeFilter.FILTER_ACCEPT;
+}
+
+var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'C1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B2'");
+shouldBe("walker.previousNode(); walker.currentNode.id", "'C1'");
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/previousSiblingLastChildSkip.js b/LayoutTests/fast/dom/TreeWalker/script-tests/previousSiblingLastChildSkip.js
new file mode 100644
index 0000000..ed7c577
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/previousSiblingLastChildSkip.js
@@ -0,0 +1,23 @@
+description('Test for a specific problem with previousSibling that failed in older versions of WebKit.');
+
+var testElement = document.createElement("div");
+testElement.innerHTML='<div id="A1"><div id="B1"><div id="C1"></div><div id="C2"><div id="D1"></div><div id="D2"></div></div></div><div id="B2"><div id="C3"></div><div id="C4"></div></div></div>';
+
+function filter(node)
+{
+ if (node.id == "B1")
+ return NodeFilter.FILTER_SKIP;
+ return NodeFilter.FILTER_ACCEPT;
+}
+
+var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'C1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'C2'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'D1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'D2'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B2'");
+shouldBe("walker.previousSibling(); walker.currentNode.id", "'C2'");
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-reject.js b/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-reject.js
new file mode 100644
index 0000000..33fdbef
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-reject.js
@@ -0,0 +1,58 @@
+description('Test TreeWalker with rejection');
+
+var walker;
+var testElement = document.createElement("div");
+testElement.innerHTML='<div id="A1"> <div id="B1"> <div id="C1"></div> </div> <div id="B2"></div><div id="B3"></div> </div>';
+
+var rejectB1Filter = {
+ acceptNode: function(node) {
+ if (node.id == 'B1')
+ return NodeFilter.FILTER_REJECT;
+
+ return NodeFilter.FILTER_ACCEPT;
+ }
+}
+
+var rejectB2Filter = {
+ acceptNode: function(node) {
+ if (node.id == 'B2')
+ return NodeFilter.FILTER_SKIP;
+
+ return NodeFilter.FILTER_ACCEPT;
+ }
+}
+
+debug("<br>Testing nextNode")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, rejectB1Filter, false);
+shouldBe("walker.nextNode(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B2'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B3'");
+
+debug("<br>Testing firstChild")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, rejectB1Filter, false);
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.firstChild(); walker.currentNode.id", "'B2'");
+
+debug("<br>Testing nextSibling")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, rejectB2Filter, false);
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.firstChild(); walker.currentNode.id", "'B1'");
+shouldBe("walker.nextSibling(); walker.currentNode.id", "'B3'");
+
+debug("<br>Testing parentNode")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, rejectB1Filter, false);
+walker.currentNode = testElement.querySelectorAll('#C1')[0];
+shouldBe("walker.parentNode(); walker.currentNode.id", "'A1'");
+
+debug("<br>Testing previousSibling")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, rejectB2Filter, false);
+walker.currentNode = testElement.querySelectorAll('#B3')[0];
+shouldBe("walker.previousSibling(); walker.currentNode.id", "'B1'");
+
+debug("<br>Testing previousNode")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, rejectB1Filter, false);
+walker.currentNode = testElement.querySelectorAll('#B3')[0];
+shouldBe("walker.previousNode(); walker.currentNode.id", "'B2'");
+shouldBe("walker.previousNode(); walker.currentNode.id", "'A1'");
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip-most.js b/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip-most.js
new file mode 100644
index 0000000..b3d21ab
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip-most.js
@@ -0,0 +1,27 @@
+description('Test TreeWalker with skipping');
+
+var walker;
+var testElement = document.createElement("div");
+testElement.innerHTML='<div id="A1"><div id="B1" class="keep"></div><div id="B2">this text matters</div><div id="B3" class="keep"></div></div>';
+
+var filter = {
+ acceptNode: function(node) {
+ if (node.className == 'keep')
+ return NodeFilter.FILTER_ACCEPT;
+
+ return NodeFilter.FILTER_SKIP;
+ }
+}
+
+debug("<br>Testing nextSibling")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+shouldBe("walker.firstChild(); walker.currentNode.id", "'B1'");
+shouldBe("walker.nextSibling(); walker.currentNode.id", "'B3'");
+
+debug("<br>Testing previousSibling")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter, false);
+walker.currentNode = testElement.querySelectorAll('#B3')[0];
+shouldBe("walker.previousSibling(); walker.currentNode.id", "'B1'");
+
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip.js b/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip.js
new file mode 100644
index 0000000..d328f53
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/script-tests/traversal-skip.js
@@ -0,0 +1,60 @@
+description('Test TreeWalker with skipping');
+
+var walker;
+var testElement = document.createElement("div");
+testElement.innerHTML='<div id="A1"> <div id="B1"> <div id="C1"></div> </div> <div id="B2"></div><div id="B3"></div> </div>';
+
+var skipB1Filter = {
+ acceptNode: function(node) {
+ if (node.id == 'B1')
+ return NodeFilter.FILTER_SKIP;
+
+ return NodeFilter.FILTER_ACCEPT;
+ }
+}
+
+var skipB2Filter = {
+ acceptNode: function(node) {
+ if (node.id == 'B2')
+ return NodeFilter.FILTER_SKIP;
+
+ return NodeFilter.FILTER_ACCEPT;
+ }
+}
+
+debug("<br>Testing nextNode")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, skipB1Filter, false);
+shouldBe("walker.nextNode(); walker.currentNode.id", "'A1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'C1'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B2'");
+shouldBe("walker.nextNode(); walker.currentNode.id", "'B3'");
+
+debug("<br>Testing firstChild")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, skipB1Filter, false);
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.firstChild(); walker.currentNode.id", "'C1'");
+
+debug("<br>Testing nextSibling")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, skipB2Filter, false);
+shouldBe("walker.firstChild(); walker.currentNode.id", "'A1'");
+shouldBe("walker.firstChild(); walker.currentNode.id", "'B1'");
+shouldBe("walker.nextSibling(); walker.currentNode.id", "'B3'");
+
+debug("<br>Testing parentNode")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, skipB1Filter, false);
+walker.currentNode = testElement.querySelectorAll('#C1')[0];
+shouldBe("walker.parentNode(); walker.currentNode.id", "'A1'");
+
+debug("<br>Testing previousSibling")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, skipB2Filter, false);
+walker.currentNode = testElement.querySelectorAll('#B3')[0];
+shouldBe("walker.previousSibling(); walker.currentNode.id", "'B1'");
+
+debug("<br>Testing previousNode")
+walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, skipB1Filter, false);
+walker.currentNode = testElement.querySelectorAll('#B3')[0];
+shouldBe("walker.previousNode(); walker.currentNode.id", "'B2'");
+shouldBe("walker.previousNode(); walker.currentNode.id", "'C1'");
+shouldBe("walker.previousNode(); walker.currentNode.id", "'A1'");
+
+var successfullyParsed = true;
diff --git a/LayoutTests/fast/dom/TreeWalker/traversal-reject-expected.txt b/LayoutTests/fast/dom/TreeWalker/traversal-reject-expected.txt
new file mode 100644
index 0000000..89a3127
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/traversal-reject-expected.txt
@@ -0,0 +1,33 @@
+Test TreeWalker with rejection
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Testing nextNode
+PASS walker.nextNode(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'B2'
+PASS walker.nextNode(); walker.currentNode.id is 'B3'
+
+Testing firstChild
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.firstChild(); walker.currentNode.id is 'B2'
+
+Testing nextSibling
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.firstChild(); walker.currentNode.id is 'B1'
+PASS walker.nextSibling(); walker.currentNode.id is 'B3'
+
+Testing parentNode
+PASS walker.parentNode(); walker.currentNode.id is 'A1'
+
+Testing previousSibling
+PASS walker.previousSibling(); walker.currentNode.id is 'B1'
+
+Testing previousNode
+PASS walker.previousNode(); walker.currentNode.id is 'B2'
+PASS walker.previousNode(); walker.currentNode.id is 'A1'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/traversal-reject.html b/LayoutTests/fast/dom/TreeWalker/traversal-reject.html
new file mode 100644
index 0000000..ca34d86
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/traversal-reject.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/traversal-reject.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/traversal-skip-expected.txt b/LayoutTests/fast/dom/TreeWalker/traversal-skip-expected.txt
new file mode 100644
index 0000000..65bf98f
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/traversal-skip-expected.txt
@@ -0,0 +1,35 @@
+Test TreeWalker with skipping
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Testing nextNode
+PASS walker.nextNode(); walker.currentNode.id is 'A1'
+PASS walker.nextNode(); walker.currentNode.id is 'C1'
+PASS walker.nextNode(); walker.currentNode.id is 'B2'
+PASS walker.nextNode(); walker.currentNode.id is 'B3'
+
+Testing firstChild
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.firstChild(); walker.currentNode.id is 'C1'
+
+Testing nextSibling
+PASS walker.firstChild(); walker.currentNode.id is 'A1'
+PASS walker.firstChild(); walker.currentNode.id is 'B1'
+PASS walker.nextSibling(); walker.currentNode.id is 'B3'
+
+Testing parentNode
+PASS walker.parentNode(); walker.currentNode.id is 'A1'
+
+Testing previousSibling
+PASS walker.previousSibling(); walker.currentNode.id is 'B1'
+
+Testing previousNode
+PASS walker.previousNode(); walker.currentNode.id is 'B2'
+PASS walker.previousNode(); walker.currentNode.id is 'C1'
+PASS walker.previousNode(); walker.currentNode.id is 'A1'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/traversal-skip-most-expected.txt b/LayoutTests/fast/dom/TreeWalker/traversal-skip-most-expected.txt
new file mode 100644
index 0000000..2be59a2
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/traversal-skip-most-expected.txt
@@ -0,0 +1,16 @@
+Test TreeWalker with skipping
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Testing nextSibling
+PASS walker.firstChild(); walker.currentNode.id is 'B1'
+PASS walker.nextSibling(); walker.currentNode.id is 'B3'
+
+Testing previousSibling
+PASS walker.previousSibling(); walker.currentNode.id is 'B1'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/TreeWalker/traversal-skip-most.html b/LayoutTests/fast/dom/TreeWalker/traversal-skip-most.html
new file mode 100644
index 0000000..141f979
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/traversal-skip-most.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/traversal-skip-most.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/dom/TreeWalker/traversal-skip.html b/LayoutTests/fast/dom/TreeWalker/traversal-skip.html
new file mode 100644
index 0000000..d788624
--- /dev/null
+++ b/LayoutTests/fast/dom/TreeWalker/traversal-skip.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="stylesheet" href="../../js/resources/js-test-style.css">
+<script src="../../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/traversal-skip.js"></script>
+<script src="../../js/resources/js-test-post.js"></script>
+</body>
+</html>