diff options
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( |