From: <asa...@us...> - 2012-12-16 08:41:38
|
Revision: 7867 http://sourceforge.net/p/htmlunit/code/7867 Author: asashour Date: 2012-12-16 08:41:35 +0000 (Sun, 16 Dec 2012) Log Message: ----------- CSS: fix DirectAdjacentSelector (E + F) Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSSelectorTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2012-12-15 13:08:47 UTC (rev 7866) +++ trunk/htmlunit/src/changes/changes.xml 2012-12-16 08:41:35 UTC (rev 7867) @@ -8,6 +8,9 @@ <body> <release version="2.12" date="???" description="Bugfixes"> + <action type="fix" dev="asashour"> + CSS: fix DirectAdjacentSelector (E + F). + </action> <action type="fix" dev="asashour" issue="1456"> JavaScript: fix the value of "(i in x)" for NodeList, HTMLCollection and CSSRuleList. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java 2012-12-15 13:08:47 UTC (rev 7866) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSStyleSheet.java 2012-12-16 08:41:35 UTC (rev 7867) @@ -371,7 +371,10 @@ return HtmlHtml.TAG_NAME.equalsIgnoreCase(element.getTagName()); case Selector.SAC_DIRECT_ADJACENT_SELECTOR: final SiblingSelector ss = (SiblingSelector) selector; - final DomNode prev = element.getPreviousSibling(); + DomNode prev = element.getPreviousSibling(); + while (prev != null && !(prev instanceof HtmlElement)) { + prev = prev.getPreviousSibling(); + } return prev instanceof HtmlElement && selects(browserVersion, ss.getSelector(), (HtmlElement) prev) && selects(browserVersion, ss.getSiblingSelector(), element); @@ -827,6 +830,9 @@ case Selector.SAC_CHILD_SELECTOR: final DescendantSelector ds = (DescendantSelector) selector; return isValidSelector(ds.getAncestorSelector()) && isValidSelector(ds.getSimpleSelector()); + case Selector.SAC_DIRECT_ADJACENT_SELECTOR: + final SiblingSelector ss = (SiblingSelector) selector; + return isValidSelector(ss.getSelector()) && isValidSelector(ss.getSiblingSelector()); default: LOG.warn("Unhandled CSS selector type '" + selector.getSelectorType() + "'. Accepting it silently."); return true; // at least in a first time to break less stuff Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSSelectorTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSSelectorTest.java 2012-12-15 13:08:47 UTC (rev 7866) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/css/CSSSelectorTest.java 2012-12-16 08:41:35 UTC (rev 7867) @@ -81,4 +81,30 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if an error occurs + */ + @Test + @Alerts({ "1", "ul2" }) + public void directAdjacentSelector() throws Exception { + final String html + = HtmlPageTest.STANDARDS_MODE_PREFIX_ + "<html><head><title>First</title><script>\n" + + "function test() {\n" + + " try {\n" + + " var list = document.querySelectorAll('p+ul');\n" + + " alert(list.length);\n" + + " alert(list[0].id);\n" + + " } catch(e) {alert('exception')}\n" + + "}\n" + + "</script></head>\n" + + "<body onload='test()'>\n" + + " <div></div>\n" + + " <ul id='ul1'></ul>\n" + + " <p></p>\n" + + " <ul id='ul2'></ul>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } |