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_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_ 6 #define CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_ 7 8 #include "base/basictypes.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "content/public/renderer/renderer_ppapi_host.h" 11 #include "content/renderer/pepper/content_renderer_pepper_host_factory.h" 12 #include "ppapi/host/ppapi_host.h" 13 14 namespace IPC { 15 class Sender; 16 } 17 18 namespace ppapi { 19 20 namespace proxy { 21 class HostDispatcher; 22 } 23 24 namespace thunk { 25 class ResourceCreationAPI; 26 } 27 28 } // namespace ppapi 29 30 namespace content { 31 32 class PepperInProcessRouter; 33 class PepperPluginInstanceImpl; 34 class PluginModule; 35 36 // This class is attached to a PluginModule which manages our lifetime. 37 class RendererPpapiHostImpl : public RendererPpapiHost { 38 public: 39 virtual ~RendererPpapiHostImpl(); 40 41 // Factory functions to create in process or out-of-process host impls. The 42 // host will be created and associated with the given module, which must not 43 // already have embedder state on it. 44 // 45 // The module will take ownership of the new host impl. The returned value 46 // does not pass ownership, it's just for the information of the caller. 47 static RendererPpapiHostImpl* CreateOnModuleForOutOfProcess( 48 PluginModule* module, 49 ppapi::proxy::HostDispatcher* dispatcher, 50 const ppapi::PpapiPermissions& permissions); 51 static RendererPpapiHostImpl* CreateOnModuleForInProcess( 52 PluginModule* module, 53 const ppapi::PpapiPermissions& permissions); 54 55 // Returns the RendererPpapiHostImpl associated with the given PP_Instance, 56 // or NULL if the instance is invalid. 57 static RendererPpapiHostImpl* GetForPPInstance(PP_Instance pp_instance); 58 59 // Returns the router that we use for in-process IPC emulation (see the 60 // pepper_in_process_router.h for more). This will be NULL when the plugin 61 // is running out-of-process. 62 PepperInProcessRouter* in_process_router() { 63 return in_process_router_.get(); 64 } 65 66 // Creates the in-process resource creation API wrapper for the given 67 // plugin instance. This object will reference the host impl, so the 68 // host impl should outlive the returned pointer. Since the resource 69 // creation object is associated with the instance, this will generally 70 // happen automatically. 71 scoped_ptr<ppapi::thunk::ResourceCreationAPI> 72 CreateInProcessResourceCreationAPI(PepperPluginInstanceImpl* instance); 73 74 PepperPluginInstanceImpl* GetPluginInstanceImpl(PP_Instance instance) const; 75 76 bool IsExternalPluginHost() const; 77 78 // RendererPpapiHost implementation. 79 virtual ppapi::host::PpapiHost* GetPpapiHost() OVERRIDE; 80 virtual bool IsValidInstance(PP_Instance instance) const OVERRIDE; 81 virtual PepperPluginInstance* GetPluginInstance(PP_Instance instance) const 82 OVERRIDE; 83 virtual RenderFrame* GetRenderFrameForInstance(PP_Instance instance) const 84 OVERRIDE; 85 virtual RenderView* GetRenderViewForInstance(PP_Instance instance) const 86 OVERRIDE; 87 virtual blink::WebPluginContainer* GetContainerForInstance( 88 PP_Instance instance) const OVERRIDE; 89 virtual base::ProcessId GetPluginPID() const OVERRIDE; 90 virtual bool HasUserGesture(PP_Instance instance) const OVERRIDE; 91 virtual int GetRoutingIDForWidget(PP_Instance instance) const OVERRIDE; 92 virtual gfx::Point PluginPointToRenderFrame(PP_Instance instance, 93 const gfx::Point& pt) const 94 OVERRIDE; 95 virtual IPC::PlatformFileForTransit ShareHandleWithRemote( 96 base::PlatformFile handle, 97 bool should_close_source) OVERRIDE; 98 virtual bool IsRunningInProcess() const OVERRIDE; 99 virtual std::string GetPluginName() const OVERRIDE; 100 virtual void SetToExternalPluginHost() OVERRIDE; 101 virtual void CreateBrowserResourceHosts( 102 PP_Instance instance, 103 const std::vector<IPC::Message>& nested_msgs, 104 const base::Callback<void(const std::vector<int>&)>& callback) const 105 OVERRIDE; 106 virtual GURL GetDocumentURL(PP_Instance instance) const OVERRIDE; 107 108 private: 109 RendererPpapiHostImpl(PluginModule* module, 110 ppapi::proxy::HostDispatcher* dispatcher, 111 const ppapi::PpapiPermissions& permissions); 112 RendererPpapiHostImpl(PluginModule* module, 113 const ppapi::PpapiPermissions& permissions); 114 115 // Retrieves the plugin instance object associated with the given PP_Instance 116 // and validates that it is one of the instances associated with our module. 117 // Returns NULL on failure. 118 // 119 // We use this to security check the PP_Instance values sent from a plugin to 120 // make sure it's not trying to spoof another instance. 121 PepperPluginInstanceImpl* GetAndValidateInstance(PP_Instance instance) const; 122 123 PluginModule* module_; // Non-owning pointer. 124 125 // The dispatcher we use to send messagse when the plugin is out-of-process. 126 // Will be null when running in-process. Non-owning pointer. 127 ppapi::proxy::HostDispatcher* dispatcher_; 128 129 scoped_ptr<ppapi::host::PpapiHost> ppapi_host_; 130 131 // Null when running out-of-process. 132 scoped_ptr<PepperInProcessRouter> in_process_router_; 133 134 // Whether the plugin is running in process. 135 bool is_running_in_process_; 136 137 // Whether this is a host for external plugins. 138 bool is_external_plugin_host_; 139 140 DISALLOW_COPY_AND_ASSIGN(RendererPpapiHostImpl); 141 }; 142 143 } // namespace content 144 145 #endif // CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_ 146