Home | History | Annotate | Download | only in pepper
      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