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_BROWSER_ANDROID_JAVA_JAVA_BRIDGE_DISPATCHER_HOST_H_
6#define CONTENT_BROWSER_ANDROID_JAVA_JAVA_BRIDGE_DISPATCHER_HOST_H_
7
8#include <vector>
9#include "base/memory/ref_counted.h"
10#include "base/memory/weak_ptr.h"
11#include "base/strings/string16.h"
12#include "content/child/npapi/npobject_stub.h"
13
14class RouteIDGenerator;
15struct NPObject;
16
17namespace IPC {
18class Message;
19}
20
21namespace content {
22class NPChannelBase;
23class RenderFrameHost;
24struct NPVariant_Param;
25
26// This class handles injecting Java objects into a single RenderFrame. The Java
27// object itself lives in the browser process on a background thread, while a
28// proxy object is created in the renderer. An instance of this class exists
29// for each RenderViewHost.
30class JavaBridgeDispatcherHost
31    : public base::RefCountedThreadSafe<JavaBridgeDispatcherHost> {
32 public:
33  // We hold a weak pointer to the RenderFrameHost. It must outlive this object.
34  explicit JavaBridgeDispatcherHost(RenderFrameHost* render_frame_host);
35
36  // Injects |object| into the main frame of the corresponding RenderView. A
37  // proxy object is created in the renderer and when the main frame's window
38  // object is next cleared, this proxy object is bound to the window object
39  // using |name|. The proxy object remains bound until the next time the
40  // window object is cleared after a call to RemoveNamedObject() or
41  // AddNamedObject() with the same name. The proxy object proxies calls back
42  // to |object|, which is manipulated on the background thread. This class
43  // holds a reference to |object| for the time that the proxy object is bound
44  // to the window object.
45  void AddNamedObject(const base::string16& name, NPObject* object);
46  void RemoveNamedObject(const base::string16& name);
47
48  // Since this object is ref-counted, it might outlive render_frame_host.
49  void RenderFrameDeleted();
50
51  void OnGetChannelHandle(IPC::Message* reply_msg);
52  void Send(IPC::Message* msg);
53
54 private:
55  friend class base::RefCountedThreadSafe<JavaBridgeDispatcherHost>;
56  virtual ~JavaBridgeDispatcherHost();
57
58  void GetChannelHandle(IPC::Message* reply_msg);
59  void CreateNPVariantParam(NPObject* object, NPVariant_Param* param);
60  void CreateObjectStub(NPObject* object, int render_process_id, int route_id);
61
62  scoped_refptr<NPChannelBase> channel_;
63  RenderFrameHost* render_frame_host_;
64  std::vector<base::WeakPtr<NPObjectStub> > stubs_;
65
66  DISALLOW_COPY_AND_ASSIGN(JavaBridgeDispatcherHost);
67};
68
69}  // namespace content
70
71#endif  // CONTENT_BROWSER_ANDROID_JAVA_JAVA_BRIDGE_DISPATCHER_HOST_H_
72