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 7d5b0aea0d727a6b5becc77b1e2533014a03a777..5d7df38e61f0ce58b829c5ede771da287f448a5a 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 |
@@ -12,23 +12,15 @@ import static org.chromium.content.browser.test.util.TestCallbackHelperContainer |
import org.chromium.android_webview.AwContents; |
import org.chromium.android_webview.MessageChannel; |
+import org.chromium.android_webview.test.util.CommonResources; |
import org.chromium.base.test.util.Feature; |
+import org.chromium.net.test.util.TestWebServer; |
/** |
* The tests for content postMessage API. |
*/ |
public class PostMessageTest extends AwTestBase { |
- private static final String TEST_PAGE = |
- "<!DOCTYPE html><html><body>" |
- + " <script type=\"text/javascript\">" |
- + " onmessage = function (e) {" |
- + " messageObject.setMessageParams(e.data, e.origin, e.ports);" |
- + " }" |
- + " </script>" |
- + "</body></html>"; |
- |
- private static final String MESSAGE = "Foo"; |
private static final String SOURCE_ORIGIN = "android_webview"; |
// Inject to the page to verify received messages. |
@@ -75,6 +67,7 @@ public class PostMessageTest extends AwTestBase { |
private TestAwContentsClient mContentsClient; |
private AwTestContainerView mTestContainerView; |
private AwContents mAwContents; |
+ private TestWebServer mWebServer; |
@Override |
protected void setUp() throws Exception { |
@@ -96,25 +89,48 @@ public class PostMessageTest extends AwTestBase { |
} catch (Throwable t) { |
throw new RuntimeException(t); |
} |
+ mWebServer = TestWebServer.start(); |
+ } |
+ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ mWebServer.shutdown(); |
+ super.tearDown(); |
+ } |
+ |
+ private static final String WEBVIEW_MESSAGE = "from_webview"; |
+ |
+ private static final String TEST_PAGE = |
+ "<!DOCTYPE html><html><body>" |
+ + " <script type=\"text/javascript\">" |
+ + " onmessage = function (e) {" |
+ + " messageObject.setMessageParams(e.data, e.origin, e.ports);" |
+ + " }" |
+ + " </script>" |
+ + "</body></html>"; |
+ |
+ private void loadPage(String page) throws Throwable { |
+ final String url = mWebServer.setResponse("/test.html", page, |
+ CommonResources.getTextHtmlHeaders(true)); |
OnPageFinishedHelper onPageFinishedHelper = mContentsClient.getOnPageFinishedHelper(); |
int currentCallCount = onPageFinishedHelper.getCallCount(); |
- // Load test page |
- loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), |
- TEST_PAGE, "text/html", false); |
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url); |
onPageFinishedHelper.waitForCallback(currentCallCount); |
} |
@SmallTest |
@Feature({"AndroidWebView", "Android-PostMessage"}) |
public void testPostMessageToMainFrame() throws Throwable { |
+ loadPage(TEST_PAGE); |
runTestOnUiThread(new Runnable() { |
@Override |
public void run() { |
- mAwContents.postMessageToFrame(null, MESSAGE, SOURCE_ORIGIN, "*", null); |
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, SOURCE_ORIGIN, |
+ mWebServer.getBaseUrl(), null); |
} |
}); |
mMessageObject.waitForMessage(); |
- assertEquals(MESSAGE, mMessageObject.getData()); |
+ assertEquals(WEBVIEW_MESSAGE, mMessageObject.getData()); |
assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin()); |
} |
@@ -125,23 +141,80 @@ public class PostMessageTest extends AwTestBase { |
@SmallTest |
@Feature({"AndroidWebView", "Android-PostMessage"}) |
public void testCreateChannel() throws Throwable { |
+ loadPage(TEST_PAGE); |
runTestOnUiThread(new Runnable() { |
@Override |
public void run() { |
ValueCallback<MessageChannel> callback = new ValueCallback<MessageChannel>() { |
@Override |
public void onReceiveValue(MessageChannel channel) { |
- mAwContents.postMessageToFrame(null, MESSAGE, SOURCE_ORIGIN, "*", |
- new int[]{channel.port2()}); |
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, SOURCE_ORIGIN, |
+ mWebServer.getBaseUrl(), new int[]{channel.port2()}); |
} |
}; |
mAwContents.createMessageChannel(callback); |
} |
}); |
mMessageObject.waitForMessage(); |
- assertEquals(MESSAGE, mMessageObject.getData()); |
+ assertEquals(WEBVIEW_MESSAGE, mMessageObject.getData()); |
assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin()); |
// verify that one message port is received. |
assertEquals(1, mMessageObject.getPorts().length); |
} |
+ |
+ private static final String WORKER_MESSAGE = "from_worker"; |
+ |
+ // Listen for messages. Pass port 1 to worker and use port 2 to receive messages from |
+ // from worker. |
+ private static final String TEST_PAGE_FOR_PORT_TRANSFER = |
+ "<!DOCTYPE html><html><body>" |
+ + " <script type=\"text/javascript\">" |
+ + " var worker = new Worker(\"worker.js\");" |
+ + " onmessage = function (e) {" |
+ + " if (e.data == \"" + WEBVIEW_MESSAGE + "\") {" |
+ + " worker.postMessage(\"worker_port\", [e.ports[0]]);" |
+ + " var messageChannelPort = e.ports[1];" |
+ + " messageChannelPort.onmessage = receiveWorkerMessage;" |
+ + " }" |
+ + " };" |
+ + " function receiveWorkerMessage(e) {" |
+ + " if (e.data == \"" + WORKER_MESSAGE + "\") {" |
+ + " messageObject.setMessageParams(e.data, e.origin, e.ports);" |
+ + " }" |
+ + " };" |
+ + " </script>" |
+ + "</body></html>"; |
+ |
+ private static final String WORKER_SCRIPT = |
+ "onmessage = function(e) {" |
+ + " if (e.data == \"worker_port\") {" |
+ + " var toWindow = e.ports[0];" |
+ + " toWindow.postMessage(\"" + WORKER_MESSAGE + "\");" |
+ + " toWindow.start();" |
+ + " }" |
+ + "}"; |
+ |
+ @SmallTest |
+ @Feature({"AndroidWebView", "Android-PostMessage"}) |
+ public void testTransferPortsToWorker() throws Throwable { |
+ mWebServer.setResponse("/worker.js", WORKER_SCRIPT, |
+ CommonResources.getTextJavascriptHeaders(true)); |
+ loadPage(TEST_PAGE_FOR_PORT_TRANSFER); |
+ runTestOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ ValueCallback<MessageChannel> callback = new ValueCallback<MessageChannel>() { |
+ @Override |
+ public void onReceiveValue(MessageChannel channel) { |
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, SOURCE_ORIGIN, |
+ mWebServer.getBaseUrl(), |
+ new int[]{channel.port1(), channel.port2()}); |
+ } |
+ }; |
+ mAwContents.createMessageChannel(callback); |
+ } |
+ }); |
+ mMessageObject.waitForMessage(); |
+ assertEquals(WORKER_MESSAGE, mMessageObject.getData()); |
+ } |
} |