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

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

Issue 5699005: Policy: Re-enabled plugin still disabled (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleaned up WebPluginInfo and rebased on fixed PluginGroup::InitFrom. Created 10 years 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
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/string_split.h" 12 #include "base/string_split.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/sys_string_conversions.h" 14 #include "base/sys_string_conversions.h"
15 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
16 #include "googleurl/src/gurl.h" 16 #include "googleurl/src/gurl.h"
17 #include "net/base/mime_util.h"
18 #include "webkit/glue/webkit_glue.h" 17 #include "webkit/glue/webkit_glue.h"
19 #include "webkit/plugins/npapi/plugin_constants_win.h" 18 #include "webkit/plugins/npapi/plugin_constants_win.h"
20 #include "webkit/plugins/npapi/plugin_lib.h" 19 #include "webkit/plugins/npapi/plugin_lib.h"
21 #include "webkit/plugins/plugin_switches.h" 20 #include "webkit/plugins/plugin_switches.h"
22 21
23 #if defined(OS_POSIX) 22 #if defined(OS_POSIX)
24 #include "base/stl_util-inl.h" 23 #include "base/stl_util-inl.h"
25 #include "base/third_party/valgrind/valgrind.h" 24 #include "base/third_party/valgrind/valgrind.h"
26 #endif // defined(OS_POSIX) 25 #endif // defined(OS_POSIX)
27 26
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 LOG_IF(ERROR, PluginList::DebugPluginLoading()) 245 LOG_IF(ERROR, PluginList::DebugPluginLoading())
247 << "Plugin " << pvi.product_name << " has no MIME types, skipping"; 246 << "Plugin " << pvi.product_name << " has no MIME types, skipping";
248 return false; 247 return false;
249 } 248 }
250 249
251 info->name = WideToUTF16(pvi.product_name); 250 info->name = WideToUTF16(pvi.product_name);
252 info->desc = WideToUTF16(pvi.file_description); 251 info->desc = WideToUTF16(pvi.file_description);
253 info->version = WideToUTF16(pvi.file_version); 252 info->version = WideToUTF16(pvi.file_version);
254 info->path = pvi.path; 253 info->path = pvi.path;
255 info->enabled = true; 254 info->enabled = true;
255 info->reason = WebPluginInfo::USER;
256 256
257 for (size_t i = 0; i < mime_types.size(); ++i) { 257 for (size_t i = 0; i < mime_types.size(); ++i) {
258 WebPluginMimeType mime_type; 258 WebPluginMimeType mime_type;
259 mime_type.mime_type = StringToLowerASCII(mime_types[i]); 259 mime_type.mime_type = StringToLowerASCII(mime_types[i]);
260 if (file_extensions.size() > i) 260 if (file_extensions.size() > i)
261 base::SplitString(file_extensions[i], ',', &mime_type.file_extensions); 261 base::SplitString(file_extensions[i], ',', &mime_type.file_extensions);
262 262
263 if (descriptions.size() > i) { 263 if (descriptions.size() > i) {
264 mime_type.description = descriptions[i]; 264 mime_type.description = descriptions[i];
265 265
(...skipping 12 matching lines...) Expand all
278 info->mime_types.push_back(mime_type); 278 info->mime_types.push_back(mime_type);
279 } 279 }
280 280
281 return true; 281 return true;
282 } 282 }
283 283
284 PluginList::PluginList() 284 PluginList::PluginList()
285 : plugins_loaded_(false), 285 : plugins_loaded_(false),
286 plugins_need_refresh_(false), 286 plugins_need_refresh_(false),
287 disable_outdated_plugins_(false), 287 disable_outdated_plugins_(false),
288 next_priority_(0) { 288 next_priority_(1) {
289 PlatformInit(); 289 PlatformInit();
290 AddHardcodedPluginGroups(); 290 AddHardcodedPluginGroups();
291 } 291 }
292 292
293 bool PluginList::ShouldDisableGroup(const string16& group_name) {
294 AutoLock lock(lock_);
295 if (PluginGroup::IsPluginNameDisabledByPolicy(group_name)) {
296 disabled_groups_.insert(group_name);
297 return true;
298 }
299 return disabled_groups_.count(group_name) > 0;
300 }
301
302 void PluginList::LoadPlugins(bool refresh) { 293 void PluginList::LoadPlugins(bool refresh) {
303 // Don't want to hold the lock while loading new plugins, so we don't block 294 // Don't want to hold the lock while loading new plugins, so we don't block
304 // other methods if they're called on other threads. 295 // other methods if they're called on other threads.
305 std::vector<FilePath> extra_plugin_paths; 296 std::vector<FilePath> extra_plugin_paths;
306 std::vector<FilePath> extra_plugin_dirs; 297 std::vector<FilePath> extra_plugin_dirs;
307 std::vector<PluginVersionInfo> internal_plugins; 298 std::vector<PluginVersionInfo> internal_plugins;
308 { 299 {
309 AutoLock lock(lock_); 300 AutoLock lock(lock_);
310 if (plugins_loaded_ && !refresh && !plugins_need_refresh_) 301 if (plugins_loaded_ && !refresh && !plugins_need_refresh_)
311 return; 302 return;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 342
352 #if defined(OS_WIN) 343 #if defined(OS_WIN)
353 LoadPluginsFromRegistry(&new_plugins, &visited_plugins); 344 LoadPluginsFromRegistry(&new_plugins, &visited_plugins);
354 #endif 345 #endif
355 346
356 // Load the default plugin last. 347 // Load the default plugin last.
357 if (webkit_glue::IsDefaultPluginEnabled()) 348 if (webkit_glue::IsDefaultPluginEnabled())
358 LoadPlugin(FilePath(kDefaultPluginLibraryName), &new_plugins); 349 LoadPlugin(FilePath(kDefaultPluginLibraryName), &new_plugins);
359 350
360 // Disable all of the plugins and plugin groups that are disabled by policy. 351 // Disable all of the plugins and plugin groups that are disabled by policy.
361 // There's currenly a bug that makes it impossible to correctly re-enable
362 // plugins or plugin-groups to their original, "pre-policy" state, so
363 // plugins and groups are only changed to a more "safe" state after a policy
364 // change, i.e. from enabled to disabled. See bug 54681.
365 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin(); 352 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
366 it != plugin_groups_.end(); ++it) { 353 it != plugin_groups_.end(); ++it) {
367 PluginGroup* group = it->second; 354 PluginGroup* group = it->second;
368 string16 group_name = group->GetGroupName(); 355 string16 group_name = group->GetGroupName();
369 if (ShouldDisableGroup(group_name)) { 356 if (PluginGroup::IsPluginNameDisabledByPolicy(group_name))
370 group->Enable(false); 357 group->EnableGroup(false);
371 }
372 358
373 if (disable_outdated_plugins_) { 359 if (disable_outdated_plugins_)
374 group->DisableOutdatedPlugins(); 360 group->DisableOutdatedPlugins();
375 } 361 }
376 if (!group->Enabled()) { 362
377 AutoLock lock(lock_); 363 AutoLock lock(lock_);
378 disabled_groups_.insert(group_name); 364 // Clean up the plugins that has disappeared from the groups.
Bernhard Bauer 2010/12/21 19:07:39 Nit: have
pastarmovj 2010/12/23 13:00:19 Done.
365 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
366 group != plugin_groups_.end(); ++group) {
367 std::vector<WebPluginInfo>& gr_plugins = group->second->GetPlugins();
Bernhard Bauer 2010/12/21 19:07:39 Can you use a const reference here? If not, that i
pastarmovj 2010/12/21 20:31:19 I can and will do it no problem. I only read from
pastarmovj 2010/12/23 13:00:19 Done.
368 for (size_t i = 0; i < gr_plugins.size(); ++i) {
369 bool plugin_found = false;
370 for (size_t j = 0; j < new_plugins.size(); ++j)
371 if (gr_plugins[i].path == new_plugins[j].path) {
372 plugin_found = true;
373 break;
374 }
375 if (!plugin_found)
376 group->second->SetPluginIsPlaceholder(gr_plugins[i], true);
379 } 377 }
380 } 378 }
381
382 // Only update the data now since loading plugins can take a while.
383 AutoLock lock(lock_);
384
385 plugins_ = new_plugins;
386 plugins_loaded_ = true; 379 plugins_loaded_ = true;
387 } 380 }
388 381
389 void PluginList::LoadPlugin(const FilePath& path, 382 void PluginList::LoadPlugin(const FilePath& path,
390 std::vector<WebPluginInfo>* plugins) { 383 std::vector<WebPluginInfo>* plugins) {
391 LOG_IF(ERROR, PluginList::DebugPluginLoading()) 384 LOG_IF(ERROR, PluginList::DebugPluginLoading())
392 << "Loading plugin " << path.value(); 385 << "Loading plugin " << path.value();
393
394 WebPluginInfo plugin_info; 386 WebPluginInfo plugin_info;
395 const PluginEntryPoints* entry_points; 387 const PluginEntryPoints* entry_points;
396 388
397 if (!ReadPluginInfo(path, &plugin_info, &entry_points)) 389 if (!ReadPluginInfo(path, &plugin_info, &entry_points))
398 return; 390 return;
399 391
400 if (!ShouldLoadPlugin(plugin_info, plugins)) 392 if (!ShouldLoadPlugin(plugin_info, plugins))
401 return; 393 return;
402 394
403 if (path.value() != kDefaultPluginLibraryName 395 if (path.value() != kDefaultPluginLibraryName
404 #if defined(OS_WIN) && !defined(NDEBUG) 396 #if defined(OS_WIN) && !defined(NDEBUG)
405 && path.BaseName().value() != L"npspy.dll" // Make an exception for NPSPY 397 && path.BaseName().value() != L"npspy.dll" // Make an exception for NPSPY
406 #endif 398 #endif
407 ) { 399 ) {
408 for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) { 400 for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) {
409 // TODO: don't load global handlers for now. 401 // TODO: don't load global handlers for now.
410 // WebKit hands to the Plugin before it tries 402 // WebKit hands to the Plugin before it tries
411 // to handle mimeTypes on its own. 403 // to handle mimeTypes on its own.
412 const std::string &mime_type = plugin_info.mime_types[i].mime_type; 404 const std::string &mime_type = plugin_info.mime_types[i].mime_type;
413 if (mime_type == "*" ) 405 if (mime_type == "*" )
414 return; 406 return;
415 } 407 }
416 } 408 }
417 409
418 // Mark disabled plugins as such. (This has to happen before calling
419 // |AddToPluginGroups(plugin_info)|.)
420 if (disabled_plugins_.count(plugin_info.path)) {
421 plugin_info.enabled = false;
422 } else {
423 plugin_info.enabled = true;
424 }
425
426 AutoLock lock(lock_); 410 AutoLock lock(lock_);
411 AddToPluginGroups(plugin_info);
427 plugins->push_back(plugin_info); 412 plugins->push_back(plugin_info);
428 AddToPluginGroups(plugin_info);
429 } 413 }
430 414
431 bool PluginList::SupportsType(const WebPluginInfo& info,
432 const std::string &mime_type,
433 bool allow_wildcard) {
434 // Webkit will ask for a plugin to handle empty mime types.
435 if (mime_type.empty())
436 return false;
437
438 for (size_t i = 0; i < info.mime_types.size(); ++i) {
439 const WebPluginMimeType& mime_info = info.mime_types[i];
440 if (net::MatchesMimeType(mime_info.mime_type, mime_type)) {
441 if (!allow_wildcard && mime_info.mime_type == "*") {
442 continue;
443 }
444 return true;
445 }
446 }
447 return false;
448 }
449
450 bool PluginList::SupportsExtension(const WebPluginInfo& info,
451 const std::string &extension,
452 std::string* actual_mime_type) {
453 for (size_t i = 0; i < info.mime_types.size(); ++i) {
454 const WebPluginMimeType& mime_type = info.mime_types[i];
455 for (size_t j = 0; j < mime_type.file_extensions.size(); ++j) {
456 if (mime_type.file_extensions[j] == extension) {
457 if (actual_mime_type)
458 *actual_mime_type = mime_type.mime_type;
459 return true;
460 }
461 }
462 }
463
464 return false;
465 }
466
467
468 void PluginList::GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins) { 415 void PluginList::GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins) {
469 LoadPlugins(refresh); 416 LoadPlugins(refresh);
470 417
471 AutoLock lock(lock_); 418 AutoLock lock(lock_);
472 *plugins = plugins_; 419 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
420 group != plugin_groups_.end(); ++group) {
421 const std::vector<WebPluginInfo>& gr_plugins = group->second->GetPlugins();
422 for (size_t i = 0; i < gr_plugins.size(); ++i)
423 if (!group->second->IsPluginPlaceholder(gr_plugins[i]))
424 plugins->push_back(gr_plugins[i]);
425 }
473 } 426 }
474 427
475 void PluginList::GetEnabledPlugins(bool refresh, 428 void PluginList::GetEnabledPlugins(bool refresh,
476 std::vector<WebPluginInfo>* plugins) { 429 std::vector<WebPluginInfo>* plugins) {
477 LoadPlugins(refresh); 430 LoadPlugins(refresh);
478 431
479 plugins->clear(); 432 plugins->clear();
480 AutoLock lock(lock_); 433 AutoLock lock(lock_);
481 for (std::vector<WebPluginInfo>::const_iterator it = plugins_.begin(); 434 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
482 it != plugins_.end(); 435 group != plugin_groups_.end(); ++group) {
483 ++it) { 436 const std::vector<WebPluginInfo>& gr_plugins = group->second->GetPlugins();
484 if (it->enabled) 437 for (size_t i = 0; i < gr_plugins.size(); ++i) {
485 plugins->push_back(*it); 438 if (!group->second->IsPluginPlaceholder(gr_plugins[i]) &&
439 WebPluginInfoUtils::IsEnabled(gr_plugins[i]))
440 plugins->push_back(gr_plugins[i]);
441 }
486 } 442 }
487 } 443 }
488 444
489 void PluginList::GetPluginInfoArray( 445 void PluginList::GetPluginInfoArray(
490 const GURL& url, 446 const GURL& url,
491 const std::string& mime_type, 447 const std::string& mime_type,
492 bool allow_wildcard, 448 bool allow_wildcard,
493 std::vector<WebPluginInfo>* info, 449 std::vector<WebPluginInfo>* info,
494 std::vector<std::string>* actual_mime_types) { 450 std::vector<std::string>* actual_mime_types) {
495 DCHECK(mime_type == StringToLowerASCII(mime_type)); 451 DCHECK(mime_type == StringToLowerASCII(mime_type));
496 DCHECK(info); 452 DCHECK(info);
497 453
498 LoadPlugins(false); 454 LoadPlugins(false);
499 AutoLock lock(lock_); 455 AutoLock lock(lock_);
500 info->clear(); 456 info->clear();
501 if (actual_mime_types) 457 if (actual_mime_types)
502 actual_mime_types->clear(); 458 actual_mime_types->clear();
503 459
504 std::set<FilePath> visited_plugins; 460 std::set<FilePath> visited_plugins;
505 461
506 // Add in enabled plugins by mime type. 462 // Add in enabled plugins by mime type.
507 WebPluginInfo default_plugin; 463 WebPluginInfo default_plugin;
508 for (size_t i = 0; i < plugins_.size(); ++i) { 464 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
509 if (plugins_[i].enabled && 465 group != plugin_groups_.end(); ++group) {
510 SupportsType(plugins_[i], mime_type, allow_wildcard)) { 466 const std::vector<WebPluginInfo>& plugins = group->second->GetPlugins();
511 FilePath path = plugins_[i].path; 467 for (size_t i = 0; i < plugins.size(); ++i) {
512 if (path.value() != kDefaultPluginLibraryName && 468 if (!group->second->IsPluginPlaceholder(plugins[i]) &&
513 visited_plugins.insert(path).second) { 469 WebPluginInfoUtils::IsEnabled(plugins[i]) &&
514 info->push_back(plugins_[i]); 470 WebPluginInfoUtils::SupportsType(plugins[i],
515 if (actual_mime_types) 471 mime_type, allow_wildcard)) {
516 actual_mime_types->push_back(mime_type); 472 FilePath path = plugins[i].path;
473 if (path.value() != kDefaultPluginLibraryName &&
474 visited_plugins.insert(path).second) {
475 info->push_back(plugins[i]);
476 if (actual_mime_types)
477 actual_mime_types->push_back(mime_type);
478 }
517 } 479 }
518 } 480 }
519 } 481 }
520 482
521 // Add in enabled plugins by url. 483 // Add in enabled plugins by url.
522 std::string path = url.path(); 484 std::string path = url.path();
523 std::string::size_type last_dot = path.rfind('.'); 485 std::string::size_type last_dot = path.rfind('.');
524 if (last_dot != std::string::npos) { 486 if (last_dot != std::string::npos) {
525 std::string extension = StringToLowerASCII(std::string(path, last_dot+1)); 487 std::string extension = StringToLowerASCII(std::string(path, last_dot+1));
526 std::string actual_mime_type; 488 std::string actual_mime_type;
527 for (size_t i = 0; i < plugins_.size(); ++i) { 489 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
528 if (plugins_[i].enabled && 490 group != plugin_groups_.end(); ++group) {
529 SupportsExtension(plugins_[i], extension, &actual_mime_type)) { 491 const std::vector<WebPluginInfo>& plugins = group->second->GetPlugins();
530 FilePath path = plugins_[i].path; 492 for (size_t i = 0; i < plugins.size(); ++i) {
531 if (path.value() != kDefaultPluginLibraryName && 493 if (!group->second->IsPluginPlaceholder(plugins[i]) &&
532 visited_plugins.insert(path).second) { 494 WebPluginInfoUtils::IsEnabled(plugins[i]) &&
533 info->push_back(plugins_[i]); 495 WebPluginInfoUtils::SupportsExtension(
534 if (actual_mime_types) 496 plugins[i], extension, &actual_mime_type)) {
535 actual_mime_types->push_back(actual_mime_type); 497 FilePath path = plugins[i].path;
498 if (path.value() != kDefaultPluginLibraryName &&
499 visited_plugins.insert(path).second) {
500 info->push_back(plugins[i]);
501 if (actual_mime_types)
502 actual_mime_types->push_back(actual_mime_type);
503 }
536 } 504 }
537 } 505 }
538 } 506 }
539 } 507 }
540 508
541 // Add in disabled plugins by mime type. 509 // Add in disabled plugins by mime type.
542 for (size_t i = 0; i < plugins_.size(); ++i) { 510 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
543 if (!plugins_[i].enabled && 511 group != plugin_groups_.end(); ++group) {
544 SupportsType(plugins_[i], mime_type, allow_wildcard)) { 512 const std::vector<WebPluginInfo>& plugins = group->second->GetPlugins();
545 FilePath path = plugins_[i].path; 513 for (size_t i = 0; i < plugins.size(); ++i) {
546 if (path.value() != kDefaultPluginLibraryName && 514 if (!group->second->IsPluginPlaceholder(plugins[i]) &&
547 visited_plugins.insert(path).second) { 515 !WebPluginInfoUtils::IsEnabled(plugins[i]) &&
548 info->push_back(plugins_[i]); 516 WebPluginInfoUtils::SupportsType(plugins[i],
549 if (actual_mime_types) 517 mime_type, allow_wildcard)) {
550 actual_mime_types->push_back(mime_type); 518 FilePath path = plugins[i].path;
519 if (path.value() != kDefaultPluginLibraryName &&
520 visited_plugins.insert(path).second) {
521 info->push_back(plugins[i]);
522 if (actual_mime_types)
523 actual_mime_types->push_back(mime_type);
524 }
551 } 525 }
552 } 526 }
553 } 527 }
554 528
555 // Add the default plugin at the end if it supports the mime type given, 529 // Add the default plugin at the end if it supports the mime type given,
556 // and the default plugin is enabled. 530 // and the default plugin is enabled.
557 if (!plugins_.empty() && webkit_glue::IsDefaultPluginEnabled()) { 531 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
558 const WebPluginInfo& default_info = plugins_.back(); 532 group != plugin_groups_.end(); ++group) {
559 if (SupportsType(default_info, mime_type, allow_wildcard)) { 533 #if defined(OS_WIN)
560 info->push_back(default_info); 534 if (group->first.compare(WideToUTF8(kDefaultPluginLibraryName)) == 0) {
561 if (actual_mime_types) 535 #else
562 actual_mime_types->push_back(mime_type); 536 if (group->first.compare(kDefaultPluginLibraryName) == 0) {
537 #endif
538 DCHECK_NE(0U, group->second->GetPlugins().size());
539 const WebPluginInfo& default_info = group->second->GetPlugins().front();
540 if (WebPluginInfoUtils::SupportsType(default_info,
541 mime_type, allow_wildcard)) {
542 info->push_back(default_info);
543 if (actual_mime_types)
544 actual_mime_types->push_back(mime_type);
545 }
563 } 546 }
564 } 547 }
565 } 548 }
566 549
567 bool PluginList::GetPluginInfo(const GURL& url, 550 bool PluginList::GetPluginInfo(const GURL& url,
568 const std::string& mime_type, 551 const std::string& mime_type,
569 bool allow_wildcard, 552 bool allow_wildcard,
570 WebPluginInfo* info, 553 WebPluginInfo* info,
571 std::string* actual_mime_type) { 554 std::string* actual_mime_type) {
572 DCHECK(info); 555 DCHECK(info);
(...skipping 17 matching lines...) Expand all
590 return true; 573 return true;
591 } 574 }
592 } 575 }
593 return false; 576 return false;
594 } 577 }
595 578
596 bool PluginList::GetPluginInfoByPath(const FilePath& plugin_path, 579 bool PluginList::GetPluginInfoByPath(const FilePath& plugin_path,
597 WebPluginInfo* info) { 580 WebPluginInfo* info) {
598 LoadPlugins(false); 581 LoadPlugins(false);
599 AutoLock lock(lock_); 582 AutoLock lock(lock_);
600 for (size_t i = 0; i < plugins_.size(); ++i) { 583 for (PluginGroup::PluginMap::const_iterator group = plugin_groups_.begin();
601 if (plugins_[i].path == plugin_path) { 584 group != plugin_groups_.end(); ++group) {
602 *info = plugins_[i]; 585 const std::vector<WebPluginInfo>& plugins = group->second->GetPlugins();
603 return true; 586 for (size_t i = 0; i < plugins.size(); ++i) {
587 if (!group->second->IsPluginPlaceholder(plugins[i]) &&
588 plugins[i].path == plugin_path) {
589 *info = plugins[i];
590 return true;
591 }
604 } 592 }
605 } 593 }
606 594
607 return false; 595 return false;
608 } 596 }
609 597
610 void PluginList::GetPluginGroups( 598 void PluginList::GetPluginGroups(
611 bool load_if_necessary, 599 bool load_if_necessary,
612 std::vector<PluginGroup>* plugin_groups) { 600 std::vector<PluginGroup>* plugin_groups) {
613 if (load_if_necessary) 601 if (load_if_necessary)
614 LoadPlugins(false); 602 LoadPlugins(false);
603 AutoLock lock(lock_);
615 plugin_groups->clear(); 604 plugin_groups->clear();
616 for (PluginGroup::PluginMap::const_iterator it = plugin_groups_.begin(); 605 for (PluginGroup::PluginMap::const_iterator it = plugin_groups_.begin();
617 it != plugin_groups_.end(); ++it) { 606 it != plugin_groups_.end(); ++it) {
618 if (!it->second->IsEmpty()) 607 if (!it->second->IsEmpty())
619 plugin_groups->push_back(*it->second); 608 plugin_groups->push_back(*it->second);
620 } 609 }
621 } 610 }
622 611
623 const PluginGroup* PluginList::GetPluginGroup( 612 const PluginGroup* PluginList::GetPluginGroup(
624 const WebPluginInfo& web_plugin_info) { 613 const WebPluginInfo& web_plugin_info) {
(...skipping 15 matching lines...) Expand all
640 PluginGroup* group = AddToPluginGroups(web_plugin_info); 629 PluginGroup* group = AddToPluginGroups(web_plugin_info);
641 return group->identifier(); 630 return group->identifier();
642 } 631 }
643 632
644 void PluginList::AddHardcodedPluginGroups() { 633 void PluginList::AddHardcodedPluginGroups() {
645 AutoLock lock(lock_); 634 AutoLock lock(lock_);
646 const PluginGroupDefinition* definitions = GetPluginGroupDefinitions(); 635 const PluginGroupDefinition* definitions = GetPluginGroupDefinitions();
647 for (size_t i = 0; i < GetPluginGroupDefinitionsSize(); ++i) { 636 for (size_t i = 0; i < GetPluginGroupDefinitionsSize(); ++i) {
648 PluginGroup* definition_group = PluginGroup::FromPluginGroupDefinition( 637 PluginGroup* definition_group = PluginGroup::FromPluginGroupDefinition(
649 definitions[i]); 638 definitions[i]);
639 ProcessGroupAfterInitialize(definition_group);
650 std::string identifier = definition_group->identifier(); 640 std::string identifier = definition_group->identifier();
651 DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end()); 641 DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end());
652 plugin_groups_.insert(std::make_pair(identifier, definition_group)); 642 plugin_groups_.insert(std::make_pair(identifier, definition_group));
653 } 643 }
654 } 644 }
655 645
656 PluginGroup* PluginList::AddToPluginGroups( 646 PluginGroup* PluginList::AddToPluginGroups(
657 const WebPluginInfo& web_plugin_info) { 647 const WebPluginInfo& web_plugin_info) {
658 PluginGroup* group = NULL; 648 PluginGroup* group = NULL;
659 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin(); 649 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
660 it != plugin_groups_.end(); ++it) { 650 it != plugin_groups_.end(); ++it) {
661 if (it->second->Match(web_plugin_info)) 651 if (it->second->Match(web_plugin_info)) {
662 group = it->second; 652 group = it->second;
653 break;
654 }
663 } 655 }
664 if (!group) { 656 if (!group) {
665 group = PluginGroup::FromWebPluginInfo(web_plugin_info); 657 group = PluginGroup::FromWebPluginInfo(web_plugin_info);
658 ProcessGroupAfterInitialize(group);
666 std::string identifier = group->identifier(); 659 std::string identifier = group->identifier();
667 // If the identifier is not unique, use the full path. This means that we 660 // If the identifier is not unique, use the full path. This means that we
668 // probably won't be able to search for this group by identifier, but at 661 // probably won't be able to search for this group by identifier, but at
669 // least it's going to be in the set of plugin groups, and if there 662 // least it's going to be in the set of plugin groups, and if there
670 // is already a plug-in with the same filename, it's probably going to 663 // is already a plug-in with the same filename, it's probably going to
671 // handle the same MIME types (and it has a higher priority), so this one 664 // handle the same MIME types (and it has a higher priority), so this one
672 // is not going to run anyway. 665 // is not going to run anyway.
673 if (plugin_groups_.find(identifier) != plugin_groups_.end()) 666 if (plugin_groups_.find(identifier) != plugin_groups_.end())
674 identifier = PluginGroup::GetLongIdentifier(web_plugin_info); 667 identifier = PluginGroup::GetLongIdentifier(web_plugin_info);
675 DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end()); 668 DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end());
676 plugin_groups_.insert(std::make_pair(identifier, group)); 669 plugin_groups_.insert(std::make_pair(identifier, group));
677 } 670 }
678 group->AddPlugin(web_plugin_info, next_priority_++); 671 bool is_new_addition = group->AddPlugin(web_plugin_info, next_priority_);
672 if (is_new_addition)
673 next_priority_++;
679 return group; 674 return group;
680 } 675 }
681 676
682 bool PluginList::EnablePlugin(const FilePath& filename) { 677 PluginGroup* PluginList::AddPlaceholderToPluginGroups(
683 AutoLock lock(lock_); 678 const FilePath& filename, const string16& name) {
684 679 WebPluginInfo plugin_info;
jam 2010/12/21 19:57:42 if I understand correctly, AddPlaceholderToPluginG
pastarmovj 2010/12/21 20:31:19 It is not so simple to keep this list of disabled
685 bool did_enable = false; 680 plugin_info.path = filename;
686 681 plugin_info.name = name;
687 std::set<FilePath>::iterator entry = disabled_plugins_.find(filename); 682 return AddToPluginGroups(plugin_info);
688 if (entry == disabled_plugins_.end())
689 return did_enable; // Early exit if plugin not in disabled list.
690
691 disabled_plugins_.erase(entry); // Remove from disabled list.
692
693 // Set enabled flags if necessary.
694 for (std::vector<WebPluginInfo>::iterator it = plugins_.begin();
695 it != plugins_.end();
696 ++it) {
697 if (it->path == filename) {
698 DCHECK(!it->enabled); // Should have been disabled.
699 it->enabled = true;
700 did_enable = true;
701 }
702 }
703
704 return did_enable;
705 } 683 }
706 684
707 bool PluginList::DisablePlugin(const FilePath& filename) { 685 bool PluginList::EnablePlugin(const FilePath& filename, const string16& name) {
708 AutoLock lock(lock_); 686 AutoLock lock(lock_);
687 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
688 it != plugin_groups_.end(); ++it) {
689 if (it->second->ContainsPlugin(filename))
690 return it->second->EnablePlugin(filename);
691 }
692 // No such group yet; add one as a placeholder.
693 PluginGroup* group = AddPlaceholderToPluginGroups(filename, name);
694 return group->EnablePlugin(filename);
695 }
709 696
710 bool did_disable = false; 697 bool PluginList::DisablePlugin(const FilePath& filename, const string16& name) {
711 698 AutoLock lock(lock_);
712 if (disabled_plugins_.find(filename) != disabled_plugins_.end()) 699 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
713 return did_disable; // Early exit if plugin already in disabled list. 700 it != plugin_groups_.end(); ++it) {
714 701 if (it->second->ContainsPlugin(filename))
715 disabled_plugins_.insert(filename); // Add to disabled list. 702 return it->second->DisablePlugin(filename);
716
717 // Unset enabled flags if necessary.
718 for (std::vector<WebPluginInfo>::iterator it = plugins_.begin();
719 it != plugins_.end();
720 ++it) {
721 if (it->path == filename) {
722 DCHECK(it->enabled); // Should have been enabled.
723 it->enabled = false;
724 did_disable = true;
725 }
726 } 703 }
727 704 // No such group yet; add one as a placeholder.
728 return did_disable; 705 PluginGroup* group = AddPlaceholderToPluginGroups(filename, name);
706 return group->DisablePlugin(filename);
729 } 707 }
730 708
731 bool PluginList::EnableGroup(bool enable, const string16& group_name) { 709 bool PluginList::EnableGroup(bool enable, const string16& group_name) {
732 bool did_change = false; 710 AutoLock lock(lock_);
733 { 711 PluginGroup* group = NULL;
734 AutoLock lock(lock_); 712 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
735 713 it != plugin_groups_.end(); ++it) {
736 std::set<string16>::iterator entry = disabled_groups_.find(group_name); 714 if (it->second->GetGroupName().find(group_name) != string16::npos) {
737 if (enable) { 715 group = it->second;
738 if (entry == disabled_groups_.end()) 716 break;
739 return did_change; // Early exit if group not in disabled list.
740 disabled_groups_.erase(entry); // Remove from disabled list.
741 } else {
742 if (entry != disabled_groups_.end())
743 return did_change; // Early exit if group already in disabled list.
744 disabled_groups_.insert(group_name);
745 } 717 }
746 } 718 }
747 719 if (!group) {
748 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin(); 720 group = PluginGroup::CreateEmptyGroup(group_name);
749 it != plugin_groups_.end(); ++it) { 721 plugin_groups_.insert(std::make_pair(UTF16ToUTF8(group_name), group));
750 if (it->second->GetGroupName() == group_name) {
751 if (it->second->Enabled() != enable) {
752 it->second->Enable(enable);
753 did_change = true;
754 break;
755 }
756 }
757 } 722 }
758 723
759 return did_change; 724 return group->EnableGroup(enable);
760 } 725 }
761 726
762 void PluginList::DisableOutdatedPluginGroups() { 727 void PluginList::DisableOutdatedPluginGroups() {
763 disable_outdated_plugins_ = true; 728 disable_outdated_plugins_ = true;
764 } 729 }
765 730
766 PluginList::~PluginList() { 731 PluginList::~PluginList() {
767 Shutdown(); 732 Shutdown();
768 } 733 }
769 734
770 void PluginList::Shutdown() { 735 void PluginList::Shutdown() {
771 // TODO 736 // TODO
772 // Note: plugin_groups_ contains simple pointers of type PluginGroup*, but 737 // Note: plugin_groups_ contains simple pointers of type PluginGroup*, but
773 // since this singleton lives until the process is destroyed, no explicit 738 // since this singleton lives until the process is destroyed, no explicit
774 // cleanup is necessary. 739 // cleanup is necessary.
775 // However, when running on Valgrind, we need to do the cleanup to keep the 740 // However, when running on Valgrind, we need to do the cleanup to keep the
776 // memory tree green. 741 // memory tree green.
777 #if defined(OS_POSIX) 742 #if defined(OS_POSIX)
778 if (RUNNING_ON_VALGRIND) { 743 if (RUNNING_ON_VALGRIND) {
779 STLDeleteContainerPairSecondPointers(plugin_groups_.begin(), 744 STLDeleteContainerPairSecondPointers(plugin_groups_.begin(),
780 plugin_groups_.end()); 745 plugin_groups_.end());
781 } 746 }
782 #endif 747 #endif
783 } 748 }
784 749
785 } // namespace npapi 750 } // namespace npapi
786 } // namespace webkit 751 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698