Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2282)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java

Issue 869133005: Post a Message from Java to JS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: spelling fix Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 3be279c9f71d7a65f44febc63d7573c60046c7ba..4c3f945cdb88f636492333c2c53627eb76b38d16 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
@@ -15,10 +15,13 @@ 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.DisabledTest;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.net.test.util.TestWebServer;
+import java.util.concurrent.CountDownLatch;
+
/**
* The tests for content postMessage API.
*/
@@ -141,6 +144,38 @@ public class PostMessageTest extends AwTestBase {
assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin());
}
+ @SmallTest
+ @Feature({"AndroidWebView", "Android-PostMessage"})
+ public void testTransferringSamePortTwiceNotAllowed() throws Throwable {
+ loadPage(TEST_PAGE);
+ final CountDownLatch latch = new CountDownLatch(1);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ValueCallback<MessageChannel> callback = new ValueCallback<MessageChannel>() {
+ @Override
+ public void onReceiveValue(MessageChannel channel) {
+ mAwContents.postMessageToFrame(null, "1", SOURCE_ORIGIN,
+ mWebServer.getBaseUrl(),
+ new MessagePort[]{channel.port2()});
+ // retransfer the port. This should fail with an exception
+ try {
+ mAwContents.postMessageToFrame(null, "2", SOURCE_ORIGIN,
+ mWebServer.getBaseUrl(),
+ new MessagePort[]{channel.port2()});
+ } catch (IllegalStateException ex) {
+ latch.countDown();
+ return;
+ }
+ fail();
+ }
+ };
+ mAwContents.createMessageChannel(callback);
+ }
+ });
+ boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILLISECONDS);
+ }
+
private static class ChannelContainer {
private boolean mReady;
private MessageChannel mChannel;
@@ -173,11 +208,18 @@ public class PostMessageTest extends AwTestBase {
}
}
- // Verify that a channel can be created and basic full duplex communication
- // can happen on it.
+ // Verify that messages from JS can be waited on a UI thread.
@SmallTest
+ // TODO this test turned out to be flaky. When it fails, it always fails in IPC.
+ // When a postmessage is received, an IPC message is sent from browser to renderer
+ // to convert the postmessage from WebSerializedScriptValue to a string. The IPC is sent
+ // and seems to be received by IPC in renderer, but then nothing else seems to happen.
+ // The issue seems like blocking the UI thread causes a racing SYNC ipc from renderer
+ // to browser to block waiting for UI thread, and this would in turn block renderer
+ // doing the conversion.
+ @DisabledTest
@Feature({"AndroidWebView", "Android-PostMessage"})
- public void testCreateChannel() throws Throwable {
+ public void testReceiveMessageInBackgroundThread() throws Throwable {
loadPage(TEST_PAGE);
final ChannelContainer channelContainer = new ChannelContainer();
runTestOnUiThread(new Runnable() {
@@ -218,7 +260,51 @@ public class PostMessageTest extends AwTestBase {
}
});
assertEquals(JS_MESSAGE, channelContainer.getMessage());
- // TODO(sgurun) verify communication from Java to JS on the created channel
+ }
+
+ private static final String ECHO_PAGE =
+ "<!DOCTYPE html><html><body>"
+ + " <script type=\"text/javascript\">"
+ + " onmessage = function (e) {"
+ + " var myPort = e.ports[0];"
+ + " myPort.onmessage = function(e) {"
+ + " myPort.postMessage(e.data + \"" + JS_MESSAGE + "\"); }"
+ + " }"
+ + " </script>"
+ + "</body></html>";
+
+ // Verify that a channel can be created and basic full duplex communication
+ // can happen on it. Do this by sending a message to JS and let it echo'ing
+ // the message with some text prepended to it.
+ @SmallTest
+ @Feature({"AndroidWebView", "Android-PostMessage"})
+ public void testMessageChannel() throws Throwable {
+ final String hello = "HELLO";
+ final ChannelContainer channelContainer = new ChannelContainer();
+ loadPage(ECHO_PAGE);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ValueCallback<MessageChannel> callback = new ValueCallback<MessageChannel>() {
+ @Override
+ public void onReceiveValue(MessageChannel 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 MessagePort[]{channel.port2()});
+ channel.port1().postMessage(hello, null);
+ }
+ };
+ mAwContents.createMessageChannel(callback);
+ }
+ });
+ // wait for the asynchronous response from JS
+ channelContainer.waitForMessage();
+ assertEquals(hello + JS_MESSAGE, channelContainer.getMessage());
}
private static final String WORKER_MESSAGE = "from_worker";
« no previous file with comments | « android_webview/java/src/org/chromium/android_webview/MessagePort.java ('k') | android_webview/native/aw_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698