15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/plugins_ui.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_finder.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_metadata.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_content_client.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/common/content_constants.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/ui_account_tweaks.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::WebPluginInfo; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback function to process result of EnablePlugin method. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AssertPluginEnabled(bool did_enable) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(did_enable); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::WebUIDataSource* CreatePluginsUIHTMLSource(Profile* profile) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource* source = 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Create(chrome::kChromeUIPluginsHost); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->SetUseJsonJSFormatV2(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginsTitle", IDS_PLUGINS_TITLE); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginsDetailsModeLink", 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_DETAILS_MODE_LINK); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginsNoneInstalled", 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_NONE_INSTALLED); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginDisabled", IDS_PLUGINS_DISABLED_PLUGIN); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginDisabledByPolicy", 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_DISABLED_BY_POLICY_PLUGIN); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginEnabledByPolicy", 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_ENABLED_BY_POLICY_PLUGIN); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginGroupManagedByPolicy", 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_GROUP_MANAGED_BY_POLICY); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginDownload", IDS_PLUGINS_DOWNLOAD); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginName", IDS_PLUGINS_NAME); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginVersion", IDS_PLUGINS_VERSION); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginDescription", IDS_PLUGINS_DESCRIPTION); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginPath", IDS_PLUGINS_PATH); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginType", IDS_PLUGINS_TYPE); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginMimeTypes", IDS_PLUGINS_MIME_TYPES); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginMimeTypesMimeType", 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_MIME_TYPES_MIME_TYPE); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginMimeTypesDescription", 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_MIME_TYPES_DESCRIPTION); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("pluginMimeTypesFileExtensions", 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_PLUGINS_MIME_TYPES_FILE_EXTENSIONS); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("disable", IDS_PLUGINS_DISABLE); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("enable", IDS_PLUGINS_ENABLE); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("alwaysAllowed", IDS_PLUGINS_ALWAYS_ALLOWED); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("noPlugins", IDS_PLUGINS_NO_PLUGINS); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->SetJsonPath("strings.js"); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->AddResourcePath("plugins.js", IDR_PLUGINS_JS); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source->SetDefaultResource(IDR_PLUGINS_HTML); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chromeos::AddAccountUITweaksLocalizedValues(source, profile); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 PluginTypeToString(int type) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The type is stored as an |int|, but doing the switch on the right 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enumeration type gives us better build-time error checking (if someone adds 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a new type). 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (static_cast<WebPluginInfo::PluginType>(type)) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebPluginInfo::PLUGIN_TYPE_NPAPI: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_PLUGINS_NPAPI); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebPluginInfo::PLUGIN_TYPE_PEPPER_IN_PROCESS: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_PLUGINS_PPAPI_IN_PROCESS); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_PLUGINS_PPAPI_OUT_OF_PROCESS); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebPluginInfo::PLUGIN_TYPE_PEPPER_UNSANDBOXED: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_PLUGINS_PPAPI_UNSANDBOXED); 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch case WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN: 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return l10n_util::GetStringUTF16(IDS_PLUGINS_BROWSER_PLUGIN); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PluginsDOMHandler 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The handler for Javascript messages for the chrome://plugins/ page. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(viettrungluu): Make plugin list updates notify, and then observe 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes; maybe replumb plugin list through plugin service? 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <http://crbug.com/39101> 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginsDOMHandler : public WebUIMessageHandler, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PluginsDOMHandler(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PluginsDOMHandler() {} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUIMessageHandler implementation. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterMessages() OVERRIDE; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "requestPluginsData" message. 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleRequestPluginsData(const base::ListValue* args); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "enablePlugin" message. 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleEnablePluginMessage(const base::ListValue* args); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "saveShowDetailsToPrefs" message. 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleSaveShowDetailsToPrefs(const base::ListValue* args); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calback for the "getShowDetails" message. 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleGetShowDetails(const base::ListValue* args); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "setPluginAlwaysAllowed" message. 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleSetPluginAlwaysAllowed(const base::ListValue* args); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver method overrides 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadPlugins(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the UI thread when the plugin information is ready. 174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void PluginsLoaded(const std::vector<WebPluginInfo>& plugins); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Holds grouped plug-ins. The key is the group identifier and 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the value is the list of plug-ins belonging to the group. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, std::vector<const WebPluginInfo*> > 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginGroups; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This pref guards the value whether about:plugins is in the details mode or 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BooleanPrefMember show_details_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::WeakPtrFactory<PluginsDOMHandler> weak_ptr_factory_; 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PluginsDOMHandler); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginsDOMHandler::PluginsDOMHandler() 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginsDOMHandler::RegisterMessages() { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) show_details_.Init(prefs::kPluginsShowDetails, prefs); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("requestPluginsData", 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginsDOMHandler::HandleRequestPluginsData, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("enablePlugin", 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginsDOMHandler::HandleEnablePluginMessage, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("setPluginAlwaysAllowed", 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginsDOMHandler::HandleSetPluginAlwaysAllowed, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("saveShowDetailsToPrefs", 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginsDOMHandler::HandleSaveShowDetailsToPrefs, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("getShowDetails", 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginsDOMHandler::HandleGetShowDetails, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginsDOMHandler::HandleRequestPluginsData(const base::ListValue* args) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadPlugins(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginsDOMHandler::HandleEnablePluginMessage(const base::ListValue* args) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Be robust in accepting badness since plug-ins display HTML (hence 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JavaScript). 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args->GetSize() != 3) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string enable_str; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string is_group_str; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(1, &enable_str) || !args->GetString(2, &is_group_str)) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable = enable_str == "true"; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile).get(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_group_str == "true") { 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 group_name; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &group_name)) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_prefs->EnablePluginGroup(enable, group_name); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/50105 for background. 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 adobereader = base::ASCIIToUTF16( 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PluginMetadata::kAdobeReaderGroupName); 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 internalpdf = 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16(ChromeContentClient::kPDFPluginName); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group_name == adobereader) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_prefs->EnablePluginGroup(false, internalpdf); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (group_name == internalpdf) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_prefs->EnablePluginGroup(false, adobereader); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType file_path; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &file_path)) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_prefs->EnablePlugin(enable, base::FilePath(file_path), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&AssertPluginEnabled)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginsDOMHandler::HandleSaveShowDetailsToPrefs( 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string details_mode; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &details_mode)) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_details_.SetValue(details_mode == "true"); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginsDOMHandler::HandleGetShowDetails(const base::ListValue* args) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FundamentalValue show_details(show_details_.GetValue()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("loadShowDetailsFromPrefs", show_details); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginsDOMHandler::HandleSetPluginAlwaysAllowed( 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Be robust in the input parameters, but crash in a Debug build. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args->GetSize() != 2) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string plugin; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed = false; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &plugin) || !args->GetBoolean(1, &allowed)) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile->GetHostContentSettingsMap()->SetContentSetting( 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PLUGINS, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_DEFAULT); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep track of the whitelist separately, so that we can distinguish plug-ins 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whitelisted by the user from automatically whitelisted ones. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(profile->GetPrefs(), 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs::kContentSettingsPluginWhitelist); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update->SetBoolean(plugin, allowed); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginsDOMHandler::Observe(int type, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, type); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadPlugins(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginsDOMHandler::LoadPlugins() { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (weak_ptr_factory_.HasWeakPtrs()) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginService::GetInstance()->GetPlugins( 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginsDOMHandler::PluginsLoaded, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginsDOMHandler::PluginsLoaded( 338ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::vector<WebPluginInfo>& plugins) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile).get(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginFinder* plugin_finder = PluginFinder::GetInstance(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Group plug-ins by identifier. This is done to be able to display 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the plug-ins in UI in a grouped fashion. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginGroups groups; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < plugins.size(); ++i) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PluginMetadata> plugin( 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_finder->GetPluginMetadata(plugins[i])); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groups[plugin->identifier()].push_back(&plugins[i]); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct DictionaryValues to return to UI. 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* plugin_groups_data = new base::ListValue(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginGroups::const_iterator it = groups.begin(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != groups.end(); ++it) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<const WebPluginInfo*>& group_plugins = it->second; 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* plugin_files = new base::ListValue(); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PluginMetadata> plugin_metadata( 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_finder->GetPluginMetadata(*group_plugins[0])); 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 group_name = plugin_metadata->name(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string group_identifier = plugin_metadata->identifier(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool group_enabled = false; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool all_plugins_enabled_by_policy = true; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool all_plugins_disabled_by_policy = true; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool all_plugins_managed_by_policy = true; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPluginInfo* active_plugin = NULL; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < group_plugins.size(); ++j) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPluginInfo& group_plugin = *group_plugins[j]; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* plugin_file = new base::DictionaryValue(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_file->SetString("name", group_plugin.name); 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If this plugin is Pepper Flash, and the plugin path is the same as the 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // path for the Pepper Flash Debugger plugin, then mark this plugin 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // description as the debugger plugin to help the user disambiguate the 37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // two plugins. 37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16 desc = group_plugin.desc; 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (group_plugin.is_pepper_plugin() && 38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) group_plugin.name == base::ASCIIToUTF16(content::kFlashPluginName)) { 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath debug_path; 38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathService::Get(chrome::DIR_PEPPER_FLASH_DEBUGGER_PLUGIN, &debug_path); 38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (group_plugin.path.DirName() == debug_path) 38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) desc += base::ASCIIToUTF16(" Debug"); 38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) plugin_file->SetString("description", desc); 38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_file->SetString("path", group_plugin.path.value()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_file->SetString("version", group_plugin.version); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_file->SetString("type", PluginTypeToString(group_plugin.type)); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* mime_types = new base::ListValue(); 394ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::vector<content::WebPluginMimeType>& plugin_mime_types = 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_plugin.mime_types; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t k = 0; k < plugin_mime_types.size(); ++k) { 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* mime_type = new base::DictionaryValue(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type->SetString("mimeType", plugin_mime_types[k].mime_type); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type->SetString("description", plugin_mime_types[k].description); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* file_extensions = new base::ListValue(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& mime_file_extensions = 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mime_types[k].file_extensions; 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t l = 0; l < mime_file_extensions.size(); ++l) { 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) file_extensions->Append( 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new base::StringValue(mime_file_extensions[l])); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_type->Set("fileExtensions", file_extensions); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mime_types->Append(mime_type); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_file->Set("mimeTypes", mime_types); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool plugin_enabled = plugin_prefs->IsPluginEnabled(group_plugin); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!active_plugin || (plugin_enabled && !group_enabled)) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_plugin = &group_plugin; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_enabled = plugin_enabled || group_enabled; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string enabled_mode; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginPrefs::PolicyStatus plugin_status = 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_prefs->PolicyStatusForPlugin(group_plugin.name); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginPrefs::PolicyStatus group_status = 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_prefs->PolicyStatusForPlugin(group_name); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_status == PluginPrefs::POLICY_ENABLED || 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_status == PluginPrefs::POLICY_ENABLED) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "enabledByPolicy"; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_plugins_disabled_by_policy = false; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_plugins_enabled_by_policy = false; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_status == PluginPrefs::POLICY_DISABLED || 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_status == PluginPrefs::POLICY_DISABLED) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "disabledByPolicy"; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_plugins_disabled_by_policy = false; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_plugins_managed_by_policy = false; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_enabled) { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "enabledByUser"; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "disabledByUser"; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_file->SetString("enabledMode", enabled_mode); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_files->Append(plugin_file); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* group_data = new base::DictionaryValue(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->Set("plugin_files", plugin_files); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetString("name", group_name); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetString("id", group_identifier); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetString("description", active_plugin->desc); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetString("version", active_plugin->version); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PLUGIN_INSTALLATION) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool out_of_date = plugin_metadata->GetSecurityStatus(*active_plugin) == 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginMetadata::SECURITY_STATUS_OUT_OF_DATE; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetBoolean("critical", out_of_date); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetString("update_url", plugin_metadata->plugin_url().spec()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string enabled_mode; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (all_plugins_enabled_by_policy) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "enabledByPolicy"; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (all_plugins_disabled_by_policy) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "disabledByPolicy"; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (all_plugins_managed_by_policy) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "managedByPolicy"; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (group_enabled) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "enabledByUser"; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_mode = "disabledByUser"; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetString("enabledMode", enabled_mode); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool always_allowed = false; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group_enabled) { 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* whitelist = 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile->GetPrefs()->GetDictionary( 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs::kContentSettingsPluginWhitelist); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) whitelist->GetBoolean(group_identifier, &always_allowed); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_data->SetBoolean("alwaysAllowed", always_allowed); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_groups_data->Append(group_data); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue results; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results.Set("plugins", plugin_groups_data); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("returnPluginsData", results); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PluginsUI 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginsUI::PluginsUI(content::WebUI* web_ui) : WebUIController(web_ui) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->AddMessageHandler(new PluginsDOMHandler()); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the chrome://plugins/ source. 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebUIDataSource::Add(profile, CreatePluginsUIHTMLSource(profile)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::RefCountedMemory* PluginsUI::GetFaviconResourceBytes( 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor scale_factor) { 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ResourceBundle::GetSharedInstance(). 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadDataResourceBytesForScale(IDR_PLUGINS_FAVICON, scale_factor); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid PluginsUI::RegisterProfilePrefs( 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kPluginsShowDetails, 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kContentSettingsPluginWhitelist, 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 527