Index: webkit/glue/plugins/plugin_list.cc |
=================================================================== |
--- webkit/glue/plugins/plugin_list.cc (revision 69426) |
+++ webkit/glue/plugins/plugin_list.cc (working copy) |
@@ -1,780 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/glue/plugins/plugin_list.h" |
- |
-#include <algorithm> |
- |
-#include "base/command_line.h" |
-#include "base/lazy_instance.h" |
-#include "base/logging.h" |
-#include "base/string_split.h" |
-#include "base/string_util.h" |
-#include "base/sys_string_conversions.h" |
-#include "base/utf_string_conversions.h" |
-#include "googleurl/src/gurl.h" |
-#include "net/base/mime_util.h" |
-#include "webkit/glue/plugins/plugin_constants_win.h" |
-#include "webkit/glue/plugins/plugin_lib.h" |
-#include "webkit/glue/webkit_glue.h" |
-#include "webkit/plugins/plugin_switches.h" |
- |
-#if defined(OS_POSIX) |
-#include "base/stl_util-inl.h" |
-#include "base/third_party/valgrind/valgrind.h" |
-#endif // defined(OS_POSIX) |
- |
-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 VersionRangeDefinition kQuicktimeVersionRange[] = { |
- { "", "", "7.6.6" } |
-}; |
-static const VersionRangeDefinition kJavaVersionRange[] = { |
- { "", "", "" } |
-}; |
-static const VersionRangeDefinition kFlashVersionRange[] = { |
- { "", "", "10.1.102" } |
-}; |
-static const VersionRangeDefinition kSilverlightVersionRange[] = { |
- { "0", "4", "3.0.50106.0" }, |
- { "4", "5", "" } |
-}; |
-static const VersionRangeDefinition kFlip4MacVersionRange[] = { |
- { "", "", "2.2.1" } |
-}; |
-static const VersionRangeDefinition kShockwaveVersionRange[] = { |
- { "", "", "11.5.9.615" } |
-}; |
-static const PluginGroupDefinition kGroupDefinitions[] = { |
- { "apple-quicktime", "Quicktime", "QuickTime Plug-in", kQuicktimeVersionRange, |
- arraysize(kQuicktimeVersionRange), |
- "http://www.apple.com/quicktime/download/" }, |
- { "java-runtime-environment", "Java", "Java", kJavaVersionRange, |
- arraysize(kJavaVersionRange), "http://support.apple.com/kb/HT1338" }, |
- { "adobe-flash-player", "Flash", "Shockwave Flash", kFlashVersionRange, |
- arraysize(kFlashVersionRange), "http://get.adobe.com/flashplayer/" }, |
- { "silverlight", "Silverlight", "Silverlight", kSilverlightVersionRange, |
- arraysize(kSilverlightVersionRange), |
- "http://www.microsoft.com/getsilverlight/" }, |
- { "flip4mac", "Flip4Mac", "Flip4Mac", kFlip4MacVersionRange, |
- arraysize(kFlip4MacVersionRange), |
- "http://www.telestream.net/flip4mac-wmv/overview.htm" }, |
- { "shockwave", "Shockwave", "Shockwave for Director", kShockwaveVersionRange, |
- arraysize(kShockwaveVersionRange), |
- "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 VersionRangeDefinition kQuicktimeVersionRange[] = { |
- { "", "", "7.6.8" } |
-}; |
-static const VersionRangeDefinition kJavaVersionRange[] = { |
- { "0", "7", "6.0.220" } // "220" is not a typo. |
-}; |
-static const VersionRangeDefinition kAdobeReaderVersionRange[] = { |
- { "10", "11", "" }, |
- { "9", "10", "9.4.1" }, |
- { "0", "9", "8.2.5" } |
-}; |
-static const VersionRangeDefinition kFlashVersionRange[] = { |
- { "", "", "10.1.102" } |
-}; |
-static const VersionRangeDefinition kSilverlightVersionRange[] = { |
- { "0", "4", "3.0.50106.0" }, |
- { "4", "5", "" } |
-}; |
-static const VersionRangeDefinition kShockwaveVersionRange[] = { |
- { "", "", "11.5.9.615" } |
-}; |
-static const VersionRangeDefinition kDivXVersionRange[] = { |
- { "", "", "1.4.3.4" } |
-}; |
-static const PluginGroupDefinition kGroupDefinitions[] = { |
- { "apple-quicktime", "Quicktime", "QuickTime Plug-in", kQuicktimeVersionRange, |
- arraysize(kQuicktimeVersionRange), |
- "http://www.apple.com/quicktime/download/" }, |
- { "java-runtime-environment", "Java 6", "Java", kJavaVersionRange, |
- arraysize(kJavaVersionRange), "http://www.java.com/" }, |
- { "adobe-reader", PluginGroup::kAdobeReaderGroupName, "Adobe Acrobat", |
- kAdobeReaderVersionRange, arraysize(kAdobeReaderVersionRange), |
- "http://get.adobe.com/reader/" }, |
- { "adobe-flash-player", "Flash", "Shockwave Flash", kFlashVersionRange, |
- arraysize(kFlashVersionRange), "http://get.adobe.com/flashplayer/" }, |
- { "silverlight", "Silverlight", "Silverlight", kSilverlightVersionRange, |
- arraysize(kSilverlightVersionRange), |
- "http://www.microsoft.com/getsilverlight/" }, |
- { "shockwave", "Shockwave", "Shockwave for Director", kShockwaveVersionRange, |
- arraysize(kShockwaveVersionRange), |
- "http://www.adobe.com/shockwave/download/" }, |
- { "divx-player", "DivX Player", "DivX Web Player", kDivXVersionRange, |
- arraysize(kDivXVersionRange), |
- "http://download.divx.com/divx/autoupdate/player/" |
- "DivXWebPlayerInstaller.exe" }, |
- // These are here for grouping, no vulnerabilities known. |
- { "windows-media-player", "Windows Media Player", "Windows Media Player", |
- NULL, 0, "" }, |
- { "microsoft-office", "Microsoft Office", "Microsoft Office", |
- NULL, 0, "" }, |
- // 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", NULL, 0, |
- "www.real.com/realplayer/downloads" }, |
-}; |
- |
-#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 |
-PluginList* PluginList::Singleton() { |
- return g_singleton.Pointer(); |
-} |
- |
-// static |
-bool PluginList::DebugPluginLoading() { |
- return CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDebugPluginLoading); |
-} |
- |
-bool PluginList::PluginsLoaded() { |
- AutoLock lock(lock_); |
- return plugins_loaded_; |
-} |
- |
-void PluginList::RefreshPlugins() { |
- AutoLock lock(lock_); |
- plugins_need_refresh_ = true; |
-} |
- |
-void PluginList::AddExtraPluginPath(const FilePath& plugin_path) { |
- // Chrome OS only loads plugins from /opt/google/chrome/plugins. |
-#if !defined(OS_CHROMEOS) |
- AutoLock lock(lock_); |
- extra_plugin_paths_.push_back(plugin_path); |
-#endif |
-} |
- |
-void PluginList::RemoveExtraPluginPath(const FilePath& plugin_path) { |
- AutoLock lock(lock_); |
- std::vector<FilePath>::iterator it = |
- std::find(extra_plugin_paths_.begin(), extra_plugin_paths_.end(), |
- plugin_path); |
- if (it != extra_plugin_paths_.end()) |
- extra_plugin_paths_.erase(it); |
-} |
- |
-void PluginList::AddExtraPluginDir(const FilePath& plugin_dir) { |
- // Chrome OS only loads plugins from /opt/google/chrome/plugins. |
-#if !defined(OS_CHROMEOS) |
- AutoLock lock(lock_); |
- extra_plugin_dirs_.push_back(plugin_dir); |
-#endif |
-} |
- |
-void PluginList::RegisterInternalPlugin(const PluginVersionInfo& info) { |
- AutoLock lock(lock_); |
- internal_plugins_.push_back(info); |
-} |
- |
-void PluginList::UnregisterInternalPlugin(const FilePath& path) { |
- AutoLock lock(lock_); |
- for (size_t i = 0; i < internal_plugins_.size(); i++) { |
- if (internal_plugins_[i].path == path) { |
- internal_plugins_.erase(internal_plugins_.begin() + i); |
- return; |
- } |
- } |
- NOTREACHED(); |
-} |
- |
-bool PluginList::ReadPluginInfo(const FilePath& filename, |
- WebPluginInfo* info, |
- const PluginEntryPoints** entry_points) { |
- { |
- AutoLock lock(lock_); |
- for (size_t i = 0; i < internal_plugins_.size(); ++i) { |
- if (filename == internal_plugins_[i].path) { |
- *entry_points = &internal_plugins_[i].entry_points; |
- return CreateWebPluginInfo(internal_plugins_[i], info); |
- } |
- } |
- } |
- |
- // Not an internal plugin. |
- *entry_points = NULL; |
- |
- return PluginLib::ReadWebPluginInfo(filename, info); |
-} |
- |
-bool PluginList::CreateWebPluginInfo(const PluginVersionInfo& pvi, |
- WebPluginInfo* info) { |
- std::vector<std::string> mime_types, file_extensions; |
- std::vector<string16> descriptions; |
- base::SplitString(WideToUTF8(pvi.mime_types), '|', &mime_types); |
- base::SplitString(WideToUTF8(pvi.file_extensions), '|', &file_extensions); |
- base::SplitString(WideToUTF16(pvi.type_descriptions), '|', &descriptions); |
- |
- info->mime_types.clear(); |
- |
- if (mime_types.empty()) { |
- LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
- << "Plugin " << pvi.product_name << " has no MIME types, skipping"; |
- return false; |
- } |
- |
- info->name = WideToUTF16(pvi.product_name); |
- info->desc = WideToUTF16(pvi.file_description); |
- info->version = WideToUTF16(pvi.file_version); |
- info->path = pvi.path; |
- info->enabled = true; |
- |
- for (size_t i = 0; i < mime_types.size(); ++i) { |
- WebPluginMimeType mime_type; |
- mime_type.mime_type = StringToLowerASCII(mime_types[i]); |
- if (file_extensions.size() > i) |
- base::SplitString(file_extensions[i], ',', &mime_type.file_extensions); |
- |
- if (descriptions.size() > i) { |
- mime_type.description = descriptions[i]; |
- |
- // On Windows, the description likely has a list of file extensions |
- // embedded in it (e.g. "SurfWriter file (*.swr)"). Remove an extension |
- // list from the description if it is present. |
- size_t ext = mime_type.description.find(ASCIIToUTF16("(*")); |
- if (ext != string16::npos) { |
- if (ext > 1 && mime_type.description[ext -1] == ' ') |
- ext--; |
- |
- mime_type.description.erase(ext); |
- } |
- } |
- |
- info->mime_types.push_back(mime_type); |
- } |
- |
- return true; |
-} |
- |
-PluginList::PluginList() |
- : plugins_loaded_(false), |
- plugins_need_refresh_(false), |
- disable_outdated_plugins_(false), |
- next_priority_(0) { |
- PlatformInit(); |
- AddHardcodedPluginGroups(); |
-} |
- |
-bool PluginList::ShouldDisableGroup(const string16& group_name) { |
- AutoLock lock(lock_); |
- if (PluginGroup::IsPluginNameDisabledByPolicy(group_name)) { |
- disabled_groups_.insert(group_name); |
- return true; |
- } |
- return disabled_groups_.count(group_name) > 0; |
-} |
- |
-void PluginList::LoadPlugins(bool refresh) { |
- // Don't want to hold the lock while loading new plugins, so we don't block |
- // other methods if they're called on other threads. |
- std::vector<FilePath> extra_plugin_paths; |
- std::vector<FilePath> extra_plugin_dirs; |
- std::vector<PluginVersionInfo> internal_plugins; |
- { |
- AutoLock lock(lock_); |
- if (plugins_loaded_ && !refresh && !plugins_need_refresh_) |
- return; |
- |
- // Clear the refresh bit now, because it might get set again before we |
- // reach the end of the method. |
- plugins_need_refresh_ = false; |
- extra_plugin_paths = extra_plugin_paths_; |
- extra_plugin_dirs = extra_plugin_dirs_; |
- internal_plugins = internal_plugins_; |
- } |
- |
- std::vector<WebPluginInfo> new_plugins; |
- std::set<FilePath> visited_plugins; |
- |
- std::vector<FilePath> directories_to_scan; |
- GetPluginDirectories(&directories_to_scan); |
- |
- // Load internal plugins first so that, if both an internal plugin and a |
- // "discovered" plugin want to handle the same type, the internal plugin |
- // will have precedence. |
- for (size_t i = 0; i < internal_plugins.size(); ++i) { |
- if (internal_plugins[i].path.value() == kDefaultPluginLibraryName) |
- continue; |
- LoadPlugin(internal_plugins[i].path, &new_plugins); |
- } |
- |
- for (size_t i = 0; i < extra_plugin_paths.size(); ++i) { |
- const FilePath& path = extra_plugin_paths[i]; |
- if (visited_plugins.find(path) != visited_plugins.end()) |
- continue; |
- LoadPlugin(path, &new_plugins); |
- visited_plugins.insert(path); |
- } |
- |
- for (size_t i = 0; i < extra_plugin_dirs.size(); ++i) { |
- LoadPluginsFromDir(extra_plugin_dirs[i], &new_plugins, &visited_plugins); |
- } |
- |
- for (size_t i = 0; i < directories_to_scan.size(); ++i) { |
- LoadPluginsFromDir(directories_to_scan[i], &new_plugins, &visited_plugins); |
- } |
- |
-#if defined(OS_WIN) |
- LoadPluginsFromRegistry(&new_plugins, &visited_plugins); |
-#endif |
- |
- // Load the default plugin last. |
- if (webkit_glue::IsDefaultPluginEnabled()) |
- LoadPlugin(FilePath(kDefaultPluginLibraryName), &new_plugins); |
- |
- // Disable all of the plugins and plugin groups that are disabled by policy. |
- // There's currenly a bug that makes it impossible to correctly re-enable |
- // 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. |
- 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)) { |
- group->Enable(false); |
- } |
- |
- if (disable_outdated_plugins_) { |
- group->DisableOutdatedPlugins(); |
- } |
- 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_); |
- |
- plugins_ = new_plugins; |
- plugins_loaded_ = true; |
-} |
- |
-void PluginList::LoadPlugin(const FilePath& path, |
- std::vector<WebPluginInfo>* plugins) { |
- LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
- << "Loading plugin " << path.value(); |
- |
- WebPluginInfo plugin_info; |
- const PluginEntryPoints* entry_points; |
- |
- if (!ReadPluginInfo(path, &plugin_info, &entry_points)) |
- return; |
- |
- if (!ShouldLoadPlugin(plugin_info, plugins)) |
- return; |
- |
- if (path.value() != kDefaultPluginLibraryName |
-#if defined(OS_WIN) && !defined(NDEBUG) |
- && path.BaseName().value() != L"npspy.dll" // Make an exception for NPSPY |
-#endif |
- ) { |
- for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) { |
- // TODO: don't load global handlers for now. |
- // WebKit hands to the Plugin before it tries |
- // to handle mimeTypes on its own. |
- const std::string &mime_type = plugin_info.mime_types[i].mime_type; |
- if (mime_type == "*" ) |
- return; |
- } |
- } |
- |
- // 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, |
- const std::string &mime_type, |
- bool allow_wildcard) { |
- // Webkit will ask for a plugin to handle empty mime types. |
- if (mime_type.empty()) |
- return false; |
- |
- for (size_t i = 0; i < info.mime_types.size(); ++i) { |
- const WebPluginMimeType& mime_info = info.mime_types[i]; |
- if (net::MatchesMimeType(mime_info.mime_type, mime_type)) { |
- if (!allow_wildcard && mime_info.mime_type == "*") { |
- continue; |
- } |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-bool PluginList::SupportsExtension(const WebPluginInfo& info, |
- const std::string &extension, |
- std::string* actual_mime_type) { |
- for (size_t i = 0; i < info.mime_types.size(); ++i) { |
- const WebPluginMimeType& mime_type = info.mime_types[i]; |
- for (size_t j = 0; j < mime_type.file_extensions.size(); ++j) { |
- if (mime_type.file_extensions[j] == extension) { |
- if (actual_mime_type) |
- *actual_mime_type = mime_type.mime_type; |
- return true; |
- } |
- } |
- } |
- |
- return false; |
-} |
- |
- |
-void PluginList::GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins) { |
- LoadPlugins(refresh); |
- |
- AutoLock lock(lock_); |
- *plugins = plugins_; |
-} |
- |
-void PluginList::GetEnabledPlugins(bool refresh, |
- std::vector<WebPluginInfo>* plugins) { |
- LoadPlugins(refresh); |
- |
- plugins->clear(); |
- AutoLock lock(lock_); |
- for (std::vector<WebPluginInfo>::const_iterator it = plugins_.begin(); |
- it != plugins_.end(); |
- ++it) { |
- if (it->enabled) |
- plugins->push_back(*it); |
- } |
-} |
- |
-void PluginList::GetPluginInfoArray( |
- const GURL& url, |
- const std::string& mime_type, |
- bool allow_wildcard, |
- std::vector<WebPluginInfo>* info, |
- std::vector<std::string>* actual_mime_types) { |
- DCHECK(mime_type == StringToLowerASCII(mime_type)); |
- DCHECK(info); |
- |
- LoadPlugins(false); |
- AutoLock lock(lock_); |
- info->clear(); |
- if (actual_mime_types) |
- actual_mime_types->clear(); |
- |
- std::set<FilePath> visited_plugins; |
- |
- // Add in enabled plugins by mime type. |
- WebPluginInfo default_plugin; |
- for (size_t i = 0; i < plugins_.size(); ++i) { |
- if (plugins_[i].enabled && |
- SupportsType(plugins_[i], mime_type, allow_wildcard)) { |
- FilePath path = plugins_[i].path; |
- if (path.value() != kDefaultPluginLibraryName && |
- visited_plugins.insert(path).second) { |
- info->push_back(plugins_[i]); |
- if (actual_mime_types) |
- actual_mime_types->push_back(mime_type); |
- } |
- } |
- } |
- |
- // Add in enabled plugins by url. |
- std::string path = url.path(); |
- std::string::size_type last_dot = path.rfind('.'); |
- if (last_dot != std::string::npos) { |
- std::string extension = StringToLowerASCII(std::string(path, last_dot+1)); |
- std::string actual_mime_type; |
- for (size_t i = 0; i < plugins_.size(); ++i) { |
- if (plugins_[i].enabled && |
- SupportsExtension(plugins_[i], extension, &actual_mime_type)) { |
- FilePath path = plugins_[i].path; |
- if (path.value() != kDefaultPluginLibraryName && |
- visited_plugins.insert(path).second) { |
- info->push_back(plugins_[i]); |
- if (actual_mime_types) |
- actual_mime_types->push_back(actual_mime_type); |
- } |
- } |
- } |
- } |
- |
- // Add in disabled plugins by mime type. |
- for (size_t i = 0; i < plugins_.size(); ++i) { |
- if (!plugins_[i].enabled && |
- SupportsType(plugins_[i], mime_type, allow_wildcard)) { |
- FilePath path = plugins_[i].path; |
- if (path.value() != kDefaultPluginLibraryName && |
- visited_plugins.insert(path).second) { |
- info->push_back(plugins_[i]); |
- if (actual_mime_types) |
- actual_mime_types->push_back(mime_type); |
- } |
- } |
- } |
- |
- // Add the default plugin at the end if it supports the mime type given, |
- // and the default plugin is enabled. |
- if (!plugins_.empty() && webkit_glue::IsDefaultPluginEnabled()) { |
- const WebPluginInfo& default_info = plugins_.back(); |
- if (SupportsType(default_info, mime_type, allow_wildcard)) { |
- info->push_back(default_info); |
- if (actual_mime_types) |
- actual_mime_types->push_back(mime_type); |
- } |
- } |
-} |
- |
-bool PluginList::GetPluginInfo(const GURL& url, |
- const std::string& mime_type, |
- bool allow_wildcard, |
- WebPluginInfo* info, |
- std::string* actual_mime_type) { |
- DCHECK(info); |
- std::vector<WebPluginInfo> info_list; |
- |
- // GetPluginInfoArray has slightly less work to do if we can pass |
- // NULL for the mime type list... |
- if (actual_mime_type) { |
- std::vector<std::string> mime_type_list; |
- GetPluginInfoArray( |
- url, mime_type, allow_wildcard, &info_list, &mime_type_list); |
- if (!info_list.empty()) { |
- *info = info_list[0]; |
- *actual_mime_type = mime_type_list[0]; |
- return true; |
- } |
- } else { |
- GetPluginInfoArray(url, mime_type, allow_wildcard, &info_list, NULL); |
- if (!info_list.empty()) { |
- *info = info_list[0]; |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-bool PluginList::GetPluginInfoByPath(const FilePath& plugin_path, |
- WebPluginInfo* info) { |
- LoadPlugins(false); |
- AutoLock lock(lock_); |
- for (size_t i = 0; i < plugins_.size(); ++i) { |
- if (plugins_[i].path == plugin_path) { |
- *info = plugins_[i]; |
- return true; |
- } |
- } |
- |
- return false; |
-} |
- |
-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_); |
- return AddToPluginGroups(web_plugin_info); |
-} |
- |
-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) { |
- AutoLock lock(lock_); |
- |
- bool did_enable = false; |
- |
- std::set<FilePath>::iterator entry = disabled_plugins_.find(filename); |
- if (entry == disabled_plugins_.end()) |
- return did_enable; // Early exit if plugin not in disabled list. |
- |
- disabled_plugins_.erase(entry); // Remove from disabled list. |
- |
- // Set enabled flags if necessary. |
- for (std::vector<WebPluginInfo>::iterator it = plugins_.begin(); |
- it != plugins_.end(); |
- ++it) { |
- if (it->path == filename) { |
- DCHECK(!it->enabled); // Should have been disabled. |
- it->enabled = true; |
- did_enable = true; |
- } |
- } |
- |
- return did_enable; |
-} |
- |
-bool PluginList::DisablePlugin(const FilePath& filename) { |
- AutoLock lock(lock_); |
- |
- bool did_disable = false; |
- |
- if (disabled_plugins_.find(filename) != disabled_plugins_.end()) |
- return did_disable; // Early exit if plugin already in disabled list. |
- |
- disabled_plugins_.insert(filename); // Add to disabled list. |
- |
- // Unset enabled flags if necessary. |
- for (std::vector<WebPluginInfo>::iterator it = plugins_.begin(); |
- it != plugins_.end(); |
- ++it) { |
- if (it->path == filename) { |
- DCHECK(it->enabled); // Should have been enabled. |
- it->enabled = false; |
- did_disable = true; |
- } |
- } |
- |
- return did_disable; |
-} |
- |
-bool PluginList::EnableGroup(bool enable, const string16& group_name) { |
- bool did_change = false; |
- { |
- AutoLock lock(lock_); |
- |
- std::set<string16>::iterator entry = disabled_groups_.find(group_name); |
- if (enable) { |
- if (entry == disabled_groups_.end()) |
- return did_change; // Early exit if group not in disabled list. |
- disabled_groups_.erase(entry); // Remove from disabled list. |
- } else { |
- if (entry != disabled_groups_.end()) |
- return did_change; // Early exit if group already in disabled list. |
- disabled_groups_.insert(group_name); |
- } |
- } |
- |
- 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); |
- did_change = true; |
- break; |
- } |
- } |
- } |
- |
- return did_change; |
-} |
- |
-void PluginList::DisableOutdatedPluginGroups() { |
- disable_outdated_plugins_ = true; |
-} |
- |
-PluginList::~PluginList() { |
- Shutdown(); |
-} |
- |
-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. |
- // However, when running on Valgrind, we need to do the cleanup to keep the |
- // memory tree green. |
-#if defined(OS_POSIX) |
- if (RUNNING_ON_VALGRIND) { |
- STLDeleteContainerPairSecondPointers(plugin_groups_.begin(), |
- plugin_groups_.end()); |
- } |
-#endif |
-} |
- |
-} // namespace NPAPI |