Commit 3705fe7e authored by Bernhard Bauer's avatar Bernhard Bauer Committed by Commit Bot

Clear plugin map in PluginFinder when reinitializing.

The call to clear() was accidentally removed in https://crrev.com/456456,
but the bug didn't surface until recently when the remote plugin list
was updated before the baked-in one.

Other cleanup:
* Remove unused FindPlugin() method
* Use built-in static instead of base::Singleton
* Use SequenceChecker instead of BrowserThread thread checking
* Use new base::Value APIs and moar std::unique_ptr

TBR: finnur@chromium.org
Bug: 778856
Change-Id: I050dd2292882ab047b54f63983cdfd2f7da3aded
Reviewed-on: https://chromium-review.googlesource.com/746841
Commit-Queue: Bernhard Bauer <bauerb@chromium.org>
Reviewed-by: default avatarWill Harris <wfh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#512853}
parent 7d379ce1
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/browser/host_content_settings_map.h"
#include "content/public/browser/plugin_service.h" #include "content/public/browser/plugin_service.h"
#include "content/public/common/webplugininfo.h"
#include "extensions/browser/extension_prefs_scope.h" #include "extensions/browser/extension_prefs_scope.h"
#include "extensions/common/error_utils.h" #include "extensions/common/error_utils.h"
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/string16.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
...@@ -22,13 +23,11 @@ ...@@ -22,13 +23,11 @@
#include "chrome/grit/browser_resources.h" #include "chrome/grit/browser_resources.h"
#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "content/public/browser/browser_thread.h" #include "content/public/common/webplugininfo.h"
#include "content/public/browser/plugin_service.h"
#include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_bundle.h"
#include "url/gurl.h" #include "url/gurl.h"
using base::DictionaryValue; using base::DictionaryValue;
using content::PluginService;
namespace { namespace {
...@@ -154,17 +153,16 @@ void PluginFinder::RegisterPrefs(PrefRegistrySimple* registry) { ...@@ -154,17 +153,16 @@ void PluginFinder::RegisterPrefs(PrefRegistrySimple* registry) {
// static // static
PluginFinder* PluginFinder::GetInstance() { PluginFinder* PluginFinder::GetInstance() {
// PluginFinder::GetInstance() is the only method that's allowed to call static PluginFinder* instance = new PluginFinder();
// base::Singleton<PluginFinder>::get(). return instance;
return base::Singleton<PluginFinder>::get();
} }
PluginFinder::PluginFinder() : version_(-1) { PluginFinder::PluginFinder() : version_(-1) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
} }
void PluginFinder::Init() { void PluginFinder::Init() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// Load the built-in plugin list first. If we have a newer version stored // Load the built-in plugin list first. If we have a newer version stored
// locally or download one, we will replace this one with it. // locally or download one, we will replace this one with it.
std::unique_ptr<base::DictionaryValue> plugin_list(LoadBuiltInPluginList()); std::unique_ptr<base::DictionaryValue> plugin_list(LoadBuiltInPluginList());
...@@ -179,7 +177,7 @@ void PluginFinder::Init() { ...@@ -179,7 +177,7 @@ void PluginFinder::Init() {
} }
// static // static
base::DictionaryValue* PluginFinder::LoadBuiltInPluginList() { std::unique_ptr<base::DictionaryValue> PluginFinder::LoadBuiltInPluginList() {
base::StringPiece json_resource( base::StringPiece json_resource(
ui::ResourceBundle::GetSharedInstance().GetRawDataResource( ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_PLUGIN_DB_JSON)); IDR_PLUGIN_DB_JSON));
...@@ -234,36 +232,12 @@ base::DictionaryValue* PluginFinder::LoadBuiltInPluginList() { ...@@ -234,36 +232,12 @@ base::DictionaryValue* PluginFinder::LoadBuiltInPluginList() {
DCHECK_EQ(base::JSONReader::JSON_NO_ERROR, error_code); DCHECK_EQ(base::JSONReader::JSON_NO_ERROR, error_code);
RecordBuiltInPluginListError(PluginListError::PLUGIN_LIST_NO_ERROR); RecordBuiltInPluginListError(PluginListError::PLUGIN_LIST_NO_ERROR);
return static_cast<base::DictionaryValue*>(value.release()); return base::DictionaryValue::From(std::move(value));
} }
PluginFinder::~PluginFinder() { PluginFinder::~PluginFinder() {
} }
bool PluginFinder::FindPlugin(
const std::string& mime_type,
const std::string& language,
PluginInstaller** installer,
std::unique_ptr<PluginMetadata>* plugin_metadata) {
if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
return false;
base::AutoLock lock(mutex_);
auto metadata_it = identifier_plugin_.begin();
for (; metadata_it != identifier_plugin_.end(); ++metadata_it) {
if (language == metadata_it->second->language() &&
metadata_it->second->HasMimeType(mime_type)) {
*plugin_metadata = metadata_it->second->Clone();
auto installer_it = installers_.find(metadata_it->second->identifier());
DCHECK(installer_it != installers_.end());
*installer = installer_it->second.get();
return true;
}
}
return false;
}
bool PluginFinder::FindPluginWithIdentifier( bool PluginFinder::FindPluginWithIdentifier(
const std::string& identifier, const std::string& identifier,
PluginInstaller** installer, PluginInstaller** installer,
...@@ -293,10 +267,11 @@ void PluginFinder::ReinitializePlugins( ...@@ -293,10 +267,11 @@ void PluginFinder::ReinitializePlugins(
return; return;
version_ = version; version_ = version;
identifier_plugin_.clear();
for (base::DictionaryValue::Iterator plugin_it(*plugin_list); for (base::DictionaryValue::Iterator plugin_it(*plugin_list);
!plugin_it.IsAtEnd(); plugin_it.Advance()) { !plugin_it.IsAtEnd(); plugin_it.Advance()) {
const base::DictionaryValue* plugin = NULL; const base::DictionaryValue* plugin = nullptr;
const std::string& identifier = plugin_it.key(); const std::string& identifier = plugin_it.key();
if (plugin_list->GetDictionaryWithoutPathExpansion(identifier, &plugin)) { if (plugin_list->GetDictionaryWithoutPathExpansion(identifier, &plugin)) {
DCHECK(identifier_plugin_.find(identifier) == identifier_plugin_.end()); DCHECK(identifier_plugin_.find(identifier) == identifier_plugin_.end());
......
...@@ -12,16 +12,17 @@ ...@@ -12,16 +12,17 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/gtest_prod_util.h" #include "base/gtest_prod_util.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/singleton.h" #include "base/sequence_checker.h"
#include "base/strings/string16.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "chrome/common/features.h"
#include "content/public/common/webplugininfo.h"
namespace base { namespace base {
class DictionaryValue; class DictionaryValue;
} }
namespace content {
struct WebPluginInfo;
}
class PluginInstaller; class PluginInstaller;
class PluginMetadata; class PluginMetadata;
class PrefRegistrySimple; class PrefRegistrySimple;
...@@ -40,15 +41,6 @@ class PluginFinder { ...@@ -40,15 +41,6 @@ class PluginFinder {
void ReinitializePlugins(const base::DictionaryValue* json_metadata); void ReinitializePlugins(const base::DictionaryValue* json_metadata);
// Finds a plugin for the given MIME type and language (specified as an IETF
// language tag, i.e. en-US). If found, sets |installer| to the
// corresponding PluginInstaller and |plugin_metadata| to a copy of the
// corresponding PluginMetadata.
bool FindPlugin(const std::string& mime_type,
const std::string& language,
PluginInstaller** installer,
std::unique_ptr<PluginMetadata>* plugin_metadata);
// Finds the plugin with the given identifier. If found, sets |installer| // Finds the plugin with the given identifier. If found, sets |installer|
// to the corresponding PluginInstaller and |plugin_metadata| to a copy // to the corresponding PluginInstaller and |plugin_metadata| to a copy
// of the corresponding PluginMetadata. |installer| may be null. // of the corresponding PluginMetadata. |installer| may be null.
...@@ -62,16 +54,17 @@ class PluginFinder { ...@@ -62,16 +54,17 @@ class PluginFinder {
const content::WebPluginInfo& plugin); const content::WebPluginInfo& plugin);
private: private:
friend struct base::DefaultSingletonTraits<PluginFinder>;
FRIEND_TEST_ALL_PREFIXES(PluginFinderTest, JsonSyntax); FRIEND_TEST_ALL_PREFIXES(PluginFinderTest, JsonSyntax);
FRIEND_TEST_ALL_PREFIXES(PluginFinderTest, PluginGroups); FRIEND_TEST_ALL_PREFIXES(PluginFinderTest, ReinitializePlugins);
PluginFinder(); PluginFinder();
~PluginFinder(); ~PluginFinder();
// Loads the plugin information from the browser resources and parses it. // Loads the plugin information from the browser resources and parses it.
// Returns null if the plugin list couldn't be parsed. // Returns null if the plugin list couldn't be parsed.
static base::DictionaryValue* LoadBuiltInPluginList(); static std::unique_ptr<base::DictionaryValue> LoadBuiltInPluginList();
SEQUENCE_CHECKER(sequence_checker_);
std::map<std::string, std::unique_ptr<PluginInstaller>> installers_; std::map<std::string, std::unique_ptr<PluginInstaller>> installers_;
......
...@@ -12,9 +12,9 @@ using base::DictionaryValue; ...@@ -12,9 +12,9 @@ using base::DictionaryValue;
using base::ListValue; using base::ListValue;
TEST(PluginFinderTest, JsonSyntax) { TEST(PluginFinderTest, JsonSyntax) {
std::unique_ptr<base::DictionaryValue> plugin_list( std::unique_ptr<base::DictionaryValue> plugin_list =
PluginFinder::LoadBuiltInPluginList()); PluginFinder::LoadBuiltInPluginList();
ASSERT_TRUE(plugin_list.get()); ASSERT_TRUE(plugin_list);
std::unique_ptr<base::Value> version; std::unique_ptr<base::Value> version;
ASSERT_TRUE(plugin_list->Remove("x-version", &version)); ASSERT_TRUE(plugin_list->Remove("x-version", &version));
EXPECT_EQ(base::Value::Type::INTEGER, version->type()); EXPECT_EQ(base::Value::Type::INTEGER, version->type());
...@@ -73,3 +73,21 @@ TEST(PluginFinderTest, JsonSyntax) { ...@@ -73,3 +73,21 @@ TEST(PluginFinderTest, JsonSyntax) {
} }
} }
} }
TEST(PluginFinderTest, ReinitializePlugins) {
PluginFinder* plugin_finder = PluginFinder::GetInstance();
plugin_finder->Init();
std::unique_ptr<base::DictionaryValue> plugin_list =
PluginFinder::LoadBuiltInPluginList();
// Increment the version number by one.
const base::Value* version_value = plugin_list->FindKey("x-version");
ASSERT_TRUE(version_value);
int version = 0;
ASSERT_TRUE(version_value->GetAsInteger(&version));
plugin_list->SetKey("x-version", base::Value(version + 1));
plugin_finder->ReinitializePlugins(plugin_list.get());
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment