summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-21 15:00:34 +0000
committerbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-21 15:00:34 +0000
commit74b8d3e4e52a6419a98ecc40b6f6710f7911726d (patch)
treee8f076d596363ea2ac0cc61831260c3d395a9436
parent0b7ba8c5a0f954e8dea8709a34a5b5f0dc40c615 (diff)
downloadchromium_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.mm13
-rw-r--r--chrome/browser/gtk/content_setting_bubble_gtk.cc13
-rw-r--r--chrome/browser/plugin_updater.cc71
-rw-r--r--chrome/browser/plugin_updater.h13
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.cc11
-rw-r--r--chrome/browser/views/content_setting_bubble_contents.cc14
-rw-r--r--chrome/common/plugin_group.cc106
-rw-r--r--chrome/common/plugin_group.h19
-rw-r--r--chrome/common/plugin_group_unittest.cc8
-rw-r--r--chrome/renderer/render_view.cc11
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);