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

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

Issue 5699005: Policy: Re-enabled plugin still disabled (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: MacOS support patched in. 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/glue/plugins/plugin_list.h" 5 #include "webkit/glue/plugins/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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 } 159 }
160 160
161 bool PluginList::PluginsLoaded() { 161 bool PluginList::PluginsLoaded() {
162 AutoLock lock(lock_); 162 AutoLock lock(lock_);
163 return plugins_loaded_; 163 return plugins_loaded_;
164 } 164 }
165 165
166 void PluginList::RefreshPlugins() { 166 void PluginList::RefreshPlugins() {
167 AutoLock lock(lock_); 167 AutoLock lock(lock_);
168 plugins_need_refresh_ = true; 168 plugins_need_refresh_ = true;
169 plugins_vector_is_dirty_ = true;
169 } 170 }
170 171
171 void PluginList::AddExtraPluginPath(const FilePath& plugin_path) { 172 void PluginList::AddExtraPluginPath(const FilePath& plugin_path) {
172 // Chrome OS only loads plugins from /opt/google/chrome/plugins. 173 // Chrome OS only loads plugins from /opt/google/chrome/plugins.
173 #if !defined(OS_CHROMEOS) 174 #if !defined(OS_CHROMEOS)
174 AutoLock lock(lock_); 175 AutoLock lock(lock_);
175 extra_plugin_paths_.push_back(plugin_path); 176 extra_plugin_paths_.push_back(plugin_path);
176 #endif 177 #endif
177 } 178 }
178 179
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 274
274 info->mime_types.push_back(mime_type); 275 info->mime_types.push_back(mime_type);
275 } 276 }
276 277
277 return true; 278 return true;
278 } 279 }
279 280
280 PluginList::PluginList() 281 PluginList::PluginList()
281 : plugins_loaded_(false), 282 : plugins_loaded_(false),
282 plugins_need_refresh_(false), 283 plugins_need_refresh_(false),
284 plugins_vector_is_dirty_(false),
283 disable_outdated_plugins_(false), 285 disable_outdated_plugins_(false),
284 next_priority_(0) { 286 next_priority_(0) {
285 PlatformInit(); 287 PlatformInit();
286 AddHardcodedPluginGroups(); 288 AddHardcodedPluginGroups();
287 } 289 }
288 290
289 bool PluginList::ShouldDisableGroup(const string16& group_name) { 291 bool PluginList::ShouldDisableGroup(const string16& group_name) {
290 AutoLock lock(lock_); 292 AutoLock lock(lock_);
291 if (PluginGroup::IsPluginNameDisabledByPolicy(group_name)) { 293 if (PluginGroup::IsPluginNameDisabledByPolicy(group_name)) {
292 disabled_groups_.insert(group_name); 294 disabled_groups_.insert(DisabledGroupsListElement(group_name, POLICY));
293 return true; 295 return true;
294 } 296 }
295 return disabled_groups_.count(group_name) > 0; 297 return disabled_groups_.count(group_name) > 0;
296 } 298 }
297 299
298 void PluginList::LoadPlugins(bool refresh) { 300 void PluginList::LoadPlugins(bool refresh) {
299 // Don't want to hold the lock while loading new plugins, so we don't block 301 // Don't want to hold the lock while loading new plugins, so we don't block
300 // other methods if they're called on other threads. 302 // other methods if they're called on other threads.
301 std::vector<FilePath> extra_plugin_paths; 303 std::vector<FilePath> extra_plugin_paths;
302 std::vector<FilePath> extra_plugin_dirs; 304 std::vector<FilePath> extra_plugin_dirs;
303 std::vector<PluginVersionInfo> internal_plugins; 305 std::vector<PluginVersionInfo> internal_plugins;
304 { 306 {
305 AutoLock lock(lock_); 307 AutoLock lock(lock_);
306 if (plugins_loaded_ && !refresh && !plugins_need_refresh_) 308 if (plugins_loaded_ && !refresh && !plugins_need_refresh_)
307 return; 309 return;
308 310
309 // Clear the refresh bit now, because it might get set again before we 311 // Clear the refresh bit now, because it might get set again before we
310 // reach the end of the method. 312 // reach the end of the method.
311 plugins_need_refresh_ = false; 313 plugins_need_refresh_ = false;
312 extra_plugin_paths = extra_plugin_paths_; 314 extra_plugin_paths = extra_plugin_paths_;
313 extra_plugin_dirs = extra_plugin_dirs_; 315 extra_plugin_dirs = extra_plugin_dirs_;
314 internal_plugins = internal_plugins_; 316 internal_plugins = internal_plugins_;
315 } 317 }
316 318
317 std::vector<WebPluginInfo> new_plugins;
318 std::set<FilePath> visited_plugins; 319 std::set<FilePath> visited_plugins;
319 320
320 std::vector<FilePath> directories_to_scan; 321 std::vector<FilePath> directories_to_scan;
321 GetPluginDirectories(&directories_to_scan); 322 GetPluginDirectories(&directories_to_scan);
322 323
323 // Load internal plugins first so that, if both an internal plugin and a 324 // Load internal plugins first so that, if both an internal plugin and a
324 // "discovered" plugin want to handle the same type, the internal plugin 325 // "discovered" plugin want to handle the same type, the internal plugin
325 // will have precedence. 326 // will have precedence.
326 for (size_t i = 0; i < internal_plugins.size(); ++i) { 327 for (size_t i = 0; i < internal_plugins.size(); ++i) {
327 if (internal_plugins[i].path.value() == kDefaultPluginLibraryName) 328 if (internal_plugins[i].path.value() == kDefaultPluginLibraryName)
328 continue; 329 continue;
329 LoadPlugin(internal_plugins[i].path, &new_plugins); 330 LoadPlugin(internal_plugins[i].path);
330 } 331 }
331 332
332 for (size_t i = 0; i < extra_plugin_paths.size(); ++i) { 333 for (size_t i = 0; i < extra_plugin_paths.size(); ++i) {
333 const FilePath& path = extra_plugin_paths[i]; 334 const FilePath& path = extra_plugin_paths[i];
334 if (visited_plugins.find(path) != visited_plugins.end()) 335 if (visited_plugins.find(path) != visited_plugins.end())
335 continue; 336 continue;
336 LoadPlugin(path, &new_plugins); 337 LoadPlugin(path);
337 visited_plugins.insert(path); 338 visited_plugins.insert(path);
338 } 339 }
339 340
340 for (size_t i = 0; i < extra_plugin_dirs.size(); ++i) { 341 for (size_t i = 0; i < extra_plugin_dirs.size(); ++i) {
341 LoadPluginsFromDir(extra_plugin_dirs[i], &new_plugins, &visited_plugins); 342 LoadPluginsFromDir(extra_plugin_dirs[i], &visited_plugins);
342 } 343 }
343 344
344 for (size_t i = 0; i < directories_to_scan.size(); ++i) { 345 for (size_t i = 0; i < directories_to_scan.size(); ++i) {
345 LoadPluginsFromDir(directories_to_scan[i], &new_plugins, &visited_plugins); 346 LoadPluginsFromDir(directories_to_scan[i], &visited_plugins);
346 } 347 }
347 348
348 #if defined(OS_WIN) 349 #if defined(OS_WIN)
349 LoadPluginsFromRegistry(&new_plugins, &visited_plugins); 350 LoadPluginsFromRegistry(&new_plugins, &visited_plugins);
350 #endif 351 #endif
351 352
352 // Load the default plugin last. 353 // Load the default plugin last.
353 if (webkit_glue::IsDefaultPluginEnabled()) 354 if (webkit_glue::IsDefaultPluginEnabled())
354 LoadPlugin(FilePath(kDefaultPluginLibraryName), &new_plugins); 355 LoadPlugin(FilePath(kDefaultPluginLibraryName));
355 356
356 // Disable all of the plugins and plugin groups that are disabled by policy. 357 // Disable all of the plugins and plugin groups that are disabled by policy.
357 // There's currenly a bug that makes it impossible to correctly re-enable 358 // There's currenly a bug that makes it impossible to correctly re-enable
358 // plugins or plugin-groups to their original, "pre-policy" state, so 359 // plugins or plugin-groups to their original, "pre-policy" state, so
359 // plugins and groups are only changed to a more "safe" state after a policy 360 // plugins and groups are only changed to a more "safe" state after a policy
360 // change, i.e. from enabled to disabled. See bug 54681. 361 // change, i.e. from enabled to disabled. See bug 54681.
361 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin(); 362 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
362 it != plugin_groups_.end(); ++it) { 363 it != plugin_groups_.end(); ++it) {
363 PluginGroup* group = it->second; 364 PluginGroup* group = it->second;
364 string16 group_name = group->GetGroupName(); 365 string16 group_name = group->GetGroupName();
365 if (ShouldDisableGroup(group_name)) { 366 if (ShouldDisableGroup(group_name)) {
366 group->Enable(false); 367 group->Enable(false);
367 } 368 }
368 369
369 if (disable_outdated_plugins_) { 370 if (disable_outdated_plugins_) {
370 group->DisableOutdatedPlugins(); 371 group->DisableOutdatedPlugins();
371 } 372 }
372 if (!group->Enabled()) { 373 if (!group->Enabled()) {
373 AutoLock lock(lock_); 374 AutoLock lock(lock_);
374 disabled_groups_.insert(group_name); 375 if(0 == disabled_groups_.count(group_name))
danno 2010/12/14 09:43:39 use == 0 formatting (reverse order). compiler give
pastarmovj 2010/12/15 14:44:51 Done.
376 disabled_groups_.insert(DisabledGroupsListElement(group_name, USER));
375 } 377 }
376 } 378 }
377 379
378 // Only update the data now since loading plugins can take a while. 380 // Only update the data now since loading plugins can take a while.
381 RebuildPluginsList();
danno 2010/12/14 09:43:39 You also acquire the lock inside of RebuildPluginL
pastarmovj 2010/12/15 14:44:51 I have to for the plugins_loaded_ flag. However th
382 //plugins_ = new_plugins;
379 AutoLock lock(lock_); 383 AutoLock lock(lock_);
380
381 plugins_ = new_plugins;
382 plugins_loaded_ = true; 384 plugins_loaded_ = true;
383 } 385 }
384 386
385 void PluginList::LoadPlugin(const FilePath& path, 387 void PluginList::RebuildPluginsList() {
386 std::vector<WebPluginInfo>* plugins) { 388 AutoLock lock(lock_);
389 if(!plugins_vector_is_dirty_) return;
390 plugins_vector_is_dirty_ = false;
391
392 std::vector<WebPluginInfo*> new_plugins;
393 new_plugins.resize(this->next_priority_);
394 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
395 it != plugin_groups_.end(); ++it) {
396 std::vector<WebPluginInfo>& group_plugins = it->second->GetPlugins();
397 std::vector<int>::iterator itprio =
398 it->second->GetPluginPositions().begin();
399 for (std::vector<WebPluginInfo>::iterator itp = group_plugins.begin();
400 itp != group_plugins.end();
401 ++itp,++itprio) {
402 new_plugins[*itprio] = &(*itp);
danno 2010/12/14 09:43:39 Whoa. Taking the address of a dereferenced iterato
pastarmovj 2010/12/15 14:44:51 Cool right ;)
403 }
404 }
405 plugins_ = new_plugins;
406 }
407
408 void PluginList::LoadPlugin(const FilePath& path) {
Bernhard Bauer 2010/12/14 04:21:49 Drive-by: Removing the |plugins| parameter may see
pastarmovj 2010/12/15 14:44:51 Done.
387 LOG_IF(ERROR, PluginList::DebugPluginLoading()) 409 LOG_IF(ERROR, PluginList::DebugPluginLoading())
388 << "Loading plugin " << path.value(); 410 << "Loading plugin " << path.value();
389 411
390 WebPluginInfo plugin_info; 412 WebPluginInfo plugin_info;
391 const PluginEntryPoints* entry_points; 413 const PluginEntryPoints* entry_points;
392 414
393 if (!ReadPluginInfo(path, &plugin_info, &entry_points)) 415 if (!ReadPluginInfo(path, &plugin_info, &entry_points))
394 return; 416 return;
395 417
396 if (!ShouldLoadPlugin(plugin_info, plugins)) 418 if (!ShouldLoadPlugin(plugin_info))
397 return; 419 return;
398 420
399 if (path.value() != kDefaultPluginLibraryName 421 if (path.value() != kDefaultPluginLibraryName
400 #if defined(OS_WIN) && !defined(NDEBUG) 422 #if defined(OS_WIN) && !defined(NDEBUG)
401 && path.BaseName().value() != L"npspy.dll" // Make an exception for NPSPY 423 && path.BaseName().value() != L"npspy.dll" // Make an exception for NPSPY
402 #endif 424 #endif
403 ) { 425 ) {
404 for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) { 426 for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) {
405 // TODO: don't load global handlers for now. 427 // TODO: don't load global handlers for now.
406 // WebKit hands to the Plugin before it tries 428 // WebKit hands to the Plugin before it tries
407 // to handle mimeTypes on its own. 429 // to handle mimeTypes on its own.
408 const std::string &mime_type = plugin_info.mime_types[i].mime_type; 430 const std::string &mime_type = plugin_info.mime_types[i].mime_type;
409 if (mime_type == "*" ) 431 if (mime_type == "*" )
410 return; 432 return;
411 } 433 }
412 } 434 }
413 435
414 // Mark disabled plugins as such. (This has to happen before calling 436 // Mark disabled plugins as such. (This has to happen before calling
415 // |AddToPluginGroups(plugin_info)|.) 437 // |AddToPluginGroups(plugin_info)|.)
416 if (disabled_plugins_.count(plugin_info.path)) { 438 if (disabled_plugins_.count(plugin_info.path)) {
417 plugin_info.enabled = false; 439 plugin_info.enabled = false;
418 } else { 440 } else {
419 plugin_info.enabled = true; 441 plugin_info.enabled = true;
420 } 442 }
421 443
422 AutoLock lock(lock_); 444 AutoLock lock(lock_);
423 plugins->push_back(plugin_info);
424 AddToPluginGroups(plugin_info); 445 AddToPluginGroups(plugin_info);
425 } 446 }
426 447
427 bool PluginList::SupportsType(const WebPluginInfo& info, 448 bool PluginList::SupportsType(const WebPluginInfo& info,
428 const std::string &mime_type, 449 const std::string &mime_type,
429 bool allow_wildcard) { 450 bool allow_wildcard) {
430 // Webkit will ask for a plugin to handle empty mime types. 451 // Webkit will ask for a plugin to handle empty mime types.
431 if (mime_type.empty()) 452 if (mime_type.empty())
432 return false; 453 return false;
433 454
(...skipping 24 matching lines...) Expand all
458 } 479 }
459 480
460 return false; 481 return false;
461 } 482 }
462 483
463 484
464 void PluginList::GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins) { 485 void PluginList::GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins) {
465 LoadPlugins(refresh); 486 LoadPlugins(refresh);
466 487
467 AutoLock lock(lock_); 488 AutoLock lock(lock_);
468 *plugins = plugins_; 489 for (std::vector<WebPluginInfo*>::const_iterator it = plugins_.begin();
490 it != plugins_.end();
491 ++it) {
492 plugins->push_back(**it);
493 }
469 } 494 }
470 495
471 void PluginList::GetEnabledPlugins(bool refresh, 496 void PluginList::GetEnabledPlugins(bool refresh,
472 std::vector<WebPluginInfo>* plugins) { 497 std::vector<WebPluginInfo>* plugins) {
473 LoadPlugins(refresh); 498 LoadPlugins(refresh);
474 499
475 plugins->clear(); 500 plugins->clear();
476 AutoLock lock(lock_); 501 AutoLock lock(lock_);
477 for (std::vector<WebPluginInfo>::const_iterator it = plugins_.begin(); 502 for (std::vector<WebPluginInfo*>::const_iterator it = plugins_.begin();
478 it != plugins_.end(); 503 it != plugins_.end();
479 ++it) { 504 ++it) {
480 if (it->enabled) 505 if ((*it)->enabled)
481 plugins->push_back(*it); 506 plugins->push_back(**it);
482 } 507 }
483 } 508 }
484 509
485 void PluginList::GetPluginInfoArray( 510 void PluginList::GetPluginInfoArray(
486 const GURL& url, 511 const GURL& url,
487 const std::string& mime_type, 512 const std::string& mime_type,
488 bool allow_wildcard, 513 bool allow_wildcard,
489 std::vector<WebPluginInfo>* info, 514 std::vector<WebPluginInfo>* info,
490 std::vector<std::string>* actual_mime_types) { 515 std::vector<std::string>* actual_mime_types) {
491 DCHECK(mime_type == StringToLowerASCII(mime_type)); 516 DCHECK(mime_type == StringToLowerASCII(mime_type));
492 DCHECK(info); 517 DCHECK(info);
493 518
494 LoadPlugins(false); 519 LoadPlugins(false);
495 AutoLock lock(lock_); 520 AutoLock lock(lock_);
496 info->clear(); 521 info->clear();
497 if (actual_mime_types) 522 if (actual_mime_types)
498 actual_mime_types->clear(); 523 actual_mime_types->clear();
499 524
500 std::set<FilePath> visited_plugins; 525 std::set<FilePath> visited_plugins;
501 526
502 // Add in enabled plugins by mime type. 527 // Add in enabled plugins by mime type.
503 WebPluginInfo default_plugin; 528 WebPluginInfo default_plugin;
504 for (size_t i = 0; i < plugins_.size(); ++i) { 529 for (size_t i = 0; i < plugins_.size(); ++i) {
505 if (plugins_[i].enabled && 530 if (plugins_[i]->enabled &&
506 SupportsType(plugins_[i], mime_type, allow_wildcard)) { 531 SupportsType(*plugins_[i], mime_type, allow_wildcard)) {
507 FilePath path = plugins_[i].path; 532 FilePath path = plugins_[i]->path;
508 if (path.value() != kDefaultPluginLibraryName && 533 if (path.value() != kDefaultPluginLibraryName &&
509 visited_plugins.insert(path).second) { 534 visited_plugins.insert(path).second) {
510 info->push_back(plugins_[i]); 535 info->push_back(*plugins_[i]);
511 if (actual_mime_types) 536 if (actual_mime_types)
512 actual_mime_types->push_back(mime_type); 537 actual_mime_types->push_back(mime_type);
513 } 538 }
514 } 539 }
515 } 540 }
516 541
517 // Add in enabled plugins by url. 542 // Add in enabled plugins by url.
518 std::string path = url.path(); 543 std::string path = url.path();
519 std::string::size_type last_dot = path.rfind('.'); 544 std::string::size_type last_dot = path.rfind('.');
520 if (last_dot != std::string::npos) { 545 if (last_dot != std::string::npos) {
521 std::string extension = StringToLowerASCII(std::string(path, last_dot+1)); 546 std::string extension = StringToLowerASCII(std::string(path, last_dot+1));
522 std::string actual_mime_type; 547 std::string actual_mime_type;
523 for (size_t i = 0; i < plugins_.size(); ++i) { 548 for (size_t i = 0; i < plugins_.size(); ++i) {
524 if (plugins_[i].enabled && 549 if (plugins_[i]->enabled &&
525 SupportsExtension(plugins_[i], extension, &actual_mime_type)) { 550 SupportsExtension(*plugins_[i], extension, &actual_mime_type)) {
526 FilePath path = plugins_[i].path; 551 FilePath path = plugins_[i]->path;
527 if (path.value() != kDefaultPluginLibraryName && 552 if (path.value() != kDefaultPluginLibraryName &&
528 visited_plugins.insert(path).second) { 553 visited_plugins.insert(path).second) {
529 info->push_back(plugins_[i]); 554 info->push_back(*plugins_[i]);
530 if (actual_mime_types) 555 if (actual_mime_types)
531 actual_mime_types->push_back(actual_mime_type); 556 actual_mime_types->push_back(actual_mime_type);
532 } 557 }
533 } 558 }
534 } 559 }
535 } 560 }
536 561
537 // Add in disabled plugins by mime type. 562 // Add in disabled plugins by mime type.
538 for (size_t i = 0; i < plugins_.size(); ++i) { 563 for (size_t i = 0; i < plugins_.size(); ++i) {
539 if (!plugins_[i].enabled && 564 if (!plugins_[i]->enabled &&
540 SupportsType(plugins_[i], mime_type, allow_wildcard)) { 565 SupportsType(*plugins_[i], mime_type, allow_wildcard)) {
541 FilePath path = plugins_[i].path; 566 FilePath path = plugins_[i]->path;
542 if (path.value() != kDefaultPluginLibraryName && 567 if (path.value() != kDefaultPluginLibraryName &&
543 visited_plugins.insert(path).second) { 568 visited_plugins.insert(path).second) {
544 info->push_back(plugins_[i]); 569 info->push_back(*plugins_[i]);
545 if (actual_mime_types) 570 if (actual_mime_types)
546 actual_mime_types->push_back(mime_type); 571 actual_mime_types->push_back(mime_type);
547 } 572 }
548 } 573 }
549 } 574 }
550 575
551 // Add the default plugin at the end if it supports the mime type given, 576 // Add the default plugin at the end if it supports the mime type given,
552 // and the default plugin is enabled. 577 // and the default plugin is enabled.
553 if (!plugins_.empty() && webkit_glue::IsDefaultPluginEnabled()) { 578 if (!plugins_.empty() && webkit_glue::IsDefaultPluginEnabled()) {
554 const WebPluginInfo& default_info = plugins_.back(); 579 const WebPluginInfo& default_info = *plugins_.back();
555 if (SupportsType(default_info, mime_type, allow_wildcard)) { 580 if (SupportsType(default_info, mime_type, allow_wildcard)) {
556 info->push_back(default_info); 581 info->push_back(default_info);
557 if (actual_mime_types) 582 if (actual_mime_types)
558 actual_mime_types->push_back(mime_type); 583 actual_mime_types->push_back(mime_type);
559 } 584 }
560 } 585 }
561 } 586 }
562 587
563 bool PluginList::GetPluginInfo(const GURL& url, 588 bool PluginList::GetPluginInfo(const GURL& url,
564 const std::string& mime_type, 589 const std::string& mime_type,
(...skipping 22 matching lines...) Expand all
587 } 612 }
588 } 613 }
589 return false; 614 return false;
590 } 615 }
591 616
592 bool PluginList::GetPluginInfoByPath(const FilePath& plugin_path, 617 bool PluginList::GetPluginInfoByPath(const FilePath& plugin_path,
593 WebPluginInfo* info) { 618 WebPluginInfo* info) {
594 LoadPlugins(false); 619 LoadPlugins(false);
595 AutoLock lock(lock_); 620 AutoLock lock(lock_);
596 for (size_t i = 0; i < plugins_.size(); ++i) { 621 for (size_t i = 0; i < plugins_.size(); ++i) {
597 if (plugins_[i].path == plugin_path) { 622 if (plugins_[i]->path == plugin_path) {
598 *info = plugins_[i]; 623 *info = *plugins_[i];
599 return true; 624 return true;
600 } 625 }
601 } 626 }
602 627
603 return false; 628 return false;
604 } 629 }
605 630
606 void PluginList::GetPluginGroups( 631 void PluginList::GetPluginGroups(
607 bool load_if_necessary, 632 bool load_if_necessary,
608 std::vector<PluginGroup>* plugin_groups) { 633 std::vector<PluginGroup>* plugin_groups) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 // probably won't be able to search for this group by identifier, but at 688 // probably won't be able to search for this group by identifier, but at
664 // least it's going to be in the set of plugin groups, and if there 689 // least it's going to be in the set of plugin groups, and if there
665 // is already a plug-in with the same filename, it's probably going to 690 // is already a plug-in with the same filename, it's probably going to
666 // handle the same MIME types (and it has a higher priority), so this one 691 // handle the same MIME types (and it has a higher priority), so this one
667 // is not going to run anyway. 692 // is not going to run anyway.
668 if (plugin_groups_.find(identifier) != plugin_groups_.end()) 693 if (plugin_groups_.find(identifier) != plugin_groups_.end())
669 identifier = PluginGroup::GetLongIdentifier(web_plugin_info); 694 identifier = PluginGroup::GetLongIdentifier(web_plugin_info);
670 DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end()); 695 DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end());
671 plugin_groups_.insert(std::make_pair(identifier, group)); 696 plugin_groups_.insert(std::make_pair(identifier, group));
672 } 697 }
673 group->AddPlugin(web_plugin_info, next_priority_++); 698 if(group->AddPlugin(web_plugin_info, next_priority_++)){
699 // We don't need to protect the flag here because it is protected from the
700 // callers of |AddToPluginGroups|.
701 plugins_vector_is_dirty_ = true;
702 }
674 return group; 703 return group;
675 } 704 }
676 705
677 bool PluginList::EnablePlugin(const FilePath& filename) { 706 bool PluginList::EnablePlugin(const FilePath& filename) {
707 RebuildPluginsList();
678 AutoLock lock(lock_); 708 AutoLock lock(lock_);
679 709
680 bool did_enable = false; 710 bool did_enable = false;
681 711
682 std::set<FilePath>::iterator entry = disabled_plugins_.find(filename); 712 DisabledPluginsList::iterator entry =
683 if (entry == disabled_plugins_.end()) 713 disabled_plugins_.find(filename);
714 if (entry == disabled_plugins_.end() || entry->second == POLICY)
684 return did_enable; // Early exit if plugin not in disabled list. 715 return did_enable; // Early exit if plugin not in disabled list.
685 716
686 disabled_plugins_.erase(entry); // Remove from disabled list. 717 disabled_plugins_.erase(entry); // Remove from disabled list.
687 718
688 // Set enabled flags if necessary. 719 // Set enabled flags if necessary.
689 for (std::vector<WebPluginInfo>::iterator it = plugins_.begin(); 720 for (std::vector<WebPluginInfo*>::iterator it = plugins_.begin();
690 it != plugins_.end(); 721 it != plugins_.end();
691 ++it) { 722 ++it) {
692 if (it->path == filename) { 723 if ((*it)->path == filename) {
693 DCHECK(!it->enabled); // Should have been disabled. 724 DCHECK(!(*it)->enabled); // Should have been disabled.
694 it->enabled = true; 725 (*it)->enabled = true;
726 AddToPluginGroups(**it)->RefreshEnabledState();
695 did_enable = true; 727 did_enable = true;
696 } 728 }
697 } 729 }
698 730
699 return did_enable; 731 return did_enable;
700 } 732 }
701 733
702 bool PluginList::DisablePlugin(const FilePath& filename) { 734 bool PluginList::DisablePlugin(const FilePath& filename, bool policy_disabled) {
735 RebuildPluginsList();
703 AutoLock lock(lock_); 736 AutoLock lock(lock_);
704 737
705 bool did_disable = false; 738 bool did_disable = false;
706 739
707 if (disabled_plugins_.find(filename) != disabled_plugins_.end()) 740 DisabledPluginsList::iterator entry =
741 disabled_plugins_.find(filename);
742 if (entry != disabled_plugins_.end())
743 {
744 if ((entry->second == POLICY && !policy_disabled) ||
745 (entry->second == USER && policy_disabled))
746 entry->second = POLICY_AND_USER;
708 return did_disable; // Early exit if plugin already in disabled list. 747 return did_disable; // Early exit if plugin already in disabled list.
748 }
709 749
710 disabled_plugins_.insert(filename); // Add to disabled list. 750 // Add to disabled list.
751 disabled_plugins_.insert(
752 DisabledPluginsListElement(filename, policy_disabled ? POLICY : USER));
711 753
712 // Unset enabled flags if necessary. 754 // Unset enabled flags if necessary.
713 for (std::vector<WebPluginInfo>::iterator it = plugins_.begin(); 755 for (std::vector<WebPluginInfo*>::iterator it = plugins_.begin();
714 it != plugins_.end(); 756 it != plugins_.end();
715 ++it) { 757 ++it) {
716 if (it->path == filename) { 758 if ((*it)->path == filename) {
717 DCHECK(it->enabled); // Should have been enabled. 759 DCHECK((*it)->enabled); // Should have been enabled.
718 it->enabled = false; 760 (*it)->enabled = false;
761 AddToPluginGroups(**it)->RefreshEnabledState();
719 did_disable = true; 762 did_disable = true;
720 } 763 }
721 } 764 }
722 765
723 return did_disable; 766 return did_disable;
724 } 767 }
725 768
726 bool PluginList::EnableGroup(bool enable, const string16& group_name) { 769 bool PluginList::EnableGroup(bool enable, const string16& group_name) {
727 bool did_change = false; 770 bool did_change = false;
728 { 771 {
729 AutoLock lock(lock_); 772 AutoLock lock(lock_);
730 773
731 std::set<string16>::iterator entry = disabled_groups_.find(group_name); 774 DisabledGroupsList::iterator entry =
775 disabled_groups_.find(group_name);
732 if (enable) { 776 if (enable) {
733 if (entry == disabled_groups_.end()) 777 if (entry == disabled_groups_.end() || entry->second == POLICY)
734 return did_change; // Early exit if group not in disabled list. 778 return did_change; // Early exit if group not in disabled list.
735 disabled_groups_.erase(entry); // Remove from disabled list. 779 disabled_groups_.erase(entry); // Remove from disabled list.
736 } else { 780 } else {
737 if (entry != disabled_groups_.end()) 781 if (entry != disabled_groups_.end())
738 return did_change; // Early exit if group already in disabled list. 782 return did_change; // Early exit if group already in disabled list.
739 disabled_groups_.insert(group_name); 783 disabled_groups_.insert(
784 DisabledGroupsListElement(
785 group_name,
786 PluginGroup::IsPluginNameDisabledByPolicy(group_name) ?
787 POLICY : USER));
740 } 788 }
741 } 789 }
742 790
743 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin(); 791 for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
744 it != plugin_groups_.end(); ++it) { 792 it != plugin_groups_.end(); ++it) {
745 if (it->second->GetGroupName() == group_name) { 793 if (it->second->GetGroupName() == group_name) {
746 if (it->second->Enabled() != enable) { 794 if (it->second->Enabled() != enable) {
747 it->second->Enable(enable); 795 it->second->Enable(enable);
748 did_change = true; 796 did_change = true;
749 break; 797 break;
750 } 798 }
751 } 799 }
752 } 800 }
753 801
754 return did_change; 802 return did_change;
755 } 803 }
756 804
757 void PluginList::DisableOutdatedPluginGroups() { 805 void PluginList::DisableOutdatedPluginGroups() {
758 disable_outdated_plugins_ = true; 806 disable_outdated_plugins_ = true;
759 } 807 }
760 808
809 void PluginList::GetDisabledPlugins(DisabledPluginsList* disabled_plugins) {
810 AutoLock lock(lock_);
811 *disabled_plugins = disabled_plugins_;
812 }
813
814 void PluginList::GetDisabledGroups(DisabledGroupsList* disabled_groups) {
815 AutoLock lock(lock_);
816 *disabled_groups = disabled_groups_;
817 }
818
761 PluginList::~PluginList() { 819 PluginList::~PluginList() {
762 Shutdown(); 820 Shutdown();
763 } 821 }
764 822
765 void PluginList::Shutdown() { 823 void PluginList::Shutdown() {
766 // TODO 824 // TODO
767 // Note: plugin_groups_ contains simple pointers of type PluginGroup*, but 825 // Note: plugin_groups_ contains simple pointers of type PluginGroup*, but
768 // since this singleton lives until the process is destroyed, no explicit 826 // since this singleton lives until the process is destroyed, no explicit
769 // cleanup is necessary. 827 // cleanup is necessary.
770 // However, when running on Valgrind, we need to do the cleanup to keep the 828 // However, when running on Valgrind, we need to do the cleanup to keep the
771 // memory tree green. 829 // memory tree green.
772 #if defined(OS_POSIX) 830 #if defined(OS_POSIX)
773 if (RUNNING_ON_VALGRIND) { 831 if (RUNNING_ON_VALGRIND) {
774 STLDeleteContainerPairSecondPointers(plugin_groups_.begin(), 832 STLDeleteContainerPairSecondPointers(plugin_groups_.begin(),
775 plugin_groups_.end()); 833 plugin_groups_.end());
776 } 834 }
777 #endif 835 #endif
778 } 836 }
779 837
780 } // namespace NPAPI 838 } // namespace NPAPI
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698