diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-10 12:06:33 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-10 12:06:33 +0000 |
commit | 64ffefaba14b83143c1b159d61df170e72ed50f8 (patch) | |
tree | 517ba1206d2dafcc2a07434a5046fda5cabc308f /content/browser/renderer_host/java | |
parent | c9a1784876eaf8b9091079632fdb6890c4eaa2a4 (diff) | |
download | chromium_src-64ffefaba14b83143c1b159d61df170e72ed50f8.zip chromium_src-64ffefaba14b83143c1b159d61df170e72ed50f8.tar.gz chromium_src-64ffefaba14b83143c1b159d61df170e72ed50f8.tar.bz2 |
Re-land "Pass RenderFrameHost to WebContentObservers' message handlers"
This patch enables WebContentsObserver::OnMessageReceived to receive
a reference to RenderFrameHost that received the message.
This allows passing of JavaBridgeDispatcherHostManager ownership from
WebContentsImpl to ContentViewCore and removing of some redundant
initialization code in JavaBridgeDispatcherHostManager, fixing
a long-standing TODO.
This patch also includes a fix for "Search Google for this image"
discovered shorly after the original patch has been landed.
BUG=371296
TBR=jam@chromium.org,benm@chromium.org,yoz@chromium.org,bauerb@chromium.org,fsamuel@chromium.org
Review URL: https://codereview.chromium.org/275873002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269571 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/java')
3 files changed, 36 insertions, 41 deletions
diff --git a/content/browser/renderer_host/java/java_bridge_dispatcher_host.h b/content/browser/renderer_host/java/java_bridge_dispatcher_host.h index b62ea82..a656f07 100644 --- a/content/browser/renderer_host/java/java_bridge_dispatcher_host.h +++ b/content/browser/renderer_host/java/java_bridge_dispatcher_host.h @@ -49,13 +49,12 @@ class JavaBridgeDispatcherHost void RenderFrameDeleted(); void OnGetChannelHandle(IPC::Message* reply_msg); + void Send(IPC::Message* msg); private: friend class base::RefCountedThreadSafe<JavaBridgeDispatcherHost>; virtual ~JavaBridgeDispatcherHost(); - void Send(IPC::Message* msg); - void GetChannelHandle(IPC::Message* reply_msg); void CreateNPVariantParam(NPObject* object, NPVariant_Param* param); void CreateObjectStub(NPObject* object, int render_process_id, int route_id); diff --git a/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.cc b/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.cc index 8d587bd..635a1d1 100644 --- a/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.cc +++ b/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.cc @@ -13,6 +13,7 @@ #include "content/browser/renderer_host/java/java_bound_object.h" #include "content/browser/renderer_host/java/java_bridge_dispatcher_host.h" #include "content/common/android/hash_set.h" +#include "content/common/java_bridge_messages.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" #include "third_party/WebKit/public/web/WebBindings.h" @@ -20,9 +21,13 @@ namespace content { JavaBridgeDispatcherHostManager::JavaBridgeDispatcherHostManager( - WebContents* web_contents) + WebContents* web_contents, + jobject retained_object_set) : WebContentsObserver(web_contents), + retained_object_set_(base::android::AttachCurrentThread(), + retained_object_set), allow_object_contents_inspection_(true) { + DCHECK(retained_object_set); } JavaBridgeDispatcherHostManager::~JavaBridgeDispatcherHostManager() { @@ -48,27 +53,6 @@ void JavaBridgeDispatcherHostManager::AddNamedObject(const base::string16& name, } } -void JavaBridgeDispatcherHostManager::SetRetainedObjectSet( - const JavaObjectWeakGlobalRef& retained_object_set) { - // It's an error to replace the retained_object_set_ after it's been set, - // so we check that it hasn't already been here. - // TODO(benm): It'd be better to pass the set in the constructor to avoid - // the chance of this happening; but that's tricky as this get's constructed - // before ContentViewCore (which owns the set). Best solution may be to move - // ownership of the JavaBridgerDispatchHostManager from WebContents to - // ContentViewCore? - JNIEnv* env = base::android::AttachCurrentThread(); - base::android::ScopedJavaLocalRef<jobject> new_retained_object_set = - retained_object_set.get(env); - base::android::ScopedJavaLocalRef<jobject> current_retained_object_set = - retained_object_set_.get(env); - if (!env->IsSameObject(new_retained_object_set.obj(), - current_retained_object_set.obj())) { - DCHECK(current_retained_object_set.is_null()); - retained_object_set_ = retained_object_set; - } -} - void JavaBridgeDispatcherHostManager::RemoveNamedObject( const base::string16& name) { ObjectMap::iterator iter = objects_.find(name); @@ -85,11 +69,6 @@ void JavaBridgeDispatcherHostManager::RemoveNamedObject( } } -void JavaBridgeDispatcherHostManager::OnGetChannelHandle( - RenderFrameHost* render_frame_host, IPC::Message* reply_msg) { - instances_[render_frame_host]->OnGetChannelHandle(reply_msg); -} - void JavaBridgeDispatcherHostManager::RenderFrameCreated( RenderFrameHost* render_frame_host) { // Creates a JavaBridgeDispatcherHost for the specified RenderViewHost and @@ -132,6 +111,25 @@ void JavaBridgeDispatcherHostManager::DocumentAvailableInMainFrame() { } } +bool JavaBridgeDispatcherHostManager::OnMessageReceived( + const IPC::Message& message, + RenderFrameHost* render_frame_host) { + DCHECK(render_frame_host); + if (!instances_.count(render_frame_host)) + return false; + scoped_refptr<JavaBridgeDispatcherHost> instance = + instances_[render_frame_host]; + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(JavaBridgeDispatcherHostManager, message) + IPC_MESSAGE_FORWARD_DELAY_REPLY( + JavaBridgeHostMsg_GetChannelHandle, + instance.get(), + JavaBridgeDispatcherHost::OnGetChannelHandle) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + void JavaBridgeDispatcherHostManager::JavaBoundObjectCreated( const base::android::JavaRef<jobject>& object) { DCHECK_CURRENTLY_ON(BrowserThread::UI); diff --git a/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h b/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h index 3ada0d0..8d03576 100644 --- a/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h +++ b/content/browser/renderer_host/java/java_bridge_dispatcher_host_manager.h @@ -28,7 +28,8 @@ class JavaBridgeDispatcherHostManager : public WebContentsObserver, public base::SupportsWeakPtr<JavaBridgeDispatcherHostManager> { public: - explicit JavaBridgeDispatcherHostManager(WebContents* web_contents); + JavaBridgeDispatcherHostManager(WebContents* web_contents, + jobject retained_object_set); virtual ~JavaBridgeDispatcherHostManager(); // These methods add or remove the object to each JavaBridgeDispatcherHost. @@ -37,21 +38,12 @@ class JavaBridgeDispatcherHostManager void AddNamedObject(const base::string16& name, NPObject* object); void RemoveNamedObject(const base::string16& name); - void OnGetChannelHandle(RenderFrameHost* render_frame_host, - IPC::Message* reply_msg); - - // Every time a JavaBoundObject backed by a real Java object is - // created/destroyed, we insert/remove a strong ref to that Java object into - // this set so that it doesn't get garbage collected while it's still - // potentially in use. Although the set is managed native side, it's owned - // and defined in Java so that pushing refs into it does not create new GC - // roots that would prevent ContentViewCore from being garbage collected. - void SetRetainedObjectSet(const JavaObjectWeakGlobalRef& retained_object_set); - // WebContentsObserver overrides virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) OVERRIDE; virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) OVERRIDE; virtual void DocumentAvailableInMainFrame() OVERRIDE; + virtual bool OnMessageReceived(const IPC::Message& message, + RenderFrameHost* render_frame_host) OVERRIDE; void JavaBoundObjectCreated(const base::android::JavaRef<jobject>& object); void JavaBoundObjectDestroyed(const base::android::JavaRef<jobject>& object); @@ -67,6 +59,12 @@ class JavaBridgeDispatcherHostManager InstanceMap instances_; typedef std::map<base::string16, NPObject*> ObjectMap; ObjectMap objects_; + // Every time a JavaBoundObject backed by a real Java object is + // created/destroyed, we insert/remove a strong ref to that Java object into + // this set so that it doesn't get garbage collected while it's still + // potentially in use. Although the set is managed native side, it's owned + // and defined in Java so that pushing refs into it does not create new GC + // roots that would prevent ContentViewCore from being garbage collected. JavaObjectWeakGlobalRef retained_object_set_; bool allow_object_contents_inspection_; |