From: <mgu...@us...> - 2013-01-11 17:15:00
|
Revision: 7991 http://sourceforge.net/p/htmlunit/code/7991 Author: mguillem Date: 2013-01-11 17:14:57 +0000 (Fri, 11 Jan 2013) Log Message: ----------- JavaScript: elements nested within an element with "display: none" have offsetHeight = offsetWidth = 0. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-01-11 15:33:45 UTC (rev 7990) +++ trunk/htmlunit/src/changes/changes.xml 2013-01-11 17:14:57 UTC (rev 7991) @@ -9,6 +9,8 @@ <body> <release version="2.12" date="???" description="Bugfixes, CSS3 Selectors"> <action type="fix" dev="mguillem"> + JavaScript: elements nested within an element with "display: none" have offsetHeight = offsetWidth = 0. + <action type="fix" dev="mguillem"> JavaScript: fixed wrong trigger of focus event in special cases when field loses focus. </action> <action type="fix" dev="mguillem"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-01-11 15:33:45 UTC (rev 7990) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement.java 2013-01-11 17:14:57 UTC (rev 7991) @@ -1644,6 +1644,9 @@ */ @JsxGetter public int getOffsetHeight() { + if (isDislayNone()) { + return 0; + } final MouseEvent event = MouseEvent.getCurrentMouseEvent(); if (isAncestorOfEventTarget(event)) { // compute appropriate offset height to pretend mouse event was produced within this element @@ -1652,6 +1655,20 @@ return getCurrentStyle().getCalculatedHeight(true, true); } + private boolean isDislayNone() { + // if a parent is display:none there's nothing that a child can do to override it + HTMLElement element = this; + while (element != null) { + final CSSStyleDeclaration style = element.getCurrentStyle(); + final String display = style.getDisplay(); + if ("none".equals(display)) { + return true; + } + element = element.getParentHTMLElement(); + } + return false; + } + /** * Returns this element's <tt>offsetWidth</tt>, which is the element width plus the element's padding * plus the element's border. This method returns a dummy value compatible with mouse event coordinates @@ -1662,6 +1679,10 @@ */ @JsxGetter public int getOffsetWidth() { + if (isDislayNone()) { + return 0; + } + final MouseEvent event = MouseEvent.getCurrentMouseEvent(); if (isAncestorOfEventTarget(event)) { // compute appropriate offset width to pretend mouse event was produced within this element Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement2Test.java 2013-01-11 15:33:45 UTC (rev 7990) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLElement2Test.java 2013-01-11 17:14:57 UTC (rev 7991) @@ -442,7 +442,7 @@ * @throws Exception if an error occurs */ @Test - @Alerts({ "30px", "46", "55px", "71", "71", "0", "0" }) + @Alerts({ "30px", "46", "55px", "71", "71", "0", "0", "0", "0" }) public void offsetWidthAndHeight() throws Exception { final String html = "<html><head>\n" @@ -464,11 +464,14 @@ + " e.className = 'dontDisplay';\n" + " alert(e.offsetHeight);\n" + " alert(e.offsetWidth);\n" + + " var nested = document.getElementById('nested');\n" + + " alert(nested.offsetHeight);\n" + + " alert(nested.offsetWidth);\n" + " }\n" + "</script>\n" + "</head>\n" + "<body onload='test()'>\n" - + " <div id='myDiv' style='border: 3px solid #fff; padding: 5px;'></div>\n" + + " <div id='myDiv' style='border: 3px solid #fff; padding: 5px;'><div id='nested'>hello</div></div>\n" + "</body></html>"; loadPageWithAlerts2(html); } |