/** @throws Exception if an error occurs */ @Test public void history() throws Exception { final WebClient client = new WebClient(); final TopLevelWindow window = (TopLevelWindow) client.getCurrentWindow(); final History history = window.getHistory(); final MockWebConnection conn = new MockWebConnection(); conn.setResponse( URL_FIRST, "<html><body><a name='a' href='" + URL_SECOND + "'>foo</a>" + "<a name='b' href='#b'>bar</a></body></html>"); conn.setResponse( URL_SECOND, "<html><body><a name='a' href='" + URL_THIRD + "'>foo</a></body></html>"); conn.setResponse( URL_THIRD, "<html><body><a name='a' href='" + URL_FIRST + "'>foo</a></body></html>"); client.setWebConnection(conn); assertEquals(0, history.getLength()); assertEquals(-1, history.getIndex()); // Load the first page. HtmlPage page = client.getPage(URL_FIRST); assertEquals(1, history.getLength()); assertEquals(0, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals( URL_FIRST, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(1)); // Go to the second page. page = page.getAnchorByName("a").click(); assertEquals(2, history.getLength()); assertEquals(1, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals(URL_SECOND, history.getUrl(1)); assertEquals( URL_SECOND, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(2)); // Go to the third page. page = page.getAnchorByName("a").click(); assertEquals(3, history.getLength()); assertEquals(2, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals(URL_SECOND, history.getUrl(1)); assertEquals(URL_THIRD, history.getUrl(2)); assertEquals( URL_THIRD, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(3)); // Cycle around back to the first page. page = page.getAnchorByName("a").click(); assertEquals(4, history.getLength()); assertEquals(3, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals(URL_SECOND, history.getUrl(1)); assertEquals(URL_THIRD, history.getUrl(2)); assertEquals(URL_FIRST, history.getUrl(3)); assertEquals( URL_FIRST, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(4)); // Go to a hash on the current page. final URL firstUrlWithHash = new URL(URL_FIRST, "#b"); page = page.getAnchorByName("b").click(); assertEquals(5, history.getLength()); assertEquals(4, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals(URL_SECOND, history.getUrl(1)); assertEquals(URL_THIRD, history.getUrl(2)); assertEquals(URL_FIRST, history.getUrl(3)); assertEquals(firstUrlWithHash, history.getUrl(4)); assertEquals( firstUrlWithHash, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(5)); history.back().back(); assertEquals(5, history.getLength()); assertEquals(2, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals(URL_SECOND, history.getUrl(1)); assertEquals(URL_THIRD, history.getUrl(2)); assertEquals(URL_FIRST, history.getUrl(3)); assertEquals(firstUrlWithHash, history.getUrl(4)); assertEquals( URL_THIRD, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(5)); history.forward(); assertEquals(5, history.getLength()); assertEquals(3, history.getIndex()); assertNull(history.getUrl(-1)); assertEquals(URL_FIRST, history.getUrl(0)); assertEquals(URL_SECOND, history.getUrl(1)); assertEquals(URL_THIRD, history.getUrl(2)); assertEquals(URL_FIRST, history.getUrl(3)); assertEquals(firstUrlWithHash, history.getUrl(4)); assertEquals( URL_FIRST, window.getEnclosedPage().getWebResponse().getRequestSettings().getUrl()); assertNull(history.getUrl(5)); }