| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_ | 
 | #define CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "content/common/content_export.h" | 
 | #include "content/public/renderer/renderer_ppapi_host.h" | 
 | #include "content/renderer/pepper/content_renderer_pepper_host_factory.h" | 
 | #include "ppapi/host/ppapi_host.h" | 
 |  | 
 | namespace ppapi { | 
 |  | 
 | namespace proxy { | 
 | class HostDispatcher; | 
 | } | 
 |  | 
 | namespace thunk { | 
 | class ResourceCreationAPI; | 
 | } | 
 |  | 
 | }  // namespace ppapi | 
 |  | 
 | namespace content { | 
 |  | 
 | class PepperInProcessRouter; | 
 | class PepperPluginInstanceImpl; | 
 | class PluginModule; | 
 |  | 
 | // This class is attached to a PluginModule which manages our lifetime. | 
 | class RendererPpapiHostImpl : public RendererPpapiHost { | 
 |  public: | 
 |   RendererPpapiHostImpl(const RendererPpapiHostImpl&) = delete; | 
 |   RendererPpapiHostImpl& operator=(const RendererPpapiHostImpl&) = delete; | 
 |  | 
 |   ~RendererPpapiHostImpl() override; | 
 |  | 
 |   // Factory functions to create in process or out-of-process host impls. The | 
 |   // host will be created and associated with the given module, which must not | 
 |   // already have embedder state on it. | 
 |   // | 
 |   // The module will take ownership of the new host impl. The returned value | 
 |   // does not pass ownership, it's just for the information of the caller. | 
 |   static RendererPpapiHostImpl* CreateOnModuleForOutOfProcess( | 
 |       PluginModule* module, | 
 |       ppapi::proxy::HostDispatcher* dispatcher, | 
 |       const ppapi::PpapiPermissions& permissions); | 
 |   CONTENT_EXPORT static RendererPpapiHostImpl* CreateOnModuleForInProcess( | 
 |       PluginModule* module, | 
 |       const ppapi::PpapiPermissions& permissions); | 
 |  | 
 |   // Returns the RendererPpapiHostImpl associated with the given PP_Instance, | 
 |   // or NULL if the instance is invalid. | 
 |   static RendererPpapiHostImpl* GetForPPInstance(PP_Instance pp_instance); | 
 |  | 
 |   // Returns the router that we use for in-process IPC emulation (see the | 
 |   // pepper_in_process_router.h for more). This will be NULL when the plugin | 
 |   // is running out-of-process. | 
 |   PepperInProcessRouter* in_process_router() { | 
 |     return in_process_router_.get(); | 
 |   } | 
 |  | 
 |   // Creates the in-process resource creation API wrapper for the given | 
 |   // plugin instance. This object will reference the host impl, so the | 
 |   // host impl should outlive the returned pointer. Since the resource | 
 |   // creation object is associated with the instance, this will generally | 
 |   // happen automatically. | 
 |   std::unique_ptr<ppapi::thunk::ResourceCreationAPI> | 
 |   CreateInProcessResourceCreationAPI(PepperPluginInstanceImpl* instance); | 
 |  | 
 |   PepperPluginInstanceImpl* GetPluginInstanceImpl(PP_Instance instance) const; | 
 |  | 
 |   bool IsExternalPluginHost() const; | 
 |  | 
 |   // RendererPpapiHost implementation. | 
 |   ppapi::host::PpapiHost* GetPpapiHost() override; | 
 |   bool IsValidInstance(PP_Instance instance) override; | 
 |   PepperPluginInstance* GetPluginInstance(PP_Instance instance) override; | 
 |   RenderFrame* GetRenderFrameForInstance(PP_Instance instance) override; | 
 |   blink::WebPluginContainer* GetContainerForInstance( | 
 |       PP_Instance instance) override; | 
 |   bool HasUserGesture(PP_Instance instance) override; | 
 |   int GetRoutingIDForFrame(PP_Instance instance) override; | 
 |   gfx::Point PluginPointToRenderFrame(PP_Instance instance, | 
 |                                       const gfx::Point& pt) override; | 
 |   IPC::PlatformFileForTransit ShareHandleWithRemote( | 
 |       base::PlatformFile handle, | 
 |       bool should_close_source) override; | 
 |   base::UnsafeSharedMemoryRegion ShareUnsafeSharedMemoryRegionWithRemote( | 
 |       const base::UnsafeSharedMemoryRegion& region) override; | 
 |   base::ReadOnlySharedMemoryRegion ShareReadOnlySharedMemoryRegionWithRemote( | 
 |       const base::ReadOnlySharedMemoryRegion& region) override; | 
 |   bool IsRunningInProcess() override; | 
 |   std::string GetPluginName() override; | 
 |   void SetToExternalPluginHost() override; | 
 |   void CreateBrowserResourceHosts( | 
 |       PP_Instance instance, | 
 |       const std::vector<IPC::Message>& nested_msgs, | 
 |       base::OnceCallback<void(const std::vector<int>&)> callback) override; | 
 |   GURL GetDocumentURL(PP_Instance pp_instance) override; | 
 |  | 
 |   // Returns whether the plugin is running in a secure context. | 
 |   bool IsSecureContext(PP_Instance pp_instance) const; | 
 |  | 
 |   // Returns the plugin child process ID if the plugin is running out of | 
 |   // process. Returns -1 otherwise. This is the ID that the browser process uses | 
 |   // to idetify the child process for the plugin. This isn't directly useful | 
 |   // from our process (the renderer) except in messages to the browser to | 
 |   // disambiguate plugins. | 
 |   int GetPluginChildId() const; | 
 |  | 
 |   void set_viewport_to_dip_scale(float viewport_to_dip_scale) { | 
 |     DCHECK_LT(0, viewport_to_dip_scale_); | 
 |     viewport_to_dip_scale_ = viewport_to_dip_scale; | 
 |   } | 
 |  | 
 |  private: | 
 |   RendererPpapiHostImpl(PluginModule* module, | 
 |                         ppapi::proxy::HostDispatcher* dispatcher, | 
 |                         const ppapi::PpapiPermissions& permissions); | 
 |   RendererPpapiHostImpl(PluginModule* module, | 
 |                         const ppapi::PpapiPermissions& permissions); | 
 |  | 
 |   // Retrieves the plugin instance object associated with the given PP_Instance | 
 |   // and validates that it is one of the instances associated with our module. | 
 |   // Returns NULL on failure. | 
 |   // | 
 |   // We use this to security check the PP_Instance values sent from a plugin to | 
 |   // make sure it's not trying to spoof another instance. | 
 |   PepperPluginInstanceImpl* GetAndValidateInstance(PP_Instance instance) const; | 
 |  | 
 |   PluginModule* module_;  // Non-owning pointer. | 
 |  | 
 |   // The dispatcher we use to send messagse when the plugin is out-of-process. | 
 |   // Will be null when running in-process. Non-owning pointer. | 
 |   ppapi::proxy::HostDispatcher* dispatcher_; | 
 |  | 
 |   std::unique_ptr<ppapi::host::PpapiHost> ppapi_host_; | 
 |  | 
 |   // Null when running out-of-process. | 
 |   std::unique_ptr<PepperInProcessRouter> in_process_router_; | 
 |  | 
 |   // Whether the plugin is running in process. | 
 |   bool is_running_in_process_; | 
 |  | 
 |   // Whether this is a host for external plugins. | 
 |   bool is_external_plugin_host_; | 
 |  | 
 |   // The scale between the viewport and dip. | 
 |   float viewport_to_dip_scale_ = 1.0f; | 
 | }; | 
 |  | 
 | }  // namespace content | 
 |  | 
 | #endif  // CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_ |