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 0adff6714ee8aaf0675d3817ddb8a4e953721b81..c4eb3181b0544b4ff5a3afa9a96e2c9523d13ce0 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 |
@@ -6,7 +6,6 @@ package org.chromium.android_webview.test; |
import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; |
-import android.os.Handler; |
import android.support.test.filters.SmallTest; |
import android.webkit.JavascriptInterface; |
@@ -18,7 +17,6 @@ import org.chromium.base.test.util.DisabledTest; |
import org.chromium.base.test.util.Feature; |
import org.chromium.base.test.util.RetryOnFailure; |
import org.chromium.content.browser.AppWebMessagePort; |
-import org.chromium.content.browser.AppWebMessagePortService; |
import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper; |
@@ -501,8 +499,6 @@ public class PostMessageTest extends AwTestBase { |
@Feature({"AndroidWebView", "Android-PostMessage"}) |
public void testPendingPortCanBeTransferredInPendingPort() throws Throwable { |
loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL); |
- final TestMessagePort testPort = |
- new TestMessagePort(getAwBrowserContext().getMessagePortService()); |
runTestOnUiThread(new Runnable() { |
@Override |
public void run() { |
@@ -636,6 +632,7 @@ public class PostMessageTest extends AwTestBase { |
} |
private static final String HELLO = "HELLO"; |
+ private static final String SMILEY = "\u263A"; |
// Message channels are created on UI thread in a pending state. They are |
// initialized at a later stage. Verify that a message port that is initialized |
@@ -676,6 +673,42 @@ public class PostMessageTest extends AwTestBase { |
assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage()); |
} |
+ // Same test as above, but add in a non-ASCII character. This is meaningful |
+ // as Blink uses a different serialization format for non-ASCII strings. |
+ @SmallTest |
+ @Feature({"AndroidWebView", "Android-PostMessage"}) |
+ public void testMessageChannelUsingInitializedPortWithNonASCII() throws Throwable { |
+ final ChannelContainer channelContainer = new ChannelContainer(); |
+ loadPage(ECHO_PAGE); |
+ final AppWebMessagePort[] channel = |
+ ThreadUtils.runOnUiThreadBlocking(new Callable<AppWebMessagePort[]>() { |
+ @Override |
+ public AppWebMessagePort[] call() { |
+ return mAwContents.createMessageChannel(); |
+ } |
+ }); |
+ |
+ waitUntilPortReady(channel[0]); |
+ waitUntilPortReady(channel[1]); |
+ runTestOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ channel[0].setMessageCallback(new MessagePort.MessageCallback() { |
+ @Override |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
+ channelContainer.setMessage(message); |
+ } |
+ }, null); |
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), |
+ new AppWebMessagePort[] {channel[1]}); |
+ channel[0].postMessage(HELLO + SMILEY, null); |
+ } |
+ }); |
+ // wait for the asynchronous response from JS |
+ channelContainer.waitForMessage(); |
+ assertEquals(HELLO + SMILEY + JS_MESSAGE, channelContainer.getMessage()); |
+ } |
+ |
// Verify that a message port can be used immediately (even if it is in |
// pending state) after creation. In particular make sure the message port can be |
// transferred to JS and full communication can happen on it. |
@@ -802,87 +835,6 @@ public class PostMessageTest extends AwTestBase { |
expectTitle("24"); |
} |
- private static class TestMessagePort extends AppWebMessagePort { |
- private boolean mReady; |
- private AppWebMessagePort mPort; |
- private final Object mLock = new Object(); |
- |
- public TestMessagePort(AppWebMessagePortService service) { |
- super(service); |
- } |
- |
- public void setMessagePort(AppWebMessagePort port) { |
- mPort = port; |
- } |
- |
- public void setReady(boolean ready) { |
- synchronized (mLock) { |
- mReady = ready; |
- } |
- } |
- @Override |
- public boolean isReady() { |
- synchronized (mLock) { |
- return mReady; |
- } |
- } |
- @Override |
- public int portId() { |
- return mPort.portId(); |
- } |
- @Override |
- public void setPortId(int id) { |
- mPort.setPortId(id); |
- } |
- @Override |
- public void close() { |
- mPort.close(); |
- } |
- @Override |
- public boolean isClosed() { |
- return mPort.isClosed(); |
- } |
- @Override |
- public void setMessageCallback(MessageCallback messageCallback, Handler handler) { |
- mPort.setMessageCallback(messageCallback, handler); |
- } |
- @Override |
- public void onMessage(String message, AppWebMessagePort[] sentPorts) { |
- mPort.onMessage(message, sentPorts); |
- } |
- @Override |
- public void postMessage(String message, MessagePort[] sentPorts) |
- throws IllegalStateException { |
- mPort.postMessage(message, sentPorts); |
- } |
- } |
- |
- // Post a message with a pending port to a frame and then post a message that |
- // is pending after that. Make sure that when first message becomes ready, |
- // the subsequent not-ready message is not sent. |
- @SmallTest |
- @Feature({"AndroidWebView", "Android-PostMessage"}) |
- public void testPostMessageToFrameNotSendsPendingMessages() throws Throwable { |
- loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME); |
- final TestMessagePort testPort = |
- new TestMessagePort(getAwBrowserContext().getMessagePortService()); |
- runTestOnUiThread(new Runnable() { |
- @Override |
- public void run() { |
- AppWebMessagePort[] channel = mAwContents.createMessageChannel(); |
- mAwContents.postMessageToFrame( |
- null, "1", mWebServer.getBaseUrl(), new AppWebMessagePort[] {channel[1]}); |
- mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(), null); |
- AppWebMessagePort[] channel2 = mAwContents.createMessageChannel(); |
- // Test port is in a pending state so it should not be transferred. |
- testPort.setMessagePort(channel2[0]); |
- mAwContents.postMessageToFrame( |
- null, "3", mWebServer.getBaseUrl(), new AppWebMessagePort[] {testPort}); |
- } |
- }); |
- expectTitle("12"); |
- } |
- |
private static final String WORKER_MESSAGE = "from_worker"; |
// Listen for messages. Pass port 1 to worker and use port 2 to receive messages from |