// 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_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_ #define CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_ #include #include #include "base/id_map.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "content/common/android/gin_java_bridge_errors.h" #include "content/public/renderer/render_frame_observer.h" namespace blink { class WebFrame; } namespace content { class GinJavaBridgeObject; // This class handles injecting Java objects into the main frame of a // RenderView. The 'add' and 'remove' messages received from the browser // process modify the entries in a map of 'pending' objects. These objects are // bound to the window object of the main frame when that window object is next // cleared. These objects remain bound until the window object is cleared // again. class GinJavaBridgeDispatcher : public base::SupportsWeakPtr, public RenderFrameObserver { public: // GinJavaBridgeObjects are managed by gin. An object gets destroyed // when it is no more referenced from JS. As GinJavaBridgeObject reports // deletion of self to GinJavaBridgeDispatcher, we would not have stale // pointers here. typedef IDMap ObjectMap; typedef ObjectMap::KeyType ObjectID; explicit GinJavaBridgeDispatcher(RenderFrame* render_frame); ~GinJavaBridgeDispatcher() override; // RenderFrameObserver override: bool OnMessageReceived(const IPC::Message& message) override; void DidClearWindowObject() override; void GetJavaMethods(ObjectID object_id, std::set* methods); bool HasJavaMethod(ObjectID object_id, const std::string& method_name); scoped_ptr InvokeJavaMethod(ObjectID object_id, const std::string& method_name, const base::ListValue& arguments, GinJavaBridgeError* error); GinJavaBridgeObject* GetObject(ObjectID object_id); void OnGinJavaBridgeObjectDeleted(GinJavaBridgeObject* object); private: void OnAddNamedObject(const std::string& name, ObjectID object_id); void OnRemoveNamedObject(const std::string& name); void OnSetAllowObjectContentsInspection(bool allow); typedef std::map NamedObjectMap; NamedObjectMap named_objects_; ObjectMap objects_; bool inside_did_clear_window_object_; DISALLOW_COPY_AND_ASSIGN(GinJavaBridgeDispatcher); }; } // namespace content #endif // CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_