From: <rb...@us...> - 2013-08-05 17:43:02
|
Revision: 8440 http://sourceforge.net/p/htmlunit/code/8440 Author: rbri Date: 2013-08-05 17:42:58 +0000 (Mon, 05 Aug 2013) Log Message: ----------- window.postMessage is synchronous in IE only Modified Paths: -------------- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-08-05 16:39:28 UTC (rev 8439) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-08-05 17:42:58 UTC (rev 8440) @@ -1170,6 +1170,10 @@ @BrowserFeature(@WebBrowser(IE)) JS_WINDOW_IS_NOT_A_FUNCTION, + /** Window.postMessage is synchronouse. */ + @BrowserFeature(@WebBrowser(IE)) + JS_WINDOW_POST_MESSAGE_SYNCHRONOUSE, + /** Supports XML. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) JS_XML, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-08-05 16:39:28 UTC (rev 8439) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-08-05 17:42:58 UTC (rev 8440) @@ -20,6 +20,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_CHANGE_OPENER_NOT_ALLOWED; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_FRAMES_ACCESSIBLE_BY_ID; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_IS_NOT_A_FUNCTION; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_WINDOW_POST_MESSAGE_SYNCHRONOUSE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML_SUPPORT_VIA_ACTIVEXOBJECT; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.CHROME; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.FF; @@ -81,6 +82,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlLink; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlStyle; +import com.gargoylesoftware.htmlunit.javascript.PostponedAction; import com.gargoylesoftware.htmlunit.javascript.ScriptableWithFallbackGetter; import com.gargoylesoftware.htmlunit.javascript.SimpleScriptable; import com.gargoylesoftware.htmlunit.javascript.background.BackgroundJavaScriptFactory; @@ -2051,7 +2053,18 @@ event.setParentScope(this); event.setPrototype(getPrototype(event.getClass())); - dispatchEvent(event); + if (getBrowserVersion().hasFeature(JS_WINDOW_POST_MESSAGE_SYNCHRONOUSE)) { + dispatchEvent(event); + return; + } + + final PostponedAction action = new PostponedAction(getDomNodeOrDie().getPage()) { + @Override + public void execute() throws Exception { + dispatchEvent(event); + } + }; + getWebWindow().getWebClient().getJavaScriptEngine().addPostponedAction(action); } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-08-05 16:39:28 UTC (rev 8439) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-08-05 17:42:58 UTC (rev 8440) @@ -38,6 +38,7 @@ * @version $Revision$ * @author Marc Guillemot * @author Ahmed Ashour + * @author Ronald Brill */ @RunWith(BrowserRunner.class) public class Window2Test extends WebDriverTestCase { @@ -1171,22 +1172,25 @@ IE6 = "exception", IE7 = "exception") public void postMessage() throws Exception { final String html - = "<html><body><script>\n" - + "function receiveMessage(event) {\n" - + " alert('type: ' + event.type);\n" - + " alert('data: ' + event.data);\n" - // + " alert('origin: ' + event.origin);\n" - // + " alert('source: ' + event.source);\n" - // + " alert('lastEventId: ' + event.lastEventId);\n" - + "}\n" - + "if (window.addEventListener) {\n" - + " window.addEventListener('message', receiveMessage, false);\n" - + "}\n" - + "else {\n" - + " window.attachEvent('onmessage', receiveMessage);\n" - + "}\n" + = "<html>" + + "<head><title>foo</title></head>\n" + + "<body>\n" + + "<script>\n" + + " function receiveMessage(event) {\n" + + " alert('type: ' + event.type);\n" + + " alert('data: ' + event.data);\n" + // + " alert('origin: ' + event.origin);\n" + // + " alert('source: ' + event.source);\n" + // + " alert('lastEventId: ' + event.lastEventId);\n" + + " }\n" + + + " if (window.addEventListener) {\n" + + " window.addEventListener('message', receiveMessage, false);\n" + + " } else {\n" + + " window.attachEvent('onmessage', receiveMessage);\n" + + " }\n" + "</script>\n" - + "<iframe src='" + URL_SECOND + "'></iframe>\n" + + " <iframe src='" + URL_SECOND + "'></iframe>\n" + "</body></html>"; final String iframe = "<html><body><script>\n" @@ -1198,4 +1202,42 @@ getMockWebConnection().setResponse(URL_SECOND, iframe); loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "sync: false", + IE6 = "exception", + IE7 = "exception", + IE = "sync: true") + public void postMessageSyncOrAsync() throws Exception { + final String html + = "<html>" + + "<head><title>foo</title></head>\n" + + "<body>\n" + + "<script>\n" + + " var sync = true;\n" + + " function receiveMessage(event) {\n" + + " alert('sync: ' + sync);\n" + + " }\n" + + " if (window.addEventListener) {\n" + + " window.addEventListener('message', receiveMessage, false);\n" + + " } else {\n" + + " window.attachEvent('onmessage', receiveMessage);\n" + + " }\n" + + "</script>\n" + + " <iframe src='" + URL_SECOND + "'></iframe>\n" + + "</body></html>"; + + final String iframe = "<html><body><script>\n" + + "try {\n" + + " top.postMessage('hello', '*');\n" + + " top.sync = false;\n" + + "} catch(e) { alert('exception') }\n" + + "</script></body></html>"; + + getMockWebConnection().setResponse(URL_SECOND, iframe); + loadPageWithAlerts2(html); + } } |