Home | History | Annotate | Download | only in java
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_
      6 #define CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_
      7 
      8 #include <map>
      9 #include <set>
     10 
     11 #include "base/id_map.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/values.h"
     15 #include "content/common/android/gin_java_bridge_errors.h"
     16 #include "content/public/renderer/render_frame_observer.h"
     17 
     18 namespace blink {
     19 class WebFrame;
     20 }
     21 
     22 namespace content {
     23 
     24 class GinJavaBridgeObject;
     25 
     26 // This class handles injecting Java objects into the main frame of a
     27 // RenderView. The 'add' and 'remove' messages received from the browser
     28 // process modify the entries in a map of 'pending' objects. These objects are
     29 // bound to the window object of the main frame when that window object is next
     30 // cleared. These objects remain bound until the window object is cleared
     31 // again.
     32 class GinJavaBridgeDispatcher
     33     : public base::SupportsWeakPtr<GinJavaBridgeDispatcher>,
     34       public RenderFrameObserver {
     35  public:
     36   // GinJavaBridgeObjects are managed by gin. An object gets destroyed
     37   // when it is no more referenced from JS. As GinJavaBridgeObject reports
     38   // deletion of self to GinJavaBridgeDispatcher, we would not have stale
     39   // pointers here.
     40   typedef IDMap<GinJavaBridgeObject, IDMapExternalPointer> ObjectMap;
     41   typedef ObjectMap::KeyType ObjectID;
     42 
     43   explicit GinJavaBridgeDispatcher(RenderFrame* render_frame);
     44   virtual ~GinJavaBridgeDispatcher();
     45 
     46   // RenderFrameObserver override:
     47   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     48   virtual void DidClearWindowObject() OVERRIDE;
     49 
     50   void GetJavaMethods(ObjectID object_id, std::set<std::string>* methods);
     51   bool HasJavaMethod(ObjectID object_id, const std::string& method_name);
     52   scoped_ptr<base::Value> InvokeJavaMethod(ObjectID object_id,
     53                                            const std::string& method_name,
     54                                            const base::ListValue& arguments,
     55                                            GinJavaBridgeError* error);
     56   GinJavaBridgeObject* GetObject(ObjectID object_id);
     57   void OnGinJavaBridgeObjectDeleted(ObjectID object_id);
     58 
     59  private:
     60   void OnAddNamedObject(const std::string& name,
     61                         ObjectID object_id);
     62   void OnRemoveNamedObject(const std::string& name);
     63   void OnSetAllowObjectContentsInspection(bool allow);
     64 
     65   typedef std::map<std::string, ObjectID> NamedObjectMap;
     66   NamedObjectMap named_objects_;
     67   ObjectMap objects_;
     68   bool inside_did_clear_window_object_;
     69 
     70   DISALLOW_COPY_AND_ASSIGN(GinJavaBridgeDispatcher);
     71 };
     72 
     73 }  // namespace content
     74 
     75 #endif  // CONTENT_RENDERER_JAVA_GIN_JAVA_BRIDGE_DISPATCHER_H_
     76