Index: android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java |
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java |
index 6d86ef3dc20f50ad84538c6885d23c207c8a9cfa..44db7f1b7e60f86f360805a4d9dc794a6c9bc02b 100644 |
--- a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java |
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java |
@@ -763,4 +763,90 @@ public class PostMessageTest extends AwTestBase { |
mMessageObject.waitForMessage(); |
assertEquals(WORKER_MESSAGE, mMessageObject.getData()); |
} |
+ |
+ private static final String POPUP_MESSAGE = "from_popup"; |
+ private static final String POPUP_URL = "/popup.html"; |
+ private static final String IFRAME_URL = "/iframe.html"; |
+ private static final String MAIN_PAGE_FOR_POPUP_TEST = "<!DOCTYPE html><html>" |
+ + "<head>" |
+ + " <script>" |
+ + " function createPopup() {" |
+ + " var popupWindow = window.open('" + POPUP_URL + "');" |
+ + " onmessage = function(e) {" |
+ + " popupWindow.postMessage(e.data, '*', e.ports);" |
+ + " };" |
+ + " }" |
+ + " </script>" |
+ + "</head>" |
+ + "</html>"; |
+ |
+ // Sends message and ports to the iframe. |
+ private static final String POPUP_PAGE_WITH_IFRAME = "<!DOCTYPE html><html>" |
+ + "<script>" |
+ + " onmessage = function(e) {" |
+ + " var iframe = document.getElementsByTagName('iframe')[0];" |
+ + " iframe.contentWindow.postMessage('" + POPUP_MESSAGE + "', '*', e.ports);" |
+ + " };" |
+ + "</script>" |
+ + "<body><iframe src='" + IFRAME_URL + "'></iframe></body>" |
+ + "</html>"; |
+ |
+ // Test if WebView can post a message from/to a popup window owning a message port. |
+ @SmallTest |
+ @Feature({"AndroidWebView", "Android-PostMessage"}) |
+ public void testPostMessageToPopup() throws Throwable { |
+ triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POPUP_TEST, ECHO_PAGE, |
+ POPUP_URL, "createPopup()"); |
+ connectPendingPopup(mAwContents); |
+ final ChannelContainer channelContainer = new ChannelContainer(); |
+ |
+ runTestOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ MessagePort[] channel = mAwContents.createMessageChannel(); |
+ channelContainer.set(channel); |
+ channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
+ @Override |
+ public void onMessage(String message) { |
+ channelContainer.setMessage(message); |
+ } |
+ }, null); |
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), |
+ new MessagePort[] {channel[1]}); |
+ channel[0].postMessage(HELLO, null); |
+ } |
+ }); |
+ channelContainer.waitForMessage(); |
+ assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
+ } |
+ |
+ // Test if WebView can post a message from/to an iframe in a popup window. |
+ @SmallTest |
+ @Feature({"AndroidWebView", "Android-PostMessage"}) |
+ public void testPostMessageToIframeInsidePopup() throws Throwable { |
+ mWebServer.setResponse(IFRAME_URL, ECHO_PAGE, null); |
+ triggerPopup(mAwContents, mContentsClient, mWebServer, MAIN_PAGE_FOR_POPUP_TEST, |
+ POPUP_PAGE_WITH_IFRAME, POPUP_URL, "createPopup()"); |
+ connectPendingPopup(mAwContents); |
+ final ChannelContainer channelContainer = new ChannelContainer(); |
+ |
+ runTestOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ MessagePort[] channel = mAwContents.createMessageChannel(); |
+ channelContainer.set(channel); |
+ channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
+ @Override |
+ public void onMessage(String message) { |
+ channelContainer.setMessage(message); |
+ } |
+ }, null); |
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), |
+ new MessagePort[] {channel[1]}); |
+ channel[0].postMessage(HELLO, null); |
+ } |
+ }); |
+ channelContainer.waitForMessage(); |
+ assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
+ } |
} |