From: <rb...@us...> - 2014-01-13 22:32:25
|
Revision: 8969 http://sourceforge.net/p/htmlunit/code/8969 Author: rbri Date: 2014-01-13 22:32:21 +0000 (Mon, 13 Jan 2014) Log Message: ----------- conversion of anchor elements into strings fixed Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-01-12 16:11:37 UTC (rev 8968) +++ trunk/htmlunit/src/changes/changes.xml 2014-01-13 22:32:21 UTC (rev 8969) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="FF24, Bugfixes, initial work on IE11"> + <action type="fix" dev="rbri"> + JavaScript: conversion of anchor element into strings fixed. + </action> <action type="fix" dev="rbri" due-to="Frank Danek"> JavaScript: hashChangeEvent processing fixed. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java 2014-01-12 16:11:37 UTC (rev 8968) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java 2014-01-13 22:32:21 UTC (rev 8969) @@ -101,22 +101,10 @@ page.executeJavaScriptIfPossible(builder.toString(), "javascript url", getStartLineNumber()); return; } - URL url = page.getFullyQualifiedUrl(href); - // fix for empty url - if (StringUtils.isEmpty(href)) { - final boolean dropFilename = hasFeature(ANCHOR_EMPTY_HREF_NO_FILENAME); - if (dropFilename) { - String path = url.getPath(); - path = path.substring(0, path.lastIndexOf('/') + 1); - url = UrlUtils.getUrlWithNewPath(url, path); - url = UrlUtils.getUrlWithNewRef(url, null); - } - else { - url = UrlUtils.getUrlWithNewRef(url, null); - } - } - final BrowserVersion browser = getPage().getWebClient().getBrowserVersion(); + final URL url = getTargetUrl(href, page); + + final BrowserVersion browser = page.getWebClient().getBrowserVersion(); final WebRequest webRequest = new WebRequest(url, browser.getHtmlAcceptHeader()); webRequest.setCharset(page.getPageEncoding()); webRequest.setAdditionalHeader("Referer", page.getUrl().toExternalForm()); @@ -133,6 +121,32 @@ } /** + * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> + * + * @param href the href + * @param page the HtmlPage + * @return the calculated target url. + * @throws MalformedURLException if an IO error occurs + */ + public static URL getTargetUrl(final String href, final HtmlPage page) throws MalformedURLException { + URL url = page.getFullyQualifiedUrl(href); + // fix for empty url + if (StringUtils.isEmpty(href)) { + final boolean dropFilename = page.getWebClient().getBrowserVersion() + .hasFeature(ANCHOR_EMPTY_HREF_NO_FILENAME); + if (dropFilename) { + String path = url.getPath(); + path = path.substring(0, path.lastIndexOf('/') + 1); + url = UrlUtils.getUrlWithNewPath(url, path); + url = UrlUtils.getUrlWithNewRef(url, null); + } + else { + url = UrlUtils.getUrlWithNewRef(url, null); + } + } + return url; + } + /** * {@inheritDoc} */ @Override Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement.java 2014-01-12 16:11:37 UTC (rev 8968) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement.java 2014-01-13 22:32:21 UTC (rev 8969) @@ -397,23 +397,8 @@ return href; } - final int indexAnchor = href.indexOf('#'); - final String beforeAnchor; - final String anchorPart; - if (indexAnchor == -1) { - beforeAnchor = href; - anchorPart = ""; - } - else { - beforeAnchor = href.substring(0, indexAnchor); - anchorPart = href.substring(indexAnchor); - } - - final HtmlPage htmlPage = (HtmlPage) page; try { - final String response = - htmlPage.getFullyQualifiedUrl(beforeAnchor).toExternalForm() + anchorPart; - return response; + return HtmlAnchor.getTargetUrl(href, (HtmlPage) page).toExternalForm(); } catch (final MalformedURLException e) { return href; Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java 2014-01-12 16:11:37 UTC (rev 8968) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java 2014-01-13 22:32:21 UTC (rev 8969) @@ -256,8 +256,8 @@ * @throws Exception if the test fails */ @Test - @Alerts({ "http://htmlunit.sourceforge.net/", "§§URL§§test", "§§URL§§#ref#test", - "§§URL§§#ref#", "§§URL§§#ref" }) + @Alerts({ "http://htmlunit.sourceforge.net/", "§§URL§§test", "§§URL§§#test", + "§§URL§§#", "§§URL§§" }) public void getDefaultValueWithHash() throws Exception { final String html = "<html><head><title>AnchorTest</title>\n" @@ -289,6 +289,41 @@ * @throws Exception if the test fails */ @Test + @Alerts(DEFAULT = { "http://htmlunit.sourceforge.net/", "§§URL§§test", "§§URL§§index.html#test", + "§§URL§§index.html#", "§§URL§§index.html" }, + IE = { "http://htmlunit.sourceforge.net/", "§§URL§§test", "§§URL§§index.html#test", + "§§URL§§index.html#", "§§URL§§" }) + public void getDefaultValueWithHashAndFileName() throws Exception { + final String html + = "<html><head><title>AnchorTest</title>\n" + + "<script>\n" + + " function test() {\n" + + " alert(document.getElementById('absolute'));\n" + + " alert(document.getElementById('relative'));\n" + + " alert(document.getElementById('hash'));\n" + + " alert(document.getElementById('hashOnly'));\n" + + " alert(document.getElementById('empty'));\n" + + " }\n</script>\n" + + "</head>\n" + + "<body onload='test()'>\n" + + " <a href='http://htmlunit.sourceforge.net/' id='absolute'>bla</a>\n" + + " <a href='test' id='relative'>bla</a>\n" + + " <a href='#test' id='hash'>bla</a>\n" + + " <a href='#' id='hashOnly'>bla</a>\n" + + " <a href='' id='empty'>bla</a>\n" + + "</body></html>"; + + getMockWebConnection().setDefaultResponse(html); + final WebDriver driver = loadPage2(html, UrlUtils.getUrlWithNewPath(URL_FIRST, "/index.html")); + + expandExpectedAlertsVariables(URL_FIRST); + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts({ "true", "not defined" }) public void onclickToString() throws Exception { final String html @@ -303,8 +338,8 @@ + "</script>\n" + "</head>\n" + "<body onload='test()'>\n" - + " <a href='foo.html' onClick='alert(\"on click\")'>\n" - + " <a href='foo2.html'>\n" + + " <a href='foo.html' onClick='alert(\"on click\")'>a1</a>\n" + + " <a href='foo2.html'>a2</a>\n" + "</body></html>"; loadPageWithAlerts2(html); |