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