| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |