| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7d5b0aea0d727a6b5becc77b1e2533014a03a777
|
| --- /dev/null
|
| +++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
|
| @@ -0,0 +1,147 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.android_webview.test;
|
| +
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.webkit.ValueCallback;
|
| +
|
| +import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
|
| +import static org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
|
| +
|
| +import org.chromium.android_webview.AwContents;
|
| +import org.chromium.android_webview.MessageChannel;
|
| +import org.chromium.base.test.util.Feature;
|
| +
|
| +/**
|
| + * 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.
|
| + private static class MessageObject {
|
| + // Timeout to failure, in milliseconds
|
| + private static final long TIMEOUT = scaleTimeout(5000);
|
| +
|
| + private boolean mReady;
|
| + private String mData;
|
| + private String mOrigin;
|
| + private int[] mPorts;
|
| + private Object mLock = new Object();
|
| +
|
| + public void setMessageParams(String data, String origin, int[] ports) {
|
| + synchronized (mLock) {
|
| + mData = data;
|
| + mOrigin = origin;
|
| + mPorts = ports;
|
| + mReady = true;
|
| + mLock.notify();
|
| + }
|
| + }
|
| +
|
| + public void waitForMessage() throws InterruptedException {
|
| + synchronized (mLock) {
|
| + if (!mReady) mLock.wait(TIMEOUT);
|
| + }
|
| + }
|
| +
|
| + public String getData() {
|
| + return mData;
|
| + }
|
| +
|
| + public String getOrigin() {
|
| + return mOrigin;
|
| + }
|
| +
|
| + public int[] getPorts() {
|
| + return mPorts;
|
| + }
|
| + }
|
| +
|
| + private MessageObject mMessageObject;
|
| + private TestAwContentsClient mContentsClient;
|
| + private AwTestContainerView mTestContainerView;
|
| + private AwContents mAwContents;
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + super.setUp();
|
| + mMessageObject = new MessageObject();
|
| + mContentsClient = new TestAwContentsClient();
|
| + mTestContainerView = createAwTestContainerViewOnMainSync(mContentsClient);
|
| + mAwContents = mTestContainerView.getAwContents();
|
| + enableJavaScriptOnUiThread(mAwContents);
|
| +
|
| + try {
|
| + runTestOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mAwContents.addPossiblyUnsafeJavascriptInterface(mMessageObject,
|
| + "messageObject", null);
|
| + }
|
| + });
|
| + } catch (Throwable t) {
|
| + throw new RuntimeException(t);
|
| + }
|
| + OnPageFinishedHelper onPageFinishedHelper = mContentsClient.getOnPageFinishedHelper();
|
| + int currentCallCount = onPageFinishedHelper.getCallCount();
|
| + // Load test page
|
| + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
|
| + TEST_PAGE, "text/html", false);
|
| + onPageFinishedHelper.waitForCallback(currentCallCount);
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AndroidWebView", "Android-PostMessage"})
|
| + public void testPostMessageToMainFrame() throws Throwable {
|
| + runTestOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mAwContents.postMessageToFrame(null, MESSAGE, SOURCE_ORIGIN, "*", null);
|
| + }
|
| + });
|
| + mMessageObject.waitForMessage();
|
| + assertEquals(MESSAGE, mMessageObject.getData());
|
| + assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin());
|
| + }
|
| +
|
| + // TODO(sgurun) This test verifies a channel is created by posting one of the
|
| + // ports of the channel to a MessagePort and verifying one port is received.
|
| + // in a next CL we will update the JS to post messages back to Webview so
|
| + // we could do a more thorough verification.
|
| + @SmallTest
|
| + @Feature({"AndroidWebView", "Android-PostMessage"})
|
| + public void testCreateChannel() throws Throwable {
|
| + 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.createMessageChannel(callback);
|
| + }
|
| + });
|
| + mMessageObject.waitForMessage();
|
| + assertEquals(MESSAGE, mMessageObject.getData());
|
| + assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin());
|
| + // verify that one message port is received.
|
| + assertEquals(1, mMessageObject.getPorts().length);
|
| + }
|
| +}
|
|
|