Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: chrome/browser/plugins/plugin_finder.cc

Issue 11348046: Add versioning to PluginFinder metadata. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/plugins/plugin_finder.h" 5 #include "chrome/browser/plugins/plugin_finder.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/json/json_reader.h" 8 #include "base/json/json_reader.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 local_state->RegisterBooleanPref(prefs::kDisablePluginFinder, false); 139 local_state->RegisterBooleanPref(prefs::kDisablePluginFinder, false);
140 } 140 }
141 141
142 // static 142 // static
143 PluginFinder* PluginFinder::GetInstance() { 143 PluginFinder* PluginFinder::GetInstance() {
144 // PluginFinder::GetInstance() is the only method that's allowed to call 144 // PluginFinder::GetInstance() is the only method that's allowed to call
145 // Singleton<PluginFinder>::get(). 145 // Singleton<PluginFinder>::get().
146 return Singleton<PluginFinder>::get(); 146 return Singleton<PluginFinder>::get();
147 } 147 }
148 148
149 PluginFinder::PluginFinder() { 149 PluginFinder::PluginFinder() : version_(-1) {
150 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 150 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
151 } 151 }
152 152
153 void PluginFinder::Init() { 153 void PluginFinder::Init() {
154 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 154 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
155 plugin_list_.reset(ComputePluginList()); 155 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.
156 DCHECK(plugin_list_.get()); 156 if (plugin_list)
157 157 ReinitializePlugins(plugin_list.Pass());
cevans 2013/02/05 21:06:52 In the common case (ENABLE_PLUGIN_INSTALLATION), R
158 InitInternal();
159 } 158 }
160 159
161 // static 160 // static
162 DictionaryValue* PluginFinder::ComputePluginList() { 161 DictionaryValue* PluginFinder::ComputePluginList() {
163 #if defined(ENABLE_PLUGIN_INSTALLATION) 162 #if defined(ENABLE_PLUGIN_INSTALLATION)
164 const base::DictionaryValue* metadata = 163 scoped_ptr<DictionaryValue> plugin_list(LoadPluginList());
165 g_browser_process->local_state()->GetDictionary(prefs::kPluginsMetadata); 164 if (plugin_list)
166 if (!metadata->empty()) 165 ReinitializePlugins(plugin_list.Pass());
167 return metadata->DeepCopy();
168 #endif 166 #endif
169 base::DictionaryValue* result = LoadPluginList(); 167 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
170 if (result) 168 if (result)
171 return result; 169 return result;
172 return new base::DictionaryValue(); 170 return new base::DictionaryValue();
173 } 171 }
174 172
175 // static 173 // static
176 DictionaryValue* PluginFinder::LoadPluginList() { 174 DictionaryValue* PluginFinder::LoadPluginList() {
177 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) 175 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
178 base::StringPiece json_resource( 176 base::StringPiece json_resource(
179 ResourceBundle::GetSharedInstance().GetRawDataResource( 177 ResourceBundle::GetSharedInstance().GetRawDataResource(
(...skipping 22 matching lines...) Expand all
202 #endif 200 #endif
203 STLDeleteValues(&identifier_plugin_); 201 STLDeleteValues(&identifier_plugin_);
204 } 202 }
205 203
206 #if defined(ENABLE_PLUGIN_INSTALLATION) 204 #if defined(ENABLE_PLUGIN_INSTALLATION)
207 bool PluginFinder::FindPlugin( 205 bool PluginFinder::FindPlugin(
208 const std::string& mime_type, 206 const std::string& mime_type,
209 const std::string& language, 207 const std::string& language,
210 PluginInstaller** installer, 208 PluginInstaller** installer,
211 scoped_ptr<PluginMetadata>* plugin_metadata) { 209 scoped_ptr<PluginMetadata>* plugin_metadata) {
212 base::AutoLock lock(mutex_);
213 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) 210 if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder))
214 return false; 211 return false;
215 212
213 base::AutoLock lock(mutex_);
216 PluginMap::const_iterator metadata_it = identifier_plugin_.begin(); 214 PluginMap::const_iterator metadata_it = identifier_plugin_.begin();
217 for (; metadata_it != identifier_plugin_.end(); ++metadata_it) { 215 for (; metadata_it != identifier_plugin_.end(); ++metadata_it) {
218 if (language == metadata_it->second->language() && 216 if (language == metadata_it->second->language() &&
219 metadata_it->second->HasMimeType(mime_type)) { 217 metadata_it->second->HasMimeType(mime_type)) {
220 *plugin_metadata = metadata_it->second->Clone(); 218 *plugin_metadata = metadata_it->second->Clone();
221 219
222 std::map<std::string, PluginInstaller*>::const_iterator installer_it = 220 std::map<std::string, PluginInstaller*>::const_iterator installer_it =
223 installers_.find(metadata_it->second->identifier()); 221 installers_.find(metadata_it->second->identifier());
224 DCHECK(installer_it != installers_.end()); 222 DCHECK(installer_it != installers_.end());
225 *installer = installer_it->second; 223 *installer = installer_it->second;
(...skipping 17 matching lines...) Expand all
243 std::map<std::string, PluginInstaller*>::const_iterator installer_it = 241 std::map<std::string, PluginInstaller*>::const_iterator installer_it =
244 installers_.find(identifier); 242 installers_.find(identifier);
245 if (installer_it == installers_.end()) 243 if (installer_it == installers_.end())
246 return false; 244 return false;
247 *installer = installer_it->second; 245 *installer = installer_it->second;
248 } 246 }
249 return true; 247 return true;
250 } 248 }
251 249
252 void PluginFinder::ReinitializePlugins( 250 void PluginFinder::ReinitializePlugins(
253 const base::DictionaryValue& json_metadata) { 251 scoped_ptr<base::DictionaryValue> json_metadata) {
254 base::AutoLock lock(mutex_); 252 base::AutoLock lock(mutex_);
253 int version = 0; // If no version is defined, we default to 0.
254 const char kVersionKey[] = "x-version";
255 json_metadata->GetInteger(kVersionKey, &version);
256 if (version <= version_)
257 return;
258
259 json_metadata->Remove(kVersionKey, NULL);
260
261 version_ = version;
262
255 STLDeleteValues(&identifier_plugin_); 263 STLDeleteValues(&identifier_plugin_);
256 identifier_plugin_.clear(); 264 identifier_plugin_.clear();
257 265
258 plugin_list_.reset(json_metadata.DeepCopy()); 266 InitInternal(json_metadata.Pass());
259 InitInternal();
260 } 267 }
261 #endif 268 #endif
262 269
263 string16 PluginFinder::FindPluginNameWithIdentifier( 270 string16 PluginFinder::FindPluginNameWithIdentifier(
264 const std::string& identifier) { 271 const std::string& identifier) {
265 base::AutoLock lock(mutex_); 272 base::AutoLock lock(mutex_);
266 PluginMap::const_iterator it = identifier_plugin_.find(identifier); 273 PluginMap::const_iterator it = identifier_plugin_.find(identifier);
267 string16 name; 274 string16 name;
268 if (it != identifier_plugin_.end()) 275 if (it != identifier_plugin_.end())
269 name = it->second->name(); 276 name = it->second->name();
(...skipping 25 matching lines...) Expand all
295 302
296 DCHECK(metadata->MatchesPlugin(plugin)); 303 DCHECK(metadata->MatchesPlugin(plugin));
297 if (identifier_plugin_.find(identifier) != identifier_plugin_.end()) 304 if (identifier_plugin_.find(identifier) != identifier_plugin_.end())
298 identifier = GetLongIdentifier(plugin); 305 identifier = GetLongIdentifier(plugin);
299 306
300 DCHECK(identifier_plugin_.find(identifier) == identifier_plugin_.end()); 307 DCHECK(identifier_plugin_.find(identifier) == identifier_plugin_.end());
301 identifier_plugin_[identifier] = metadata; 308 identifier_plugin_[identifier] = metadata;
302 return metadata->Clone(); 309 return metadata->Clone();
303 } 310 }
304 311
305 void PluginFinder::InitInternal() { 312 void PluginFinder::InitInternal(scoped_ptr<base::DictionaryValue> plugin_list) {
306 for (DictionaryValue::Iterator plugin_it(*plugin_list_); 313 for (DictionaryValue::Iterator plugin_it(*plugin_list);
307 plugin_it.HasNext(); plugin_it.Advance()) { 314 plugin_it.HasNext(); plugin_it.Advance()) {
308 DictionaryValue* plugin = NULL; 315 DictionaryValue* plugin = NULL;
309 const std::string& identifier = plugin_it.key(); 316 const std::string& identifier = plugin_it.key();
310 if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin)) { 317 if (plugin_list->GetDictionaryWithoutPathExpansion(identifier, &plugin)) {
311 DCHECK(!identifier_plugin_[identifier]); 318 DCHECK(!identifier_plugin_[identifier]);
312 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin); 319 identifier_plugin_[identifier] = CreatePluginMetadata(identifier, plugin);
313 320
314 #if defined(ENABLE_PLUGIN_INSTALLATION) 321 #if defined(ENABLE_PLUGIN_INSTALLATION)
315 if (installers_.find(identifier) == installers_.end()) 322 if (installers_.find(identifier) == installers_.end())
316 installers_[identifier] = new PluginInstaller(); 323 installers_[identifier] = new PluginInstaller();
317 #endif 324 #endif
318 } 325 }
319 } 326 }
320 } 327 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698