2006-06-24 Graham Dennis <Graham.Dennis@gmail.com>
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 24 Jun 2006 14:43:23 +0000 (14:43 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 24 Jun 2006 14:43:23 +0000 (14:43 +0000)
        Reviewed by Darin, landed by ap.

        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=9467
          TreeWalker/NodeIterator do not restrict the traversal

        Test: traversal/stay-within-root.html

        * dom/Node.cpp:
        (WebCore::Node::traversePreviousNode):
        * dom/Node.h:
        Add a stayWithin argument to traversePreviousNode just like the other
        traversal functions
        * dom/NodeIterator.cpp:
        (WebCore::NodeIterator::findNextNode):
        (WebCore::NodeIterator::findPreviousNode):
        Ensure that when moving forward or backward that the root node is not
        exited
        * dom/TreeWalker.cpp:
        (WebCore::TreeWalker::previousNode):
        (WebCore::TreeWalker::nextNode):
        Ditto
        (WebCore::CompositeEditCommand::moveParagraphContentsToNewBlockIfNecessary):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15009 268f45cc-cd09-0410-ab3c-d52691b4dbfc

22 files changed:
LayoutTests/ChangeLog
LayoutTests/traversal/node-iterator-001.html
LayoutTests/traversal/node-iterator-002.html
LayoutTests/traversal/node-iterator-003.html
LayoutTests/traversal/node-iterator-004.html
LayoutTests/traversal/node-iterator-005.html
LayoutTests/traversal/node-iterator-006.html
LayoutTests/traversal/node-iterator-007.html
LayoutTests/traversal/stay-within-root-expected.checksum [new file with mode: 0644]
LayoutTests/traversal/stay-within-root-expected.png [new file with mode: 0644]
LayoutTests/traversal/stay-within-root-expected.txt [new file with mode: 0644]
LayoutTests/traversal/stay-within-root.html [new file with mode: 0644]
LayoutTests/traversal/tree-walker-001.html
LayoutTests/traversal/tree-walker-002.html
LayoutTests/traversal/tree-walker-003.html
LayoutTests/traversal/tree-walker-004.html
LayoutTests/traversal/tree-walker-005.html
WebCore/ChangeLog
WebCore/dom/Node.cpp
WebCore/dom/Node.h
WebCore/dom/NodeIterator.cpp
WebCore/dom/TreeWalker.cpp

index 15d3eec254b9ef98ef6f64b83f220b115cb870d8..175d3ab14ba2d24950443670b03d88787f6d7ebc 100644 (file)
@@ -1,3 +1,27 @@
+2006-06-24  Graham Dennis  <Graham.Dennis@gmail.com>
+
+        Reviewed by Darin, landed by ap.
+
+        - test and updated results for http://bugzilla.opendarwin.org/show_bug.cgi?id=9467
+          TreeWalker/NodeIterator do not restrict the traversal
+
+        * traversal/node-iterator-001.html:
+        * traversal/node-iterator-002.html:
+        * traversal/node-iterator-003.html:
+        * traversal/node-iterator-004.html:
+        * traversal/node-iterator-005.html:
+        * traversal/node-iterator-006.html:
+        * traversal/node-iterator-007.html:
+        * traversal/stay-within-root-expected.checksum: Added.
+        * traversal/stay-within-root-expected.png: Added.
+        * traversal/stay-within-root-expected.txt: Added.
+        * traversal/stay-within-root.html: Added.
+        * traversal/tree-walker-001.html:
+        * traversal/tree-walker-002.html:
+        * traversal/tree-walker-003.html:
+        * traversal/tree-walker-004.html:
+        * traversal/tree-walker-005.html:
+
 2006-06-24  Jonas Witt <jonas.witt@gmail.com>
 
         Reviewed by ggaren, landed by ap.
index f65c71ca7782e2362a90a4887ae992f71125efdc..5eaf12da366a02f450aa412018cfb0b29afc8869 100644 (file)
@@ -9,7 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
index c4aab219e87f8c9fb9085afb69fdb523f4228323..638da71f5de21580446b5395d5128bce49999ef8 100644 (file)
@@ -9,8 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var parent = document.getElementById('test');
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
@@ -25,21 +24,21 @@ document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 
 // remove node 'E'
 document.write("<p>remove node 'E'");
-parent.removeChild(document.getElementById('E'));
+root.removeChild(document.getElementById('E'));
 document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 
 // insert new node 'X' before 'F'
 document.write("<p>insert new node 'X' before 'F'");
 var X = document.createElement('SPAN');
 X.setAttribute('ID', 'X');
-parent.insertBefore(X, document.getElementById('F'));
+root.insertBefore(X, document.getElementById('F'));
 document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 
 // move node 'I' before 'X'
 document.write("<p>move node 'I' before 'X'");
 var I = document.getElementById('I');
-parent.removeChild(I);
-parent.insertBefore(I, X);
+root.removeChild(I);
+root.insertBefore(I, X);
 document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 </script>
 </div>
index 4fdfd492195409cc832e8e5a3a9ab16a8cabd1c7..122337856594832d248e18b2173efccb78147605 100644 (file)
@@ -9,8 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var parent = document.getElementById('test');
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
@@ -25,7 +24,7 @@ document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 
 // remove node 'D'
 document.write("<p>remove node 'D'");
-parent.removeChild(document.getElementById('D'));
+root.removeChild(document.getElementById('D'));
 document.write(dumpNodeIterator(it, "ref node 'C'; pointer after"));
 </script>
 </div>
index 01f44fd1100e5da3039c20797ed78336977a6b8f..b866915411da14ff70ff0212e3fd406dd7c1498a 100644 (file)
@@ -9,8 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var parent = document.getElementById('test');
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
@@ -26,7 +25,7 @@ document.write(dumpNodeIterator(it, "ref node 'E'; pointer before"));
 
 // remove node 'E'
 document.write("<p>remove node 'E'");
-parent.removeChild(document.getElementById('E'));
+root.removeChild(document.getElementById('E'));
 document.write(dumpNodeIterator(it, "ref node 'F'; pointer before"));
 </script>
 </div>
index d7214163f7adb2e60e9364b7807c6de3685ad68c..fac535ff1b9ade2d8e7ac82815fde29d0d117de9 100644 (file)
@@ -9,8 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var parent = document.getElementById('test');
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
@@ -26,8 +25,8 @@ document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 // remove node 'D'; insert it at the end
 document.write("<p>remove node 'D'");
 var D = document.getElementById('D');
-parent.removeChild(D);
-parent.appendChild(D);
+root.removeChild(D);
+root.appendChild(D);
 document.write(dumpNodeIterator(it, "ref node 'C'; pointer after"));
 </script>
 </div>
index da7c56a34706576b3ab144c003b3a296a0937937..7ddbf2c62f0b5c501f304e799b6cfc66bac9268d 100644 (file)
@@ -9,8 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var parent = document.getElementById('test');
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
@@ -27,7 +26,7 @@ document.write(dumpNodeIterator(it, "ref node 'C'; pointer before"));
 // remove node 'C'
 document.write("<p>remove node 'C'");
 var D = document.getElementById('C');
-parent.removeChild(D);
+root.removeChild(D);
 document.write(dumpNodeIterator(it, "ref node 'B'; pointer after"));
 </script>
 </div>
index ef0d82b63ed3b53638c99cd4bb010ce41b1f2ebb..9471eb66610579b78f59f88cdde3ae76037f5901 100644 (file)
@@ -9,8 +9,7 @@
 </div>
 <div style="font-family: Courier; font-size: 14;">
 <script>
-var parent = document.getElementById('test');
-var root = document.getElementById('A');
+var root = document.getElementById('test');
 
 function testNodeFiter(n)
 {
@@ -26,7 +25,7 @@ document.write(dumpNodeIterator(it, "ref node 'D'; pointer after"));
 // remove node 'C'
 document.write("<p>remove node 'C'");
 var D = document.getElementById('C');
-parent.removeChild(D);
+root.removeChild(D);
 document.write(dumpNodeIterator(it, "ref node 'B'; pointer after"));
 </script>
 </div>
diff --git a/LayoutTests/traversal/stay-within-root-expected.checksum b/LayoutTests/traversal/stay-within-root-expected.checksum
new file mode 100644 (file)
index 0000000..42dac94
--- /dev/null
@@ -0,0 +1,2 @@
+6ac3a1ffc86df24c99698a832aa89249
+\ No newline at end of file
diff --git a/LayoutTests/traversal/stay-within-root-expected.png b/LayoutTests/traversal/stay-within-root-expected.png
new file mode 100644 (file)
index 0000000..03b6377
Binary files /dev/null and b/LayoutTests/traversal/stay-within-root-expected.png differ
diff --git a/LayoutTests/traversal/stay-within-root-expected.txt b/LayoutTests/traversal/stay-within-root-expected.txt
new file mode 100644 (file)
index 0000000..e79ce6e
--- /dev/null
@@ -0,0 +1,66 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x576
+      RenderBlock {DIV} at (0,0) size 784x36
+        RenderBlock (anonymous) at (0,0) size 784x36
+          RenderText {#text} at (0,0) size 760x36
+            text run at (0,0) width 760: "This test checks that the NodeIterator and TreeWalker functions do not go past the root element that they are supposed to"
+            text run at (0,18) width 73: "stay within."
+        RenderBlock {DIV} at (0,36) size 784x0
+          RenderBlock {DIV} at (0,0) size 784x0
+          RenderBlock {DIV} at (0,0) size 784x0
+      RenderBlock {OL} at (0,52) size 784x234
+        RenderListItem {LI} at (40,0) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 320x18
+            text run at (0,0) width 320: "NodeIterator: testing nextNode() (5 should be null)"
+        RenderListItem {LI} at (40,18) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 81x18
+            text run at (0,0) width 81: "[object DIV]"
+        RenderListItem {LI} at (40,36) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 81x18
+            text run at (0,0) width 81: "[object DIV]"
+        RenderListItem {LI} at (40,54) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 81x18
+            text run at (0,0) width 81: "[object DIV]"
+        RenderListItem {LI} at (40,72) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 24x18
+            text run at (0,0) width 24: "null"
+        RenderListItem {LI} at (40,90) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 347x18
+            text run at (0,0) width 347: "NodeIterator: testing previousNode() (7 should be null)"
+        RenderListItem {LI} at (40,108) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 24x18
+            text run at (0,0) width 24: "null"
+        RenderListItem {LI} at (40,126) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 323x18
+            text run at (0,0) width 323: "TreeWalker: testing nextNode() (11 should be null)"
+        RenderListItem {LI} at (40,144) size 744x18
+          RenderListMarker at (-20,0) size 16x18
+          RenderText {#text} at (0,0) size 81x18
+            text run at (0,0) width 81: "[object DIV]"
+        RenderListItem {LI} at (40,162) size 744x18
+          RenderListMarker at (-28,0) size 24x18
+          RenderText {#text} at (0,0) size 81x18
+            text run at (0,0) width 81: "[object DIV]"
+        RenderListItem {LI} at (40,180) size 744x18
+          RenderListMarker at (-28,0) size 24x18
+          RenderText {#text} at (0,0) size 24x18
+            text run at (0,0) width 24: "null"
+        RenderListItem {LI} at (40,198) size 744x18
+          RenderListMarker at (-28,0) size 24x18
+          RenderText {#text} at (0,0) size 350x18
+            text run at (0,0) width 350: "TreeWalker: testing previousNode() (13 should be null)"
+        RenderListItem {LI} at (40,216) size 744x18
+          RenderListMarker at (-28,0) size 24x18
+          RenderText {#text} at (0,0) size 24x18
+            text run at (0,0) width 24: "null"
diff --git a/LayoutTests/traversal/stay-within-root.html b/LayoutTests/traversal/stay-within-root.html
new file mode 100644 (file)
index 0000000..5177f3c
--- /dev/null
@@ -0,0 +1,55 @@
+<html>
+<head>
+<script language="JavaScript">
+function log(message) {
+    var console = document.getElementById("console");
+    var li = document.createElement("li");
+    var text = document.createTextNode(message);
+    li.appendChild(text);
+    console.appendChild(li);
+}
+
+function iteratorTest() {
+    log("NodeIterator: testing nextNode() (5 should be null)");
+    var iterator = document.createNodeIterator(divB, NodeFilter.SHOW_ELEMENT, null, false);
+    iterator.root = divB;
+    for (i=0; i < 4; i++)
+        log(iterator.nextNode());
+
+    log("NodeIterator: testing previousNode() (7 should be null)");
+    iterator = document.createNodeIterator(divB, NodeFilter.SHOW_ELEMENT, null, false);
+    log(iterator.previousNode());
+    
+    log("TreeWalker: testing nextNode() (11 should be null)");
+    iterator = document.createTreeWalker(divB, NodeFilter.SHOW_ELEMENT, null, false);
+    for (i=0; i < 3; i++)
+        log(iterator.nextNode());
+
+    log("TreeWalker: testing previousNode() (13 should be null)");
+    iterator = document.createTreeWalker(divB, NodeFilter.SHOW_ELEMENT, null, false);
+    log(iterator.previousNode());
+}
+</script>
+</head>
+
+<body>
+<div id="divA">
+This test checks that the NodeIterator and TreeWalker functions do not go past the root element that they are supposed to stay within.
+<div id="divB">
+<div id="divC">
+</div>
+<div id="divD">
+</div>
+
+</div>
+</div>
+
+<ol id="console" > </ol>
+
+<script>
+iteratorTest();
+</script>
+
+</body>
+
+</html>
index b40a2e3c7003b312a458691718b02382bf068e9d..32da7a344705ca2fcb1f550f59c56d7d165cf1ec 100644 (file)
@@ -40,7 +40,8 @@
 </div>
 <div style="font-family: Courier; font-size: 14; white-space: pre">
 <script>
-var root = document.getElementById('A');
+var root = document.getElementById('test');
+var start = document.getElementById('A');
 
 function testNodeFiter(n)
 {
@@ -49,7 +50,7 @@ function testNodeFiter(n)
 }
 
 var tw = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
-document.write(dumpTreeWalker(tw, root));
+document.write(dumpTreeWalker(tw, start));
 </script>
 </div>
 </body>
index 06af23a7c020a3103d579a0755fbf629caaa2400..f30ea901c9d098775be135d47fd084c8d84a5768 100644 (file)
@@ -40,7 +40,8 @@
 </div>
 <div style="font-family: Courier; font-size: 14; white-space: pre">
 <script>
-var root = document.getElementById('B');
+var root = document.getElementById('test');
+var start = document.getElementById('B');
 
 function testNodeFiter(n)
 {
@@ -50,7 +51,7 @@ function testNodeFiter(n)
 
 var tw = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
 tw.previousNode();
-document.write(dumpTreeWalker(tw, root));
+document.write(dumpTreeWalker(tw, start));
 </script>
 </div>
 </body>
index 6cc7b56a3027263f45cb69d0422ec440b51e2c1f..0e5a47c4ddc0f3756ca93187f4eda53076e35054 100644 (file)
@@ -46,7 +46,8 @@
 </div>
 <div style="font-family: Courier; font-size: 14; white-space: pre">
 <script>
-var root = document.getElementById('A');
+var root = document.getElementById('test');
+var start = document.getElementById('A');
 
 function testNodeFiter(n)
 {
@@ -59,10 +60,10 @@ function testNodeFiter(n)
 }
 
 var tw1 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
-document.write(dumpTreeWalker(tw1, root));
+document.write(dumpTreeWalker(tw1, start));
 
 var tw2 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
-document.write(dumpTreeWalker(tw2, root, document.getElementById('D'), true));
+document.write(dumpTreeWalker(tw2, start, document.getElementById('D'), true));
 
 </script>
 </div>
index 8d1a5f86daacb592a2e35fc60acf538cc3ef5089..54b6e0916b1df56107dcdd2deee622ed5b457ed0 100644 (file)
@@ -46,7 +46,8 @@
 </div>
 <div style="font-family: Courier; font-size: 14; white-space: pre">
 <script>
-var root = document.getElementById('A');
+var root = document.getElementById('test');
+var start = document.getElementById('A');
 
 function testNodeFiter(n)
 {
@@ -56,10 +57,10 @@ function testNodeFiter(n)
 }
 
 var tw1 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
-document.write(dumpTreeWalker(tw1, root));
+document.write(dumpTreeWalker(tw1, start));
 
 var tw2 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
-document.write(dumpTreeWalker(tw2, root, document.getElementById('D'), true));
+document.write(dumpTreeWalker(tw2, start, document.getElementById('D'), true));
 
 </script>
 </div>
index 53c46626fcd54e8ec6205f14fd265ce70f62cbd5..b207ef0fae0c0789f95028c289418f761f5bb03e 100644 (file)
@@ -46,7 +46,8 @@
 </div>
 <div style="font-family: Courier; font-size: 14; white-space: pre">
 <script>
-var root = document.getElementById('B');
+var root = document.getElementById('test');
+var start = document.getElementById('B');
 
 function testNodeFiter(n)
 {
@@ -58,7 +59,9 @@ function testNodeFiter(n)
 }
 
 var tw1 = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, testNodeFiter, false);
-document.write(dumpTreeWalker(tw1, root));
+tw1.firstChild();
+tw1.nextSibling();
+document.write(dumpTreeWalker(tw1, start));
 
 </script>
 </div>
index d775393a03751cb271df4d51de8f0953d9f269be..96fe14eab795a39b224e15c6878b03667cde3a67 100644 (file)
@@ -1,3 +1,28 @@
+2006-06-24  Graham Dennis  <Graham.Dennis@gmail.com>
+
+        Reviewed by Darin, landed by ap.
+        
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=9467
+          TreeWalker/NodeIterator do not restrict the traversal
+        
+        Test: traversal/stay-within-root.html
+
+        * dom/Node.cpp:
+        (WebCore::Node::traversePreviousNode):
+        * dom/Node.h:
+        Add a stayWithin argument to traversePreviousNode just like the other
+        traversal functions
+        * dom/NodeIterator.cpp:
+        (WebCore::NodeIterator::findNextNode):
+        (WebCore::NodeIterator::findPreviousNode):
+        Ensure that when moving forward or backward that the root node is not
+        exited
+        * dom/TreeWalker.cpp:
+        (WebCore::TreeWalker::previousNode):
+        (WebCore::TreeWalker::nextNode):
+        Ditto
+        (WebCore::CompositeEditCommand::moveParagraphContentsToNewBlockIfNecessary):
+
 2006-06-24  Jonas Witt <jonas.witt@gmail.com>
 
         Reviewed by ggaren, landed by ap.
index d871834a325dbadbf8d9a545eb0a9b8ad15ee5c2..3c1dda0159c67433dbadd16bf60d3b2f2c3acfc5 100644 (file)
@@ -479,15 +479,16 @@ Node *Node::traverseNextSibling(const Node *stayWithin) const
     return 0;
 }
 
-Node *Node::traversePreviousNode() const
+Node *Node::traversePreviousNode(const Node *stayWithin) const
 {
+    if (this == stayWithin)
+        return 0;
     if (previousSibling()) {
         Node *n = previousSibling();
         while (n->lastChild())
             n = n->lastChild();
         return n;
     }
-    
     return parentNode();
 }
 
index a3e1b73da8794f52b271ab39f14adb063f2d4448..6a4d99f66881fbd0a82eda5e467490ee8424c1d3 100644 (file)
@@ -300,7 +300,7 @@ public:
      *
      * see @ref traverseNextNode()
      */
-    Node* traversePreviousNode() const;
+    Node* traversePreviousNode(const Node * stayWithin = 0) const;
 
     /* Like traversePreviousNode, but visits nodes before their children. */
     Node* traversePreviousNodePostOrder(const Node *stayWithin = 0) const;
index 358bc25bcb3d3d624afd4b08d53085cd9b8bcba5..5567b1d6f8cc68d5b2058b97a2220c7db0d71971 100644 (file)
@@ -51,7 +51,7 @@ NodeIterator::~NodeIterator()
 
 Node* NodeIterator::findNextNode(Node* node) const
 {
-    while ((node = node->traverseNextNode())) {
+    while ((node = node->traverseNextNode(root()))) {
         // NodeIterators treat the DOM tree as a flat list of nodes.
         // In other words, FILTER_REJECT does not pass over descendants
         // of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP.
@@ -79,7 +79,7 @@ Node* NodeIterator::nextNode(ExceptionCode& ec)
 
 Node* NodeIterator::findPreviousNode(Node* node) const
 {
-    while ((node = node->traversePreviousNode())) {
+    while ((node = node->traversePreviousNode(root()))) {
         // NodeIterators treat the DOM tree as a flat list of nodes.
         // In other words, FILTER_REJECT does not pass over descendants
         // of the rejected node. Hence, FILTER_REJECT is the same as FILTER_SKIP.
index e6664e8fe31399a3d603d9cc8d5607aa6b034a7c..7da62caa9dcc6104b3017c1aa5aa52d8e8f60918 100644 (file)
@@ -124,7 +124,7 @@ Node* TreeWalker::nextSibling()
 Node* TreeWalker::previousNode()
 {
     Node* result = 0;
-    for (Node* node = currentNode()->traversePreviousNode(); node; node = node->traversePreviousNode()) {
+    for (Node* node = currentNode()->traversePreviousNode(root()); node; node = node->traversePreviousNode(root())) {
         if (acceptNode(node) == NodeFilter::FILTER_ACCEPT && !ancestorRejected(node)) {
             setCurrentNode(node);
             result = node;
@@ -137,7 +137,7 @@ Node* TreeWalker::previousNode()
 Node* TreeWalker::nextNode()
 {
     Node* result = 0;
-    for (Node* node = currentNode()->traverseNextNode(); node; node = node->traverseNextNode()) {
+    for (Node* node = currentNode()->traverseNextNode(root()); node; node = node->traverseNextNode(root())) {
         if (acceptNode(node) == NodeFilter::FILTER_ACCEPT && !ancestorRejected(node)) {
             setCurrentNode(node);
             result = node;