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