Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / content / renderer / pepper / renderer_ppapi_host_impl.h
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_