From: <rb...@us...> - 2017-12-01 08:40:05
|
Revision: 14984 http://sourceforge.net/p/htmlunit/code/14984 Author: rbri Date: 2017-12-01 08:40:03 +0000 (Fri, 01 Dec 2017) Log Message: ----------- location.reload uses the same request method like the original request Issue 1840 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2017-12-01 07:16:31 UTC (rev 14983) +++ trunk/htmlunit/src/changes/changes.xml 2017-12-01 08:40:03 UTC (rev 14984) @@ -8,7 +8,10 @@ <body> <release version="2.29" date="xx, 2017" description=""> - <action type="fix" dev="rbri" issue="1932"> + <action type="fix" dev="rbri" issue="1840"> + JavaScript: location.reload uses the same request method like the original request. + </action> + <action type="fix" dev="rbri"> JavaScript: WebSocket constructor call failed with a NPE when called during page construction. </action> <action type="fix" dev="rbri" issue="1932"> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java 2017-12-01 07:16:31 UTC (rev 14983) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Location.java 2017-12-01 08:40:03 UTC (rev 14984) @@ -134,13 +134,18 @@ */ @JsxFunction public void reload(final boolean force) throws IOException { - final String url = getHref(); - if (UNKNOWN.equals(url)) { - LOG.error("Unable to reload location: current URL is unknown."); - } - else { - setHref(url); - } + final HtmlPage htmlPage = (HtmlPage) getWindow(getStartingScope()).getWebWindow().getEnclosedPage(); + final WebRequest request = htmlPage.getWebResponse().getWebRequest(); + + String referer = htmlPage.getUrl().toExternalForm(); + request.setAdditionalHeader(HttpHeader.REFERER, referer); + + referer = UrlUtils.getUrlWithNewQuery(htmlPage.getUrl(), null).toExternalForm(); + referer = StringUtils.stripEnd(referer, "/"); + request.setAdditionalHeader(HttpHeader.ORIGIN, referer); + + final WebWindow webWindow = window_.getWebWindow(); + webWindow.getWebClient().download(webWindow, "", request, true, false, "JS reload"); } /** Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java 2017-12-01 07:16:31 UTC (rev 14983) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Location2Test.java 2017-12-01 08:40:03 UTC (rev 14984) @@ -18,6 +18,7 @@ import static com.gargoylesoftware.htmlunit.BrowserRunner.TestedBrowser.IE; import java.net.URL; +import java.util.List; import java.util.Map; import org.junit.Test; @@ -26,11 +27,14 @@ import org.openqa.selenium.WebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner; +import com.gargoylesoftware.htmlunit.HttpHeader; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; import com.gargoylesoftware.htmlunit.BrowserRunner.BuggyWebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; +import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.MockWebConnection; import com.gargoylesoftware.htmlunit.WebDriverTestCase; +import com.gargoylesoftware.htmlunit.util.NameValuePair; /** * Tests for {@link Location}. @@ -769,7 +773,7 @@ assertEquals(2, conn.getRequestCount()); Map<String, String> lastAdditionalHeaders = conn.getLastAdditionalHeaders(); - assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get("Referer")); + assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get(HttpHeader.REFERER)); loadPage2(html); assertEquals(3, conn.getRequestCount()); @@ -777,7 +781,7 @@ driver.findElement(By.id("jsLink")).click(); assertEquals(4, conn.getRequestCount()); lastAdditionalHeaders = conn.getLastAdditionalHeaders(); - assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get("Referer")); + assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get(HttpHeader.REFERER)); } /** @@ -814,13 +818,13 @@ driver.findElement(By.id("link")).click(); assertEquals(3, conn.getRequestCount()); Map<String, String> lastAdditionalHeaders = conn.getLastAdditionalHeaders(); - assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get("Referer")); + assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get(HttpHeader.REFERER)); // click an anchor with onclick which sets frame.location driver.findElement(By.id("jsLink")).click(); assertEquals(4, conn.getRequestCount()); lastAdditionalHeaders = conn.getLastAdditionalHeaders(); - assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get("Referer")); + assertEquals(getExpectedAlerts()[0], lastAdditionalHeaders.get(HttpHeader.REFERER)); } /** @@ -844,4 +848,92 @@ final WebDriver driver = loadPage2(html); verifyAlerts(driver, expectedAlerts); } + + /** + * @throws Exception if the test fails + */ + @Test + public void reloadGet() throws Exception { + final String html = + "<html>\n" + + " <head></head>\n" + + " <body>\n" + + " <a href='javascript:window.location.reload(true);' id='link'>reload</a>\n" + + " </body>\n" + + "</html>"; + + getMockWebConnection().setDefaultResponse(html); + final WebDriver driver = loadPage2(html, new URL(URL_FIRST + "a.html?p1=sieben&p2")); + assertEquals(1, getMockWebConnection().getRequestCount()); + + driver.findElement(By.id("link")).click(); + assertEquals(2, getMockWebConnection().getRequestCount()); + + assertEquals(HttpMethod.GET, getMockWebConnection().getLastWebRequest().getHttpMethod()); + assertEquals(URL_FIRST + "a.html", getMockWebConnection().getLastWebRequest().getUrl()); + + final List<NameValuePair> params = getMockWebConnection().getLastWebRequest().getRequestParameters(); + assertEquals(2, params.size()); + assertEquals("p1", params.get(0).getName()); + assertEquals("sieben", params.get(0).getValue()); + assertEquals("p2", params.get(1).getName()); + assertEquals("", params.get(1).getValue()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @BuggyWebDriver(FF) + public void reloadPost() throws Exception { + final String form = + "<html>\n" + + " <head></head>\n" + + " <body>\n" + + " <form method='POST' name='form' action='" + URL_SECOND + "a.html?urlParam=urlVal'>\n" + + " <input type='hidden' name='p1' value='seven'>\n" + + " <input type='hidden' name='p2' value=''>\n" + + " <input type='submit' id='enter' name='sub' value='ok'>\n" + + " </form>\n" + + " </body>\n" + + "</html>"; + + final String html = + "<html>\n" + + " <head></head>\n" + + " <body>\n" + + " <a href='javascript:window.location.reload(true);' id='link'>reload</a>\n" + + " </body>\n" + + "</html>"; + + getMockWebConnection().setDefaultResponse(html); + + final WebDriver driver = loadPage2(form, URL_FIRST); + assertEquals(1, getMockWebConnection().getRequestCount()); + driver.findElement(By.id("enter")).click(); + + assertEquals(2, getMockWebConnection().getRequestCount()); + + driver.findElement(By.id("link")).click(); + assertEquals(3, getMockWebConnection().getRequestCount()); + + assertEquals(HttpMethod.POST, getMockWebConnection().getLastWebRequest().getHttpMethod()); + assertEquals(URL_SECOND + "a.html", getMockWebConnection().getLastWebRequest().getUrl()); + + final List<NameValuePair> params = getMockWebConnection().getLastWebRequest().getRequestParameters(); + assertEquals(4, params.size()); + assertEquals("p1", params.get(0).getName()); + assertEquals("seven", params.get(0).getValue()); + assertEquals("sub", params.get(1).getName()); + assertEquals("ok", params.get(1).getValue()); + assertEquals("p2", params.get(2).getName()); + assertEquals("", params.get(2).getValue()); + assertEquals("urlParam", params.get(3).getName()); + assertEquals("urlVal", params.get(3).getValue()); + + final Map<String, String> additionalHeaders = getMockWebConnection().getLastAdditionalHeaders(); + // assertEquals("http://localhost:" + PORT, additionalHeaders.get(HttpHeader.ORIGIN)); + assertEquals(URL_SECOND + "a.html?urlParam=urlVal", additionalHeaders.get(HttpHeader.REFERER)); + assertEquals("localhost:" + PORT, additionalHeaders.get(HttpHeader.HOST)); + } } |