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

Side by Side Diff: webkit/plugins/npapi/plugin_list.cc

Issue 8318028: Gracefully handle child process death in out-of-process plugin loading. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Do not send the index Created 9 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « webkit/plugins/npapi/plugin_list.h ('k') | webkit/plugins/npapi/plugin_list_mac.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "webkit/plugins/npapi/plugin_list.h" 5 #include "webkit/plugins/npapi/plugin_list.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 base::AutoLock lock(lock_); 250 base::AutoLock lock(lock_);
251 for (size_t i = 0; i < internal_plugins_.size(); i++) { 251 for (size_t i = 0; i < internal_plugins_.size(); i++) {
252 if (internal_plugins_[i].info.path == path) { 252 if (internal_plugins_[i].info.path == path) {
253 internal_plugins_.erase(internal_plugins_.begin() + i); 253 internal_plugins_.erase(internal_plugins_.begin() + i);
254 return; 254 return;
255 } 255 }
256 } 256 }
257 NOTREACHED(); 257 NOTREACHED();
258 } 258 }
259 259
260 void PluginList::GetInternalPlugins(
261 std::vector<webkit::WebPluginInfo>* internal_plugins) {
262 base::AutoLock lock(lock_);
263
264 for (std::vector<InternalPlugin>::iterator it = internal_plugins_.begin();
265 it != internal_plugins_.end();
266 ++it) {
267 internal_plugins->push_back(it->info);
268 }
269 }
270
260 bool PluginList::ReadPluginInfo(const FilePath& filename, 271 bool PluginList::ReadPluginInfo(const FilePath& filename,
261 webkit::WebPluginInfo* info, 272 webkit::WebPluginInfo* info,
262 const PluginEntryPoints** entry_points) { 273 const PluginEntryPoints** entry_points) {
263 { 274 {
264 base::AutoLock lock(lock_); 275 base::AutoLock lock(lock_);
265 for (size_t i = 0; i < internal_plugins_.size(); ++i) { 276 for (size_t i = 0; i < internal_plugins_.size(); ++i) {
266 if (filename == internal_plugins_[i].info.path) { 277 if (filename == internal_plugins_[i].info.path) {
267 *entry_points = &internal_plugins_[i].entry_points; 278 *entry_points = &internal_plugins_[i].entry_points;
268 *info = internal_plugins_[i].info; 279 *info = internal_plugins_[i].info;
269 return true; 280 return true;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 const webkit::WebPluginInfo& web_plugin_info) const { 352 const webkit::WebPluginInfo& web_plugin_info) const {
342 for (size_t i = 0; i < hardcoded_plugin_groups_.size(); ++i) { 353 for (size_t i = 0; i < hardcoded_plugin_groups_.size(); ++i) {
343 const PluginGroup* group = hardcoded_plugin_groups_[i]; 354 const PluginGroup* group = hardcoded_plugin_groups_[i];
344 if (group->Match(web_plugin_info)) 355 if (group->Match(web_plugin_info))
345 return new PluginGroup(*group); 356 return new PluginGroup(*group);
346 } 357 }
347 return PluginGroup::FromWebPluginInfo(web_plugin_info); 358 return PluginGroup::FromWebPluginInfo(web_plugin_info);
348 } 359 }
349 360
350 void PluginList::LoadPluginsInternal(ScopedVector<PluginGroup>* plugin_groups) { 361 void PluginList::LoadPluginsInternal(ScopedVector<PluginGroup>* plugin_groups) {
351 // Don't want to hold the lock while loading new plugins, so we don't block
352 // other methods if they're called on other threads.
353 std::vector<FilePath> extra_plugin_paths;
354 std::vector<FilePath> extra_plugin_dirs;
355 std::vector<InternalPlugin> internal_plugins;
356 base::Closure will_load_callback; 362 base::Closure will_load_callback;
357 { 363 {
358 base::AutoLock lock(lock_); 364 base::AutoLock lock(lock_);
359 // Clear the refresh bit now, because it might get set again before we 365 // Clear the refresh bit now, because it might get set again before we
360 // reach the end of the method. 366 // reach the end of the method.
361 plugins_need_refresh_ = false; 367 plugins_need_refresh_ = false;
362 will_load_callback = will_load_plugins_callback_; 368 will_load_callback = will_load_plugins_callback_;
363 extra_plugin_paths = extra_plugin_paths_;
364 extra_plugin_dirs = extra_plugin_dirs_;
365 internal_plugins = internal_plugins_;
366 } 369 }
367 370
368 if (!will_load_callback.is_null()) 371 if (!will_load_callback.is_null())
369 will_load_callback.Run(); 372 will_load_callback.Run();
370 373
371 std::set<FilePath> visited_plugins; 374 std::vector<FilePath> plugin_paths;
375 GetPluginPathsToLoad(&plugin_paths);
372 376
373 std::vector<FilePath> directories_to_scan; 377 for (std::vector<FilePath>::const_iterator it = plugin_paths.begin();
374 GetPluginDirectories(&directories_to_scan); 378 it != plugin_paths.end();
375 379 ++it) {
376 // Load internal plugins first so that, if both an internal plugin and a 380 LoadPlugin(*it, plugin_groups);
377 // "discovered" plugin want to handle the same type, the internal plugin
378 // will have precedence.
379 for (size_t i = 0; i < internal_plugins.size(); ++i) {
380 if (internal_plugins[i].info.path.value() == kDefaultPluginLibraryName)
381 continue;
382 LoadPlugin(internal_plugins[i].info.path, plugin_groups);
383 } 381 }
384
385 for (size_t i = 0; i < extra_plugin_paths.size(); ++i) {
386 const FilePath& path = extra_plugin_paths[i];
387 if (visited_plugins.find(path) != visited_plugins.end())
388 continue;
389 LoadPlugin(path, plugin_groups);
390 visited_plugins.insert(path);
391 }
392
393 for (size_t i = 0; i < extra_plugin_dirs.size(); ++i) {
394 LoadPluginsFromDir(
395 extra_plugin_dirs[i], plugin_groups, &visited_plugins);
396 }
397
398 for (size_t i = 0; i < directories_to_scan.size(); ++i) {
399 LoadPluginsFromDir(
400 directories_to_scan[i], plugin_groups, &visited_plugins);
401 }
402
403 #if defined(OS_WIN)
404 LoadPluginsFromRegistry(plugin_groups, &visited_plugins);
405 #endif
406
407 // Load the default plugin last.
408 if (default_plugin_enabled_)
409 LoadPlugin(FilePath(kDefaultPluginLibraryName), plugin_groups);
410 } 382 }
411 383
412 void PluginList::LoadPlugins() { 384 void PluginList::LoadPlugins() {
413 { 385 {
414 base::AutoLock lock(lock_); 386 base::AutoLock lock(lock_);
415 if (!plugins_need_refresh_) 387 if (!plugins_need_refresh_)
416 return; 388 return;
417 } 389 }
418 390
419 ScopedVector<PluginGroup> new_plugin_groups; 391 ScopedVector<PluginGroup> new_plugin_groups;
(...skipping 29 matching lines...) Expand all
449 const std::string &mime_type = plugin_info.mime_types[i].mime_type; 421 const std::string &mime_type = plugin_info.mime_types[i].mime_type;
450 if (mime_type == "*") 422 if (mime_type == "*")
451 return; 423 return;
452 } 424 }
453 } 425 }
454 426
455 base::AutoLock lock(lock_); 427 base::AutoLock lock(lock_);
456 AddToPluginGroups(plugin_info, plugin_groups); 428 AddToPluginGroups(plugin_info, plugin_groups);
457 } 429 }
458 430
459 void PluginList::GetPluginPathListsToLoad( 431 void PluginList::GetPluginPathsToLoad(std::vector<FilePath>* plugin_paths) {
460 std::vector<FilePath>* extra_plugin_paths, 432 // Don't want to hold the lock while loading new plugins, so we don't block
461 std::vector<FilePath>* extra_plugin_dirs, 433 // other methods if they're called on other threads.
462 std::vector<webkit::WebPluginInfo>* internal_plugins) { 434 std::vector<FilePath> extra_plugin_paths;
463 base::AutoLock lock(lock_); 435 std::vector<FilePath> extra_plugin_dirs;
464 *extra_plugin_paths = extra_plugin_paths_; 436 std::vector<InternalPlugin> internal_plugins;
465 *extra_plugin_dirs = extra_plugin_dirs_; 437 {
438 base::AutoLock lock(lock_);
439 extra_plugin_paths = extra_plugin_paths_;
440 extra_plugin_dirs = extra_plugin_dirs_;
441 internal_plugins = internal_plugins_;
442 }
466 443
467 *internal_plugins = std::vector<webkit::WebPluginInfo>(); 444 std::vector<FilePath> directories_to_scan;
468 for (std::vector<InternalPlugin>::iterator it = internal_plugins_.begin(); 445 GetPluginDirectories(&directories_to_scan);
469 it != internal_plugins_.end(); 446
470 ++it) { 447 // Load internal plugins first so that, if both an internal plugin and a
471 internal_plugins->push_back(it->info); 448 // "discovered" plugin want to handle the same type, the internal plugin
449 // will have precedence.
450 for (size_t i = 0; i < internal_plugins.size(); ++i) {
451 if (internal_plugins[i].info.path.value() == kDefaultPluginLibraryName)
452 continue;
453 plugin_paths->push_back(internal_plugins[i].info.path);
472 } 454 }
455
456 for (size_t i = 0; i < extra_plugin_paths.size(); ++i) {
457 const FilePath& path = extra_plugin_paths[i];
458 if (std::find(plugin_paths->begin(), plugin_paths->end(), path) !=
459 plugin_paths->end()) {
460 continue;
461 }
462 plugin_paths->push_back(path);
463 }
464
465 for (size_t i = 0; i < extra_plugin_dirs.size(); ++i)
466 GetPluginsInDir(extra_plugin_dirs[i], plugin_paths);
467
468 for (size_t i = 0; i < directories_to_scan.size(); ++i)
469 GetPluginsInDir(directories_to_scan[i], plugin_paths);
470
471 #if defined(OS_WIN)
472 GetPluginPathsFromRegistry(plugin_paths);
473 #endif
474
475 // Load the default plugin last.
476 if (default_plugin_enabled_)
477 plugin_paths->push_back(FilePath(kDefaultPluginLibraryName));
473 } 478 }
474 479
475 void PluginList::SetPlugins(const std::vector<webkit::WebPluginInfo>& plugins) { 480 void PluginList::SetPlugins(const std::vector<webkit::WebPluginInfo>& plugins) {
476 base::AutoLock lock(lock_); 481 base::AutoLock lock(lock_);
477 482
478 plugins_need_refresh_ = false; 483 plugins_need_refresh_ = false;
479 484
480 plugin_groups_.reset(); 485 plugin_groups_.reset();
481 for (std::vector<webkit::WebPluginInfo>::const_iterator it = plugins.begin(); 486 for (std::vector<webkit::WebPluginInfo>::const_iterator it = plugins.begin();
482 it != plugins.end(); 487 it != plugins.end();
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 } 715 }
711 return false; 716 return false;
712 } 717 }
713 718
714 PluginList::~PluginList() { 719 PluginList::~PluginList() {
715 } 720 }
716 721
717 722
718 } // namespace npapi 723 } // namespace npapi
719 } // namespace webkit 724 } // namespace webkit
OLDNEW
« no previous file with comments | « webkit/plugins/npapi/plugin_list.h ('k') | webkit/plugins/npapi/plugin_list_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698