From: <mgu...@us...> - 2013-01-18 14:22:26
|
Revision: 8002 http://sourceforge.net/p/htmlunit/code/8002 Author: mguillem Date: 2013-01-18 14:22:21 +0000 (Fri, 18 Jan 2013) Log Message: ----------- JavaScript: execute onload handler of pages loaded in a frame, replacing a previous content (unit test adapted from test proposed by spaced30) Issue 1443 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFrame2Test.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-01-17 18:44:47 UTC (rev 8001) +++ trunk/htmlunit/src/changes/changes.xml 2013-01-18 14:22:21 UTC (rev 8002) @@ -8,6 +8,9 @@ <body> <release version="2.12" date="???" description="Bugfixes, CSS3 Selectors"> + <action type="fix" dev="mguillem" issue="1443"> + JavaScript: execute onload handler of pages loaded in a frame, replacing a previous content. + </action> <action type="update" dev="rbri"> Upgrade Apache HttpClient to 4.2.3. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-01-17 18:44:47 UTC (rev 8001) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2013-01-18 14:22:21 UTC (rev 8002) @@ -221,11 +221,13 @@ // frame initialization has a different order final boolean framesetFirst = browserVersion.hasFeature(EVENT_ONLOAD_FRAMESET_FIRST); boolean isFrameWindow = enclosingWindow instanceof FrameWindow; + boolean isFirstPageInFrameWindow = false; if (isFrameWindow) { isFrameWindow = ((FrameWindow) enclosingWindow).getFrameElement() instanceof HtmlFrame; + isFirstPageInFrameWindow = enclosingWindow.getHistory().getLength() <= 2; // first is always about:blank } - if (framesetFirst && !isFrameWindow) { + if ((framesetFirst && !isFrameWindow) || (isFrameWindow && !isFirstPageInFrameWindow)) { executeEventHandlersIfNeeded(Event.TYPE_LOAD); } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFrame2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFrame2Test.java 2013-01-17 18:44:47 UTC (rev 8001) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFrame2Test.java 2013-01-18 14:22:21 UTC (rev 8002) @@ -22,11 +22,13 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; import com.gargoylesoftware.htmlunit.BrowserRunner.NotYetImplemented; +import com.gargoylesoftware.htmlunit.MockWebConnection; import com.gargoylesoftware.htmlunit.WebDriverTestCase; /** @@ -253,4 +255,35 @@ loadPageWithAlerts2(html); } + + /** + * Was failing as of HtmlUnit-2.11. + * @see <a href="sourceforge.net/p/htmlunit/bugs/1443/">Bug 1443</a> + * @throws Exception if the test fails + */ + @Test + @Alerts("foo") + public void onloadInNavigatedFrame() throws Exception { + final String html = "<html><head><title>first</title></head>\n" + + "<frameset cols='20%,80%'>\n" + + " <frame src='frame1.html' id='frame1'>\n" + + "</frameset></html>"; + + final String firstHtml = "<html><body>\n" + + "<a id='a1' href='frame2.html'>hello</a>\n" + + "</body></html>"; + + final String secondHtml = "<html><body onload='alert(\"foo\")'></body></html>"; + + final MockWebConnection webConnection = getMockWebConnection(); + webConnection.setResponse(new URL(getDefaultUrl(), "frame1.html"), firstHtml); + webConnection.setResponse(new URL(getDefaultUrl(), "frame2.html"), secondHtml); + + final WebDriver driver = loadPage2(html); + driver.switchTo().frame(0); + + driver.findElement(By.id("a1")).click(); + + assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); + } } |