From: <mgu...@us...> - 2013-08-05 09:15:16
|
Revision: 8436 http://sourceforge.net/p/htmlunit/code/8436 Author: mguillem Date: 2013-08-05 09:15:13 +0000 (Mon, 05 Aug 2013) Log Message: ----------- JavaScript: added (simple) support for window.postMessage. Issue 1481 Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.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/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-08-02 17:43:20 UTC (rev 8435) +++ trunk/htmlunit/src/changes/changes.xml 2013-08-05 09:15:13 UTC (rev 8436) @@ -8,6 +8,9 @@ <body> <release version="2.13" date="???" description="Bugfixes"> + <action type="fix" dev="mguillem" issue="1481"> + JavaScript: added (simple) support for window.postMessage. + </action> <action type="fix" dev="rbri" issue="1532" due-to="Sebastian Cato"> XMLHttpRequest open(..) methods failed when called with null for userid/password. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java 2013-08-02 17:43:20 UTC (rev 8435) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Event.java 2013-08-05 09:15:13 UTC (rev 8436) @@ -125,6 +125,9 @@ /** The event type triggered by "onerror" event handlers. */ public static final String TYPE_ERROR = "error"; + /** The message event type, triggered by postMessage. */ + public static final String TYPE_MESSAGE = "message"; + /** The first event phase: the capturing phase. */ @JsxConstant(@WebBrowser(FF)) public static final short CAPTURING_PHASE = 1; Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java 2013-08-02 17:43:20 UTC (rev 8435) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/MessageEvent.java 2013-08-05 09:15:13 UTC (rev 8436) @@ -14,7 +14,6 @@ */ package com.gargoylesoftware.htmlunit.javascript.host; -import com.gargoylesoftware.htmlunit.javascript.SimpleScriptable; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxGetter; @@ -27,7 +26,7 @@ * @author Ahmed Ashour */ @JsxClass -public class MessageEvent extends SimpleScriptable { +public class MessageEvent extends Event { private Object data_; @@ -44,6 +43,7 @@ */ public MessageEvent(final Object data) { data_ = data; + setType(TYPE_MESSAGE); } /** 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-02 17:43:20 UTC (rev 8435) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/Window.java 2013-08-05 09:15:13 UTC (rev 8436) @@ -2038,6 +2038,21 @@ public void setOnchange(final Object onchange) { setHandlerForJavaScript(Event.TYPE_CHANGE, onchange); } + + /** + * Posts a message. + * @param message the object passed to the window + * @param targetOrigin the origin this window must be for the event to be dispatched + * @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage">MDN documentation</a> + */ + @JsxFunction({@WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 9) }) + public void postMessage(final String message, final String targetOrigin) { + final MessageEvent event = new MessageEvent(message); + event.setParentScope(this); + event.setPrototype(getPrototype(event.getClass())); + + dispatchEvent(event); + } } class HTMLCollectionFrames extends HTMLCollection { 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-02 17:43:20 UTC (rev 8435) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/Window2Test.java 2013-08-05 09:15:13 UTC (rev 8436) @@ -1162,4 +1162,30 @@ assertEquals(getExpectedAlerts(), getCollectedAlerts(driver)); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = { "type: message", "data: hello" }, + IE6 = { }, IE7 = { }, IE8 = { }) + 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" + + "}\n" + + "window.addEventListener('message', receiveMessage, false);\n" + + "</script>\n" + + "<iframe src='" + URL_SECOND + "'></iframe>\n" + + "</body></html>"; + + final String iframe = "<html><body><script>\n" + + "top.postMessage('hello', '*');\n" + + "</script></body></html>"; + + getMockWebConnection().setResponse(URL_SECOND, iframe); + loadPageWithAlerts2(html); + } } |