renderer_ppapi_host.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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_PUBLIC_RENDERER_RENDERER_PPAPI_HOST_H_
6#define CONTENT_PUBLIC_RENDERER_RENDERER_PPAPI_HOST_H_
7
8#include <vector>
9
10#include "base/callback_forward.h"
11#include "base/memory/ref_counted.h"
12#include "base/platform_file.h"
13#include "base/process/process.h"
14#include "content/common/content_export.h"
15#include "ipc/ipc_platform_file.h"
16#include "ppapi/c/pp_instance.h"
17#include "url/gurl.h"
18
19namespace base {
20class FilePath;
21}
22
23namespace gfx {
24class Point;
25}
26
27namespace IPC {
28class Message;
29}
30
31namespace ppapi {
32namespace host {
33class PpapiHost;
34}
35}
36
37namespace blink {
38class WebPluginContainer;
39}
40
41namespace content {
42class PepperPluginInstance;
43class RenderFrame;
44class RenderView;
45
46// Interface that allows components in the embedder app to talk to the
47// PpapiHost in the renderer process.
48//
49// There will be one of these objects in the renderer per plugin module.
50class RendererPpapiHost {
51 public:
52  // Returns the RendererPpapiHost associated with the given PP_Instance,
53  // or NULL if the instance is invalid.
54  //
55  // Do NOT use this when dealing with an "external plugin" that serves as a
56  // bootstrap to load a second plugin. This is because the two will share a
57  // PP_Instance, and the RendererPpapiHost* for the second plugin will be
58  // returned after we switch the proxy on.
59  CONTENT_EXPORT static RendererPpapiHost* GetForPPInstance(
60      PP_Instance instance);
61
62  // Returns the PpapiHost object.
63  virtual ppapi::host::PpapiHost* GetPpapiHost() = 0;
64
65  // Returns true if the given PP_Instance is valid and belongs to the
66  // plugin associated with this host.
67  virtual bool IsValidInstance(PP_Instance instance) const = 0;
68
69  // Returns the PluginInstance for the given PP_Instance, or NULL if the
70  // PP_Instance is invalid (the common case this will be invalid is during
71  // plugin teardown when resource hosts are being force-freed).
72  virtual PepperPluginInstance* GetPluginInstance(
73      PP_Instance instance) const = 0;
74
75  // Returns the RenderFrame for the given plugin instance, or NULL if the
76  // instance is invalid.
77  virtual RenderFrame* GetRenderFrameForInstance(
78      PP_Instance instance) const = 0;
79
80  // Returns the RenderView for the given plugin instance, or NULL if the
81  // instance is invalid.
82  virtual RenderView* GetRenderViewForInstance(PP_Instance instance) const = 0;
83
84  // Returns the WebPluginContainer for the given plugin instance, or NULL if
85  // the instance is invalid.
86  virtual blink::WebPluginContainer* GetContainerForInstance(
87      PP_Instance instance) const = 0;
88
89  // Returns the PID of the child process containing the plugin. If running
90  // in-process, this returns base::kNullProcessId.
91  virtual base::ProcessId GetPluginPID() const = 0;
92
93  // Returns true if the given instance is considered to be currently
94  // processing a user gesture or the plugin module has the "override user
95  // gesture" flag set (in which case it can always do things normally
96  // restricted by user gestures). Returns false if the instance is invalid or
97  // if there is no current user gesture.
98  virtual bool HasUserGesture(PP_Instance instance) const = 0;
99
100  // Returns the routing ID for the render widget containing the given
101  // instance. This will take into account the current Flash fullscreen state,
102  // so if there is a Flash fullscreen instance active, this will return the
103  // routing ID of the fullscreen widget. Returns 0 on failure.
104  virtual int GetRoutingIDForWidget(PP_Instance instance) const = 0;
105
106  // Converts the given plugin coordinate to the containing RenderFrame. This
107  // will take into account the current Flash fullscreen state so will use
108  // the fullscreen widget if it's displayed.
109  virtual gfx::Point PluginPointToRenderFrame(
110      PP_Instance instance,
111      const gfx::Point& pt) const = 0;
112
113  // Shares a file handle (HANDLE / file descriptor) with the remote side. It
114  // returns a handle that should be sent in exactly one IPC message. Upon
115  // receipt, the remote side then owns that handle. Note: if sending the
116  // message fails, the returned handle is properly closed by the IPC system. If
117  // |should_close_source| is set to true, the original handle is closed by this
118  // operation and should not be used again.
119  virtual IPC::PlatformFileForTransit ShareHandleWithRemote(
120      base::PlatformFile handle,
121      bool should_close_source) = 0;
122
123  // Returns true if the plugin is running in process.
124  virtual bool IsRunningInProcess() const = 0;
125
126  virtual std::string GetPluginName() const = 0;
127
128  // Used by the embedder to inform this RendererPpapiHost that the associated
129  // plugin module is a host for "external plugins."
130  //
131  // An embedder may, at the time a plugin module is created, configure it to
132  // be a host for external plugins. Instances of such plugins go through two
133  // two stages of initialization; the first stage initializes a host plugin
134  // instance, which then loads and initializes a child plugin which takes
135  // over control. These are treated as one Pepper Instance, because despite the
136  // two-stage initialization process, the host and child appear to blink as
137  // one plugin instance.
138  //
139  // The host plugin appears as an in-process plugin, while we interact with the
140  // child plugin via the Pepper proxy.
141  virtual void SetToExternalPluginHost() = 0;
142
143  // There are times when the renderer needs to create a ResourceHost in the
144  // browser. This function does so asynchronously. |nested_msgs| is a list of
145  // resource host creation messages and |instance| is the PP_Instance which
146  // the resource will belong to. |callback| will be called asynchronously with
147  // the pending host IDs when the ResourceHosts have been created. This can be
148  // passed back to the plugin to attach to the ResourceHosts. Pending IDs of 0
149  // will be passed to the callback if a ResourceHost fails to be created.
150  virtual void CreateBrowserResourceHosts(
151      PP_Instance instance,
152      const std::vector<IPC::Message>& nested_msgs,
153      const base::Callback<void(const std::vector<int>&)>& callback) const = 0;
154
155  // Gets the URL of the document containing the given PP_Instance.
156  // Returns an empty URL if the instance is invalid.
157  // TODO(yzshen): Some methods such as this one don't need to be pure virtual.
158  // Instead, they could be directly implemented using other methods in this
159  // interface. Consider changing them to static helpers.
160  virtual GURL GetDocumentURL(PP_Instance instance) const = 0;
161
162 protected:
163  virtual ~RendererPpapiHost() {}
164};
165
166}  // namespace content
167
168#endif  // CONTENT_PUBLIC_RENDERER_RENDERER_PPAPI_HOST_H_
169