Chromium Code Reviews| 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 5d7df38e61f0ce58b829c5ede771da287f448a5a..77ee09d047ecdf63f965b50fcd1d0390e1a60cf0 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,6 +12,7 @@ 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.MessagePort; |
| import org.chromium.android_webview.test.util.CommonResources; |
| import org.chromium.base.test.util.Feature; |
| import org.chromium.net.test.util.TestWebServer; |
| @@ -22,12 +23,11 @@ import org.chromium.net.test.util.TestWebServer; |
| public class PostMessageTest extends AwTestBase { |
| private static final String SOURCE_ORIGIN = "android_webview"; |
| + // Timeout to failure, in milliseconds |
| + private static final long TIMEOUT = scaleTimeout(5000); |
| // 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; |
| @@ -99,12 +99,16 @@ public class PostMessageTest extends AwTestBase { |
| } |
| private static final String WEBVIEW_MESSAGE = "from_webview"; |
| + private static final String JS_MESSAGE = "from_js"; |
| 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);" |
| + + " if (e.ports != null && e.ports.length > 0) {" |
| + + " e.ports[0].postMessage(\"" + JS_MESSAGE + "\");" |
| + + " }" |
| + " }" |
| + " </script>" |
| + "</body></html>"; |
| @@ -134,22 +138,61 @@ public class PostMessageTest extends AwTestBase { |
| 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. |
| + private static class ChannelContainer { |
| + private boolean mReady; |
| + private MessageChannel mChannel; |
| + private Object mLock = new Object(); |
| + private String mMessage; |
| + |
| + public void set(MessageChannel channel) { |
| + mChannel = channel; |
| + } |
| + public MessageChannel get() { |
| + return mChannel; |
| + } |
| + |
| + public void setMessage(String message) { |
| + synchronized (mLock) { |
| + mMessage = message; |
| + mReady = true; |
| + mLock.notify(); |
| + } |
| + } |
| + |
| + public String getMessage() { |
| + return mMessage; |
| + } |
| + |
| + public void waitForMessage() throws InterruptedException { |
| + synchronized (mLock) { |
| + if (!mReady) mLock.wait(TIMEOUT); |
| + } |
| + } |
| + } |
| + |
| + // Verify that a channel can be created and basic full duplex communication |
| + // can happen on it. |
| @SmallTest |
| @Feature({"AndroidWebView", "Android-PostMessage"}) |
| public void testCreateChannel() throws Throwable { |
| loadPage(TEST_PAGE); |
| + final ChannelContainer channelContainer = new ChannelContainer(); |
| runTestOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| ValueCallback<MessageChannel> callback = new ValueCallback<MessageChannel>() { |
| @Override |
| public void onReceiveValue(MessageChannel channel) { |
| + // verify communication from JS to Java. |
| + channelContainer.set(channel); |
| + channel.port1().setMessageHandler(new MessagePort.MessageHandler() { |
| + @Override |
| + public void onMessage(String message) { |
| + channelContainer.setMessage(message); |
| + } |
| + }); |
| mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, SOURCE_ORIGIN, |
| - mWebServer.getBaseUrl(), new int[]{channel.port2()}); |
| + mWebServer.getBaseUrl(), new MessagePort[]{channel.port2()}); |
| } |
| }; |
| mAwContents.createMessageChannel(callback); |
| @@ -158,10 +201,26 @@ public class PostMessageTest extends AwTestBase { |
| mMessageObject.waitForMessage(); |
| assertEquals(WEBVIEW_MESSAGE, mMessageObject.getData()); |
| assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin()); |
| - // verify that one message port is received. |
| + // verify that one message port is received at the js side |
| assertEquals(1, mMessageObject.getPorts().length); |
| + // wait until we receive a message from JS |
| + runTestOnUiThread(new Runnable() { |
| + @Override |
| + public void run() { |
| + try { |
| + channelContainer.waitForMessage(); |
| + } catch (InterruptedException e) { |
| + // ignore. |
| + } |
| + } |
| + }); |
| + assertEquals(JS_MESSAGE, channelContainer.getMessage()); |
| + // TODO(sgurun) verify communication from Java to JS on the created channel |
| } |
| + |
|
mnaganov (inactive)
2015/01/15 09:49:33
nit: extra new lines
sgurun-gerrit only
2015/01/15 21:21:32
Done.
|
| + |
| + |
| private static final String WORKER_MESSAGE = "from_worker"; |
| // Listen for messages. Pass port 1 to worker and use port 2 to receive messages from |
| @@ -208,7 +267,7 @@ public class PostMessageTest extends AwTestBase { |
| public void onReceiveValue(MessageChannel channel) { |
| mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, SOURCE_ORIGIN, |
| mWebServer.getBaseUrl(), |
| - new int[]{channel.port1(), channel.port2()}); |
| + new MessagePort[]{channel.port1(), channel.port2()}); |
| } |
| }; |
| mAwContents.createMessageChannel(callback); |