| 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 710f42335be8e540248b83ff309bf8965de9e8b1..a4f0dfe04e207a939a53a470bfcb608238d42b04 100644
|
| --- a/chrome/browser/ui/webui/plugins_ui.cc
|
| +++ b/chrome/browser/ui/webui/plugins_ui.cc
|
| @@ -36,6 +36,9 @@
|
| #include "ui/base/resource/resource_bundle.h"
|
| #include "webkit/plugins/npapi/plugin_list.h"
|
|
|
| +using webkit::npapi::PluginGroup;
|
| +using webkit::WebPluginInfo;
|
| +
|
| namespace {
|
|
|
| ChromeWebUIDataSource* CreatePluginsUIHTMLSource(bool enable_controls) {
|
| @@ -125,17 +128,17 @@ class PluginsDOMHandler : public WebUIMessageHandler,
|
| private:
|
| // Loads the plugins on the FILE thread.
|
| static void LoadPluginsOnFileThread(
|
| - std::vector<webkit::npapi::PluginGroup>* groups, Task* task);
|
| + std::vector<PluginGroup>* groups, Task* task);
|
|
|
| // Used in conjunction with ListWrapper to avoid any memory leaks.
|
| static void EnsurePluginGroupsDeleted(
|
| - std::vector<webkit::npapi::PluginGroup>* groups);
|
| + std::vector<PluginGroup>* groups);
|
|
|
| // 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(const std::vector<PluginGroup>* groups);
|
|
|
| NotificationRegistrar registrar_;
|
|
|
| @@ -181,13 +184,6 @@ void PluginsDOMHandler::HandleRequestPluginsData(const ListValue* args) {
|
| void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) {
|
| Profile* profile = Profile::FromWebUI(web_ui_);
|
|
|
| - // If a non-first-profile user tries to trigger these methods sneakily,
|
| - // forbid it.
|
| -#if !defined(OS_CHROMEOS)
|
| - if (!profile->GetOriginalProfile()->first_launched())
|
| - return;
|
| -#endif
|
| -
|
| // Be robust in accepting badness since plug-ins display HTML (hence
|
| // JavaScript).
|
| if (args->GetSize() != 3)
|
| @@ -209,27 +205,20 @@ void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) {
|
| if (enable) {
|
| // See http://crbug.com/50105 for background.
|
| string16 adobereader = ASCIIToUTF16(
|
| - webkit::npapi::PluginGroup::kAdobeReaderGroupName);
|
| + PluginGroup::kAdobeReaderGroupName);
|
| string16 internalpdf =
|
| ASCIIToUTF16(chrome::ChromeContentClient::kPDFPluginName);
|
| - if (group_name == adobereader) {
|
| + if (group_name == adobereader)
|
| plugin_prefs->EnablePluginGroup(false, internalpdf);
|
| - } else if (group_name == internalpdf) {
|
| + else if (group_name == internalpdf)
|
| plugin_prefs->EnablePluginGroup(false, adobereader);
|
| - }
|
| }
|
| } else {
|
| FilePath::StringType file_path;
|
| if (!args->GetString(0, &file_path))
|
| return;
|
| -
|
| plugin_prefs->EnablePlugin(enable, FilePath(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);
|
| }
|
|
|
| void PluginsDOMHandler::HandleSaveShowDetailsToPrefs(const ListValue* args) {
|
| @@ -254,7 +243,7 @@ void PluginsDOMHandler::Observe(int type,
|
| }
|
|
|
| void PluginsDOMHandler::LoadPluginsOnFileThread(
|
| - std::vector<webkit::npapi::PluginGroup>* groups,
|
| + std::vector<PluginGroup>* groups,
|
| Task* task) {
|
| webkit::npapi::PluginList::Singleton()->GetPluginGroups(true, groups);
|
|
|
| @@ -267,7 +256,7 @@ void PluginsDOMHandler::LoadPluginsOnFileThread(
|
| }
|
|
|
| void PluginsDOMHandler::EnsurePluginGroupsDeleted(
|
| - std::vector<webkit::npapi::PluginGroup>* groups) {
|
| + std::vector<PluginGroup>* groups) {
|
| delete groups;
|
| }
|
|
|
| @@ -275,8 +264,7 @@ void PluginsDOMHandler::LoadPlugins() {
|
| if (!get_plugins_factory_.empty())
|
| return;
|
|
|
| - std::vector<webkit::npapi::PluginGroup>* groups =
|
| - new std::vector<webkit::npapi::PluginGroup>;
|
| + std::vector<PluginGroup>* groups = new std::vector<PluginGroup>;
|
| Task* task = get_plugins_factory_.NewRunnableMethod(
|
| &PluginsDOMHandler::PluginsLoaded, groups);
|
|
|
| @@ -287,13 +275,103 @@ void PluginsDOMHandler::LoadPlugins() {
|
| &PluginsDOMHandler::LoadPluginsOnFileThread, groups, task));
|
| }
|
|
|
| -void PluginsDOMHandler::PluginsLoaded(
|
| - const std::vector<webkit::npapi::PluginGroup>* groups) {
|
| +void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>* groups) {
|
| + PluginPrefs* plugin_prefs =
|
| + PluginPrefs::GetForProfile(Profile::FromWebUI(web_ui_));
|
| +
|
| + bool all_plugins_enabled_by_policy = true;
|
| + bool all_plugins_disabled_by_policy = true;
|
| +
|
| // 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.
|
| + ListValue* plugin_files = new ListValue();
|
| + const PluginGroup& group = (*groups)[i];
|
| + string16 group_name = group.GetGroupName();
|
| + bool group_enabled = false;
|
| + const WebPluginInfo* active_plugin = NULL;
|
| + for (size_t j = 0; j < group.web_plugin_infos().size(); ++j) {
|
| + const WebPluginInfo& group_plugin = group.web_plugin_infos()[j];
|
| +
|
| + DictionaryValue* plugin_file = new DictionaryValue();
|
| + plugin_file->SetString("name", group_plugin.name);
|
| + plugin_file->SetString("description", group_plugin.desc);
|
| + plugin_file->SetString("path", group_plugin.path.value());
|
| + plugin_file->SetString("version", group_plugin.version);
|
| +
|
| + ListValue* mime_types = new ListValue();
|
| + const std::vector<webkit::WebPluginMimeType>& plugin_mime_types =
|
| + group_plugin.mime_types;
|
| + for (size_t k = 0; k < plugin_mime_types.size(); ++k) {
|
| + DictionaryValue* mime_type = new DictionaryValue();
|
| + mime_type->SetString("mimeType", plugin_mime_types[k].mime_type);
|
| + mime_type->SetString("description", plugin_mime_types[k].description);
|
| +
|
| + ListValue* file_extensions = new ListValue();
|
| + const std::vector<std::string>& mime_file_extensions =
|
| + plugin_mime_types[k].file_extensions;
|
| + for (size_t l = 0; l < mime_file_extensions.size(); ++l)
|
| + file_extensions->Append(new StringValue(mime_file_extensions[l]));
|
| + mime_type->Set("fileExtensions", file_extensions);
|
| +
|
| + mime_types->Append(mime_type);
|
| + }
|
| + plugin_file->Set("mimeTypes", mime_types);
|
| +
|
| + bool plugin_enabled = plugin_prefs->IsPluginEnabled(group_plugin);
|
| +
|
| + if (!active_plugin || (plugin_enabled && !group_enabled))
|
| + active_plugin = &group_plugin;
|
| + group_enabled = plugin_enabled || group_enabled;
|
| +
|
| + std::string enabled_mode;
|
| + PluginPrefs::PolicyStatus plugin_status =
|
| + plugin_prefs->PolicyStatusForPlugin(group_plugin.name);
|
| + PluginPrefs::PolicyStatus group_status =
|
| + plugin_prefs->PolicyStatusForPlugin(group_name);
|
| + if (plugin_status == PluginPrefs::POLICY_ENABLED ||
|
| + group_status == PluginPrefs::POLICY_ENABLED) {
|
| + enabled_mode = "enabledByPolicy";
|
| + } else {
|
| + all_plugins_enabled_by_policy = false;
|
| + if (plugin_status == PluginPrefs::POLICY_DISABLED ||
|
| + group_status == PluginPrefs::POLICY_DISABLED) {
|
| + enabled_mode = "disabledByPolicy";
|
| + } else {
|
| + all_plugins_disabled_by_policy = false;
|
| + if (plugin_enabled) {
|
| + enabled_mode = "enabledByUser";
|
| + } else {
|
| + enabled_mode = "disabledByUser";
|
| + }
|
| + }
|
| + }
|
| + plugin_file->SetString("enabledMode", enabled_mode);
|
| +
|
| + plugin_files->Append(plugin_file);
|
| + }
|
| + DictionaryValue* group_data = new DictionaryValue();
|
| +
|
| + group_data->Set("plugin_files", plugin_files);
|
| + group_data->SetString("name", group_name);
|
| + group_data->SetString("description", active_plugin->desc);
|
| + group_data->SetString("version", active_plugin->version);
|
| + group_data->SetBoolean("critical", group.IsVulnerable(*active_plugin));
|
| + group_data->SetString("update_url", group.GetUpdateURL());
|
| +
|
| + std::string enabled_mode;
|
| + if (all_plugins_enabled_by_policy) {
|
| + enabled_mode = "enabledByPolicy";
|
| + } else if (all_plugins_disabled_by_policy) {
|
| + enabled_mode = "disabledByPolicy";
|
| + } else if (group_enabled) {
|
| + enabled_mode = "enabledByUser";
|
| + } else {
|
| + enabled_mode = "disabledByUser";
|
| + }
|
| + group_data->SetString("enabledMode", enabled_mode);
|
| +
|
| + plugin_groups_data->Append(group_data);
|
| }
|
| DictionaryValue results;
|
| results.Set("plugins", plugin_groups_data);
|
| @@ -312,11 +390,9 @@ PluginsUI::PluginsUI(TabContents* contents) : ChromeWebUI(contents) {
|
| AddMessageHandler((new PluginsDOMHandler())->Attach(this));
|
|
|
| // Set up the chrome://plugins/ source.
|
| + // TODO(bauerb): Remove |enable_controls| & co.
|
| bool enable_controls = true;
|
| Profile* profile = Profile::FromBrowserContext(contents->browser_context());
|
| -#if !defined(OS_CHROMEOS)
|
| - enable_controls = profile->GetOriginalProfile()->first_launched();
|
| -#endif
|
| profile->GetChromeURLDataManager()->AddDataSource(
|
| CreatePluginsUIHTMLSource(enable_controls));
|
| }
|
|
|