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

Side by Side Diff: chrome/browser/ui/webui/plugins_ui.cc

Issue 10910168: Separate plugin_metadata from plugin_installer, thread-safe plugin_finder (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: .. Created 8 years, 2 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
« no previous file with comments | « chrome/browser/ui/pdf/pdf_unsupported_feature.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/ui/webui/plugins_ui.h" 5 #include "chrome/browser/ui/webui/plugins_ui.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/memory/ref_counted_memory.h" 13 #include "base/memory/ref_counted_memory.h"
14 #include "base/memory/singleton.h" 14 #include "base/memory/singleton.h"
15 #include "base/memory/weak_ptr.h" 15 #include "base/memory/weak_ptr.h"
16 #include "base/message_loop.h" 16 #include "base/message_loop.h"
17 #include "base/path_service.h" 17 #include "base/path_service.h"
18 #include "base/utf_string_conversions.h" 18 #include "base/utf_string_conversions.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "chrome/browser/api/prefs/pref_member.h" 20 #include "chrome/browser/api/prefs/pref_member.h"
21 #include "chrome/browser/content_settings/host_content_settings_map.h" 21 #include "chrome/browser/content_settings/host_content_settings_map.h"
22 #include "chrome/browser/plugins/plugin_finder.h" 22 #include "chrome/browser/plugins/plugin_finder.h"
23 #include "chrome/browser/plugins/plugin_installer.h" 23 #include "chrome/browser/plugins/plugin_metadata.h"
24 #include "chrome/browser/plugins/plugin_prefs.h" 24 #include "chrome/browser/plugins/plugin_prefs.h"
25 #include "chrome/browser/prefs/pref_service.h" 25 #include "chrome/browser/prefs/pref_service.h"
26 #include "chrome/browser/prefs/scoped_user_pref_update.h" 26 #include "chrome/browser/prefs/scoped_user_pref_update.h"
27 #include "chrome/browser/profiles/profile.h" 27 #include "chrome/browser/profiles/profile.h"
28 #include "chrome/browser/ui/browser.h" 28 #include "chrome/browser/ui/browser.h"
29 #include "chrome/browser/ui/browser_window.h" 29 #include "chrome/browser/ui/browser_window.h"
30 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" 30 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
31 #include "chrome/browser/ui/webui/chrome_web_ui_data_source.h" 31 #include "chrome/browser/ui/webui/chrome_web_ui_data_source.h"
32 #include "chrome/common/chrome_content_client.h" 32 #include "chrome/common/chrome_content_client.h"
33 #include "chrome/common/chrome_notification_types.h" 33 #include "chrome/common/chrome_notification_types.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 156
157 // Callback for the "setPluginAlwaysAllowed" message. 157 // Callback for the "setPluginAlwaysAllowed" message.
158 void HandleSetPluginAlwaysAllowed(const ListValue* args); 158 void HandleSetPluginAlwaysAllowed(const ListValue* args);
159 159
160 // content::NotificationObserver method overrides 160 // content::NotificationObserver method overrides
161 virtual void Observe(int type, 161 virtual void Observe(int type,
162 const content::NotificationSource& source, 162 const content::NotificationSource& source,
163 const content::NotificationDetails& details) OVERRIDE; 163 const content::NotificationDetails& details) OVERRIDE;
164 164
165 private: 165 private:
166 // Call this to start getting the plugins on the UI thread. 166 void LoadPlugins();
167 void GetPluginFinder();
168
169 // Called when we have a PluginFinder and need to load the list of plug-ins.
170 void LoadPlugins(PluginFinder* plugin_finder);
171 167
172 // Called on the UI thread when the plugin information is ready. 168 // Called on the UI thread when the plugin information is ready.
173 void PluginsLoaded(PluginFinder* plugin_finder, 169 void PluginsLoaded(const std::vector<webkit::WebPluginInfo>& plugins);
174 const std::vector<webkit::WebPluginInfo>& plugins);
175 170
176 content::NotificationRegistrar registrar_; 171 content::NotificationRegistrar registrar_;
177 172
178 base::WeakPtrFactory<PluginsDOMHandler> weak_ptr_factory_; 173 base::WeakPtrFactory<PluginsDOMHandler> weak_ptr_factory_;
179 174
180 // Holds grouped plug-ins. The key is the group identifier and 175 // Holds grouped plug-ins. The key is the group identifier and
181 // the value is the list of plug-ins belonging to the group. 176 // the value is the list of plug-ins belonging to the group.
182 typedef base::hash_map<std::string, std::vector<const WebPluginInfo*> > 177 typedef base::hash_map<std::string, std::vector<const WebPluginInfo*> >
183 PluginGroups; 178 PluginGroups;
184 179
(...skipping 29 matching lines...) Expand all
214 base::Unretained(this))); 209 base::Unretained(this)));
215 web_ui()->RegisterMessageCallback("saveShowDetailsToPrefs", 210 web_ui()->RegisterMessageCallback("saveShowDetailsToPrefs",
216 base::Bind(&PluginsDOMHandler::HandleSaveShowDetailsToPrefs, 211 base::Bind(&PluginsDOMHandler::HandleSaveShowDetailsToPrefs,
217 base::Unretained(this))); 212 base::Unretained(this)));
218 web_ui()->RegisterMessageCallback("getShowDetails", 213 web_ui()->RegisterMessageCallback("getShowDetails",
219 base::Bind(&PluginsDOMHandler::HandleGetShowDetails, 214 base::Bind(&PluginsDOMHandler::HandleGetShowDetails,
220 base::Unretained(this))); 215 base::Unretained(this)));
221 } 216 }
222 217
223 void PluginsDOMHandler::HandleRequestPluginsData(const ListValue* args) { 218 void PluginsDOMHandler::HandleRequestPluginsData(const ListValue* args) {
224 GetPluginFinder(); 219 LoadPlugins();
225 } 220 }
226 221
227 void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) { 222 void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) {
228 Profile* profile = Profile::FromWebUI(web_ui()); 223 Profile* profile = Profile::FromWebUI(web_ui());
229 224
230 // Be robust in accepting badness since plug-ins display HTML (hence 225 // Be robust in accepting badness since plug-ins display HTML (hence
231 // JavaScript). 226 // JavaScript).
232 if (args->GetSize() != 3) { 227 if (args->GetSize() != 3) {
233 NOTREACHED(); 228 NOTREACHED();
234 return; 229 return;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 // whitelisted by the user from automatically whitelisted ones. 308 // whitelisted by the user from automatically whitelisted ones.
314 DictionaryPrefUpdate update(profile->GetPrefs(), 309 DictionaryPrefUpdate update(profile->GetPrefs(),
315 prefs::kContentSettingsPluginWhitelist); 310 prefs::kContentSettingsPluginWhitelist);
316 update->SetBoolean(plugin, allowed); 311 update->SetBoolean(plugin, allowed);
317 } 312 }
318 313
319 void PluginsDOMHandler::Observe(int type, 314 void PluginsDOMHandler::Observe(int type,
320 const content::NotificationSource& source, 315 const content::NotificationSource& source,
321 const content::NotificationDetails& details) { 316 const content::NotificationDetails& details) {
322 DCHECK_EQ(chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, type); 317 DCHECK_EQ(chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, type);
323 GetPluginFinder(); 318 LoadPlugins();
324 } 319 }
325 320
326 void PluginsDOMHandler::GetPluginFinder() { 321 void PluginsDOMHandler::LoadPlugins() {
327 if (weak_ptr_factory_.HasWeakPtrs()) 322 if (weak_ptr_factory_.HasWeakPtrs())
328 return; 323 return;
329 324
330 PluginFinder::Get(base::Bind(&PluginsDOMHandler::LoadPlugins,
331 weak_ptr_factory_.GetWeakPtr()));
332 }
333
334 void PluginsDOMHandler::LoadPlugins(PluginFinder* plugin_finder) {
335 PluginService::GetInstance()->GetPlugins( 325 PluginService::GetInstance()->GetPlugins(
336 base::Bind(&PluginsDOMHandler::PluginsLoaded, 326 base::Bind(&PluginsDOMHandler::PluginsLoaded,
337 weak_ptr_factory_.GetWeakPtr(), plugin_finder)); 327 weak_ptr_factory_.GetWeakPtr()));
338 } 328 }
339 329
340 void PluginsDOMHandler::PluginsLoaded( 330 void PluginsDOMHandler::PluginsLoaded(
341 PluginFinder* plugin_finder,
342 const std::vector<webkit::WebPluginInfo>& plugins) { 331 const std::vector<webkit::WebPluginInfo>& plugins) {
343 Profile* profile = Profile::FromWebUI(web_ui()); 332 Profile* profile = Profile::FromWebUI(web_ui());
344 PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile); 333 PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile);
345 334
346 ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); 335 ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard();
347 336
337 PluginFinder* plugin_finder = PluginFinder::GetInstance();
348 // Group plug-ins by identifier. This is done to be able to display 338 // Group plug-ins by identifier. This is done to be able to display
349 // the plug-ins in UI in a grouped fashion. 339 // the plug-ins in UI in a grouped fashion.
350 PluginGroups groups; 340 PluginGroups groups;
351 for (size_t i = 0; i < plugins.size(); ++i) { 341 for (size_t i = 0; i < plugins.size(); ++i) {
352 PluginInstaller* installer = plugin_finder->GetPluginInstaller(plugins[i]); 342 PluginMetadata* plugin = plugin_finder->GetPluginMetadata(plugins[i]);
353 groups[installer->identifier()].push_back(&plugins[i]); 343 groups[plugin->identifier()].push_back(&plugins[i]);
354 } 344 }
355 345
356 // Construct DictionaryValues to return to UI. 346 // Construct DictionaryValues to return to UI.
357 ListValue* plugin_groups_data = new ListValue(); 347 ListValue* plugin_groups_data = new ListValue();
358 for (PluginGroups::const_iterator it = groups.begin(); 348 for (PluginGroups::const_iterator it = groups.begin();
359 it != groups.end(); ++it) { 349 it != groups.end(); ++it) {
360 const std::vector<const WebPluginInfo*>& group_plugins = it->second; 350 const std::vector<const WebPluginInfo*>& group_plugins = it->second;
361 ListValue* plugin_files = new ListValue(); 351 ListValue* plugin_files = new ListValue();
362 PluginInstaller* plugin_installer = 352 PluginMetadata* plugin_metadata =
363 plugin_finder->GetPluginInstaller(*group_plugins[0]); 353 plugin_finder->GetPluginMetadata(*group_plugins[0]);
364 string16 group_name = plugin_installer->name(); 354 string16 group_name = plugin_metadata->name();
365 std::string group_identifier = plugin_installer->identifier(); 355 std::string group_identifier = plugin_metadata->identifier();
366 bool group_enabled = false; 356 bool group_enabled = false;
367 bool all_plugins_enabled_by_policy = true; 357 bool all_plugins_enabled_by_policy = true;
368 bool all_plugins_disabled_by_policy = true; 358 bool all_plugins_disabled_by_policy = true;
369 const WebPluginInfo* active_plugin = NULL; 359 const WebPluginInfo* active_plugin = NULL;
370 for (size_t j = 0; j < group_plugins.size(); ++j) { 360 for (size_t j = 0; j < group_plugins.size(); ++j) {
371 const WebPluginInfo& group_plugin = *group_plugins[j]; 361 const WebPluginInfo& group_plugin = *group_plugins[j];
372 362
373 DictionaryValue* plugin_file = new DictionaryValue(); 363 DictionaryValue* plugin_file = new DictionaryValue();
374 plugin_file->SetString("name", group_plugin.name); 364 plugin_file->SetString("name", group_plugin.name);
375 plugin_file->SetString("description", group_plugin.desc); 365 plugin_file->SetString("description", group_plugin.desc);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 } 420 }
431 DictionaryValue* group_data = new DictionaryValue(); 421 DictionaryValue* group_data = new DictionaryValue();
432 422
433 group_data->Set("plugin_files", plugin_files); 423 group_data->Set("plugin_files", plugin_files);
434 group_data->SetString("name", group_name); 424 group_data->SetString("name", group_name);
435 group_data->SetString("id", group_identifier); 425 group_data->SetString("id", group_identifier);
436 group_data->SetString("description", active_plugin->desc); 426 group_data->SetString("description", active_plugin->desc);
437 group_data->SetString("version", active_plugin->version); 427 group_data->SetString("version", active_plugin->version);
438 428
439 #if defined(ENABLE_PLUGIN_INSTALLATION) 429 #if defined(ENABLE_PLUGIN_INSTALLATION)
440 PluginInstaller* installer = 430 bool out_of_date = plugin_metadata->GetSecurityStatus(*active_plugin) ==
441 plugin_finder->FindPluginWithIdentifier(group_identifier); 431 PluginMetadata::SECURITY_STATUS_OUT_OF_DATE;
442 if (installer) { 432 group_data->SetBoolean("critical", out_of_date);
443 bool out_of_date = installer->GetSecurityStatus(*active_plugin) == 433 group_data->SetString("update_url", plugin_metadata->plugin_url().spec());
444 PluginInstaller::SECURITY_STATUS_OUT_OF_DATE;
445 group_data->SetBoolean("critical", out_of_date);
446 group_data->SetString("update_url", installer->plugin_url().spec());
447 }
448 #endif 434 #endif
449 435
450 std::string enabled_mode; 436 std::string enabled_mode;
451 if (all_plugins_enabled_by_policy) { 437 if (all_plugins_enabled_by_policy) {
452 enabled_mode = "enabledByPolicy"; 438 enabled_mode = "enabledByPolicy";
453 } else if (all_plugins_disabled_by_policy) { 439 } else if (all_plugins_disabled_by_policy) {
454 enabled_mode = "disabledByPolicy"; 440 enabled_mode = "disabledByPolicy";
455 } else if (group_enabled) { 441 } else if (group_enabled) {
456 enabled_mode = "enabledByUser"; 442 enabled_mode = "enabledByUser";
457 } else { 443 } else {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 void PluginsUI::RegisterUserPrefs(PrefService* prefs) { 487 void PluginsUI::RegisterUserPrefs(PrefService* prefs) {
502 prefs->RegisterBooleanPref(prefs::kPluginsShowDetails, 488 prefs->RegisterBooleanPref(prefs::kPluginsShowDetails,
503 false, 489 false,
504 PrefService::UNSYNCABLE_PREF); 490 PrefService::UNSYNCABLE_PREF);
505 prefs->RegisterBooleanPref(prefs::kPluginsShowSetReaderDefaultInfobar, 491 prefs->RegisterBooleanPref(prefs::kPluginsShowSetReaderDefaultInfobar,
506 true, 492 true,
507 PrefService::UNSYNCABLE_PREF); 493 PrefService::UNSYNCABLE_PREF);
508 prefs->RegisterDictionaryPref(prefs::kContentSettingsPluginWhitelist, 494 prefs->RegisterDictionaryPref(prefs::kContentSettingsPluginWhitelist,
509 PrefService::SYNCABLE_PREF); 495 PrefService::SYNCABLE_PREF);
510 } 496 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/pdf/pdf_unsupported_feature.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698