Index: chrome/browser/ui/webui/plugins_ui.cc |
diff --git a/chrome/browser/ui/webui/plugins_ui.cc b/chrome/browser/ui/webui/plugins_ui.cc |
index 55304c3a6a6f1a024e8cceb7053c34e22e0ad4a1..b830969fe074de8c9779731e39de13066cc2cc67 100644 |
--- a/chrome/browser/ui/webui/plugins_ui.cc |
+++ b/chrome/browser/ui/webui/plugins_ui.cc |
@@ -13,7 +13,7 @@ |
#include "base/path_service.h" |
#include "base/utf_string_conversions.h" |
#include "base/values.h" |
-#include "chrome/browser/plugin_prefs.h" |
+#include "chrome/browser/plugin_updater.h" |
#include "chrome/browser/prefs/pref_member.h" |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -122,19 +122,23 @@ class PluginsDOMHandler : public WebUIMessageHandler, |
const NotificationDetails& details) OVERRIDE; |
private: |
+ // This extra wrapper is used to ensure we don't leak the ListValue* pointer |
+ // if the PluginsDOMHandler object goes away before the task on the UI thread |
+ // to give it the plugin list runs. |
+ struct ListWrapper { |
+ ListValue* list; |
+ }; |
// Loads the plugins on the FILE thread. |
- static void LoadPluginsOnFileThread( |
- std::vector<webkit::npapi::PluginGroup>* groups, Task* task); |
+ static void LoadPluginsOnFileThread(ListWrapper* wrapper, Task* task); |
// Used in conjunction with ListWrapper to avoid any memory leaks. |
- static void EnsurePluginGroupsDeleted( |
- std::vector<webkit::npapi::PluginGroup>* groups); |
+ static void EnsureListDeleted(ListWrapper* wrapper); |
// Call this to start getting the plugins on the UI thread. |
void LoadPlugins(); |
// Called on the UI thread when the plugin information is ready. |
- void PluginsLoaded(const std::vector<webkit::npapi::PluginGroup>* groups); |
+ void PluginsLoaded(ListWrapper* wrapper); |
NotificationRegistrar registrar_; |
@@ -157,7 +161,7 @@ PluginsDOMHandler::PluginsDOMHandler() |
WebUIMessageHandler* PluginsDOMHandler::Attach(WebUI* web_ui) { |
PrefService* prefs = Profile::FromWebUI(web_ui)->GetPrefs(); |
- show_details_.Init(prefs::kPluginsShowDetails, prefs, NULL); |
+ show_details_.Init(prefs::kPluginsShowDetails, prefs, this); |
return WebUIMessageHandler::Attach(web_ui); |
} |
@@ -198,13 +202,13 @@ void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) { |
return; |
bool enable = enable_str == "true"; |
- PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile); |
+ PluginUpdater* plugin_updater = PluginUpdater::GetInstance(); |
if (is_group_str == "true") { |
string16 group_name; |
if (!args->GetString(0, &group_name)) |
return; |
- plugin_prefs->EnablePluginGroup(enable, group_name); |
+ plugin_updater->EnablePluginGroup(enable, group_name); |
if (enable) { |
// See http://crbug.com/50105 for background. |
string16 adobereader = ASCIIToUTF16( |
@@ -212,9 +216,9 @@ void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) { |
string16 internalpdf = |
ASCIIToUTF16(chrome::ChromeContentClient::kPDFPluginName); |
if (group_name == adobereader) { |
- plugin_prefs->EnablePluginGroup(false, internalpdf); |
+ plugin_updater->EnablePluginGroup(false, internalpdf); |
} else if (group_name == internalpdf) { |
- plugin_prefs->EnablePluginGroup(false, adobereader); |
+ plugin_updater->EnablePluginGroup(false, adobereader); |
} |
} |
} else { |
@@ -222,13 +226,13 @@ void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) { |
if (!args->GetString(0, &file_path)) |
return; |
- plugin_prefs->EnablePlugin(enable, FilePath(file_path)); |
+ plugin_updater->EnablePlugin(enable, file_path); |
} |
// TODO(viettrungluu): We might also want to ensure that the plugins |
// list is always written to prefs even when the user hasn't disabled a |
// plugin. <http://crbug.com/39101> |
- plugin_prefs->UpdatePreferences(0); |
+ plugin_updater->UpdatePreferences(profile, 0); |
} |
void PluginsDOMHandler::HandleSaveShowDetailsToPrefs(const ListValue* args) { |
@@ -252,50 +256,41 @@ void PluginsDOMHandler::Observe(int type, |
LoadPlugins(); |
} |
-void PluginsDOMHandler::LoadPluginsOnFileThread( |
- std::vector<webkit::npapi::PluginGroup>* groups, |
- Task* task) { |
- webkit::npapi::PluginList::Singleton()->GetPluginGroups(true, groups); |
- |
+void PluginsDOMHandler::LoadPluginsOnFileThread(ListWrapper* wrapper, |
+ Task* task) { |
+ wrapper->list = PluginUpdater::GetInstance()->GetPluginGroupsData(); |
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, task); |
BrowserThread::PostTask( |
BrowserThread::UI, |
FROM_HERE, |
- NewRunnableFunction(&PluginsDOMHandler::EnsurePluginGroupsDeleted, |
- groups)); |
+ NewRunnableFunction(&PluginsDOMHandler::EnsureListDeleted, wrapper)); |
} |
-void PluginsDOMHandler::EnsurePluginGroupsDeleted( |
- std::vector<webkit::npapi::PluginGroup>* groups) { |
- delete groups; |
+void PluginsDOMHandler::EnsureListDeleted(ListWrapper* wrapper) { |
+ delete wrapper->list; |
+ delete wrapper; |
} |
void PluginsDOMHandler::LoadPlugins() { |
if (!get_plugins_factory_.empty()) |
return; |
- std::vector<webkit::npapi::PluginGroup>* groups = |
- new std::vector<webkit::npapi::PluginGroup>; |
+ ListWrapper* wrapper = new ListWrapper; |
+ wrapper->list = NULL; |
Task* task = get_plugins_factory_.NewRunnableMethod( |
- &PluginsDOMHandler::PluginsLoaded, groups); |
+ &PluginsDOMHandler::PluginsLoaded, wrapper); |
BrowserThread::PostTask( |
BrowserThread::FILE, |
FROM_HERE, |
NewRunnableFunction( |
- &PluginsDOMHandler::LoadPluginsOnFileThread, groups, task)); |
+ &PluginsDOMHandler::LoadPluginsOnFileThread, wrapper, task)); |
} |
-void PluginsDOMHandler::PluginsLoaded( |
- const std::vector<webkit::npapi::PluginGroup>* groups) { |
- // Construct DictionaryValues to return to the UI |
- ListValue* plugin_groups_data = new ListValue(); |
- for (size_t i = 0; i < groups->size(); ++i) { |
- plugin_groups_data->Append((*groups)[i].GetDataForUI()); |
- // TODO(bauerb): Fetch plugin enabled state from PluginPrefs. |
- } |
+void PluginsDOMHandler::PluginsLoaded(ListWrapper* wrapper) { |
DictionaryValue results; |
- results.Set("plugins", plugin_groups_data); |
+ results.Set("plugins", wrapper->list); |
+ wrapper->list = NULL; // So it doesn't get deleted. |
web_ui_->CallJavascriptFunction("returnPluginsData", results); |
} |