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 "base/memory/weak_ptr.h" 16 #include "content/browser/renderer_host/pepper/content_browser_pepper_host_factory.h" 17 #include "content/browser/renderer_host/pepper/ssl_context_helper.h" 18 #include "content/common/content_export.h" 19 #include "content/common/pepper_renderer_instance_data.h" 20 #include "content/public/browser/browser_ppapi_host.h" 21 #include "content/public/common/process_type.h" 22 #include "ipc/message_filter.h" 23 #include "ppapi/host/ppapi_host.h" 24 25 namespace content { 26 27 class CONTENT_EXPORT BrowserPpapiHostImpl : public BrowserPpapiHost { 28 public: 29 // The creator is responsible for calling set_plugin_process_handle as soon 30 // as it is known (we start the process asynchronously so it won't be known 31 // when this object is created). 32 // |external_plugin| signfies that this is a proxy created for an embedder's 33 // plugin, i.e. using BrowserPpapiHost::CreateExternalPluginProcess. 34 BrowserPpapiHostImpl(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 GetRenderFrameIDsForInstance(PP_Instance instance, 48 int* render_process_id, 49 int* render_frame_id) const 50 OVERRIDE; 51 virtual const std::string& GetPluginName() OVERRIDE; 52 virtual const base::FilePath& GetPluginPath() OVERRIDE; 53 virtual const base::FilePath& GetProfileDataDirectory() OVERRIDE; 54 virtual GURL GetDocumentURLForInstance(PP_Instance instance) OVERRIDE; 55 virtual GURL GetPluginURLForInstance(PP_Instance instance) OVERRIDE; 56 virtual void SetOnKeepaliveCallback( 57 const BrowserPpapiHost::OnKeepaliveCallback& callback) OVERRIDE; 58 59 void set_plugin_process_handle(base::ProcessHandle handle) { 60 plugin_process_handle_ = handle; 61 } 62 63 bool external_plugin() const { return external_plugin_; } 64 65 // These two functions are notifications that an instance has been created 66 // or destroyed. They allow us to maintain a mapping of PP_Instance to data 67 // associated with the instance including view IDs in the browser process. 68 void AddInstance(PP_Instance instance, 69 const PepperRendererInstanceData& instance_data); 70 void DeleteInstance(PP_Instance instance); 71 72 scoped_refptr<IPC::MessageFilter> message_filter() { 73 return message_filter_; 74 } 75 76 const scoped_refptr<SSLContextHelper>& ssl_context_helper() const { 77 return ssl_context_helper_; 78 } 79 80 private: 81 friend class BrowserPpapiHostTest; 82 83 // Implementing MessageFilter on BrowserPpapiHostImpl makes it ref-counted, 84 // preventing us from returning these to embedders without holding a 85 // reference. To avoid that, define a message filter object. 86 class HostMessageFilter : public IPC::MessageFilter { 87 public: 88 HostMessageFilter(ppapi::host::PpapiHost* ppapi_host, 89 BrowserPpapiHostImpl* browser_ppapi_host_impl); 90 91 // IPC::MessageFilter. 92 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 93 94 void OnHostDestroyed(); 95 96 private: 97 virtual ~HostMessageFilter(); 98 99 void OnKeepalive(); 100 void OnHostMsgLogInterfaceUsage(int hash) const; 101 102 // Non owning pointers cleared in OnHostDestroyed() 103 ppapi::host::PpapiHost* ppapi_host_; 104 BrowserPpapiHostImpl* browser_ppapi_host_impl_; 105 }; 106 107 // Reports plugin activity to the callback set with SetOnKeepaliveCallback. 108 void OnKeepalive(); 109 110 scoped_ptr<ppapi::host::PpapiHost> ppapi_host_; 111 base::ProcessHandle plugin_process_handle_; 112 std::string plugin_name_; 113 base::FilePath plugin_path_; 114 base::FilePath profile_data_directory_; 115 116 // If true, this refers to a plugin running in the renderer process. 117 bool in_process_; 118 119 // If true, this is an external plugin, i.e. created by the embedder using 120 // BrowserPpapiHost::CreateExternalPluginProcess. 121 bool external_plugin_; 122 123 scoped_refptr<SSLContextHelper> ssl_context_helper_; 124 125 // Tracks all PP_Instances in this plugin and associated renderer-related 126 // data. 127 typedef std::map<PP_Instance, PepperRendererInstanceData> InstanceMap; 128 InstanceMap instance_map_; 129 130 scoped_refptr<HostMessageFilter> message_filter_; 131 132 BrowserPpapiHost::OnKeepaliveCallback on_keepalive_callback_; 133 134 DISALLOW_COPY_AND_ASSIGN(BrowserPpapiHostImpl); 135 }; 136 137 } // namespace content 138 139 #endif // CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_ 140