Chromium Code Reviews| Index: chrome/browser/plugins/plugin_finder.cc |
| diff --git a/chrome/browser/plugins/plugin_finder.cc b/chrome/browser/plugins/plugin_finder.cc |
| index b362c803d1be44536c0ac62e313059753a25835f..24f6e3e38c492f41322a59013d902d8b1c50f9f1 100644 |
| --- a/chrome/browser/plugins/plugin_finder.cc |
| +++ b/chrome/browser/plugins/plugin_finder.cc |
| @@ -146,25 +146,23 @@ 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(); |
| + scoped_ptr<DictionaryValue> plugin_list(ComputePluginList()); |
|
cevans
2013/02/05 21:06:52
I think I'd have found a comment here useful, alon
Bernhard Bauer
2013/02/06 20:08:24
Done.
|
| + if (plugin_list) |
| + ReinitializePlugins(plugin_list.Pass()); |
|
cevans
2013/02/05 21:06:52
In the common case (ENABLE_PLUGIN_INSTALLATION), R
|
| } |
| // 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(); |
| + scoped_ptr<DictionaryValue> plugin_list(LoadPluginList()); |
| + if (plugin_list) |
| + ReinitializePlugins(plugin_list.Pass()); |
| #endif |
| base::DictionaryValue* result = LoadPluginList(); |
|
cevans
2013/02/05 21:06:52
I'm kind of confused -- we just called LoadPluginL
Bernhard Bauer
2013/02/06 20:08:24
Yes, that's what I meant by "merging it with upstr
|
| if (result) |
| @@ -209,10 +207,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,13 +248,22 @@ bool PluginFinder::FindPluginWithIdentifier( |
| } |
| void PluginFinder::ReinitializePlugins( |
| - const base::DictionaryValue& json_metadata) { |
| + scoped_ptr<base::DictionaryValue> json_metadata) { |
| base::AutoLock lock(mutex_); |
| + int version = 0; // If no version is defined, we default to 0. |
| + const char kVersionKey[] = "x-version"; |
| + json_metadata->GetInteger(kVersionKey, &version); |
| + if (version <= version_) |
| + return; |
| + |
| + json_metadata->Remove(kVersionKey, NULL); |
| + |
| + version_ = version; |
| + |
| STLDeleteValues(&identifier_plugin_); |
| identifier_plugin_.clear(); |
| - plugin_list_.reset(json_metadata.DeepCopy()); |
| - InitInternal(); |
| + InitInternal(json_metadata.Pass()); |
| } |
| #endif |
| @@ -302,12 +309,12 @@ scoped_ptr<PluginMetadata> PluginFinder::GetPluginMetadata( |
| return metadata->Clone(); |
| } |
| -void PluginFinder::InitInternal() { |
| - for (DictionaryValue::Iterator plugin_it(*plugin_list_); |
| +void PluginFinder::InitInternal(scoped_ptr<base::DictionaryValue> plugin_list) { |
| + 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)) { |
| + if (plugin_list->GetDictionaryWithoutPathExpansion(identifier, &plugin)) { |
| DCHECK(!identifier_plugin_[identifier]); |
| identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin); |