From: <rb...@us...> - 2013-04-06 16:11:25
|
Revision: 8207 http://sourceforge.net/p/htmlunit/code/8207 Author: rbri Date: 2013-04-06 16:11:20 +0000 (Sat, 06 Apr 2013) Log Message: ----------- image.width() and image.height() are returning now the correct image size. Issue 1476 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElementTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-04-06 13:37:58 UTC (rev 8206) +++ trunk/htmlunit/src/changes/changes.xml 2013-04-06 16:11:20 UTC (rev 8207) @@ -8,6 +8,9 @@ <body> <release version="2.13" date="???" description="Bugfixes"> + <action type="fix" dev="rbri" issue="1476"> + JavaScript: image.width() and image.height() are returning now the correct image size. + </action> <action type="fix" dev="rbri"> JavaScript: DOMTokenList now works like in FF (different from spec). Some NPE exceptions are fixed, separator chars are fixed, and we are able to create an attribute if needed. Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-04-06 13:37:58 UTC (rev 8206) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-04-06 16:11:20 UTC (rev 8207) @@ -912,6 +912,18 @@ @BrowserFeature(@WebBrowser(IE)) JS_IGNORES_LAST_LINE_CONTAINING_UNCOMMENTED, + /** Getting the width and height of an image tag without a source returns 28x30; + * for invalid values returns 1 (IE). + */ + @BrowserFeature(@WebBrowser(CHROME)) + JS_IMAGE_WIDTH_HEIGHT_RETURNS_18x20x0, + + /** Getting the width and height of an image tag without a source returns 28x30; + * for invalid values returns 1 (IE). + */ + @BrowserFeature(@WebBrowser(IE)) + JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1, + /** Indicates if multiple spaces are replaced by a single one when accessing innerHTML. */ @BrowserFeature(@WebBrowser(IE)) JS_INNER_HTML_REDUCE_WHITESPACES, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElement.java 2013-04-06 13:37:58 UTC (rev 8206) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElement.java 2013-04-06 16:11:20 UTC (rev 8207) @@ -15,7 +15,10 @@ package com.gargoylesoftware.htmlunit.javascript.host.html; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_ALIGN_ACCEPTS_ARBITRARY_VALUES; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_IMAGE_WIDTH_HEIGHT_RETURNS_18x20x0; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1; +import java.io.IOException; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Map; @@ -24,6 +27,7 @@ import org.apache.xalan.xsltc.runtime.AttributeList; +import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.SgmlPage; import com.gargoylesoftware.htmlunit.html.DomElement; import com.gargoylesoftware.htmlunit.html.HTMLParser; @@ -217,13 +221,43 @@ @JsxGetter public int getWidth() { final HtmlImage img = (HtmlImage) getDomNodeOrDie(); - final String width = img.getWidthAttribute(); - try { - return Integer.parseInt(width); + final String widthAttrib = img.getWidthAttribute(); + + if (DomElement.ATTRIBUTE_NOT_DEFINED != widthAttrib) { + try { + return Integer.parseInt(widthAttrib); + } + catch (final NumberFormatException e) { + if (getBrowserVersion().hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1)) { + return 1; + } + } } - catch (final NumberFormatException e) { - return 24; // anything else + + if (DomElement.ATTRIBUTE_NOT_DEFINED != img.getSrcAttribute()) { + try { + return img.getWidth(); + } + catch (final IOException e) { + final BrowserVersion browserVersion = getBrowserVersion(); + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1)) { + return 1; + } + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_18x20x0)) { + return 18; + } + return 24; + } } + + final BrowserVersion browserVersion = getBrowserVersion(); + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1)) { + return 28; + } + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_18x20x0)) { + return 0; + } + return 24; } /** @@ -244,12 +278,42 @@ public int getHeight() { final HtmlImage img = (HtmlImage) getDomNodeOrDie(); final String height = img.getHeightAttribute(); - try { - return Integer.parseInt(height); + + if (DomElement.ATTRIBUTE_NOT_DEFINED != height) { + try { + return Integer.parseInt(height); + } + catch (final NumberFormatException e) { + if (getBrowserVersion().hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1)) { + return 1; + } + } } - catch (final NumberFormatException e) { - return 24; // anything else + + if (DomElement.ATTRIBUTE_NOT_DEFINED != img.getSrcAttribute()) { + try { + return img.getHeight(); + } + catch (final IOException e) { + final BrowserVersion browserVersion = getBrowserVersion(); + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1)) { + return 1; + } + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_18x20x0)) { + return 20; + } + return 24; + } } + + final BrowserVersion browserVersion = getBrowserVersion(); + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_28x30x1)) { + return 30; + } + if (browserVersion.hasFeature(JS_IMAGE_WIDTH_HEIGHT_RETURNS_18x20x0)) { + return 0; + } + return 24; } /** Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElementTest.java 2013-04-06 13:37:58 UTC (rev 8206) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLImageElementTest.java 2013-04-06 16:11:20 UTC (rev 8207) @@ -14,17 +14,27 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF17; + +import java.io.File; +import java.io.FileInputStream; +import java.net.URL; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.io.IOUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF17; import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; +import com.gargoylesoftware.htmlunit.MockWebConnection; import com.gargoylesoftware.htmlunit.WebDriverTestCase; +import com.gargoylesoftware.htmlunit.util.NameValuePair; /** * Tests for {@link HTMLImageElement}. @@ -283,25 +293,25 @@ } /** - * Test that image's width and height are numbers. + * Test image's width and height. * Regression test for bug * http://sourceforge.net/tracker/?func=detail&atid=448266&aid=2861064&group_id=47038 * @throws Exception if the test fails */ @Test - @Alerts({ "number: 300", "number: 200", "number", "number", "number", "number" }) - public void testWidthHeight() throws Exception { + @Alerts(DEFAULT = { "number: 300", "number: 200", "number: 24", "number: 24", "number: 24", "number: 24" }, + IE = { "number: 300", "number: 200", "number: 28", "number: 30", "number: 1", "number: 1" }, + CHROME = { "number: 300", "number: 200", "number: 0", "number: 0", "number: 0", "number: 0" }) + public void testWidthHeightWithoutSource() throws Exception { final String html = "<html><head>\n" + "<script>\n" + " function showInfos(imageId) {\n" + " var img = document.getElementById(imageId);\n" - + " alert(typeof(img.width));\n" - + " alert(typeof(img.height));\n" + + " alert(typeof(img.width) + ': ' + img.width);\n" + + " alert(typeof(img.height) + ': ' + img.height);\n" + " }\n" + " function test() {\n" - + " var img1 = document.getElementById('myImage1');\n" - + " alert(typeof(img1.width) + ': ' + img1.width);\n" - + " alert(typeof(img1.height) + ': ' + img1.height);\n" + + " showInfos('myImage1');\n" + " showInfos('myImage2');\n" + " showInfos('myImage3');\n" + " }\n" @@ -314,4 +324,77 @@ loadPageWithAlerts2(html); } + + /** + * Test that image's width and height are numbers. + * @throws Exception if the test fails + */ + @Test + @Alerts({ "number: 300", "number: 200", "number: 1", "number: 1", "number: 1", "number: 1" }) + public void testWidthHeightWithSource() throws Exception { + getMockWebConnection().setDefaultResponse(""); + + final String html = "<html><head>\n" + + "<script>\n" + + " function showInfos(imageId) {\n" + + " var img = document.getElementById(imageId);\n" + + " alert(typeof(img.width) + ': ' + img.width);\n" + + " alert(typeof(img.height) + ': ' + img.height);\n" + + " }\n" + + " function test() {\n" + + " showInfos('myImage1');\n" + + " showInfos('myImage2');\n" + + " showInfos('myImage3');\n" + + " }\n" + + "</script>\n" + + "</head><body onload='test()'>\n" + + " <img id='myImage1' src='" + URL_SECOND + "' width='300' height='200'>\n" + + " <img id='myImage2' src='" + URL_SECOND + "' >\n" + + " <img id='myImage3' src='" + URL_SECOND + "' width='hello' height='hello'>\n" + + "</body></html>"; + + final URL url = getClass().getClassLoader().getResource("testfiles/tiny-jpg.img"); + final FileInputStream fis = new FileInputStream(new File(url.toURI())); + final byte[] directBytes = IOUtils.toByteArray(fis); + fis.close(); + + final MockWebConnection webConnection = getMockWebConnection(); + final List<NameValuePair> emptyList = Collections.emptyList(); + webConnection.setResponse(URL_SECOND, directBytes, 200, "ok", "image/jpg", emptyList); + + loadPageWithAlerts2(html); + } + + /** + * Test that image's width and height are numbers. + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "number: 300", "number: 200", "number: 24", "number: 24", "number: 24", "number: 24" }, + IE = { "number: 300", "number: 200", "number: 1", "number: 1", "number: 1", "number: 1" }, + CHROME = { "number: 300", "number: 200", "number: 18", "number: 20", "number: 18", "number: 20" }) + public void testWidthHeightInvalidSource() throws Exception { + getMockWebConnection().setDefaultResponse(""); + + final String html = "<html><head>\n" + + "<script>\n" + + " function showInfos(imageId) {\n" + + " var img = document.getElementById(imageId);\n" + + " alert(typeof(img.width) + ': ' + img.width);\n" + + " alert(typeof(img.height) + ': ' + img.height);\n" + + " }\n" + + " function test() {\n" + + " showInfos('myImage1');\n" + + " showInfos('myImage2');\n" + + " showInfos('myImage3');\n" + + " }\n" + + "</script>\n" + + "</head><body onload='test()'>\n" + + " <img id='myImage1' src='" + URL_SECOND + "' width='300' height='200'>\n" + + " <img id='myImage2' src='" + URL_SECOND + "' >\n" + + " <img id='myImage3' src='" + URL_SECOND + "' width='hello' height='hello'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } |