summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java41
-rw-r--r--android_webview/native/aw_message_port_service_impl.cc11
-rw-r--r--android_webview/renderer/aw_message_port_client.cc10
3 files changed, 54 insertions, 8 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 869b8ba..51dd29c 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
@@ -960,4 +960,45 @@ public class PostMessageTest extends AwTestBase {
channelContainer.waitForMessage();
assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
}
+
+ private static final String TEST_PAGE_FOR_UNSUPPORTED_MESSAGES = "<!DOCTYPE html><html><body>"
+ + " <script type=\"text/javascript\">"
+ + " onmessage = function (e) {"
+ + " if (e.ports != null && e.ports.length > 0) {"
+ + " e.ports[0].postMessage();"
+ + " e.ports[0].postMessage(null);"
+ + " e.ports[0].postMessage(undefined);"
+ + " e.ports[0].postMessage(NaN);"
+ + " e.ports[0].postMessage(0);"
+ + " e.ports[0].postMessage(new Set());"
+ + " e.ports[0].postMessage({});"
+ + " e.ports[0].postMessage(\"" + JS_MESSAGE + "\");"
+ + " }"
+ + " }"
+ + " </script>"
+ + "</body></html>";
+
+ @SmallTest
+ @Feature({"AndroidWebView", "Android-PostMessage"})
+ public void testPostUnsupportedWebMessageToApp() throws Throwable {
+ loadPage(TEST_PAGE_FOR_UNSUPPORTED_MESSAGES);
+ final ChannelContainer channelContainer = new ChannelContainer();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ MessagePort[] channel = mAwContents.createMessageChannel();
+ channelContainer.set(channel);
+ channel[0].setWebEventHandler(new MessagePort.WebEventHandler() {
+ @Override
+ public void onMessage(String message) {
+ channelContainer.setMessage(message);
+ }
+ }, null);
+ mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(),
+ new MessagePort[] {channel[1]});
+ }
+ });
+ channelContainer.waitForMessage();
+ assertEquals(JS_MESSAGE, channelContainer.getMessage());
+ }
}
diff --git a/android_webview/native/aw_message_port_service_impl.cc b/android_webview/native/aw_message_port_service_impl.cc
index 0caf92c..fcad275 100644
--- a/android_webview/native/aw_message_port_service_impl.cc
+++ b/android_webview/native/aw_message_port_service_impl.cc
@@ -84,17 +84,18 @@ void AwMessagePortServiceImpl::OnConvertedWebToAppMessage(
if (jobj.is_null())
return;
- if (message.GetSize() != 1) {
- NOTREACHED();
- return;
- }
-
base::string16 value;
if (!message.GetString(0, &value)) {
LOG(WARNING) << "Converting post message to a string failed for port "
<< message_port_id;
return;
}
+
+ if (message.GetSize() != 1) {
+ NOTREACHED();
+ return;
+ }
+
ScopedJavaLocalRef<jstring> jmsg = ConvertUTF16ToJavaString(env, value);
ScopedJavaLocalRef<jintArray> jports =
ToJavaIntArray(env, sent_message_port_ids);
diff --git a/android_webview/renderer/aw_message_port_client.cc b/android_webview/renderer/aw_message_port_client.cc
index 54edf28..1493db6e 100644
--- a/android_webview/renderer/aw_message_port_client.cc
+++ b/android_webview/renderer/aw_message_port_client.cc
@@ -62,10 +62,14 @@ void AwMessagePortClient::OnWebToAppMessage(
converter->SetDateAllowed(true);
converter->SetRegExpAllowed(true);
base::ListValue result;
- result.Append(converter->FromV8Value(v8value, context));
+ base::Value* value = converter->FromV8Value(v8value, context);
+ if (value) {
+ result.Append(value);
+ }
+
Send(new AwMessagePortHostMsg_ConvertedWebToAppMessage(
- render_frame()->GetRoutingID(), message_port_id,
- result, sent_message_port_ids));
+ render_frame()->GetRoutingID(), message_port_id, result,
+ sent_message_port_ids));
}
void AwMessagePortClient::OnAppToWebMessage(