Index: chrome/browser/plugin_finder.cc |
diff --git a/chrome/browser/plugin_finder.cc b/chrome/browser/plugin_finder.cc |
deleted file mode 100644 |
index 21e8279dffcdfea588500ee2cea59822b84749d6..0000000000000000000000000000000000000000 |
--- a/chrome/browser/plugin_finder.cc |
+++ /dev/null |
@@ -1,299 +0,0 @@ |
-// Copyright (c) 2012 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 "chrome/browser/plugin_finder.h" |
- |
-#include "base/bind.h" |
-#include "base/json/json_reader.h" |
-#include "base/message_loop.h" |
-#include "base/stl_util.h" |
-#include "base/sys_string_conversions.h" |
-#include "base/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/plugin_installer.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/common/pref_names.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/plugin_service.h" |
-#include "googleurl/src/gurl.h" |
-#include "grit/browser_resources.h" |
-#include "ui/base/layout.h" |
-#include "ui/base/resource/resource_bundle.h" |
- |
-using base::DictionaryValue; |
-using content::PluginService; |
- |
-namespace { |
- |
-// Gets the base name of the file path as the identifier. |
-static std::string GetIdentifier(const webkit::WebPluginInfo& plugin) { |
-#if defined(OS_POSIX) |
- return plugin.path.BaseName().value(); |
-#elif defined(OS_WIN) |
- return base::SysWideToUTF8(plugin.path.BaseName().value()); |
-#endif |
-} |
- |
-// Gets the plug-in group name as the plug-in name if it is not empty or |
-// the filename without extension if the name is empty. |
-static string16 GetGroupName(const webkit::WebPluginInfo& plugin) { |
- if (!plugin.name.empty()) |
- return plugin.name; |
- |
- FilePath::StringType path = plugin.path.BaseName().RemoveExtension().value(); |
-#if defined(OS_POSIX) |
- return UTF8ToUTF16(path); |
-#elif defined(OS_WIN) |
- return WideToUTF16(path); |
-#endif |
-} |
- |
-// A callback barrier used to enforce the execution of a callback function |
-// only when two different asynchronous callbacks are done execution. |
-// The first asynchronous callback gets a PluginFinder instance and the |
-// second asynchronous callback gets a list of plugins. |
-class PluginFinderCallbackBarrier |
- : public base::RefCountedThreadSafe<PluginFinderCallbackBarrier> { |
- public: |
- typedef base::Callback<void(const PluginFinder::PluginVector&)> |
- PluginsCallback; |
- |
- explicit PluginFinderCallbackBarrier( |
- const PluginFinder::CombinedCallback& callback) |
- : callback_(callback), |
- finder_(NULL) { |
- DCHECK(!callback_.is_null()); |
- } |
- |
- base::Callback<void(PluginFinder*)> CreatePluginFinderCallback() { |
- return base::Bind(&PluginFinderCallbackBarrier::GotPluginFinder, this); |
- } |
- |
- PluginsCallback CreatePluginsCallback() { |
- return base::Bind(&PluginFinderCallbackBarrier::GotPlugins, this); |
- } |
- |
- private: |
- friend class base::RefCountedThreadSafe<PluginFinderCallbackBarrier>; |
- |
- ~PluginFinderCallbackBarrier() { |
- DCHECK(callback_.is_null()); |
- } |
- |
- void GotPlugins(const PluginFinder::PluginVector& plugins) { |
- plugins_.reset(new PluginFinder::PluginVector(plugins)); |
- MaybeRunCallback(); |
- } |
- |
- void GotPluginFinder(PluginFinder* finder) { |
- finder_ = finder; |
- MaybeRunCallback(); |
- } |
- |
- // Executes the callback only when both asynchronous methods have finished |
- // their executions. This is identified by having non-null values in both |
- // |finder_| and |plugins_|. |
- void MaybeRunCallback() { |
- if (!finder_ || !plugins_.get()) |
- return; |
- |
- callback_.Run(*plugins_, finder_); |
- callback_.Reset(); |
- } |
- |
- PluginFinder::CombinedCallback callback_; |
- PluginFinder* finder_; |
- scoped_ptr<PluginFinder::PluginVector> plugins_; |
-}; |
- |
-} // namespace |
- |
-// static |
-void PluginFinder::GetPluginsAndPluginFinder( |
- const PluginFinder::CombinedCallback& cb) { |
- scoped_refptr<PluginFinderCallbackBarrier> barrier = |
- new PluginFinderCallbackBarrier(cb); |
- |
- PluginFinder::Get(barrier->CreatePluginFinderCallback()); |
- PluginService::GetInstance()->GetPlugins(barrier->CreatePluginsCallback()); |
-} |
- |
-// static |
-void PluginFinder::Get(const base::Callback<void(PluginFinder*)>& cb) { |
- // At a later point we might want to do intialization here that needs to be |
- // done asynchronously, like loading the plug-in list from disk or from a URL. |
- MessageLoop::current()->PostTask(FROM_HERE, base::Bind(cb, GetInstance())); |
-} |
- |
-// static |
-PluginFinder* PluginFinder::GetInstance() { |
- // PluginFinder::GetInstance() is the only method that's allowed to call |
- // Singleton<PluginFinder>::get(). |
- return Singleton<PluginFinder>::get(); |
-} |
- |
-PluginFinder::PluginFinder() : plugin_list_(LoadPluginList()) { |
- if (!plugin_list_.get()) |
- plugin_list_.reset(new DictionaryValue()); |
-} |
- |
-// static |
-DictionaryValue* PluginFinder::LoadPluginList() { |
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) |
- base::StringPiece json_resource( |
- ResourceBundle::GetSharedInstance().GetRawDataResource( |
- IDR_PLUGIN_DB_JSON, ui::SCALE_FACTOR_NONE)); |
- std::string error_str; |
- scoped_ptr<base::Value> value(base::JSONReader::ReadAndReturnError( |
- json_resource, |
- base::JSON_PARSE_RFC, |
- NULL, |
- &error_str)); |
- if (!value.get()) { |
- DLOG(ERROR) << error_str; |
- return NULL; |
- } |
- if (value->GetType() != base::Value::TYPE_DICTIONARY) |
- return NULL; |
- return static_cast<base::DictionaryValue*>(value.release()); |
-#else |
- return new DictionaryValue(); |
-#endif |
-} |
- |
-PluginFinder::~PluginFinder() { |
- STLDeleteValues(&installers_); |
-} |
- |
-PluginInstaller* PluginFinder::FindPlugin(const std::string& mime_type, |
- const std::string& language) { |
- if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) |
- return NULL; |
- for (DictionaryValue::Iterator plugin_it(*plugin_list_); |
- plugin_it.HasNext(); plugin_it.Advance()) { |
- const DictionaryValue* plugin = NULL; |
- if (!plugin_it.value().GetAsDictionary(&plugin)) { |
- NOTREACHED(); |
- continue; |
- } |
- std::string language_str; |
- bool success = plugin->GetString("lang", &language_str); |
- if (language_str != language) |
- continue; |
- const ListValue* mime_types = NULL; |
- plugin->GetList("mime_types", &mime_types); |
- DCHECK(success); |
- for (ListValue::const_iterator mime_type_it = mime_types->begin(); |
- mime_type_it != mime_types->end(); ++mime_type_it) { |
- std::string mime_type_str; |
- success = (*mime_type_it)->GetAsString(&mime_type_str); |
- DCHECK(success); |
- if (mime_type_str == mime_type) { |
- std::string identifier = plugin_it.key(); |
- std::map<std::string, PluginInstaller*>::const_iterator installer = |
- installers_.find(identifier); |
- if (installer != installers_.end()) |
- return installer->second; |
- return CreateInstaller(identifier, plugin); |
- } |
- } |
- } |
- return NULL; |
-} |
- |
-PluginInstaller* PluginFinder::FindPluginWithIdentifier( |
- const std::string& identifier) { |
- std::map<std::string, PluginInstaller*>::const_iterator it = |
- installers_.find(identifier); |
- if (it != installers_.end()) |
- return it->second; |
- DictionaryValue* plugin = NULL; |
- if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin)) |
- return CreateInstaller(identifier, plugin); |
- return NULL; |
-} |
- |
-PluginInstaller* PluginFinder::CreateInstaller( |
- const std::string& identifier, |
- const DictionaryValue* plugin_dict) { |
- DCHECK(!installers_[identifier]); |
- std::string url; |
- bool success = plugin_dict->GetString("url", &url); |
- std::string help_url; |
- plugin_dict->GetString("help_url", &help_url); |
- string16 name; |
- success = plugin_dict->GetString("name", &name); |
- DCHECK(success); |
- bool display_url = false; |
- plugin_dict->GetBoolean("displayurl", &display_url); |
- string16 group_name_matcher; |
- success = plugin_dict->GetString("group_name_matcher", &group_name_matcher); |
- DCHECK(success); |
- |
- PluginInstaller* installer = new PluginInstaller(identifier, |
- name, |
- display_url, |
- GURL(url), |
- GURL(help_url), |
- group_name_matcher); |
- const ListValue* versions = NULL; |
- if (plugin_dict->GetList("versions", &versions)) { |
- for (ListValue::const_iterator it = versions->begin(); |
- it != versions->end(); ++it) { |
- DictionaryValue* version_dict = NULL; |
- if (!(*it)->GetAsDictionary(&version_dict)) { |
- NOTREACHED(); |
- continue; |
- } |
- std::string version; |
- success = version_dict->GetString("version", &version); |
- DCHECK(success); |
- std::string status_str; |
- success = version_dict->GetString("status", &status_str); |
- DCHECK(success); |
- PluginInstaller::SecurityStatus status = |
- PluginInstaller::SECURITY_STATUS_UP_TO_DATE; |
- success = PluginInstaller::ParseSecurityStatus(status_str, &status); |
- DCHECK(success); |
- installer->AddVersion(Version(version), status); |
- } |
- } |
- |
- installers_[identifier] = installer; |
- return installer; |
-} |
- |
-PluginInstaller* PluginFinder::GetPluginInstaller( |
- const webkit::WebPluginInfo& plugin) { |
- if (name_installers_.find(plugin.name) != name_installers_.end()) |
- return name_installers_[plugin.name]; |
- |
- for (DictionaryValue::Iterator plugin_it(*plugin_list_); |
- plugin_it.HasNext(); plugin_it.Advance()) { |
- // This method triggers the lazy initialization for all PluginInstallers. |
- FindPluginWithIdentifier(plugin_it.key()); |
- } |
- |
- // Use the group name matcher to find the plug-in installer we want. |
- for (std::map<std::string, PluginInstaller*>::const_iterator it = |
- installers_.begin(); it != installers_.end(); ++it) { |
- if (!it->second->MatchesPlugin(plugin)) |
- continue; |
- |
- name_installers_[plugin.name] = it->second; |
- return it->second; |
- } |
- |
- // The plug-in installer was not found, create a dummy one holding |
- // the name, identifier and group name only. |
- std::string identifier = GetIdentifier(plugin); |
- PluginInstaller* installer = new PluginInstaller(identifier, |
- GetGroupName(plugin), |
- false, GURL(), GURL(), |
- GetGroupName(plugin)); |
- installers_[identifier] = installer; |
- name_installers_[plugin.name] = installer; |
- return installer; |
-} |