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