• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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