summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authorsgurun <sgurun@chromium.org>2014-12-02 12:50:02 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-02 20:50:19 +0000
commit77dabb2bd7d5ce0e99c0ec2c44698ed66268bd47 (patch)
tree30cb52dcb91532e33478d8ddc031273853e24d7a /android_webview
parent691dd57a00c82fb247b695b25a60c060fdfc75dd (diff)
downloadchromium_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.java109
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());
+ }
}