Index: content/browser/renderer_host/java/gin_java_bridge_dispatcher_host.h |
diff --git a/content/browser/renderer_host/java/gin_java_bridge_dispatcher_host.h b/content/browser/renderer_host/java/gin_java_bridge_dispatcher_host.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d77da3aacdc569fbb6d50ac81285d08013d928c9 |
--- /dev/null |
+++ b/content/browser/renderer_host/java/gin_java_bridge_dispatcher_host.h |
@@ -0,0 +1,123 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_BROWSER_RENDERER_HOST_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_HOST_H_ |
+#define CONTENT_BROWSER_RENDERER_HOST_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_HOST_H_ |
+ |
+#include <map> |
+#include <set> |
+ |
+#include "base/android/jni_weak_ref.h" |
+#include "base/android/scoped_java_ref.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/weak_ptr.h" |
+#include "content/browser/renderer_host/java/gin_java_bound_object.h" |
+#include "content/browser/renderer_host/java/gin_java_method_invocation_helper.h" |
+#include "content/public/browser/web_contents_observer.h" |
+ |
+namespace base { |
+class ListValue; |
+} |
+ |
+namespace IPC { |
+class Message; |
+} |
+ |
+namespace content { |
+ |
+// This class handles injecting Java objects into a single RenderView. The Java |
+// object itself lives in the browser process on a background thread, while a |
+// proxy object is created in the renderer. An instance of this class exists |
+// for each RenderFrameHost. |
+class GinJavaBridgeDispatcherHost |
+ : public base::SupportsWeakPtr<GinJavaBridgeDispatcherHost>, |
+ public WebContentsObserver, |
+ public GinJavaMethodInvocationHelper::DispatcherDelegate { |
+ public: |
+ |
+ GinJavaBridgeDispatcherHost(WebContents* web_contents, |
+ jobject retained_object_set); |
+ virtual ~GinJavaBridgeDispatcherHost(); |
+ |
+ void AddNamedObject( |
+ const std::string& name, |
+ const base::android::JavaRef<jobject>& object, |
+ const base::android::JavaRef<jclass>& safe_annotation_clazz); |
+ void RemoveNamedObject(const std::string& name); |
+ void SetAllowObjectContentsInspection(bool allow); |
+ |
+ // WebContentsObserver |
+ 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; |
+ |
+ // GinJavaMethodInvocationHelper::DispatcherDelegate |
+ virtual JavaObjectWeakGlobalRef GetObjectWeakRef( |
+ GinJavaBoundObject::ObjectID object_id) OVERRIDE; |
+ |
+ void OnGetMethods(RenderFrameHost* render_frame_host, |
+ GinJavaBoundObject::ObjectID object_id, |
+ IPC::Message* reply_msg); |
+ void OnHasMethod(RenderFrameHost* render_frame_host, |
+ GinJavaBoundObject::ObjectID object_id, |
+ const std::string& method_name, |
+ IPC::Message* reply_msg); |
+ void OnInvokeMethod(RenderFrameHost* render_frame_host, |
+ GinJavaBoundObject::ObjectID object_id, |
+ const std::string& method_name, |
+ const base::ListValue& arguments, |
+ IPC::Message* reply_msg); |
+ |
+ private: |
+ typedef std::set<RenderFrameHost*> RendererSet; |
+ void OnObjectWrapperDeleted(RenderFrameHost* render_frame_host, |
+ GinJavaBoundObject::ObjectID object_id); |
+ |
+ void SendReply(RenderFrameHost* render_frame_host, IPC::Message* reply_msg); |
+ void SendMethods(RenderFrameHost* render_frame_host, |
+ IPC::Message* reply_msg, |
+ const std::set<std::string>& method_names); |
+ void SendHasMethodReply(RenderFrameHost* render_frame_host, |
+ IPC::Message* reply_msg, |
+ bool result); |
+ void ProcessMethodInvocationResult( |
+ RenderFrameHost* render_frame_host, |
+ IPC::Message* reply_msg, |
+ scoped_refptr<GinJavaMethodInvocationHelper> result); |
+ void ProcessMethodInvocationObjectResult( |
+ RenderFrameHost* render_frame_host, |
+ IPC::Message* reply_msg, |
+ scoped_refptr<GinJavaMethodInvocationHelper> result); |
+ GinJavaBoundObject::ObjectID AddObject( |
+ const base::android::JavaRef<jobject>& object, |
+ const base::android::JavaRef<jclass>& safe_annotation_clazz, |
+ bool is_named, |
+ RenderFrameHost* holder); |
+ bool FindObjectId(const base::android::JavaRef<jobject>& object, |
+ GinJavaBoundObject::ObjectID* object_id); |
+ void RemoveHolder(RenderFrameHost* holder, |
+ const GinJavaBoundObject::ObjectMap::iterator& from, |
+ size_t count); |
+ |
+ // Every time a GinJavaBoundObject 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_; |
+ RendererSet renderers_; |
+ GinJavaBoundObject::ObjectMap objects_; |
+ typedef std::map<std::string, GinJavaBoundObject::ObjectID> NamedObjectMap; |
+ NamedObjectMap named_objects_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GinJavaBridgeDispatcherHost); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_RENDERER_HOST_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_HOST_H_ |