From: <rb...@us...> - 2018-08-09 19:39:08
|
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); + } } |