Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(891)

Side by Side Diff: webkit/glue/plugins/plugin_lib.cc

Issue 87012: plugins: move NativeLibrary into base. (Closed)
Patch Set: more fixes from trybot Created 11 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 #include "config.h" 5 #include "config.h"
6 6
7 #include "webkit/glue/plugins/plugin_lib.h" 7 #include "webkit/glue/plugins/plugin_lib.h"
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "base/stats_counters.h" 11 #include "base/stats_counters.h"
12 #include "base/string_util.h" 12 #include "base/string_util.h"
13 #include "webkit/glue/webkit_glue.h" 13 #include "webkit/glue/webkit_glue.h"
14 #include "webkit/glue/plugins/plugin_instance.h" 14 #include "webkit/glue/plugins/plugin_instance.h"
15 #include "webkit/glue/plugins/plugin_host.h" 15 #include "webkit/glue/plugins/plugin_host.h"
16 #include "webkit/glue/plugins/plugin_list.h" 16 #include "webkit/glue/plugins/plugin_list.h"
17 17
18 // A macro for converting string constants into appropriate
19 // NativeLibraryFunctionNameTypes.
20 #if defined(OS_MACOSX)
21 #define NATIVE_LIBRARY_FUNCTION_NAME(x) CFSTR(x)
22 #else
23 #define NATIVE_LIBRARY_FUNCTION_NAME(x) x
24 #endif // OS_*
25
18 namespace NPAPI 26 namespace NPAPI
19 { 27 {
20 28
21 const char kPluginLibrariesLoadedCounter[] = "PluginLibrariesLoaded"; 29 const char kPluginLibrariesLoadedCounter[] = "PluginLibrariesLoaded";
22 const char kPluginInstancesActiveCounter[] = "PluginInstancesActive"; 30 const char kPluginInstancesActiveCounter[] = "PluginInstancesActive";
23 31
24 // A list of all the instantiated plugins. 32 // A list of all the instantiated plugins.
25 static std::vector<scoped_refptr<PluginLib> >* g_loaded_libs; 33 static std::vector<scoped_refptr<PluginLib> >* g_loaded_libs;
26 34
27 PluginLib* PluginLib::CreatePluginLib(const FilePath& filename) { 35 PluginLib* PluginLib::CreatePluginLib(const FilePath& filename) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 } 155 }
148 if (g_loaded_libs->empty()) { 156 if (g_loaded_libs->empty()) {
149 delete g_loaded_libs; 157 delete g_loaded_libs;
150 g_loaded_libs = NULL; 158 g_loaded_libs = NULL;
151 } 159 }
152 } 160 }
153 } 161 }
154 162
155 bool PluginLib::Load() { 163 bool PluginLib::Load() {
156 bool rv = false; 164 bool rv = false;
157 NativeLibrary library = 0; 165 base::NativeLibrary library = 0;
158 166
159 if (!internal_) { 167 if (!internal_) {
160 if (library_ != 0) 168 if (library_ != 0)
161 return rv; 169 return rv;
162 170
163 library = LoadNativeLibrary(web_plugin_info_.path); 171 library = base::LoadNativeLibrary(web_plugin_info_.path);
164 if (library == 0) 172 if (library == 0)
165 return rv; 173 return rv;
166 174
167 rv = true; // assume success now 175 rv = true; // assume success now
168 176
169 entry_points_.np_initialize = 177 entry_points_.np_initialize =
170 (NP_InitializeFunc)GetFunctionPointerFromNativeLibrary(library, 178 (NP_InitializeFunc)base::GetFunctionPointerFromNativeLibrary(library,
171 FUNCTION_NAME("NP_Initialize")); 179 NATIVE_LIBRARY_FUNCTION_NAME("NP_Initialize"));
172 if (entry_points_.np_initialize == 0) 180 if (entry_points_.np_initialize == 0)
173 rv = false; 181 rv = false;
174 182
175 #if !defined(OS_LINUX) 183 #if !defined(OS_LINUX)
176 entry_points_.np_getentrypoints = 184 entry_points_.np_getentrypoints =
177 (NP_GetEntryPointsFunc)GetFunctionPointerFromNativeLibrary(library, 185 (NP_GetEntryPointsFunc)base::GetFunctionPointerFromNativeLibrary(
178 FUNCTION_NAME("NP_GetEntryPoints")); 186 library,
187 NATIVE_LIBRARY_FUNCTION_NAME("NP_GetEntryPoints"));
179 if (entry_points_.np_getentrypoints == 0) 188 if (entry_points_.np_getentrypoints == 0)
180 rv = false; 189 rv = false;
181 #endif 190 #endif
182 191
183 entry_points_.np_shutdown = 192 entry_points_.np_shutdown =
184 (NP_ShutdownFunc)GetFunctionPointerFromNativeLibrary(library, 193 (NP_ShutdownFunc)base::GetFunctionPointerFromNativeLibrary(library,
185 FUNCTION_NAME("NP_Shutdown")); 194 NATIVE_LIBRARY_FUNCTION_NAME("NP_Shutdown"));
186 if (entry_points_.np_shutdown == 0) 195 if (entry_points_.np_shutdown == 0)
187 rv = false; 196 rv = false;
188 } else { 197 } else {
189 rv = true; 198 rv = true;
190 } 199 }
191 200
192 if (rv) { 201 if (rv) {
193 plugin_funcs_.size = sizeof(plugin_funcs_); 202 plugin_funcs_.size = sizeof(plugin_funcs_);
194 plugin_funcs_.version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR; 203 plugin_funcs_.version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR;
195 #if !defined(OS_LINUX) 204 #if !defined(OS_LINUX)
196 if (entry_points_.np_getentrypoints(&plugin_funcs_) != NPERR_NO_ERROR) 205 if (entry_points_.np_getentrypoints(&plugin_funcs_) != NPERR_NO_ERROR)
197 rv = false; 206 rv = false;
198 #else 207 #else
199 // On Linux, we get the plugin entry points during NP_Initialize. 208 // On Linux, we get the plugin entry points during NP_Initialize.
200 #endif 209 #endif
201 } 210 }
202 211
203 if (!internal_) { 212 if (!internal_) {
204 if (rv) 213 if (rv)
205 library_ = library; 214 library_ = library;
206 else 215 else
207 UnloadNativeLibrary(library); 216 base::UnloadNativeLibrary(library);
208 } 217 }
209 218
210 return rv; 219 return rv;
211 } 220 }
212 221
213 // This class implements delayed NP_Shutdown and FreeLibrary on the plugin dll. 222 // This class implements delayed NP_Shutdown and FreeLibrary on the plugin dll.
214 class FreePluginLibraryTask : public Task { 223 class FreePluginLibraryTask : public Task {
215 public: 224 public:
216 FreePluginLibraryTask(PluginLib::NativeLibrary library, 225 FreePluginLibraryTask(base::NativeLibrary library,
217 NP_ShutdownFunc shutdown_func) 226 NP_ShutdownFunc shutdown_func)
218 : library_(library), 227 : library_(library),
219 NP_Shutdown_(shutdown_func) { 228 NP_Shutdown_(shutdown_func) {
220 } 229 }
221 230
222 ~FreePluginLibraryTask() {} 231 ~FreePluginLibraryTask() {}
223 232
224 void Run() { 233 void Run() {
225 if (NP_Shutdown_) 234 if (NP_Shutdown_)
226 NP_Shutdown_(); 235 NP_Shutdown_();
227 236
228 if (library_) { 237 if (library_) {
229 PluginLib::UnloadNativeLibrary(library_); 238 base::UnloadNativeLibrary(library_);
230 library_ = NULL; 239 library_ = NULL;
231 } 240 }
232 } 241 }
233 242
234 private: 243 private:
235 PluginLib::NativeLibrary library_; 244 base::NativeLibrary library_;
236 NP_ShutdownFunc NP_Shutdown_; 245 NP_ShutdownFunc NP_Shutdown_;
237 DISALLOW_EVIL_CONSTRUCTORS(FreePluginLibraryTask); 246 DISALLOW_EVIL_CONSTRUCTORS(FreePluginLibraryTask);
238 }; 247 };
239 248
240 void PluginLib::Unload() { 249 void PluginLib::Unload() {
241 if (!internal_ && library_) { 250 if (!internal_ && library_) {
242 // In case of single process mode, a plugin can delete itself 251 // In case of single process mode, a plugin can delete itself
243 // by executing a script. So delay the unloading of the library 252 // by executing a script. So delay the unloading of the library
244 // so that the plugin will have a chance to unwind. 253 // so that the plugin will have a chance to unwind.
245 bool defer_unload = webkit_glue::IsPluginRunningInRendererProcess(); 254 bool defer_unload = webkit_glue::IsPluginRunningInRendererProcess();
246 255
247 #if USE(JSC) 256 #if USE(JSC)
248 // The plugin NPAPI instances may still be around. Delay the 257 // The plugin NPAPI instances may still be around. Delay the
249 // NP_Shutdown and FreeLibrary calls at least till the next 258 // NP_Shutdown and FreeLibrary calls at least till the next
250 // peek message. 259 // peek message.
251 defer_unload = true; 260 defer_unload = true;
252 #endif 261 #endif
253 262
254 if (defer_unload) { 263 if (defer_unload) {
255 FreePluginLibraryTask* free_library_task = 264 FreePluginLibraryTask* free_library_task =
256 new FreePluginLibraryTask(library_, entry_points_.np_shutdown); 265 new FreePluginLibraryTask(library_, entry_points_.np_shutdown);
257 MessageLoop::current()->PostTask(FROM_HERE, free_library_task); 266 MessageLoop::current()->PostTask(FROM_HERE, free_library_task);
258 } else { 267 } else {
259 Shutdown(); 268 Shutdown();
260 UnloadNativeLibrary(library_); 269 base::UnloadNativeLibrary(library_);
261 } 270 }
262 271
263 library_ = 0; 272 library_ = 0;
264 } 273 }
265 } 274 }
266 275
267 void PluginLib::Shutdown() { 276 void PluginLib::Shutdown() {
268 if (initialized_ && !internal_) { 277 if (initialized_ && !internal_) {
269 NP_Shutdown(); 278 NP_Shutdown();
270 initialized_ = false; 279 initialized_ = false;
271 } 280 }
272 } 281 }
273 282
274 } // namespace NPAPI 283 } // namespace NPAPI
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698