From: <rb...@us...> - 2014-02-08 18:21:25
|
Revision: 9116 http://sourceforge.net/p/htmlunit/code/9116 Author: rbri Date: 2014-02-08 18:21:20 +0000 (Sat, 08 Feb 2014) Log Message: ----------- correct the order of frame element initialization; revalidated with reals browsers Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFrame2Test.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-02-08 13:02:26 UTC (rev 9115) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-02-08 18:21:20 UTC (rev 9116) @@ -226,10 +226,6 @@ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 11) }) EVENT_ONLOAD_EXTERNAL_JAVASCRIPT, - /** Triggers "onload" event of the frameset before the one from the frames. */ - @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) - EVENT_ONLOAD_FRAMESET_FIRST, - /** Triggers "onload" event if an iframe was created by javascript and added to the page. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 11) }) EVENT_ONLOAD_IFRAME_CREATED_BY_JAVASCRIPT, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2014-02-08 13:02:26 UTC (rev 9115) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/html/HtmlPage.java 2014-02-08 18:21:20 UTC (rev 9116) @@ -16,7 +16,6 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_DOM_CONTENT_LOADED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONBEFOREUNLOAD_USES_EVENT; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONLOAD_FRAMESET_FIRST; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.EVENT_ONLOAD_IFRAME_CREATED_BY_JAVASCRIPT; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.FOCUS_BODY_ELEMENT_AT_START; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.FOCUS_HTML_ELEMENT_AT_START; @@ -254,7 +253,6 @@ setReadyStateOnDeferredScriptsIfNeeded(); // 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) { @@ -262,7 +260,7 @@ isFirstPageInFrameWindow = enclosingWindow.getHistory().getLength() <= 2; // first is always about:blank } - if ((framesetFirst && !isFrameWindow) || (isFrameWindow && !isFirstPageInFrameWindow)) { + if (isFrameWindow && !isFirstPageInFrameWindow) { executeEventHandlersIfNeeded(Event.TYPE_LOAD); } @@ -275,7 +273,7 @@ } } - if (!framesetFirst && !isFrameWindow) { + if (!isFrameWindow) { 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 2014-02-08 13:02:26 UTC (rev 9115) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/html/HtmlFrame2Test.java 2014-02-08 18:21:20 UTC (rev 9116) @@ -96,29 +96,28 @@ /** * Regression test for for bug - * <a href="http://sf.net/support/tracker.php?aid=2873802">2873802</a>. + * <a href="http://sourceforge.net/p/htmlunit/bugs/925/">925</a>. * @throws Exception if an error occurs */ @Test - @Alerts(FF = { "second [object HTMLFormElement]", "third [object HTMLFormElement]", + @Alerts(DEFAULT = { "second [object HTMLFormElement]", "third [object HTMLFormElement]", "parent [object HTMLFormElement]" }, - IE = { "parent [object]", "second [object]", "third [object]" }, - IE11 = { }) + IE8 = { "second [object]", "third [object]", "parent [object]" }) // real FF sometimes alerts 'third' before 'second' - // real IE11 does not know frames.XXX.document anymore public void postponeLoading() throws Exception { - final String html = "<FRAMESET onload=\"alert('parent ' + window.parent.frames.third.document.frm)\">\n" - + " <FRAME name=second frameborder=0 src='second.html'>\n" - + " <FRAME name=third frameborder=0 src='third.html'>\n" + final String html = "<FRAMESET rows='50%,*' " + + "onload=\"alert('parent ' + window.parent.frames['third'].document.frm)\">\n" + + " <FRAME name='second' frameborder='0' src='second.html'>\n" + + " <FRAME name='third' frameborder='0' src='third.html'>\n" + "</FRAMESET>"; final String secondHtml = "<html>\n" - + "<body onload=\"alert('second ' + window.parent.frames.third.document.frm)\">\n" + + "<body onload=\"alert('second ' + window.parent.frames['third'].document.frm)\">\n" + " <h1>second</h1>\n" + "</body></html>"; final String thirdHtml = "<html>\n" - + "<body onload=\"alert('third ' + window.parent.frames.third.document.frm)\">\n" + + "<body onload=\"alert('third ' + window.parent.frames['third'].document.frm)\">\n" + " <form name='frm' id='frm'>\n" + " <input type='text' id='one' name='one' value='something'>\n" + " </form>\n" @@ -133,6 +132,7 @@ * @throws Exception if an error occurs */ @Test + @Alerts({ "second", "third", "first" }) public void frameOnload() throws Exception { final String html = "<FRAMESET rows='50%,50%' onload=\"alert('first')\">\n" + " <FRAME name='second' src='second.html'>\n" @@ -152,22 +152,7 @@ getMockWebConnection().setResponse(new URL(getDefaultUrl(), "second.html"), secondHtml); getMockWebConnection().setResponse(new URL(getDefaultUrl(), "third.html"), thirdHtml); - final WebDriver driver = loadPage2(html); - final List<String> actualAlerts = getCollectedAlerts(driver); - - // tested with real ff17 and ie6; running in selenium returns different results - Assert.assertEquals(3, actualAlerts.size()); - - // ignore order of frame windows - if (getBrowserVersion().isIE() && BrowserVersion.INTERNET_EXPLORER_11 != getBrowserVersion()) { - // returns 'first' 'third' 'second' - Assert.assertEquals("first", actualAlerts.get(0)); - } - else { - // IE11 returns 'second' 'third' 'first' - // DEFAULT returns 'third' 'second' 'first' - Assert.assertEquals("first", actualAlerts.get(2)); - } + loadPageWithAlerts2(html); } /** Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java 2014-02-08 13:02:26 UTC (rev 9115) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLFrameElement2Test.java 2014-02-08 18:21:20 UTC (rev 9116) @@ -14,6 +14,7 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; +import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF; import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF17; import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.FF24; import static com.gargoylesoftware.htmlunit.BrowserRunner.Browser.IE8; @@ -382,6 +383,60 @@ * @throws Exception if the test fails */ @Test + @Alerts({ "head", "bottom", "frameset" }) + public void onloadOrderRows() throws Exception { + final String html = "<html><head><title>OnloadTest</title></head>\n" + + "<frameset rows='50%,*' onLoad='alert(\"frameset\")'>\n" + + " <frame name='head' src='head.html'>\n" + + " <frame name='bottom' src='bottom.html'>\n" + + "</frameset>\n" + + "</html>"; + + final String top = "<html><head><title>Head</title></head>\n" + + "<body onload='alert(\"head\")'>head</body>\n" + + "</html>"; + final String bottom = "<html><head><title>Bottom</title></head>\n" + + "<body onload='alert(\"bottom\")'>bottom</body>\n" + + "</html>"; + + getMockWebConnection().setResponse(new URL(URL_FIRST, "head.html"), top); + getMockWebConnection().setResponse(new URL(URL_FIRST, "bottom.html"), bottom); + + loadPageWithAlerts2(html); + assertEquals(3, getMockWebConnection().getRequestCount()); + } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts({ "left", "right", "frameset" }) + public void onloadOrderCols() throws Exception { + final String html = "<html><head><title>OnloadTest</title></head>\n" + + "<frameset cols='50%,*' onLoad='alert(\"frameset\")'>\n" + + " <frame name='left' src='left.html'>\n" + + " <frame name='right' src='right.html'>\n" + + "</frameset>\n" + + "</html>"; + + final String left = "<html><head><title>Left</title></head>\n" + + "<body onload='alert(\"left\")'>left</body>\n" + + "</html>"; + final String right = "<html><head><title>Right</title></head>\n" + + "<body onload='alert(\"right\")'>right</body>\n" + + "</html>"; + + getMockWebConnection().setResponse(new URL(URL_FIRST, "left.html"), left); + getMockWebConnection().setResponse(new URL(URL_FIRST, "right.html"), right); + + loadPageWithAlerts2(html); + assertEquals(3, getMockWebConnection().getRequestCount()); + } + + /** + * @throws Exception if the test fails + */ + @Test @Alerts({ "OnloadTest", "header -> content -> frameSet", "content\nClick for new frame content with onload", "header -> content -> frameSet -> onloadFrame", @@ -390,9 +445,9 @@ public void windowLocationReplaceOnload() throws Exception { final String html = "<html><head><title>OnloadTest</title></head>\n" + "<frameset rows=\"50,*\" onLoad=\"top.header.addToFrameOrder('frameSet');\">\n" - + " <frame name=\"header\" src=\"header.html\"></frame>\n" + + " <frame name=\"header\" src=\"header.html\">\n" + " <frame name=\"content\" id=\"content\" " - + "src=\"javascript:window.location.replace('content.html')\"></frame>\n" + + "src=\"javascript:window.location.replace('content.html')\">\n" + "</frameset>\n" + "</html>"; @@ -406,23 +461,23 @@ + " }\n" + "</script>\n" + "<body onload=\"addToFrameOrder('header');\">\n" - + "<div id=\"frameOrder\"></div>\n" + + " <div id=\"frameOrder\"></div>\n" + "</body></html>"; final String contentFrame = "<html><head><title>contentFrame</title></head>\n" + "<body onload=\"top.header.addToFrameOrder('content');\">\n" - + "<h3>content</h3>\n" - + "<a name=\"onloadFrameAnchor\" href=\"onload.html\" " + + " <h3>content</h3>\n" + + " <a name=\"onloadFrameAnchor\" href=\"onload.html\" " + "target=\"content\">Click for new frame content with onload</a>\n" + "</body></html>"; final String onloadFrame = "<html><head><title>onloadFrame</title></head>\n" + "<body onload=\"alert('Onload alert.');top.header.addToFrameOrder('onloadFrame');\">\n" - + "<script type=\"text/javascript\">\n" - + " alert('Body alert.');\n" - + "</script>\n" - + "<h3>onloadFrame</h3>\n" - + "<p id=\"newContent\">New content loaded...</p>\n" + + " <script type=\"text/javascript\">\n" + + " alert('Body alert.');\n" + + " </script>\n" + + " <h3>onloadFrame</h3>\n" + + " <p id=\"newContent\">New content loaded...</p>\n" + "</body></html>"; getMockWebConnection().setResponse(URL_FIRST, html); @@ -463,13 +518,13 @@ "header -> content -> frameSet -> onloadFrame", "onloadFrame\nNew content loaded..." }, FF = { "OnloadTest", "header -> frameSet", "" }) - @NotYetImplemented + @NotYetImplemented(FF) public void windowLocationAssignOnload() throws Exception { final String html = "<html><head><title>OnloadTest</title></head>\n" + "<frameset rows=\"50,*\" onLoad=\"top.header.addToFrameOrder('frameSet');\">\n" - + " <frame name=\"header\" src=\"header.html\"></frame>\n" + + " <frame name=\"header\" src=\"header.html\">\n" + " <frame name=\"content\" id=\"content\" " - + "src=\"javascript:window.location.assign('content.html')\"></frame>\n" + + "src=\"javascript:window.location.assign('content.html')\">\n" + "</frameset>\n" + "</html>"; @@ -483,23 +538,23 @@ + " }\n" + "</script>\n" + "<body onload=\"addToFrameOrder('header');\">\n" - + "<div id=\"frameOrder\"></div>\n" + + " <div id=\"frameOrder\"></div>\n" + "</body></html>"; final String contentFrame = "<html><head><title>contentFrame</title></head>\n" + "<body onload=\"top.header.addToFrameOrder('content');\">\n" - + "<h3>content</h3>\n" - + "<a name=\"onloadFrameAnchor\" href=\"onload.html\" " + + " <h3>content</h3>\n" + + " <a name=\"onloadFrameAnchor\" href=\"onload.html\" " + "target=\"content\">Click for new frame content with onload</a>\n" + "</body></html>"; final String onloadFrame = "<html><head><title>onloadFrame</title></head>\n" + "<body onload=\"alert('Onload alert.');top.header.addToFrameOrder('onloadFrame');\">\n" - + "<script type=\"text/javascript\">\n" - + " alert('Body alert.');\n" - + "</script>\n" - + "<h3>onloadFrame</h3>\n" - + "<p id=\"newContent\">New content loaded...</p>\n" + + " <script type=\"text/javascript\">\n" + + " alert('Body alert.');\n" + + " </script>\n" + + " <h3>onloadFrame</h3>\n" + + " <p id=\"newContent\">New content loaded...</p>\n" + "</body></html>"; getMockWebConnection().setResponse(URL_FIRST, html); @@ -545,9 +600,9 @@ public void windowLocationSetOnload() throws Exception { final String html = "<html><head><title>OnloadTest</title></head>\n" + "<frameset rows=\"50,*\" onLoad=\"top.header.addToFrameOrder('frameSet');\">\n" - + " <frame name=\"header\" src=\"header.html\"></frame>\n" + + " <frame name=\"header\" src=\"header.html\">\n" + " <frame name=\"content\" id=\"content\" " - + "src=\"javascript:window.location='content.html'\"></frame>\n" + + "src=\"javascript:window.location='content.html'\">\n" + "</frameset>\n" + "</html>"; @@ -561,23 +616,23 @@ + " }\n" + "</script>\n" + "<body onload=\"addToFrameOrder('header');\">\n" - + "<div id=\"frameOrder\"></div>\n" + + " <div id=\"frameOrder\"></div>\n" + "</body></html>"; final String contentFrame = "<html><head><title>contentFrame</title></head>\n" + "<body onload=\"top.header.addToFrameOrder('content');\">\n" - + "<h3>content</h3>\n" - + "<a name=\"onloadFrameAnchor\" href=\"onload.html\" " + + " <h3>content</h3>\n" + + " <a name=\"onloadFrameAnchor\" href=\"onload.html\" " + "target=\"content\">Click for new frame content with onload</a>\n" + "</body></html>"; final String onloadFrame = "<html><head><title>onloadFrame</title></head>\n" + "<body onload=\"alert('Onload alert.');top.header.addToFrameOrder('onloadFrame');\">\n" - + "<script type=\"text/javascript\">\n" - + " alert('Body alert.');\n" - + "</script>\n" - + "<h3>onloadFrame</h3>\n" - + "<p id=\"newContent\">New content loaded...</p>\n" + + " <script type=\"text/javascript\">\n" + + " alert('Body alert.');\n" + + " </script>\n" + + " <h3>onloadFrame</h3>\n" + + " <p id=\"newContent\">New content loaded...</p>\n" + "</body></html>"; getMockWebConnection().setResponse(URL_FIRST, html); |