Index: android_webview/native/aw_contents.cc |
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc |
index eac46000a7d7738f2eca7d19275b246f43b530dd..2b07ff2171e6e1bda611af638c1556391c18824c 100644 |
--- a/android_webview/native/aw_contents.cc |
+++ b/android_webview/native/aw_contents.cc |
@@ -52,6 +52,7 @@ |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/cert_store.h" |
#include "content/public/browser/favicon_status.h" |
+#include "content/public/browser/message_port_provider.h" |
#include "content/public/browser/navigation_entry.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
@@ -131,6 +132,13 @@ void OnIoThreadClientReady(content::RenderFrameHost* rfh) { |
render_process_id, render_frame_id); |
} |
+void OnMessageChannelCreated(ScopedJavaGlobalRef<jobject>* callback, |
+ int* port1, int* port2) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ Java_AwContents_onMessageChannelCreated(env, *port1, *port2, |
+ callback->obj()); |
+} |
+ |
} // namespace |
// static |
@@ -1175,6 +1183,55 @@ void AwContents::TrimMemory(JNIEnv* env, |
browser_view_renderer_.TrimMemory(level, visible); |
} |
+// TODO(sgurun) add support for posting a frame whose name is known (only |
+// main frame is supported at this time, see crbug.com/389721) |
+void AwContents::PostMessageToFrame(JNIEnv* env, jobject obj, |
+ jstring frame_name, jstring message, jstring source_origin, |
+ jstring target_origin, jintArray msgPorts) { |
+ |
+ base::string16* j_source_origin = new base::string16; |
+ ConvertJavaStringToUTF16(env, source_origin, j_source_origin); |
+ base::string16* j_target_origin = new base::string16; |
+ ConvertJavaStringToUTF16(env, target_origin, j_target_origin); |
+ base::string16* j_message = new base::string16; |
+ ConvertJavaStringToUTF16(env, message, j_message); |
+ std::vector<int>* j_ports = new std::vector<int>; |
+ |
+ if (msgPorts != nullptr) |
+ base::android::JavaIntArrayToIntVector(env, msgPorts, j_ports); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&content::MessagePortProvider::PostMessageToFrame, |
+ web_contents_.get(), |
+ base::Owned(j_source_origin), |
+ base::Owned(j_target_origin), |
+ base::Owned(j_message), |
+ base::Owned(j_ports))); |
+} |
+ |
+void AwContents::CreateMessageChannel(JNIEnv* env, jobject obj, |
+ jobject callback) { |
+ ScopedJavaGlobalRef<jobject>* j_callback = new ScopedJavaGlobalRef<jobject>(); |
+ j_callback->Reset(env, callback); |
+ |
+ int* port1 = new int; |
+ int* port2 = new int; |
+ BrowserThread::PostTaskAndReply( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&content::MessagePortProvider::CreateMessageChannel, |
+ web_contents_.get(), |
+ port1, |
+ port2), |
+ base::Bind(&OnMessageChannelCreated, |
+ base::Owned(j_callback), |
+ base::Owned(port1), |
+ base::Owned(port2))); |
+} |
+ |
+ |
void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { |
g_should_download_favicons = true; |
} |