OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef WEBKIT_PLUGINS_PPAPI_PLUGIN_MODULE_H_ | 5 #ifndef CONTENT_RENDERER_PEPPER_PLUGIN_MODULE_H_ |
6 #define WEBKIT_PLUGINS_PPAPI_PLUGIN_MODULE_H_ | 6 #define CONTENT_RENDERER_PEPPER_PLUGIN_MODULE_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
17 #include "base/native_library.h" | 17 #include "base/native_library.h" |
18 #include "base/process.h" | 18 #include "base/process.h" |
| 19 #include "content/common/content_export.h" |
| 20 #include "content/public/common/pepper_plugin_info.h" |
| 21 #include "content/renderer/pepper/plugin_delegate.h" |
19 #include "ppapi/c/pp_bool.h" | 22 #include "ppapi/c/pp_bool.h" |
20 #include "ppapi/c/pp_instance.h" | 23 #include "ppapi/c/pp_instance.h" |
21 #include "ppapi/c/pp_module.h" | |
22 #include "ppapi/c/ppb.h" | |
23 #include "ppapi/c/ppb_core.h" | 24 #include "ppapi/c/ppb_core.h" |
24 #include "ppapi/c/private/ppb_instance_private.h" | 25 #include "ppapi/c/private/ppb_instance_private.h" |
25 #include "ppapi/shared_impl/ppapi_permissions.h" | 26 #include "ppapi/shared_impl/ppapi_permissions.h" |
26 #include "webkit/plugins/ppapi/plugin_delegate.h" | |
27 #include "webkit/plugins/webkit_plugins_export.h" | |
28 | 27 |
29 typedef void* NPIdentifier; | 28 typedef void* NPIdentifier; |
30 | 29 |
31 namespace base { | 30 namespace base { |
32 class FilePath; | 31 class FilePath; |
33 } | 32 } |
34 | 33 |
35 namespace content { | 34 namespace content { |
36 class RenderView; | 35 class RenderView; |
37 } | 36 } |
(...skipping 11 matching lines...) Expand all Loading... |
49 namespace ppapi { | 48 namespace ppapi { |
50 | 49 |
51 class PluginDelegate; | 50 class PluginDelegate; |
52 class PluginInstanceImpl; | 51 class PluginInstanceImpl; |
53 | 52 |
54 // Represents one plugin library loaded into one renderer. This library may | 53 // Represents one plugin library loaded into one renderer. This library may |
55 // have multiple instances. | 54 // have multiple instances. |
56 // | 55 // |
57 // Note: to get from a PP_Instance to a PluginInstance*, use the | 56 // Note: to get from a PP_Instance to a PluginInstance*, use the |
58 // ResourceTracker. | 57 // ResourceTracker. |
59 class WEBKIT_PLUGINS_EXPORT PluginModule : | 58 class CONTENT_EXPORT PluginModule : |
60 public base::RefCounted<PluginModule>, | 59 public base::RefCounted<PluginModule>, |
61 public base::SupportsWeakPtr<PluginModule> { | 60 public base::SupportsWeakPtr<PluginModule> { |
62 public: | 61 public: |
63 typedef const void* (*GetInterfaceFunc)(const char*); | |
64 typedef int (*PPP_InitializeModuleFunc)(PP_Module, PPB_GetInterface); | |
65 typedef void (*PPP_ShutdownModuleFunc)(); | |
66 | |
67 struct EntryPoints { | |
68 // This structure is POD, with the constructor initializing to NULL. | |
69 WEBKIT_PLUGINS_EXPORT EntryPoints(); | |
70 | |
71 GetInterfaceFunc get_interface; | |
72 PPP_InitializeModuleFunc initialize_module; | |
73 PPP_ShutdownModuleFunc shutdown_module; // Optional, may be NULL. | |
74 }; | |
75 | |
76 // Allows the embedder to associate a class with this module. This is opaque | 62 // Allows the embedder to associate a class with this module. This is opaque |
77 // from the PluginModule's perspective (see Set/GetEmbedderState below) but | 63 // from the PluginModule's perspective (see Set/GetEmbedderState below) but |
78 // the module is in charge of deleting the class. | 64 // the module is in charge of deleting the class. |
79 class EmbedderState { | 65 class EmbedderState { |
80 public: | 66 public: |
81 virtual ~EmbedderState() {} | 67 virtual ~EmbedderState() {} |
82 }; | 68 }; |
83 | 69 |
84 typedef std::set<PluginInstanceImpl*> PluginInstanceSet; | 70 typedef std::set<PluginInstanceImpl*> PluginInstanceSet; |
85 | 71 |
86 // You must call one of the Init functions after the constructor to create a | 72 // You must call one of the Init functions after the constructor to create a |
87 // module of the type you desire. | 73 // module of the type you desire. |
88 // | 74 // |
89 // The module lifetime delegate is a non-owning pointer that must outlive | 75 // The module lifetime delegate is a non-owning pointer that must outlive |
90 // all plugin modules. In practice it will be a global singleton that | 76 // all plugin modules. In practice it will be a global singleton that |
91 // tracks which modules are alive. | 77 // tracks which modules are alive. |
92 PluginModule(const std::string& name, | 78 PluginModule(const std::string& name, |
93 const base::FilePath& path, | 79 const base::FilePath& path, |
94 PluginDelegate::ModuleLifetime* lifetime_delegate, | |
95 const ::ppapi::PpapiPermissions& perms); | 80 const ::ppapi::PpapiPermissions& perms); |
96 | 81 |
97 ~PluginModule(); | |
98 | |
99 // Sets the given class as being associated with this module. It will be | 82 // Sets the given class as being associated with this module. It will be |
100 // deleted when the module is destroyed. You can only set it once, subsequent | 83 // deleted when the module is destroyed. You can only set it once, subsequent |
101 // sets will assert. | 84 // sets will assert. |
102 // | 85 // |
103 // See EmbedderState above for more. | 86 // See EmbedderState above for more. |
104 void SetEmbedderState(scoped_ptr<EmbedderState> state); | 87 void SetEmbedderState(scoped_ptr<EmbedderState> state); |
105 EmbedderState* GetEmbedderState(); | 88 EmbedderState* GetEmbedderState(); |
106 | 89 |
107 // Initializes this module as an internal plugin with the given entrypoints. | 90 // Initializes this module as an internal plugin with the given entrypoints. |
108 // This is used for "plugins" compiled into Chrome. Returns true on success. | 91 // This is used for "plugins" compiled into Chrome. Returns true on success. |
109 // False means that the plugin can not be used. | 92 // False means that the plugin can not be used. |
110 bool InitAsInternalPlugin(const EntryPoints& entry_points); | 93 bool InitAsInternalPlugin( |
| 94 const content::PepperPluginInfo::EntryPoints& entry_points); |
111 | 95 |
112 // Initializes this module using the given library path as the plugin. | 96 // Initializes this module using the given library path as the plugin. |
113 // Returns true on success. False means that the plugin can not be used. | 97 // Returns true on success. False means that the plugin can not be used. |
114 bool InitAsLibrary(const base::FilePath& path); | 98 bool InitAsLibrary(const base::FilePath& path); |
115 | 99 |
116 // Initializes this module for the given out of process proxy. This takes | 100 // Initializes this module for the given out of process proxy. This takes |
117 // ownership of the given pointer, even in the failure case. | 101 // ownership of the given pointer, even in the failure case. |
118 void InitAsProxied(PluginDelegate::OutOfProcessProxy* out_of_process_proxy); | 102 void InitAsProxied(PluginDelegate::OutOfProcessProxy* out_of_process_proxy); |
119 | 103 |
120 // Creates a new module for an external plugin instance that will be using the | 104 // Creates a new module for an external plugin instance that will be using the |
(...skipping 18 matching lines...) Expand all Loading... |
139 // process. Returns 0 otherwise. This is the ID that the browser process uses | 123 // process. Returns 0 otherwise. This is the ID that the browser process uses |
140 // to idetify the child process for the plugin. This isn't directly useful | 124 // to idetify the child process for the plugin. This isn't directly useful |
141 // from our process (the renderer) except in messages to the browser to | 125 // from our process (the renderer) except in messages to the browser to |
142 // disambiguate plugins. | 126 // disambiguate plugins. |
143 int GetPluginChildId(); | 127 int GetPluginChildId(); |
144 | 128 |
145 static const PPB_Core* GetCore(); | 129 static const PPB_Core* GetCore(); |
146 | 130 |
147 // Returns a pointer to the local GetInterface function for retrieving | 131 // Returns a pointer to the local GetInterface function for retrieving |
148 // PPB interfaces. | 132 // PPB interfaces. |
149 static GetInterfaceFunc GetLocalGetInterfaceFunc(); | 133 static content::PepperPluginInfo::GetInterfaceFunc GetLocalGetInterfaceFunc(); |
150 | 134 |
151 // Returns whether an interface is supported. This method can be called from | 135 // Returns whether an interface is supported. This method can be called from |
152 // the browser process and used for interface matching before plugin | 136 // the browser process and used for interface matching before plugin |
153 // registration. | 137 // registration. |
154 // NOTE: those custom interfaces provided by PpapiInterfaceFactoryManager | 138 // NOTE: those custom interfaces provided by PpapiInterfaceFactoryManager |
155 // will not be considered when called on the browser process. | 139 // will not be considered when called on the browser process. |
156 static bool SupportsInterface(const char* name); | 140 static bool SupportsInterface(const char* name); |
157 | 141 |
158 // Returns the module handle. This may be used before Init() is called (the | 142 // Returns the module handle. This may be used before Init() is called (the |
159 // proxy needs this information to set itself up properly). | 143 // proxy needs this information to set itself up properly). |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 void SetBroker(PluginDelegate::Broker* broker); | 195 void SetBroker(PluginDelegate::Broker* broker); |
212 PluginDelegate::Broker* GetBroker(); | 196 PluginDelegate::Broker* GetBroker(); |
213 | 197 |
214 // In production we purposely leak the HostGlobals object but in unittest | 198 // In production we purposely leak the HostGlobals object but in unittest |
215 // code, this can interfere with subsequent tests. This deletes the | 199 // code, this can interfere with subsequent tests. This deletes the |
216 // existing HostGlobals. A new one will be constructed when a PluginModule is | 200 // existing HostGlobals. A new one will be constructed when a PluginModule is |
217 // instantiated. | 201 // instantiated. |
218 static void ResetHostGlobalsForTest(); | 202 static void ResetHostGlobalsForTest(); |
219 | 203 |
220 private: | 204 private: |
| 205 friend class base::RefCounted<PluginModule>; |
| 206 ~PluginModule(); |
221 // Calls the InitializeModule entrypoint. The entrypoint must have been | 207 // Calls the InitializeModule entrypoint. The entrypoint must have been |
222 // set and the plugin must not be out of process (we don't maintain | 208 // set and the plugin must not be out of process (we don't maintain |
223 // entrypoints in that case). | 209 // entrypoints in that case). |
224 bool InitializeModule(const EntryPoints& entry_points); | 210 bool InitializeModule( |
225 | 211 const content::PepperPluginInfo::EntryPoints& entry_points); |
226 // Note: This may be null. | |
227 PluginDelegate::ModuleLifetime* lifetime_delegate_; | |
228 | 212 |
229 // See EmbedderState above. | 213 // See EmbedderState above. |
230 scoped_ptr<EmbedderState> embedder_state_; | 214 scoped_ptr<EmbedderState> embedder_state_; |
231 | 215 |
232 // Tracker for completion callbacks, used mainly to ensure that all callbacks | 216 // Tracker for completion callbacks, used mainly to ensure that all callbacks |
233 // are properly aborted on module shutdown. | 217 // are properly aborted on module shutdown. |
234 scoped_refptr< ::ppapi::CallbackTracker> callback_tracker_; | 218 scoped_refptr< ::ppapi::CallbackTracker> callback_tracker_; |
235 | 219 |
236 PP_Module pp_module_; | 220 PP_Module pp_module_; |
237 | 221 |
(...skipping 15 matching lines...) Expand all Loading... |
253 | 237 |
254 // Holds a reference to the base::NativeLibrary handle if this PluginModule | 238 // Holds a reference to the base::NativeLibrary handle if this PluginModule |
255 // instance wraps functions loaded from a library. Can be NULL. If | 239 // instance wraps functions loaded from a library. Can be NULL. If |
256 // |library_| is non-NULL, PluginModule will attempt to unload the library | 240 // |library_| is non-NULL, PluginModule will attempt to unload the library |
257 // during destruction. | 241 // during destruction. |
258 base::NativeLibrary library_; | 242 base::NativeLibrary library_; |
259 | 243 |
260 // Contains pointers to the entry points of the actual plugin implementation. | 244 // Contains pointers to the entry points of the actual plugin implementation. |
261 // These will be NULL for out-of-process plugins, which is indicated by the | 245 // These will be NULL for out-of-process plugins, which is indicated by the |
262 // presence of the out_of_process_proxy_ value. | 246 // presence of the out_of_process_proxy_ value. |
263 EntryPoints entry_points_; | 247 content::PepperPluginInfo::EntryPoints entry_points_; |
264 | 248 |
265 // The name and file location of the module. | 249 // The name and file location of the module. |
266 const std::string name_; | 250 const std::string name_; |
267 const base::FilePath path_; | 251 const base::FilePath path_; |
268 | 252 |
269 ::ppapi::PpapiPermissions permissions_; | 253 ::ppapi::PpapiPermissions permissions_; |
270 | 254 |
271 // Non-owning pointers to all instances associated with this module. When | 255 // Non-owning pointers to all instances associated with this module. When |
272 // there are no more instances, this object should be deleted. | 256 // there are no more instances, this object should be deleted. |
273 PluginInstanceSet instances_; | 257 PluginInstanceSet instances_; |
274 | 258 |
275 PP_Bool (*reserve_instance_id_)(PP_Module, PP_Instance); | 259 PP_Bool (*reserve_instance_id_)(PP_Module, PP_Instance); |
276 | 260 |
277 DISALLOW_COPY_AND_ASSIGN(PluginModule); | 261 DISALLOW_COPY_AND_ASSIGN(PluginModule); |
278 }; | 262 }; |
279 | 263 |
280 } // namespace ppapi | 264 } // namespace ppapi |
281 } // namespace webkit | 265 } // namespace webkit |
282 | 266 |
283 #endif // WEBKIT_PLUGINS_PPAPI_PLUGIN_MODULE_H_ | 267 #endif // CONTENT_RENDERER_PEPPER_PLUGIN_MODULE_H_ |
OLD | NEW |