[HtmlUnit] SVN: [15512] trunk/htmlunit/src

rbri--- via HtmlUnit-develop <[email protected]> Thu, 09 Aug 2018 19:39:06 +0000
Newsgroups gmane.comp.java.htmlunit.devel
Message-ID <[email protected]>
Revision: 15512
          http://sourceforge.net/p/htmlunit/code/15512
Author:   rbri
Date:     2018-08-09 19:39:03 +0000 (Thu, 09 Aug 2018)
Log Message:
-----------
fix DomNodeIterator traverses uncles of (sub)root 
Issue 1982

Modified Paths:
--------------
    trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNodeIterator.java
    trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/DomNodeIteratorTest.java
    trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/NodeIteratorTest.java

Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNodeIterator.java
===================================================================
--- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNodeIterator.java	2018-08-05 17:08:38 UTC (rev 15511)
+++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/DomNodeIterator.java	2018-08-09 19:39:03 UTC (rev 15512)
@@ -191,12 +191,12 @@
      * traversal) from the given node.
      */
     private DomNode getFirstUncleNode(final DomNode node) {
-        if (node == root_ || node == null) {
+        if (node == null || node == root_) {
             return null;
         }
 
         final DomNode parent = node.getParentNode();
-        if (parent == null) {
+        if (parent == null || parent == root_) {
             return null;
         }
 

Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/DomNodeIteratorTest.java
===================================================================
--- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/DomNodeIteratorTest.java	2018-08-05 17:08:38 UTC (rev 15511)
+++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/DomNodeIteratorTest.java	2018-08-09 19:39:03 UTC (rev 15512)
@@ -17,10 +17,12 @@
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.assertThat;
 
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.htmlunit.HtmlUnitDriver;
+import org.w3c.dom.traversal.NodeFilter;
 import org.w3c.dom.traversal.NodeIterator;
 
 import com.gargoylesoftware.htmlunit.BrowserRunner;
@@ -31,6 +33,7 @@
  * Tests for {@link DomNodeIterator}.
  *
  * @author Ahmed Ashour
+ * @author Ronald Brill
  */
 @RunWith(BrowserRunner.class)
 public final class DomNodeIteratorTest extends WebDriverTestCase {
@@ -55,10 +58,51 @@
         if (driver instanceof HtmlUnitDriver) {
             final WebWindow webWindow = getWebWindowOf((HtmlUnitDriver) driver);
             final HtmlPage page = (HtmlPage) webWindow.getEnclosedPage();
-            final NodeIterator iterator = page.createNodeIterator(page.getDocumentElement(),
-                    org.w3c.dom.traversal.NodeFilter.SHOW_ALL, null,
+            final NodeIterator iterator = page.createNodeIterator(page.getDocumentElement(), NodeFilter.SHOW_ALL, null,
                     true);
             assertThat(iterator.nextNode(), instanceOf(HtmlHtml.class));
         }
     }
+
+    /**
+     * Test case for issue 1982.
+     * @throws Exception if the test fails
+     */
+    @Test
+    public void subroot() throws Exception {
+        final String html
+            = "<html>\n"
+            + "<head>\n"
+            + "</head>\n"
+            + "<body>\n"
+            + "<table>\n"
+            + "  <tr id='1'>\n"
+            + "    <td id='11'>11</td>\n"
+            + "    <td id='12'>12</td>\n"
+            + "  </tr>\n"
+            + "  <tr id='2'>\n"
+            + "    <td id='21'>21</td>\n"
+            + "    <td id='22'>22</td>\n"
+            + "  </tr>\n"
+            + "</table>\n"
+            + "</body></html>";
+
+        final WebDriver driver = loadPage2(html);
+        final WebWindow webWindow = getWebWindowOf((HtmlUnitDriver) driver);
+        final HtmlPage page = (HtmlPage) webWindow.getEnclosedPage();
+
+        final HtmlElement subroot = (HtmlElement) page.getElementById("1");
+        final NodeIterator iterator = page.createNodeIterator(subroot, NodeFilter.SHOW_ELEMENT, null, true);
+
+        HtmlElement element = (HtmlElement) iterator.nextNode();
+        Assert.assertEquals("1", element.getId());
+
+        element = (HtmlElement) iterator.nextNode();
+        Assert.assertEquals("11", element.getId());
+
+        element = (HtmlElement) iterator.nextNode();
+        Assert.assertEquals("12", element.getId());
+
+        Assert.assertNull(iterator.nextNode());
+    }
 }

Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/NodeIteratorTest.java
===================================================================
--- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/NodeIteratorTest.java	2018-08-05 17:08:38 UTC (rev 15511)
+++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/dom/NodeIteratorTest.java	2018-08-09 19:39:03 UTC (rev 15512)
@@ -135,4 +135,47 @@
 
         loadPageWithAlerts2(html);
     }
+
+    /**
+     * Test case for issue 1982.
+     * @throws Exception if the test fails
+     */
+    @Test
+    @Alerts({"1", "11", "12"})
+    public void subroot() throws Exception {
+        final String html
+            = "<html>\n"
+            + "<head>\n"
+            + "  <script>\n"
+            + "    function test() {\n"
+            + "      if (document.createNodeIterator) {\n"
+            + "        var nodeIterator = document.createNodeIterator(\n"
+            + "          document.getElementById('1'),\n"
+            + "          NodeFilter.SHOW_ELEMENT );\n"
+
+            + "        var currentNode;\n"
+            + "        while (currentNode = nodeIterator.nextNode()) {\n"
+            + "          alert(currentNode.id);\n"
+            + "        }\n"
+            + "      }\n"
+            + "    }\n"
+            + "  </script>\n"
+            + "</head>\n"
+            + "<body onload='test()'>\n"
+            + "<div id='before'>before</div>\n"
+            + "<table>\n"
+            + "  <tr id='1'>\n"
+            + "    <td id='11'>11</td>\n"
+            + "    <td id='12'>12</td>\n"
+            + "  </tr>\n"
+            + "  <tr id='2'>\n"
+            + "    <td id='21'>21</td>\n"
+            + "    <td id='22'>22</td>\n"
+            + "  </tr>\n"
+            + "</table>\n"
+            + "<div id='after'>after</div>\n"
+            + "</body></html>";
+
+        loadPageWithAlerts2(html);
+    }
 }


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot