browser_ppapi_host_impl.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
1a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang// Use of this source code is governed by a BSD-style license that can be
3a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com// found in the LICENSE file.
4a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
5a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_
6a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_
7a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
8a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include <map>
9c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include <string>
10c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones
11a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "base/basictypes.h"
12a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "base/compiler_specific.h"
13a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "base/files/file_path.h"
14a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "base/memory/ref_counted.h"
15a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "content/browser/renderer_host/pepper/content_browser_pepper_host_factory.h"
16a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "content/browser/renderer_host/pepper/ssl_context_helper.h"
17a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "content/common/content_export.h"
18a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "content/common/pepper_renderer_instance_data.h"
19a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "content/public/browser/browser_ppapi_host.h"
20a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "content/public/common/process_type.h"
21a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "ipc/ipc_channel_proxy.h"
22a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#include "ppapi/host/ppapi_host.h"
23a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
24a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.comnamespace content {
25ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang
26a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.comclass CONTENT_EXPORT BrowserPpapiHostImpl : public BrowserPpapiHost {
27a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com public:
28c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  // The creator is responsible for calling set_plugin_process_handle as soon
29a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // as it is known (we start the process asynchronously so it won't be known
30ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang  // when this object is created).
31a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // |external_plugin| signfies that this is a proxy created for an embedder's
32a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // plugin, i.e. using BrowserPpapiHost::CreateExternalPluginProcess.
33a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  BrowserPpapiHostImpl(
34a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com      IPC::Sender* sender,
35a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com      const ppapi::PpapiPermissions& permissions,
36c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang      const std::string& plugin_name,
37a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com      const base::FilePath& plugin_path,
38a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com      const base::FilePath& profile_data_directory,
39a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com      bool in_process,
40a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com      bool external_plugin);
41a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual ~BrowserPpapiHostImpl();
42a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
43c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  // BrowserPpapiHost.
44c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  virtual ppapi::host::PpapiHost* GetPpapiHost() OVERRIDE;
45a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual base::ProcessHandle GetPluginProcessHandle() const OVERRIDE;
46c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  virtual bool IsValidInstance(PP_Instance instance) const OVERRIDE;
47a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual bool GetRenderViewIDsForInstance(PP_Instance instance,
48a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com                                           int* render_process_id,
49a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com                                           int* render_view_id) const OVERRIDE;
50a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual const std::string& GetPluginName() OVERRIDE;
51a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual const base::FilePath& GetPluginPath() OVERRIDE;
52a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual const base::FilePath& GetProfileDataDirectory() OVERRIDE;
53a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual GURL GetDocumentURLForInstance(PP_Instance instance) OVERRIDE;
54a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  virtual GURL GetPluginURLForInstance(PP_Instance instance) OVERRIDE;
55a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
56a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  void set_plugin_process_handle(base::ProcessHandle handle) {
57c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    plugin_process_handle_ = handle;
58a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  }
59a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
60a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  bool in_process() const { return in_process_; }
61a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  bool external_plugin() const { return external_plugin_; }
62a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
63a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // These two functions are notifications that an instance has been created
64a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // or destroyed. They allow us to maintain a mapping of PP_Instance to data
65c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  // associated with the instance including view IDs in the browser process.
66a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  void AddInstance(PP_Instance instance,
67a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com                   const PepperRendererInstanceData& instance_data);
68a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  void DeleteInstance(PP_Instance instance);
69a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
708b400b1e8d84c5b93dd151807504a3e4b90d1b21apatrick@chromium.org  scoped_refptr<IPC::ChannelProxy::MessageFilter> message_filter() {
71a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com    return message_filter_;
72a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  }
73a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
74c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  const scoped_refptr<SSLContextHelper>& ssl_context_helper() const {
75a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com    return ssl_context_helper_;
76c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  }
77a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
78c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang private:
79c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  friend class BrowserPpapiHostTest;
80a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
81c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  // Implementing MessageFilter on BrowserPpapiHostImpl makes it ref-counted,
82a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // preventing us from returning these to embedders without holding a
83c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  // reference. To avoid that, define a message filter object.
84c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  class HostMessageFilter : public IPC::ChannelProxy::MessageFilter {
85c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang   public:
86a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com    explicit HostMessageFilter(ppapi::host::PpapiHost* ppapi_host)
87c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang        : ppapi_host_(ppapi_host) {}
88a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com    // IPC::ChannelProxy::MessageFilter.
89c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
90c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang
91c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    void OnHostDestroyed();
92a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
93a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com   private:
94c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    virtual ~HostMessageFilter() {}
95a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
96c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang    ppapi::host::PpapiHost* ppapi_host_;
97a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  };
98c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang
99a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  scoped_ptr<ppapi::host::PpapiHost> ppapi_host_;
100c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  base::ProcessHandle plugin_process_handle_;
101c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  std::string plugin_name_;
102c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  base::FilePath plugin_path_;
103a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  base::FilePath profile_data_directory_;
104c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang
105a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // If true, this refers to a plugin running in the renderer process.
106c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang  bool in_process_;
107c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang
108a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // If true, this is an external plugin, i.e. created by the embedder using
109a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // BrowserPpapiHost::CreateExternalPluginProcess.
110a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  bool external_plugin_;
111a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
112a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  scoped_refptr<SSLContextHelper> ssl_context_helper_;
113a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
114a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // Tracks all PP_Instances in this plugin and associated renderer-related
115a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  // data.
116a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  typedef std::map<PP_Instance, PepperRendererInstanceData> InstanceMap;
117a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  InstanceMap instance_map_;
118a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
119a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  scoped_refptr<HostMessageFilter> message_filter_;
120c9e69b1941522095a3878d9e1501511ab4722139Geoff Lang
121a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com  DISALLOW_COPY_AND_ASSIGN(BrowserPpapiHostImpl);
122a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com};
123a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
124a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com}  // namespace content
125a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com
126a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com#endif  // CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_
127a5e0d720d1570a9bfe71c8d0fc3308b8496a97a2daniel@transgaming.com