diff options
author | sgurun <sgurun@chromium.org> | 2014-12-02 12:50:02 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-02 20:50:19 +0000 |
commit | 77dabb2bd7d5ce0e99c0ec2c44698ed66268bd47 (patch) | |
tree | 30cb52dcb91532e33478d8ddc031273853e24d7a /android_webview | |
parent | 691dd57a00c82fb247b695b25a60c060fdfc75dd (diff) | |
download | chromium_src-77dabb2bd7d5ce0e99c0ec2c44698ed66268bd47.zip chromium_src-77dabb2bd7d5ce0e99c0ec2c44698ed66268bd47.tar.gz chromium_src-77dabb2bd7d5ce0e99c0ec2c44698ed66268bd47.tar.bz2 |
Verify that Message Channel Message Ports can be transferred correctly
BUG=393291
Write a test to make sure Message Channel MesssagePorts can be
transferred correctly from Webview to JS by testing communication
between a Worker and the main frame. Also fix a bug discovered
by this test.
Review URL: https://codereview.chromium.org/766623002
Cr-Commit-Position: refs/heads/master@{#306449}
Diffstat (limited to 'android_webview')
-rw-r--r-- | android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java | 109 |
1 files changed, 91 insertions, 18 deletions
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 7d5b0ae..5d7df38 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()); + } } |