diff --git a/src/main/java/org/htmlunit/WebClient.java b/src/main/java/org/htmlunit/WebClient.java index 18e7fd39d0..06b01feec6 100644 --- a/src/main/java/org/htmlunit/WebClient.java +++ b/src/main/java/org/htmlunit/WebClient.java @@ -1386,16 +1386,16 @@ private WebResponse makeWebResponseForDataUrl(final WebRequest webRequest) throw private static WebResponse makeWebResponseForAboutUrl(final WebRequest webRequest) throws MalformedURLException { final URL url = webRequest.getUrl(); - final String urlString = url.toExternalForm(); - if (UrlUtils.ABOUT_BLANK.equalsIgnoreCase(urlString)) { - return new StringWebResponse("", UrlUtils.URL_ABOUT_BLANK); + if (UrlUtils.ABOUT.equals(url.getProtocol())) { + if ("blank".equalsIgnoreCase(url.getPath())) { + if (url.getRef() == null && url.getQuery() == null) { + return new StringWebResponse("", UrlUtils.URL_ABOUT_BLANK); + } + return new StringWebResponse("", url); + } } - final String urlWithoutQuery = StringUtils.substringBefore(urlString, "?"); - if (!"blank".equalsIgnoreCase(StringUtils.substringAfter(urlWithoutQuery, UrlUtils.ABOUT_SCHEME))) { - throw new MalformedURLException(url + " is not supported, only about:blank is supported at the moment."); - } - return new StringWebResponse("", url); + throw new MalformedURLException(url + " is not supported, only about:blank is supported at the moment."); } /** diff --git a/src/main/java/org/htmlunit/javascript/host/Location.java b/src/main/java/org/htmlunit/javascript/host/Location.java index 238d340695..4633e1a455 100644 --- a/src/main/java/org/htmlunit/javascript/host/Location.java +++ b/src/main/java/org/htmlunit/javascript/host/Location.java @@ -441,10 +441,18 @@ public void setHash(final String oldURL, String hash, final boolean triggerHashC final boolean hasChanged = hash != null && !hash.equals(hash_); hash_ = hash; - if (triggerHashChanged && hasChanged) { + if (hasChanged) { final Window w = getWindow(); - final Event event = new HashChangeEvent(w, Event.TYPE_HASH_CHANGE, oldURL, getHref()); - w.executeEventLocally(event); + final Page page = w.getWebWindow().getEnclosedPage(); + if (page != null) { + final WebRequest request = page.getWebResponse().getWebRequest(); + request.setUrl(UrlUtils.toUrlSafe(getHref())); + } + + if (triggerHashChanged) { + final Event event = new HashChangeEvent(w, Event.TYPE_HASH_CHANGE, oldURL, getHref()); + w.executeEventLocally(event); + } } } diff --git a/src/test/java/org/htmlunit/javascript/host/LocationTest.java b/src/test/java/org/htmlunit/javascript/host/LocationTest.java index 597ca91f5b..d49d35cdcf 100644 --- a/src/test/java/org/htmlunit/javascript/host/LocationTest.java +++ b/src/test/java/org/htmlunit/javascript/host/LocationTest.java @@ -295,7 +295,7 @@ public void setHash() throws Exception { // Verify that we didn't reload the page. assertTrue(page == page2); - assertEquals(URL_FIRST, conn.getLastWebRequest().getUrl()); + assertEquals(1, conn.getRequestCount()); } /** @@ -382,6 +382,46 @@ public void locationWithTarget() throws Exception { assertEquals(getExpectedAlerts(), alerts); } + /** + * @throws Exception if the test fails + */ + @Test + public void setHashUpdatesPageUrl() throws Exception { + final WebClient webClient = getWebClient(); + final MockWebConnection conn = new MockWebConnection(); + + final String html = DOCTYPE_HTML + + "