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 869b8baa7dcf01c75b213a10c09926bd0a283f48..38d2d31095a69fe3439f1faf758b7f989986db64 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 |
@@ -146,7 +146,7 @@ public class PostMessageTest extends AwTestBase { |
+ " onmessage = function (e) {" |
+ " var myport = e.ports[0];" |
+ " myport.onmessage = function (f) {" |
- + " received = received + f.data;" |
+ + " received += f.data;" |
+ " document.title = received;" |
+ " }" |
+ " }" |
@@ -261,8 +261,7 @@ public class PostMessageTest extends AwTestBase { |
// set a web event handler, this puts the port in a started state. |
channel[1].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
- } |
+ public void onMessage(String message, MessagePort[] sentPorts) { } |
}, null); |
try { |
mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(), |
@@ -314,7 +313,7 @@ public class PostMessageTest extends AwTestBase { |
// set a web event handler, this puts the port in a started state. |
channel1[1].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { } |
+ public void onMessage(String message, MessagePort[] sentPorts) { } |
}, null); |
MessagePort[] channel2 = mAwContents.createMessageChannel(); |
try { |
@@ -572,7 +571,7 @@ public class PostMessageTest extends AwTestBase { |
channelContainer.set(channel); |
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
channelContainer.setMessage(message); |
} |
}, null); |
@@ -653,7 +652,7 @@ public class PostMessageTest extends AwTestBase { |
public void run() { |
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
channelContainer.setMessage(message); |
} |
}, null); |
@@ -683,7 +682,7 @@ public class PostMessageTest extends AwTestBase { |
MessagePort[] channel = mAwContents.createMessageChannel(); |
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
channelContainer.setMessage(message); |
} |
}, null); |
@@ -710,7 +709,7 @@ public class PostMessageTest extends AwTestBase { |
MessagePort[] channel = mAwContents.createMessageChannel(); |
channel[1].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
channelContainer.setMessage(message); |
} |
}, null); |
@@ -741,6 +740,58 @@ public class PostMessageTest extends AwTestBase { |
expectTitle("123"); |
} |
+ private static final String RECEIVE_JS_MESSAGE_CHANNEL_PAGE = |
+ "<!DOCTYPE html><html><body>" |
+ + " <script>" |
+ + " var received ='';" |
+ + " var mc = new MessageChannel();" |
+ + " mc.port1.onmessage = function (e) {" |
+ + " received += e.data;" |
+ + " document.title = received;" |
+ + " if (e.data == '2') { mc.port1.postMessage('3'); }" |
+ + " };" |
+ + " onmessage = function (e) {" |
+ + " var myPort = e.ports[0];" |
+ + " myPort.postMessage('from window', [mc.port2]);" |
hush (inactive)
2015/03/10 22:31:36
The other scenario (that does not work) is JS tryi
sgurun-gerrit only
2015/03/10 23:20:12
let's write a test in a separate CL.
|
+ + " }" |
+ + " </script>" |
+ + "</body></html>"; |
+ |
+ // Test webview can use a message port received from JS for full duplex communication. |
+ // Test steps: |
+ // 1. Java creates a message channel, and send one port to JS |
+ // 2. JS creates a new message channel and sends one port to Java using the channel in 1 |
+ // 3. Java sends a message using the new channel in 2. |
+ // 4. Js responds to this message using the channel in 2. |
+ // 5. Java responds to message in 4 using the channel in 2. |
+ @SmallTest |
+ @Feature({"AndroidWebView", "Android-PostMessage"}) |
+ public void testCanUseReceivedMessagePortFromJS() throws Throwable { |
+ loadPage(RECEIVE_JS_MESSAGE_CHANNEL_PAGE); |
+ runTestOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ MessagePort[] channel = mAwContents.createMessageChannel(); |
+ mAwContents.postMessageToFrame(null, "1", mWebServer.getBaseUrl(), |
+ new MessagePort[]{channel[1]}); |
+ channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
+ @Override |
+ public void onMessage(String message, final MessagePort[] p) { |
+ p[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
+ @Override |
+ public void onMessage(String message, MessagePort[] q) { |
+ assertEquals("3", message); |
+ p[0].postMessage("4", null); |
+ } |
+ }, null); |
+ p[0].postMessage("2", null); |
+ } |
+ }, null); |
+ } |
+ }); |
+ expectTitle("24"); |
+ } |
+ |
private static class TestMessagePort extends MessagePort { |
private boolean mReady; |
@@ -787,13 +838,13 @@ public class PostMessageTest extends AwTestBase { |
mPort.setWebEventHandler(webEventHandler, handler); |
} |
@Override |
- public void onMessage(String message) { |
- mPort.onMessage(message); |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
+ mPort.onMessage(message, sentPorts); |
} |
@Override |
- public void postMessage(String message, MessagePort[] msgPorts) throws |
+ public void postMessage(String message, MessagePort[] sentPorts) throws |
IllegalStateException { |
- mPort.postMessage(message, msgPorts); |
+ mPort.postMessage(message, sentPorts); |
} |
} |
@@ -918,7 +969,7 @@ public class PostMessageTest extends AwTestBase { |
channelContainer.set(channel); |
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
channelContainer.setMessage(message); |
} |
}, null); |
@@ -948,7 +999,7 @@ public class PostMessageTest extends AwTestBase { |
channelContainer.set(channel); |
channel[0].setWebEventHandler(new MessagePort.WebEventHandler() { |
@Override |
- public void onMessage(String message) { |
+ public void onMessage(String message, MessagePort[] sentPorts) { |
channelContainer.setMessage(message); |
} |
}, null); |