Index: chrome/browser/dom_ui/plugins_ui.cc |
diff --git a/chrome/browser/dom_ui/plugins_ui.cc b/chrome/browser/dom_ui/plugins_ui.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..948907da2d0839b6dfe87c5a00e805402a0711c2 |
--- /dev/null |
+++ b/chrome/browser/dom_ui/plugins_ui.cc |
@@ -0,0 +1,276 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/dom_ui/plugins_ui.h" |
+ |
+#include "app/l10n_util.h" |
+#include "app/resource_bundle.h" |
+#include "base/singleton.h" |
+#include "base/values.h" |
+#include "chrome/browser/chrome_thread.h" |
+#include "chrome/browser/dom_ui/chrome_url_data_manager.h" |
+#include "chrome/browser/pref_service.h" |
+#include "chrome/browser/profile.h" |
+#include "chrome/common/jstemplate_builder.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/url_constants.h" |
+#include "grit/browser_resources.h" |
+#include "grit/generated_resources.h" |
+#include "grit/theme_resources.h" |
+#include "webkit/glue/plugins/plugin_list.h" |
+ |
+namespace { |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+// PluginsHTMLSource |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+class PluginsUIHTMLSource : public ChromeURLDataManager::DataSource { |
+ public: |
+ PluginsUIHTMLSource() |
+ : DataSource(chrome::kChromeUIPluginsHost, MessageLoop::current()) {} |
+ |
+ // Called when the network layer has requested a resource underneath |
+ // the path we registered. |
+ virtual void StartDataRequest(const std::string& path, |
+ bool is_off_the_record, |
+ int request_id); |
+ virtual std::string GetMimeType(const std::string&) const { |
+ return "text/html"; |
+ } |
+ |
+ private: |
+ ~PluginsUIHTMLSource() {} |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PluginsUIHTMLSource); |
+}; |
+ |
+void PluginsUIHTMLSource::StartDataRequest(const std::string& path, |
+ bool is_off_the_record, int request_id) { |
+ // Strings used in the JsTemplate file. |
+ DictionaryValue localized_strings; |
+ localized_strings.SetString(L"pluginsTitle", |
+ l10n_util::GetString(IDS_PLUGINS_TITLE)); |
+ localized_strings.SetString(L"pluginsDetailsModeLink", |
+ l10n_util::GetString(IDS_PLUGINS_DETAILS_MODE_LINK)); |
+ localized_strings.SetString(L"pluginsNoneInstalled", |
+ l10n_util::GetString(IDS_PLUGINS_NONE_INSTALLED)); |
+ localized_strings.SetString(L"pluginDisabled", |
+ l10n_util::GetString(IDS_PLUGINS_DISABLED_PLUGIN)); |
+ localized_strings.SetString(L"pluginVersion", |
+ l10n_util::GetString(IDS_PLUGINS_VERSION)); |
+ localized_strings.SetString(L"pluginDescription", |
+ l10n_util::GetString(IDS_PLUGINS_DESCRIPTION)); |
+ localized_strings.SetString(L"pluginPath", |
+ l10n_util::GetString(IDS_PLUGINS_PATH)); |
+ localized_strings.SetString(L"pluginMimeTypes", |
+ l10n_util::GetString(IDS_PLUGINS_MIME_TYPES)); |
+ localized_strings.SetString(L"pluginMimeTypesMimeType", |
+ l10n_util::GetString(IDS_PLUGINS_MIME_TYPES_MIME_TYPE)); |
+ localized_strings.SetString(L"pluginMimeTypesDescription", |
+ l10n_util::GetString(IDS_PLUGINS_MIME_TYPES_DESCRIPTION)); |
+ localized_strings.SetString(L"pluginMimeTypesFileExtensions", |
+ l10n_util::GetString(IDS_PLUGINS_MIME_TYPES_FILE_EXTENSIONS)); |
+ localized_strings.SetString(L"disable", |
+ l10n_util::GetString(IDS_PLUGINS_DISABLE)); |
+ localized_strings.SetString(L"enable", |
+ l10n_util::GetString(IDS_PLUGINS_ENABLE)); |
+ |
+ ChromeURLDataManager::DataSource::SetFontAndTextDirection(&localized_strings); |
+ |
+ static const base::StringPiece plugins_html( |
+ ResourceBundle::GetSharedInstance().GetRawDataResource(IDR_PLUGINS_HTML)); |
+ std::string full_html(plugins_html.data(), plugins_html.size()); |
+ jstemplate_builder::AppendJsonHtml(&localized_strings, &full_html); |
+ jstemplate_builder::AppendI18nTemplateSourceHtml(&full_html); |
+ jstemplate_builder::AppendI18nTemplateProcessHtml(&full_html); |
+ jstemplate_builder::AppendJsTemplateSourceHtml(&full_html); |
+ |
+ scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); |
+ html_bytes->data.resize(full_html.size()); |
+ std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); |
+ |
+ SendResponse(request_id, html_bytes); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// |
+// PluginsDOMHandler |
+// |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+// The handler for Javascript messages related to the "history" view. |
+// TODO(viettrungluu): Make plugin list updates notify, and then observe |
+// changes; maybe replumb plugin list through plugin service? |
+// <http://crbug.com/39101> |
+class PluginsDOMHandler : public DOMMessageHandler { |
+ public: |
+ PluginsDOMHandler() {} |
+ virtual ~PluginsDOMHandler() {} |
+ |
+ // DOMMessageHandler implementation. |
+ virtual void RegisterMessages(); |
+ |
+ // Callback for the "requestPluginsData" message. |
+ void HandleRequestPluginsData(const Value* value); |
+ |
+ // Callback for the "enablePlugin" message. |
+ void HandleEnablePluginMessage(const Value* value); |
+ |
+ private: |
+ // Creates a dictionary containing all the information about the given plugin; |
+ // this is put into the list to "return" for the "requestPluginsData" message. |
+ DictionaryValue* CreatePluginDetailValue(const WebPluginInfo& plugin); |
+ |
+ // Creates a dictionary containing the important parts of the information |
+ // about the given plugin; this is put into a list and saved in prefs. |
+ DictionaryValue* CreatePluginSummaryValue(const WebPluginInfo& plugin); |
+ |
+ // Update the user preferences to reflect the current (user-selected) state of |
+ // plugins. |
+ void UpdatePreferences(); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PluginsDOMHandler); |
+}; |
+ |
+void PluginsDOMHandler::RegisterMessages() { |
+ dom_ui_->RegisterMessageCallback("requestPluginsData", |
+ NewCallback(this, &PluginsDOMHandler::HandleRequestPluginsData)); |
+ dom_ui_->RegisterMessageCallback("enablePlugin", |
+ NewCallback(this, &PluginsDOMHandler::HandleEnablePluginMessage)); |
+} |
+ |
+void PluginsDOMHandler::HandleRequestPluginsData(const Value* value) { |
+ DictionaryValue* results = new DictionaryValue(); |
+ |
+ // Add plugins to the results structure. |
+ ListValue* plugins_list = new ListValue(); |
+ |
+ std::vector<WebPluginInfo> plugins; |
+ NPAPI::PluginList::Singleton()->GetPlugins(false, &plugins); |
+ |
+ for (std::vector<WebPluginInfo>::const_iterator it = plugins.begin(); |
+ it != plugins.end(); |
+ ++it) { |
+ plugins_list->Append(CreatePluginDetailValue(*it)); |
+ } |
+ results->Set(L"plugins", plugins_list); |
+ |
+ dom_ui_->CallJavascriptFunction(L"returnPluginsData", *results); |
+} |
+ |
+void PluginsDOMHandler::HandleEnablePluginMessage(const Value* value) { |
+ CHECK(value->IsType(Value::TYPE_LIST)); |
+ const ListValue* list = static_cast<const ListValue*>(value); |
+ CHECK(list->GetSize() == 2); |
+ FilePath::StringType plugin_path; |
+ std::string enable_str; |
+ CHECK(list->GetString(0, &plugin_path)); |
+ CHECK(list->GetString(1, &enable_str)); |
+ if (enable_str == "true") |
+ NPAPI::PluginList::Singleton()->EnablePlugin(FilePath(plugin_path)); |
+ else |
+ NPAPI::PluginList::Singleton()->DisablePlugin(FilePath(plugin_path)); |
+ |
+ // TODO(viettrungluu): It's morally wrong to do this here (it should be done |
+ // by the plugins service), and we might also want to ensure that the plugins |
+ // list is always written to prefs even when the user hasn't disabled a |
+ // plugin. This will require refactoring the plugin list and service. |
+ // <http://crbug.com/39101> |
+ UpdatePreferences(); |
+} |
+ |
+DictionaryValue* PluginsDOMHandler::CreatePluginDetailValue( |
+ const WebPluginInfo& plugin) { |
+ DictionaryValue* plugin_data = new DictionaryValue(); |
+ plugin_data->SetString(L"path", plugin.path.value()); |
+ plugin_data->SetString(L"name", plugin.name); |
+ plugin_data->SetString(L"version", plugin.version); |
+ plugin_data->SetString(L"description", plugin.desc); |
+ plugin_data->SetBoolean(L"enabled", plugin.enabled); |
+ |
+ ListValue* mime_types = new ListValue(); |
+ for (std::vector<WebPluginMimeType>::const_iterator type_it = |
+ plugin.mime_types.begin(); |
+ type_it != plugin.mime_types.end(); |
+ ++type_it) { |
+ DictionaryValue* mime_type = new DictionaryValue(); |
+ mime_type->SetString(L"mimeType", type_it->mime_type); |
+ mime_type->SetString(L"description", type_it->description); |
+ |
+ ListValue* file_extensions = new ListValue(); |
+ for (std::vector<std::string>::const_iterator ext_it = |
+ type_it->file_extensions.begin(); |
+ ext_it != type_it->file_extensions.end(); |
+ ++ext_it) { |
+ file_extensions->Append(new StringValue(*ext_it)); |
+ } |
+ mime_type->Set(L"fileExtensions", file_extensions); |
+ |
+ mime_types->Append(mime_type); |
+ } |
+ plugin_data->Set(L"mimeTypes", mime_types); |
+ |
+ return plugin_data; |
+} |
+ |
+DictionaryValue* PluginsDOMHandler::CreatePluginSummaryValue( |
+ const WebPluginInfo& plugin) { |
+ DictionaryValue* plugin_data = new DictionaryValue(); |
+ plugin_data->SetString(L"path", plugin.path.value()); |
+ plugin_data->SetString(L"name", plugin.name); |
+ plugin_data->SetString(L"version", plugin.version); |
+ plugin_data->SetBoolean(L"enabled", plugin.enabled); |
+ return plugin_data; |
+} |
+ |
+void PluginsDOMHandler::UpdatePreferences() { |
+ ListValue* plugins_list = dom_ui_->GetProfile()->GetPrefs()->GetMutableList( |
+ prefs::kPluginsPluginsList); |
+ plugins_list->Clear(); |
+ |
+ std::vector<WebPluginInfo> plugins; |
+ NPAPI::PluginList::Singleton()->GetPlugins(false, &plugins); |
+ |
+ for (std::vector<WebPluginInfo>::const_iterator it = plugins.begin(); |
+ it != plugins.end(); |
+ ++it) { |
+ plugins_list->Append(CreatePluginSummaryValue(*it)); |
+ } |
+} |
+ |
+} // namespace |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+// PluginsUI |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+PluginsUI::PluginsUI(TabContents* contents) : DOMUI(contents) { |
+ AddMessageHandler((new PluginsDOMHandler())->Attach(this)); |
+ |
+ PluginsUIHTMLSource* html_source = new PluginsUIHTMLSource(); |
+ |
+ // Set up the chrome://plugins/ source. |
+ ChromeThread::PostTask( |
+ ChromeThread::IO, FROM_HERE, |
+ NewRunnableMethod(Singleton<ChromeURLDataManager>::get(), |
+ &ChromeURLDataManager::AddDataSource, |
+ make_scoped_refptr(html_source))); |
+} |
+ |
+ |
+// static |
+RefCountedMemory* PluginsUI::GetFaviconResourceBytes() { |
+ return ResourceBundle::GetSharedInstance(). |
+ LoadDataResourceBytes(IDR_PLUGIN); |
+} |
+ |
+// static |
+void PluginsUI::RegisterUserPrefs(PrefService* prefs) { |
+ prefs->RegisterListPref(prefs::kPluginsPluginsList); |
+} |