browser_ppapi_host_impl.h revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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 24namespace content { 25 26class 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 external_plugin); 40 virtual ~BrowserPpapiHostImpl(); 41 42 // BrowserPpapiHost. 43 virtual ppapi::host::PpapiHost* GetPpapiHost() OVERRIDE; 44 virtual base::ProcessHandle GetPluginProcessHandle() const OVERRIDE; 45 virtual bool IsValidInstance(PP_Instance instance) const OVERRIDE; 46 virtual bool GetRenderViewIDsForInstance(PP_Instance instance, 47 int* render_process_id, 48 int* render_view_id) const OVERRIDE; 49 virtual const std::string& GetPluginName() OVERRIDE; 50 virtual const base::FilePath& GetPluginPath() OVERRIDE; 51 virtual const base::FilePath& GetProfileDataDirectory() OVERRIDE; 52 virtual GURL GetDocumentURLForInstance(PP_Instance instance) OVERRIDE; 53 virtual GURL GetPluginURLForInstance(PP_Instance instance) OVERRIDE; 54 55 void set_plugin_process_handle(base::ProcessHandle handle) { 56 plugin_process_handle_ = handle; 57 } 58 59 bool external_plugin() { return external_plugin_; } 60 61 // These two functions are notifications that an instance has been created 62 // or destroyed. They allow us to maintain a mapping of PP_Instance to data 63 // associated with the instance including view IDs in the browser process. 64 void AddInstance(PP_Instance instance, 65 const PepperRendererInstanceData& instance_data); 66 void DeleteInstance(PP_Instance instance); 67 68 scoped_refptr<IPC::ChannelProxy::MessageFilter> message_filter() { 69 return message_filter_; 70 } 71 72 const scoped_refptr<SSLContextHelper>& ssl_context_helper() const { 73 return ssl_context_helper_; 74 } 75 76 private: 77 friend class BrowserPpapiHostTest; 78 79 // Implementing MessageFilter on BrowserPpapiHostImpl makes it ref-counted, 80 // preventing us from returning these to embedders without holding a 81 // reference. To avoid that, define a message filter object. 82 class HostMessageFilter : public IPC::ChannelProxy::MessageFilter { 83 public: 84 explicit HostMessageFilter(ppapi::host::PpapiHost* ppapi_host) 85 : ppapi_host_(ppapi_host) {} 86 // IPC::ChannelProxy::MessageFilter. 87 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 88 89 void OnHostDestroyed(); 90 91 private: 92 virtual ~HostMessageFilter() {} 93 94 ppapi::host::PpapiHost* ppapi_host_; 95 }; 96 97 scoped_ptr<ppapi::host::PpapiHost> ppapi_host_; 98 base::ProcessHandle plugin_process_handle_; 99 std::string plugin_name_; 100 base::FilePath plugin_path_; 101 base::FilePath profile_data_directory_; 102 103 // If true, this is an external plugin, i.e. created by the embedder using 104 // BrowserPpapiHost::CreateExternalPluginProcess. 105 bool external_plugin_; 106 107 scoped_refptr<SSLContextHelper> ssl_context_helper_; 108 109 // Tracks all PP_Instances in this plugin and associated renderer-related 110 // data. 111 typedef std::map<PP_Instance, PepperRendererInstanceData> InstanceMap; 112 InstanceMap instance_map_; 113 114 scoped_refptr<HostMessageFilter> message_filter_; 115 116 DISALLOW_COPY_AND_ASSIGN(BrowserPpapiHostImpl); 117}; 118 119} // namespace content 120 121#endif // CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_ 122