diff options
author | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-21 15:00:34 +0000 |
---|---|---|
committer | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-21 15:00:34 +0000 |
commit | 74b8d3e4e52a6419a98ecc40b6f6710f7911726d (patch) | |
tree | e8f076d596363ea2ac0cc61831260c3d395a9436 | |
parent | 0b7ba8c5a0f954e8dea8709a34a5b5f0dc40c615 (diff) | |
download | chromium_src-74b8d3e4e52a6419a98ecc40b6f6710f7911726d.zip chromium_src-74b8d3e4e52a6419a98ecc40b6f6710f7911726d.tar.gz chromium_src-74b8d3e4e52a6419a98ecc40b6f6710f7911726d.tar.bz2 |
Add a unique identifier for plugin groups and use it to identify blocked plugins.
Currently we use the plugin path as identifier for per-plugin content settings, which is not stable across Chrome updates or plugin moves.
The new identifier is either hardcoded (for predefined plugin groups), or the filename without path.
BUG=39252
TEST=none
Review URL: http://codereview.chromium.org/3384014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60054 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/cocoa/content_setting_bubble_cocoa.mm | 13 | ||||
-rw-r--r-- | chrome/browser/gtk/content_setting_bubble_gtk.cc | 13 | ||||
-rw-r--r-- | chrome/browser/plugin_updater.cc | 71 | ||||
-rw-r--r-- | chrome/browser/plugin_updater.h | 13 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.cc | 11 | ||||
-rw-r--r-- | chrome/browser/views/content_setting_bubble_contents.cc | 14 | ||||
-rw-r--r-- | chrome/common/plugin_group.cc | 106 | ||||
-rw-r--r-- | chrome/common/plugin_group.h | 19 | ||||
-rw-r--r-- | chrome/common/plugin_group_unittest.cc | 8 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 11 |
10 files changed, 155 insertions, 124 deletions
diff --git a/chrome/browser/cocoa/content_setting_bubble_cocoa.mm b/chrome/browser/cocoa/content_setting_bubble_cocoa.mm index 6250b8c..de7167c 100644 --- a/chrome/browser/cocoa/content_setting_bubble_cocoa.mm +++ b/chrome/browser/cocoa/content_setting_bubble_cocoa.mm @@ -16,7 +16,9 @@ #import "chrome/browser/cocoa/l10n_util.h" #include "chrome/browser/content_setting_bubble_model.h" #include "chrome/browser/host_content_settings_map.h" +#include "chrome/browser/plugin_updater.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/plugin_group.h" #include "grit/generated_resources.h" #include "skia/ext/skia_utils_mac.h" #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" @@ -241,14 +243,13 @@ NSTextField* LabelWithFrame(NSString* text, const NSRect& frame) { } else { for (std::set<std::string>::iterator it = plugins.begin(); it != plugins.end(); ++it) { - WebPluginInfo plugin; NSString* name; - if (NPAPI::PluginList::Singleton()-> - GetPluginInfoByPath(FilePath(*it), &plugin)) { - name = base::SysUTF16ToNSString(plugin.name); - } else { + PluginUpdater::PluginMap groups; + PluginUpdater::GetPluginUpdater()->GetPluginGroups(&groups); + if (groups.find(*it) != groups.end()) + name = base::SysUTF16ToNSString(groups[*it]->GetGroupName()); + else name = base::SysUTF8ToNSString(*it); - } [pluginArray addObject:name]; } [blockedResourcesField_ diff --git a/chrome/browser/gtk/content_setting_bubble_gtk.cc b/chrome/browser/gtk/content_setting_bubble_gtk.cc index d9edf39..116b3a3 100644 --- a/chrome/browser/gtk/content_setting_bubble_gtk.cc +++ b/chrome/browser/gtk/content_setting_bubble_gtk.cc @@ -14,11 +14,13 @@ #include "chrome/browser/gtk/gtk_util.h" #include "chrome/browser/gtk/options/content_settings_window_gtk.h" #include "chrome/browser/host_content_settings_map.h" +#include "chrome/browser/plugin_updater.h" #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/common/content_settings.h" #include "chrome/common/notification_service.h" #include "chrome/common/notification_type.h" +#include "chrome/common/plugin_group.h" #include "gfx/gtk_util.h" #include "grit/app_resources.h" #include "grit/generated_resources.h" @@ -87,14 +89,13 @@ void ContentSettingBubbleGtk::BuildBubble() { for (std::set<std::string>::const_iterator it = plugins.begin(); it != plugins.end(); ++it) { - WebPluginInfo plugin; std::string name; - if (NPAPI::PluginList::Singleton()->GetPluginInfoByPath(FilePath(*it), - &plugin)) { - name = UTF16ToUTF8(plugin.name); - } else { + PluginUpdater::PluginMap groups; + PluginUpdater::GetPluginUpdater()->GetPluginGroups(&groups); + if (groups.find(*it) != groups.end()) + name = UTF16ToUTF8(groups[*it]->GetGroupName()); + else name = *it; - } GtkWidget* label = gtk_label_new(name.c_str()); GtkWidget* label_box = gtk_hbox_new(FALSE, 0); diff --git a/chrome/browser/plugin_updater.cc b/chrome/browser/plugin_updater.cc index 3430697..3a96cee 100644 --- a/chrome/browser/plugin_updater.cc +++ b/chrome/browser/plugin_updater.cc @@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/path_service.h" #include "base/scoped_ptr.h" +#include "base/sys_string_conversions.h" #include "base/values.h" #include "base/version.h" #include "chrome/browser/prefs/pref_service.h" @@ -26,8 +27,10 @@ PluginUpdater::PluginUpdater() : enable_internal_pdf_(true) { } // Convert to a List of Groups -void PluginUpdater::GetPluginGroups( - std::vector<linked_ptr<PluginGroup> >* plugin_groups) { +void PluginUpdater::GetPluginGroups(PluginMap* plugin_groups) { + DCHECK(plugin_groups); + + plugin_groups->clear(); // Read all plugins and convert them to plugin groups std::vector<WebPluginInfo> web_plugins; NPAPI::PluginList::Singleton()->GetPlugins(false, &web_plugins); @@ -39,8 +42,22 @@ void PluginUpdater::GetPluginGroups( PluginGroup* group = PluginGroup::FindGroupMatchingPlugin( *plugin_groups, web_plugin); if (!group) { - group = PluginGroup::FindHardcodedPluginGroup(web_plugin); - plugin_groups->push_back(linked_ptr<PluginGroup>(group)); + group = PluginGroup::CopyOrCreatePluginGroup(web_plugin); + std::string identifier = group->identifier(); + // If the identifier is not unique, use the full path. This means that we + // probably won't be able to search for this group by identifier, but at + // least it's going to be in the set of plugin groups, and if there + // is already a plug-in with the same filename, it's probably going to + // handle the same MIME types (and it has a higher priority), so this one + // is not going to run anyway. + if (plugin_groups->find(identifier) != plugin_groups->end()) +#if defined(OS_POSIX) + identifier = web_plugin.path.value(); +#elif defined(OS_WIN) + identifier = base::SysWideToUTF8(web_plugin.path.value()); +#endif + DCHECK(plugin_groups->find(identifier) == plugin_groups->end()); + (*plugin_groups)[identifier] = linked_ptr<PluginGroup>(group); } group->AddPlugin(web_plugin, i); } @@ -57,33 +74,33 @@ DictionaryValue* PluginUpdater::CreatePluginFileSummary( } ListValue* PluginUpdater::GetPluginGroupsData() { - std::vector<linked_ptr<PluginGroup> > plugin_groups; + PluginMap plugin_groups; GetPluginGroups(&plugin_groups); // Construct DictionaryValues to return to the UI ListValue* plugin_groups_data = new ListValue(); - for (std::vector<linked_ptr<PluginGroup> >::iterator it = + for (PluginMap::const_iterator it = plugin_groups.begin(); it != plugin_groups.end(); ++it) { - plugin_groups_data->Append((*it)->GetDataForUI()); + plugin_groups_data->Append(it->second->GetDataForUI()); } return plugin_groups_data; } void PluginUpdater::EnablePluginGroup(bool enable, const string16& group_name) { - std::vector<linked_ptr<PluginGroup> > plugin_groups; + PluginMap plugin_groups; GetPluginGroups(&plugin_groups); - for (std::vector<linked_ptr<PluginGroup> >::iterator it = + for (PluginMap::const_iterator it = plugin_groups.begin(); it != plugin_groups.end(); ++it) { - if ((*it)->GetGroupName() == group_name) { + if (it->second->GetGroupName() == group_name) { if (PluginGroup::IsPluginNameDisabledByPolicy(group_name)) enable = false; - if ((*it)->Enabled() != enable) { - (*it)->Enable(enable); + if (it->second->Enabled() != enable) { + it->second->Enable(enable); NotificationService::current()->Notify( NotificationType::PLUGIN_ENABLE_STATUS_CHANGED, Source<PluginUpdater>(this), @@ -154,13 +171,13 @@ void PluginUpdater::DisablePluginsFromPolicy(const ListValue* plugin_names) { NPAPI::PluginList::Singleton()->DisablePlugin(plugin_iter->path); } - std::vector<linked_ptr<PluginGroup> > plugin_groups; + PluginMap plugin_groups; GetPluginGroups(&plugin_groups); - std::vector<linked_ptr<PluginGroup> >::iterator it; + PluginMap::iterator it; for (it = plugin_groups.begin(); it != plugin_groups.end(); ++it) { - string16 current_group_name = (*it)->GetGroupName(); + string16 current_group_name = it->second->GetGroupName(); if (PluginGroup::IsPluginNameDisabledByPolicy(current_group_name)) - (*it)->Enable(false); + it->second->Enable(false); } NotificationService::current()->Notify( @@ -276,14 +293,10 @@ void PluginUpdater::DisablePluginGroupsFromPrefs(Profile* profile) { } void PluginUpdater::DisableOutdatedPluginGroups() { - std::vector<linked_ptr<PluginGroup> > groups; + PluginMap groups; GetPluginGroups(&groups); - for (std::vector<linked_ptr<PluginGroup> >::iterator it = - groups.begin(); - it != groups.end(); - ++it) { - (*it)->DisableOutdatedPlugins(); - } + for (PluginMap::iterator it = groups.begin(); it != groups.end(); ++it) + it->second->DisableOutdatedPlugins(); } void PluginUpdater::UpdatePreferences(Profile* profile) { @@ -306,17 +319,15 @@ void PluginUpdater::UpdatePreferences(Profile* profile) { } // Add the groups as well. - std::vector<linked_ptr<PluginGroup> > plugin_groups; + PluginMap plugin_groups; GetPluginGroups(&plugin_groups); - for (std::vector<linked_ptr<PluginGroup> >::iterator it = - plugin_groups.begin(); - it != plugin_groups.end(); - ++it) { + for (PluginMap::iterator it = plugin_groups.begin(); + it != plugin_groups.end(); ++it) { // Don't save preferences for vulnerable pugins. if (!CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableOutdatedPlugins) || - !(*it)->IsVulnerable()) { - plugins_list->Append((*it)->GetSummary()); + !it->second->IsVulnerable()) { + plugins_list->Append(it->second->GetSummary()); } } } diff --git a/chrome/browser/plugin_updater.h b/chrome/browser/plugin_updater.h index d046d46..401ab61 100644 --- a/chrome/browser/plugin_updater.h +++ b/chrome/browser/plugin_updater.h @@ -6,7 +6,7 @@ #define CHROME_BROWSER_PLUGIN_UPDATER_H_ #pragma once -#include <vector> +#include <map> #include "base/basictypes.h" #include "base/file_path.h" @@ -24,7 +24,13 @@ struct WebPluginInfo; class PluginUpdater : public NotificationObserver { public: - // Get a list of all the Plugin groups. + typedef std::map<std::string, linked_ptr<PluginGroup> > PluginMap; + + // Get a map from identifier to plugin group for all plugin groups. + void GetPluginGroups(PluginMap* plugin_groups); + + // Get a list of all the plugin groups. The caller should take ownership + // of the returned ListValue. ListValue* GetPluginGroupsData(); // Enable or disable a plugin group. @@ -62,9 +68,6 @@ class PluginUpdater : public NotificationObserver { DictionaryValue* CreatePluginFileSummary(const WebPluginInfo& plugin); - // Convert to a List of Groups - void GetPluginGroups(std::vector<linked_ptr<PluginGroup> >* plugin_groups); - // Force plugins to be disabled due to policy. |plugins| contains // the list of StringValues of the names of the policy-disabled plugins. void DisablePluginsFromPolicy(const ListValue* plugin_names); diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 81e1d5b..4cac19c 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -44,6 +44,7 @@ #include "chrome/browser/net/predictor_api.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/notifications_prefs_cache.h" +#include "chrome/browser/plugin_updater.h" #include "chrome/browser/plugin_service.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/printing/print_job_manager.h" @@ -74,6 +75,7 @@ #include "chrome/common/font_loader_mac.h" #endif #include "chrome/common/notification_service.h" +#include "chrome/common/plugin_group.h" #include "chrome/common/pref_names.h" #include "chrome/common/render_messages.h" #include "chrome/common/render_messages_params.h" @@ -780,11 +782,10 @@ void ResourceMessageFilter::OnGetPluginInfo(const GURL& url, info->enabled = info->enabled && plugin_service_->PrivatePluginAllowedForURL(info->path, policy_url); HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); -#if defined(OS_POSIX) - std::string resource = info->path.value(); -#elif defined(OS_WIN) - std::string resource = base::SysWideToUTF8(info->path.value()); -#endif + PluginUpdater::PluginMap groups; + PluginUpdater::GetPluginUpdater()->GetPluginGroups(&groups); + PluginGroup* group = PluginGroup::FindGroupMatchingPlugin(groups, *info); + std::string resource = group->identifier(); *setting = map->GetNonDefaultContentSetting( policy_url, CONTENT_SETTINGS_TYPE_PLUGINS, resource); if (*setting == CONTENT_SETTING_DEFAULT) { diff --git a/chrome/browser/views/content_setting_bubble_contents.cc b/chrome/browser/views/content_setting_bubble_contents.cc index 75dea9a..ef165f8 100644 --- a/chrome/browser/views/content_setting_bubble_contents.cc +++ b/chrome/browser/views/content_setting_bubble_contents.cc @@ -13,12 +13,14 @@ #include "chrome/browser/blocked_popup_container.h" #include "chrome/browser/content_setting_bubble_model.h" #include "chrome/browser/host_content_settings_map.h" +#include "chrome/browser/plugin_updater.h" #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/views/browser_dialogs.h" #include "chrome/browser/views/info_bubble.h" #include "chrome/common/notification_source.h" #include "chrome/common/notification_type.h" +#include "chrome/common/plugin_group.h" #include "grit/generated_resources.h" #include "views/controls/button/native_button.h" #include "views/controls/button/radio_button.h" @@ -206,15 +208,11 @@ void ContentSettingBubbleContents::InitControlLayout() { if (!plugins.empty()) { for (std::set<std::string>::const_iterator it = plugins.begin(); it != plugins.end(); ++it) { - WebPluginInfo plugin; std::wstring name; -#if defined(OS_POSIX) - FilePath path(*it); -#elif defined(OS_WIN) - FilePath path(UTF8ToWide(*it)); -#endif - if (NPAPI::PluginList::Singleton()->GetPluginInfoByPath(path, &plugin)) - name = UTF16ToWide(plugin.name); + PluginUpdater::PluginMap groups; + PluginUpdater::GetPluginUpdater()->GetPluginGroups(&groups); + if (groups.find(*it) != groups.end()) + name = UTF16ToWide(groups[*it]->GetGroupName()); else name = UTF8ToWide(*it); layout->StartRow(0, single_column_set_id); diff --git a/chrome/common/plugin_group.cc b/chrome/common/plugin_group.cc index 6297466..a4930146 100644 --- a/chrome/common/plugin_group.cc +++ b/chrome/common/plugin_group.cc @@ -6,6 +6,7 @@ #include "base/linked_ptr.h" #include "base/string_util.h" +#include "base/sys_string_conversions.h" #include "base/utf_string_conversions.h" #include "base/values.h" #include "base/version.h" @@ -18,19 +19,19 @@ // (new versions) are published. // TODO(panayiotis): Get the Real Player version on Mac, somehow. static const PluginGroupDefinition kGroupDefinitions[] = { - { "Quicktime", "QuickTime Plug-in", "", "", "7.6.6", + { "apple-quicktime", "Quicktime", "QuickTime Plug-in", "", "", "7.6.6", "http://www.apple.com/quicktime/download/" }, - { "Java", "Java", "", "", "", + { "java-runtime-environment", "Java", "Java", "", "", "", "http://support.apple.com/kb/HT1338" }, - { "Flash", "Shockwave Flash", "", "", "10.1.82", + { "adobe-flash-player", "Flash", "Shockwave Flash", "", "", "10.1.82", "http://get.adobe.com/flashplayer/" }, - { "Silverlight 3", "Silverlight", "0", "4", "3.0.50106.0", + { "silverlight-3", "Silverlight 3", "Silverlight", "0", "4", "3.0.50106.0", "http://go.microsoft.com/fwlink/?LinkID=185927" }, - { "Silverlight 4", "Silverlight", "4", "5", "", + { "silverlight-4", "Silverlight 4", "Silverlight", "4", "5", "", "http://go.microsoft.com/fwlink/?LinkID=185927" }, - { "Flip4Mac", "Flip4Mac", "", "", "2.2.1", + { "flip4mac", "Flip4Mac", "Flip4Mac", "", "", "2.2.1", "http://www.telestream.net/flip4mac-wmv/overview.htm" }, - { "Shockwave", "Shockwave for Director", "", "", "11.5.8.612", + { "shockwave", "Shockwave", "Shockwave for Director", "", "", "11.5.8.612", "http://www.adobe.com/shockwave/download/" } }; @@ -38,31 +39,34 @@ static const PluginGroupDefinition kGroupDefinitions[] = { // TODO(panayiotis): We should group "RealJukebox NS Plugin" with the rest of // the RealPlayer files. static const PluginGroupDefinition kGroupDefinitions[] = { - { "Quicktime", "QuickTime Plug-in", "", "", "7.6.7", + { "apple-quicktime", "Quicktime", "QuickTime Plug-in", "", "", "7.6.7", "http://www.apple.com/quicktime/download/" }, - { "Java 6", "Java", "", "6", "6.0.200", + { "java-runtime-environment", "Java 6", "Java", "", "6", "6.0.200", "http://www.java.com/" }, - { "Adobe Reader 9", "Adobe Acrobat", "9", "10", "9.3.3", + { "adobe-reader", "Adobe Reader 9", "Adobe Acrobat", "9", "10", "9.3.3", "http://get.adobe.com/reader/" }, - { "Adobe Reader 8", "Adobe Acrobat", "0", "9", "8.2.3", + { "adobe-reader-8", "Adobe Reader 8", "Adobe Acrobat", "0", "9", "8.2.3", "http://get.adobe.com/reader/" }, - { "Flash", "Shockwave Flash", "", "", "10.1.82", + { "adobe-flash-player", "Flash", "Shockwave Flash", "", "", "10.1.82", "http://get.adobe.com/flashplayer/" }, - { "Silverlight 3", "Silverlight", "0", "4", "3.0.50106.0", + { "silverlight-3", "Silverlight 3", "Silverlight", "0", "4", "3.0.50106.0", "http://go.microsoft.com/fwlink/?LinkID=185927" }, - { "Silverlight 4", "Silverlight", "4", "5", "", + { "silverlight-4", "Silverlight 4", "Silverlight", "4", "5", "", "http://go.microsoft.com/fwlink/?LinkID=185927" }, - { "Shockwave", "Shockwave for Director", "", "", "11.5.8.612", + { "shockwave", "Shockwave", "Shockwave for Director", "", "", "11.5.8.612", "http://www.adobe.com/shockwave/download/" }, - { "DivX Player", "DivX Web Player", "", "", "1.4.3.4", - "http://download.divx.com/divx/autoupdate/player/DivXWebPlayerInstaller.exe" }, + { "divx-player", "DivX Player", "DivX Web Player", "", "", "1.4.3.4", + "http://download.divx.com/divx/autoupdate/player/" + "DivXWebPlayerInstaller.exe" }, // These are here for grouping, no vulnerabilies known. - { "Windows Media Player", "Windows Media Player", "", "", "", "" }, - { "Microsoft Office", "Microsoft Office", "", "", "", "" }, + { "windows-media-player", "Windows Media Player", "Windows Media Player", + "", "", "", "" }, + { "microsoft-office", "Microsoft Office", "Microsoft Office", + "", "", "", "" }, // TODO(panayiotis): The vulnerable versions are // (v >= 6.0.12.1040 && v <= 6.0.12.1663) // || v == 6.0.12.1698 || v == 6.0.12.1741 - { "RealPlayer", "RealPlayer", "", "", "", + { "realplayer", "RealPlayer", "RealPlayer", "", "", "", "http://www.adobe.com/shockwave/download/" }, }; @@ -129,26 +133,25 @@ PluginGroup::PluginGroup(const string16& group_name, const std::string& version_range_low, const std::string& version_range_high, const std::string& min_version, - const std::string& update_url) { - group_name_ = group_name; - name_matcher_ = name_matcher; - version_range_low_str_ = version_range_low; - if (!version_range_low.empty()) { - version_range_low_.reset( - Version::GetVersionFromString(version_range_low)); - } - version_range_high_str_ = version_range_high; + const std::string& update_url, + const std::string& identifier) + : identifier_(identifier), + group_name_(group_name), + name_matcher_(name_matcher), + version_range_low_str_(version_range_low), + version_range_high_str_(version_range_high), + update_url_(update_url), + enabled_(false), + min_version_str_(min_version), + version_(Version::GetVersionFromString("0")) { + if (!version_range_low.empty()) + version_range_low_.reset(Version::GetVersionFromString(version_range_low)); if (!version_range_high.empty()) { version_range_high_.reset( Version::GetVersionFromString(version_range_high)); } - min_version_str_ = min_version; - if (!min_version.empty()) { + if (!min_version.empty()) min_version_.reset(Version::GetVersionFromString(min_version)); - } - update_url_ = update_url; - enabled_ = false; - version_.reset(Version::GetVersionFromString("0")); } PluginGroup* PluginGroup::FromPluginGroupDefinition( @@ -158,27 +161,35 @@ PluginGroup* PluginGroup::FromPluginGroupDefinition( definition.version_matcher_low, definition.version_matcher_high, definition.min_version, - definition.update_url); + definition.update_url, + definition.identifier); } PluginGroup::~PluginGroup() { } PluginGroup* PluginGroup::FromWebPluginInfo(const WebPluginInfo& wpi) { // Create a matcher from the name of this plugin. - return new PluginGroup(wpi.name, wpi.name, - "", "", "", ""); +#if defined(OS_POSIX) + std::string identifier = wpi.path.BaseName().value(); +#elif defined(OS_WIN) + std::string identifier = base::SysWideToUTF8(wpi.path.BaseName().value()); +#endif + return new PluginGroup(wpi.name, wpi.name, std::string(), std::string(), + std::string(), std::string(), identifier); } -PluginGroup* PluginGroup::FindHardcodedPluginGroup(const WebPluginInfo& info) { - static std::vector<linked_ptr<PluginGroup> >* hardcoded_plugin_groups = NULL; +PluginGroup* PluginGroup::CopyOrCreatePluginGroup( + const WebPluginInfo& info) { + static PluginMap* hardcoded_plugin_groups = NULL; if (!hardcoded_plugin_groups) { - std::vector<linked_ptr<PluginGroup> >* groups = - new std::vector<linked_ptr<PluginGroup> >(); + PluginMap* groups = new PluginMap(); const PluginGroupDefinition* definitions = GetPluginGroupDefinitions(); for (size_t i = 0; i < GetPluginGroupDefinitionsSize(); ++i) { PluginGroup* definition_group = PluginGroup::FromPluginGroupDefinition( definitions[i]); - groups->push_back(linked_ptr<PluginGroup>(definition_group)); + std::string identifier = definition_group->identifier(); + DCHECK(groups->find(identifier) == groups->end()); + (*groups)[identifier] = linked_ptr<PluginGroup>(definition_group); } hardcoded_plugin_groups = groups; } @@ -196,15 +207,14 @@ PluginGroup* PluginGroup::FindHardcodedPluginGroup(const WebPluginInfo& info) { } PluginGroup* PluginGroup::FindGroupMatchingPlugin( - std::vector<linked_ptr<PluginGroup> >& plugin_groups, + const PluginMap& plugin_groups, const WebPluginInfo& plugin) { - for (std::vector<linked_ptr<PluginGroup> >::iterator it = + for (std::map<std::string, linked_ptr<PluginGroup> >::const_iterator it = plugin_groups.begin(); it != plugin_groups.end(); ++it) { - if ((*it)->Match(plugin)) { - return it->get(); - } + if (it->second->Match(plugin)) + return it->second.get(); } return NULL; } diff --git a/chrome/common/plugin_group.h b/chrome/common/plugin_group.h index 62f5b6f..9691dd7 100644 --- a/chrome/common/plugin_group.h +++ b/chrome/common/plugin_group.h @@ -6,6 +6,7 @@ #define CHROME_COMMON_PLUGIN_GROUP_H_ #pragma once +#include <map> #include <set> #include <vector> @@ -23,6 +24,7 @@ class linked_ptr; // Hard-coded definitions of plugin groups. struct PluginGroupDefinition { + const char* identifier; // Unique identifier for this group. const char* name; // Name of this group. const char* name_matcher; // Substring matcher for the plugin name. const char* version_matcher_low; // Matchers for the plugin version. @@ -40,6 +42,8 @@ struct PluginGroupDefinition { class PluginGroup { public: + typedef std::map<std::string, linked_ptr<PluginGroup> > PluginMap; + // Creates a PluginGroup from a PluginGroupDefinition. static PluginGroup* FromPluginGroupDefinition( const PluginGroupDefinition& definition); @@ -53,7 +57,8 @@ class PluginGroup { // Find a plugin group matching |info| in the list of hardcoded plugins and // returns a copy of it if found, or a new group matching exactly this plugin // otherwise. - static PluginGroup* FindHardcodedPluginGroup(const WebPluginInfo& info); + // The caller should take ownership of the return PluginGroup. + static PluginGroup* CopyOrCreatePluginGroup(const WebPluginInfo& info); // Configures the set of plugin name patterns for disabling plugins via // enterprise configuration management. @@ -70,14 +75,14 @@ class PluginGroup { // Find the PluginGroup matching a Plugin in a list of plugin groups. Returns // NULL if no matching PluginGroup is found. static PluginGroup* FindGroupMatchingPlugin( - std::vector<linked_ptr<PluginGroup> >& plugin_groups, + const std::map<std::string, linked_ptr<PluginGroup> >& plugin_groups, const WebPluginInfo& plugin); // Creates a copy of this plugin group. PluginGroup* Copy() { return new PluginGroup(group_name_, name_matcher_, version_range_low_str_, version_range_high_str_, min_version_str_, - update_url_); + update_url_, identifier_); } // Returns true if the given plugin matches this group. @@ -94,6 +99,10 @@ class PluginGroup { // Returns whether the plugin group is enabled or not. bool Enabled() const { return enabled_; } + // Returns a unique identifier for this group, if one is defined, or the empty + // string otherwise. + const std::string& identifier() const { return identifier_; } + // Returns this group's name, or the filename without extension if the name // is empty. string16 GetGroupName() const; @@ -129,7 +138,8 @@ class PluginGroup { const std::string& version_range_low, const std::string& version_range_high, const std::string& min_version, - const std::string& update_url); + const std::string& update_url, + const std::string& identifier); Version* CreateVersionFromString(const string16& version_string); @@ -143,6 +153,7 @@ class PluginGroup { static std::set<string16>* policy_disabled_plugin_patterns_; + std::string identifier_; string16 group_name_; string16 name_matcher_; std::string version_range_low_str_; diff --git a/chrome/common/plugin_group_unittest.cc b/chrome/common/plugin_group_unittest.cc index 7bef7d2..a42cbaf 100644 --- a/chrome/common/plugin_group_unittest.cc +++ b/chrome/common/plugin_group_unittest.cc @@ -16,13 +16,13 @@ #include "webkit/glue/plugins/webplugininfo.h" static const PluginGroupDefinition kPluginDef = { - "MyPlugin", "MyPlugin", "", "", "3.0.44", "http://latest/" }; + "myplugin", "MyPlugin", "MyPlugin", "", "", "3.0.44", "http://latest/" }; static const PluginGroupDefinition kPluginDef3 = { - "MyPlugin 3", "MyPlugin", "0", "4", "3.0.44", "http://latest" }; + "myplugin-3", "MyPlugin 3", "MyPlugin", "0", "4", "3.0.44", "http://latest" }; static const PluginGroupDefinition kPluginDef4 = { - "MyPlugin 4", "MyPlugin", "4", "5", "4.0.44", "http://latest" }; + "myplugin-4", "MyPlugin 4", "MyPlugin", "4", "5", "4.0.44", "http://latest" }; static const PluginGroupDefinition kPluginDefNotVulnerable = { - "MyPlugin", "MyPlugin", "", "", "", "http://latest" }; + "myplugin-latest", "MyPlugin", "MyPlugin", "", "", "", "http://latest" }; // name, path, version, desc, mime_types, enabled. static WebPluginInfo kPlugin2043 = { diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 9e33f83..17e5a34 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -2373,7 +2373,7 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame, if (!found) return NULL; - scoped_ptr<PluginGroup> group(PluginGroup::FindHardcodedPluginGroup(info)); + scoped_ptr<PluginGroup> group(PluginGroup::CopyOrCreatePluginGroup(info)); group->AddPlugin(info, 0); if (!info.enabled) { @@ -2389,13 +2389,8 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame, if (info.path.value() != kDefaultPluginLibraryName) { std::string resource; - if (cmd->HasSwitch(switches::kEnableResourceContentSettings)) { -#if defined(OS_POSIX) - resource = info.path.value(); -#elif defined(OS_WIN) - resource = base::SysWideToUTF8(info.path.value()); -#endif - } + if (cmd->HasSwitch(switches::kEnableResourceContentSettings)) + resource = group->identifier(); if (setting == CONTENT_SETTING_BLOCK) { DCHECK(!cmd->HasSwitch(switches::kDisableClickToPlay)); DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, resource); |