From: <rb...@us...> - 2014-02-17 20:57:14
|
Revision: 9136 http://sourceforge.net/p/htmlunit/code/9136 Author: rbri Date: 2014-02-17 20:57:08 +0000 (Mon, 17 Feb 2014) Log Message: ----------- The javascript inside the href attrib of an anchor executes in the context of the anchors target. Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.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-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/changes/changes.xml 2014-02-17 20:57:08 UTC (rev 9136) @@ -8,6 +8,10 @@ <body> <release version="2.15" date="???" description="Bugfixes"> + <action type="fix" dev="rbri"> + JavaScript: The javascript inside the href attrib of an anchor executes in the context + of the anchors target. + </action> </release> <release version="2.14" date="Feb 17, 2014" description="FF24, Bugfixes, initial work on IE11"> <action type="update" dev="mguillem"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2014-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/WebClient.java 2014-02-17 20:57:08 UTC (rev 9136) @@ -817,6 +817,8 @@ } /** + * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> + * * Open the window with the specified name. The name may be a special * target name of _self, _parent, _top, or _blank. An empty or null * name is set to the default. The special target names are relative to @@ -827,7 +829,7 @@ * @param defaultName the default target if no name is given * @return the new window */ - private WebWindow openTargetWindow( + public WebWindow openTargetWindow( final WebWindow opener, final String windowName, final String defaultName) { WebAssert.notNull("opener", opener); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java 2014-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlAnchor.java 2014-02-17 20:57:08 UTC (rev 9136) @@ -80,7 +80,7 @@ if (ATTRIBUTE_NOT_DEFINED == getHrefAttribute()) { return; } - final HtmlPage page = (HtmlPage) getPage(); + HtmlPage htmlPage = (HtmlPage) getPage(); if (StringUtils.startsWithIgnoreCase(href, JavaScriptURLConnection.JAVASCRIPT_PREFIX)) { final StringBuilder builder = new StringBuilder(href.length()); builder.append(JavaScriptURLConnection.JAVASCRIPT_PREFIX); @@ -98,25 +98,32 @@ } builder.append(ch); } - page.executeJavaScriptIfPossible(builder.toString(), "javascript url", getStartLineNumber()); + + final WebWindow win = htmlPage.getWebClient().openTargetWindow(htmlPage.getEnclosingWindow(), + htmlPage.getResolvedTarget(getTargetAttribute()), "_self"); + final Page page = win.getEnclosedPage(); + if (page != null && page.isHtmlPage()) { + htmlPage = (HtmlPage) page; + htmlPage.executeJavaScriptIfPossible(builder.toString(), "javascript url", getStartLineNumber()); + } return; } - final URL url = getTargetUrl(href, page); + final URL url = getTargetUrl(href, htmlPage); - final BrowserVersion browser = page.getWebClient().getBrowserVersion(); + final BrowserVersion browser = htmlPage.getWebClient().getBrowserVersion(); final WebRequest webRequest = new WebRequest(url, browser.getHtmlAcceptHeader()); - webRequest.setCharset(page.getPageEncoding()); - webRequest.setAdditionalHeader("Referer", page.getUrl().toExternalForm()); + webRequest.setCharset(htmlPage.getPageEncoding()); + webRequest.setAdditionalHeader("Referer", htmlPage.getUrl().toExternalForm()); if (LOG.isDebugEnabled()) { LOG.debug( "Getting page for " + url.toExternalForm() + ", derived from href '" + href + "', using the originating URL " - + page.getUrl()); + + htmlPage.getUrl()); } - page.getWebClient().download(page.getEnclosingWindow(), - page.getResolvedTarget(getTargetAttribute()), + htmlPage.getWebClient().download(htmlPage.getEnclosingWindow(), + htmlPage.getResolvedTarget(getTargetAttribute()), webRequest, href.endsWith("#"), "Link click"); } 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-02-17 12:06:36 UTC (rev 9135) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLAnchorElement2Test.java 2014-02-17 20:57:08 UTC (rev 9136) @@ -406,4 +406,53 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "inner", "self", "main", "top", "main", "parent" }, + IE11 = { "inner", "self", "main", "parent" }) + public void javaScriptTarget() throws Exception { + final String html + = "<html>\n" + + "<head><title>main</title></head>\n" + + "<body>\n" + + " <iframe id='testFrame' src='" + URL_SECOND + "'></iframe>\n" + + "</body></html>"; + + final String script = "javascript: try { alert(document.title); } catch(e) { alert(e); }"; + final String secondHtml + = "<html>\n" + + "<head><title>inner</title></head>\n" + + "<body>\n" + + " <a id='tester' href='javascript:'>no href</a>\n" + + " <a id='selfTester' target='_self' href='" + script + "alert(\"self\")'>self</a>\n" + + " <a id='blankTester' target='_blank' href='" + script + "alert(\"blank\")'>blank</a>\n" + + " <a id='topTester' target='_top' href='" + script + "alert(\"top\")'>top</a>\n" + + " <a id='parentTester' target='_parent' href='" + script + "alert(\"parent\")'>parent</a>\n" + + " <a id='unknownTester' target='unknown' href='" + script + "alert(\"unknown\")'>unknown</a>\n" + + "</body></html>"; + + getMockWebConnection().setResponse(URL_SECOND, secondHtml); + + final WebDriver driver = loadPage2(html); + + driver.switchTo().frame("testFrame"); + assertEquals(1, driver.getWindowHandles().size()); + driver.findElement(By.id("tester")).click(); + assertEquals(1, driver.getWindowHandles().size()); + driver.findElement(By.id("selfTester")).click(); + assertEquals(1, driver.getWindowHandles().size()); + driver.findElement(By.id("blankTester")).click(); + assertEquals(2, driver.getWindowHandles().size()); + driver.findElement(By.id("topTester")).click(); + assertEquals(2, driver.getWindowHandles().size()); + driver.findElement(By.id("parentTester")).click(); + assertEquals(2, driver.getWindowHandles().size()); + driver.findElement(By.id("unknownTester")).click(); + assertEquals(3, driver.getWindowHandles().size()); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } } |