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

Unified Diff: webkit/glue/plugins/plugin_list.cc

Issue 5516004: Clean up PluginGroup and related code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments 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 side-by-side diff with in-line comments
Download patch
« webkit/glue/plugins/plugin_group.cc ('K') | « webkit/glue/plugins/plugin_list.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/plugins/plugin_list.cc
diff --git a/webkit/glue/plugins/plugin_list.cc b/webkit/glue/plugins/plugin_list.cc
index 84736cbd61f1e4ffcffa646a4b3b40cd6bbd949e..5dcda7e4d039659d72d6c4a3e26e644158607bbf 100644
--- a/webkit/glue/plugins/plugin_list.cc
+++ b/webkit/glue/plugins/plugin_list.cc
@@ -22,6 +22,78 @@
namespace NPAPI {
+#if defined(OS_MACOSX)
+// Plugin Groups for Mac.
+// Plugins are listed here as soon as vulnerabilities and solutions
+// (new versions) are published.
+// TODO(panayiotis): Get the Real Player version on Mac, somehow.
+static const PluginGroupDefinition kGroupDefinitions[] = {
+ { "apple-quicktime", "Quicktime", "QuickTime Plug-in", "", "", "7.6.6",
+ "http://www.apple.com/quicktime/download/" },
+ { "java-runtime-environment", "Java", "Java", "", "", "",
+ "http://support.apple.com/kb/HT1338" },
+ { "adobe-flash-player", "Flash", "Shockwave Flash", "", "", "10.1.102",
+ "http://get.adobe.com/flashplayer/" },
+ { "silverlight-3", "Silverlight 3", "Silverlight", "0", "4", "3.0.50106.0",
+ "http://www.microsoft.com/getsilverlight/" },
+ { "silverlight-4", "Silverlight 4", "Silverlight", "4", "5", "",
+ "http://www.microsoft.com/getsilverlight/" },
+ { "flip4mac", "Flip4Mac", "Flip4Mac", "", "", "2.2.1",
+ "http://www.telestream.net/flip4mac-wmv/overview.htm" },
+ { "shockwave", "Shockwave", "Shockwave for Director", "", "", "11.5.9.615",
+ "http://www.adobe.com/shockwave/download/" }
+};
+
+#elif defined(OS_WIN)
+// TODO(panayiotis): We should group "RealJukebox NS Plugin" with the rest of
+// the RealPlayer files.
+static const PluginGroupDefinition kGroupDefinitions[] = {
+ { "apple-quicktime", "Quicktime", "QuickTime Plug-in", "", "", "7.6.8",
+ "http://www.apple.com/quicktime/download/" },
+ { "java-runtime-environment", "Java 6", "Java", "", "6", "6.0.220",
+ "http://www.java.com/" },
+ { "adobe-reader", PluginGroup::kAdobeReader9GroupName, "Adobe Acrobat", "9",
+ "10", "9.4.1", "http://get.adobe.com/reader/" },
+ { "adobe-reader-8", PluginGroup::kAdobeReader8GroupName, "Adobe Acrobat", "0",
+ "9", "8.2.5", "http://get.adobe.com/reader/" },
+ { "adobe-flash-player", "Flash", "Shockwave Flash", "", "", "10.1.102",
+ "http://get.adobe.com/flashplayer/" },
+ { "silverlight-3", "Silverlight 3", "Silverlight", "0", "4", "3.0.50106.0",
+ "http://www.microsoft.com/getsilverlight/" },
+ { "silverlight-4", "Silverlight 4", "Silverlight", "4", "5", "",
+ "http://www.microsoft.com/getsilverlight/" },
+ { "shockwave", "Shockwave", "Shockwave for Director", "", "", "11.5.9.615",
+ "http://www.adobe.com/shockwave/download/" },
+ { "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", "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", "", "", "",
+ "http://www.adobe.com/shockwave/download/" },
+};
+
+#else
+static const PluginGroupDefinition kGroupDefinitions[] = {};
+#endif
+
+// static
+const PluginGroupDefinition* PluginList::GetPluginGroupDefinitions() {
+ return kGroupDefinitions;
+}
+
+// static
+size_t PluginList::GetPluginGroupDefinitionsSize() {
+ // TODO(viettrungluu): |arraysize()| doesn't work with zero-size arrays.
+ return ARRAYSIZE_UNSAFE(kGroupDefinitions);
+}
+
base::LazyInstance<PluginList> g_singleton(base::LINKER_INITIALIZED);
// static
@@ -157,8 +229,10 @@ bool PluginList::CreateWebPluginInfo(const PluginVersionInfo& pvi,
PluginList::PluginList()
: plugins_loaded_(false),
plugins_need_refresh_(false),
- disable_outdated_plugins_(false) {
+ disable_outdated_plugins_(false),
+ next_priority_(0) {
PlatformInit();
+ AddHardcodedPluginGroups();
}
bool PluginList::ShouldDisableGroup(const string16& group_name) {
@@ -233,34 +307,26 @@ void PluginList::LoadPlugins(bool refresh) {
// plugins or plugin-groups to their original, "pre-policy" state, so
// plugins and groups are only changed to a more "safe" state after a policy
// change, i.e. from enabled to disabled. See bug 54681.
- PluginMap plugin_groups;
- GetPluginGroups(&new_plugins, &plugin_groups);
- for (PluginMap::const_iterator it = plugin_groups.begin();
- it != plugin_groups.end(); ++it) {
- PluginGroup* group = it->second.get();
+ for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
+ it != plugin_groups_.end(); ++it) {
+ PluginGroup* group = it->second;
string16 group_name = group->GetGroupName();
if (ShouldDisableGroup(group_name)) {
- it->second->Enable(false);
+ group->Enable(false);
}
if (disable_outdated_plugins_) {
group->DisableOutdatedPlugins();
- if (!group->Enabled()) {
- AutoLock lock(lock_);
- disabled_groups_.insert(group_name);
- }
+ }
+ if (!group->Enabled()) {
+ AutoLock lock(lock_);
+ disabled_groups_.insert(group_name);
}
}
// Only update the data now since loading plugins can take a while.
AutoLock lock(lock_);
- // Mark disabled plugins as such.
- for (size_t i = 0; i < new_plugins.size(); ++i) {
- if (disabled_plugins_.count(new_plugins[i].path))
- new_plugins[i].enabled = false;
- }
-
plugins_ = new_plugins;
plugins_loaded_ = true;
}
@@ -294,7 +360,17 @@ void PluginList::LoadPlugin(const FilePath& path,
}
}
+ // Mark disabled plugins as such. (This has to happen before calling
+ // |AddToPluginGroups(plugin_info)|.)
+ if (disabled_plugins_.count(plugin_info.path)) {
+ plugin_info.enabled = false;
+ } else {
+ plugin_info.enabled = true;
+ }
+
+ AutoLock lock(lock_);
plugins->push_back(plugin_info);
+ AddToPluginGroups(plugin_info);
}
bool PluginList::SupportsType(const WebPluginInfo& info,
@@ -476,45 +552,75 @@ bool PluginList::GetPluginInfoByPath(const FilePath& plugin_path,
return false;
}
-void PluginList::GetPluginGroups(bool load_if_necessary,
- PluginMap* plugin_groups) {
+void PluginList::GetPluginGroups(
+ bool load_if_necessary,
+ std::vector<PluginGroup>* plugin_groups) {
if (load_if_necessary)
LoadPlugins(false);
+ plugin_groups->clear();
+ for (PluginGroup::PluginMap::const_iterator it = plugin_groups_.begin();
+ it != plugin_groups_.end(); ++it) {
+ plugin_groups->push_back(*it->second);
+ }
+}
+const PluginGroup* PluginList::GetPluginGroup(
+ const WebPluginInfo& web_plugin_info) {
AutoLock lock(lock_);
- GetPluginGroups(&plugins_, plugin_groups);
+ return AddToPluginGroups(web_plugin_info);
}
-// static
-void PluginList::GetPluginGroups(const std::vector<WebPluginInfo>* plugins,
- PluginMap* plugin_groups) {
- plugin_groups->clear();
- // We first search for an existing group that matches our name,
- // and only create a new group if we can't find any.
- for (size_t i = 0; i < plugins->size(); ++i) {
- const WebPluginInfo& web_plugin = (*plugins)[i];
- PluginGroup* group = PluginGroup::FindGroupMatchingPlugin(
- *plugin_groups, web_plugin);
- if (!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);
+string16 PluginList::GetPluginGroupName(std::string identifier) {
+ PluginGroup::PluginMap::iterator it = plugin_groups_.find(identifier);
+ if (it == plugin_groups_.end()) {
+ return string16();
+ }
+ return it->second->GetGroupName();
+}
+
+std::string PluginList::GetPluginGroupIdentifier(
+ const WebPluginInfo& web_plugin_info) {
+ AutoLock lock(lock_);
+ PluginGroup* group = AddToPluginGroups(web_plugin_info);
+ return group->identifier();
+}
+
+void PluginList::AddHardcodedPluginGroups() {
+ AutoLock lock(lock_);
+ const PluginGroupDefinition* definitions = GetPluginGroupDefinitions();
+ for (size_t i = 0; i < GetPluginGroupDefinitionsSize(); ++i) {
+ PluginGroup* definition_group = PluginGroup::FromPluginGroupDefinition(
+ definitions[i]);
+ std::string identifier = definition_group->identifier();
+ DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end());
+ plugin_groups_.insert(std::make_pair(identifier, definition_group));
+ }
+}
+
+PluginGroup* PluginList::AddToPluginGroups(
+ const WebPluginInfo& web_plugin_info) {
+ PluginGroup* group = NULL;
+ for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
+ it != plugin_groups_.end(); ++it) {
+ if (it->second->Match(web_plugin_info))
+ group = it->second;
+ }
+ if (!group) {
+ group = PluginGroup::FromWebPluginInfo(web_plugin_info);
+ 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())
+ identifier = PluginGroup::GetLongIdentifier(web_plugin_info);
+ DCHECK(plugin_groups_.find(identifier) == plugin_groups_.end());
+ plugin_groups_.insert(std::make_pair(identifier, group));
}
+ group->AddPlugin(web_plugin_info, next_priority_++);
+ return group;
}
bool PluginList::EnablePlugin(const FilePath& filename) {
@@ -583,10 +689,8 @@ bool PluginList::EnableGroup(bool enable, const string16& group_name) {
}
}
- PluginMap plugin_groups;
- GetPluginGroups(false, &plugin_groups);
- for (PluginMap::const_iterator it = plugin_groups.begin();
- it != plugin_groups.end(); ++it) {
+ for (PluginGroup::PluginMap::iterator it = plugin_groups_.begin();
+ it != plugin_groups_.end(); ++it) {
if (it->second->GetGroupName() == group_name) {
if (it->second->Enabled() != enable) {
it->second->Enable(enable);
@@ -608,6 +712,9 @@ PluginList::~PluginList() {
void PluginList::Shutdown() {
// TODO
+ // Note: plugin_groups_ contains simple pointers of type PluginGroup*, but
+ // since this singleton lives until the process is destroyed, no explicit
+ // cleanup is necessary.
}
} // namespace NPAPI
« webkit/glue/plugins/plugin_group.cc ('K') | « webkit/glue/plugins/plugin_list.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698