summaryrefslogtreecommitdiffstats
path: root/chrome/browser/plugins/plugin_finder.cc
diff options
context:
space:
mode:
authorbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-12 19:16:30 +0000
committerbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-12 19:16:30 +0000
commit97eddfe766623115be4a6ef7831c740dcf10391f (patch)
tree717fe0d3ae5f06213ca3e5befba2699cd0be9d6b /chrome/browser/plugins/plugin_finder.cc
parent132759667dc2a2f713b78266dcf7e4cb23c43edf (diff)
downloadchromium_src-97eddfe766623115be4a6ef7831c740dcf10391f.zip
chromium_src-97eddfe766623115be4a6ef7831c740dcf10391f.tar.gz
chromium_src-97eddfe766623115be4a6ef7831c740dcf10391f.tar.bz2
Add versioning to PluginFinder metadata.
TBR=jochen@chromium.org BUG=170097 Review URL: https://chromiumcodereview.appspot.com/11348046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@181967 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/plugins/plugin_finder.cc')
-rw-r--r--chrome/browser/plugins/plugin_finder.cc78
1 files changed, 32 insertions, 46 deletions
diff --git a/chrome/browser/plugins/plugin_finder.cc b/chrome/browser/plugins/plugin_finder.cc
index 0c309ab..a8097cf 100644
--- a/chrome/browser/plugins/plugin_finder.cc
+++ b/chrome/browser/plugins/plugin_finder.cc
@@ -148,35 +148,21 @@ PluginFinder* PluginFinder::GetInstance() {
return Singleton<PluginFinder>::get();
}
-PluginFinder::PluginFinder() {
+PluginFinder::PluginFinder() : version_(-1) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
void PluginFinder::Init() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
- plugin_list_.reset(ComputePluginList());
- DCHECK(plugin_list_.get());
-
- InitInternal();
-}
-
-// static
-DictionaryValue* PluginFinder::ComputePluginList() {
-#if defined(ENABLE_PLUGIN_INSTALLATION)
- const base::DictionaryValue* metadata =
- g_browser_process->local_state()->GetDictionary(prefs::kPluginsMetadata);
- if (!metadata->empty())
- return metadata->DeepCopy();
-#endif
- base::DictionaryValue* result = LoadPluginList();
- if (result)
- return result;
- return new base::DictionaryValue();
+ // Load the built-in plug-in list first. If we have a newer version stored
+ // locally or download one, we will replace this one with it.
+ scoped_ptr<DictionaryValue> plugin_list(LoadBuiltInPluginList());
+ DCHECK(plugin_list);
+ ReinitializePlugins(plugin_list.get());
}
// static
-DictionaryValue* PluginFinder::LoadPluginList() {
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
+DictionaryValue* PluginFinder::LoadBuiltInPluginList() {
base::StringPiece json_resource(
ResourceBundle::GetSharedInstance().GetRawDataResource(
IDR_PLUGIN_DB_JSON));
@@ -193,9 +179,6 @@ DictionaryValue* PluginFinder::LoadPluginList() {
if (value->GetType() != base::Value::TYPE_DICTIONARY)
return NULL;
return static_cast<base::DictionaryValue*>(value.release());
-#else
- return new DictionaryValue();
-#endif
}
PluginFinder::~PluginFinder() {
@@ -211,10 +194,10 @@ bool PluginFinder::FindPlugin(
const std::string& language,
PluginInstaller** installer,
scoped_ptr<PluginMetadata>* plugin_metadata) {
- base::AutoLock lock(mutex_);
if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
return false;
+ base::AutoLock lock(mutex_);
PluginMap::const_iterator metadata_it = identifier_plugin_.begin();
for (; metadata_it != identifier_plugin_.end(); ++metadata_it) {
if (language == metadata_it->second->language() &&
@@ -250,17 +233,37 @@ bool PluginFinder::FindPluginWithIdentifier(
}
return true;
}
+#endif
void PluginFinder::ReinitializePlugins(
- const base::DictionaryValue& json_metadata) {
+ const base::DictionaryValue* plugin_list) {
base::AutoLock lock(mutex_);
+ int version = 0; // If no version is defined, we default to 0.
+ const char kVersionKey[] = "x-version";
+ plugin_list->GetInteger(kVersionKey, &version);
+ if (version <= version_)
+ return;
+
+ version_ = version;
+
STLDeleteValues(&identifier_plugin_);
identifier_plugin_.clear();
- plugin_list_.reset(json_metadata.DeepCopy());
- InitInternal();
-}
+ for (DictionaryValue::Iterator plugin_it(*plugin_list);
+ plugin_it.HasNext(); plugin_it.Advance()) {
+ const DictionaryValue* plugin = NULL;
+ const std::string& identifier = plugin_it.key();
+ if (plugin_list->GetDictionaryWithoutPathExpansion(identifier, &plugin)) {
+ DCHECK(!identifier_plugin_[identifier]);
+ identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin);
+
+#if defined(ENABLE_PLUGIN_INSTALLATION)
+ if (installers_.find(identifier) == installers_.end())
+ installers_[identifier] = new PluginInstaller();
#endif
+ }
+ }
+}
string16 PluginFinder::FindPluginNameWithIdentifier(
const std::string& identifier) {
@@ -303,20 +306,3 @@ scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata(
identifier_plugin_[identifier] = metadata;
return metadata->Clone();
}
-
-void PluginFinder::InitInternal() {
- for (DictionaryValue::Iterator plugin_it(*plugin_list_);
- plugin_it.HasNext(); plugin_it.Advance()) {
- DictionaryValue* plugin = NULL;
- const std::string& identifier = plugin_it.key();
- if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin)) {
- DCHECK(!identifier_plugin_[identifier]);
- identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin);
-
-#if defined(ENABLE_PLUGIN_INSTALLATION)
- if (installers_.find(identifier) == installers_.end())
- installers_[identifier] = new PluginInstaller();
-#endif
- }
- }
-}