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
18namespace blink {
19class WebFrame;
20}
21
22namespace content {
23
24class 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.
32class 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