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/options/content_settings_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h"
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_profile_util.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h"
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_details.h"
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h"
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/web_contents.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/common/page_zoom.h"
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h"
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/api_permission.h"
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using content_settings::ContentSettingToString;
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using content_settings::ContentSettingFromString;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::APIPermission;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ContentSettingsTypeNameEntry {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsType type;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* name;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps from a secondary pattern to a setting.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<ContentSettingsPattern, ContentSetting>
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnePatternSettings;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps from a primary pattern/source pair to a OnePatternSettings. All the
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mappings in OnePatternSettings share the given primary pattern and source.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<std::pair<ContentSettingsPattern, std::string>,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 OnePatternSettings>
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AllPatternsSettings;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The AppFilter is used in AddExceptionsGrantedByHostedApps() to choose
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions which should have their extent displayed.
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef bool (*AppFilter)(const extensions::Extension& app,
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          content::BrowserContext* profile);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kExceptionsLearnMoreUrl[] =
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "https://support.google.com/chrome/?p=settings_manage_exceptions";
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kSetting = "setting";
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kOrigin = "origin";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kSource = "source";
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kAppName = "appName";
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kAppId = "appId";
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kEmbeddingOrigin = "embeddingOrigin";
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kPreferencesSource = "preference";
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* kVideoSetting = "video";
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char* kZoom = "zoom";
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const ContentSettingsTypeNameEntry kContentSettingsTypeGroupNames[] = {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_COOKIES, "cookies"},
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_IMAGES, "images"},
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_JAVASCRIPT, "javascript"},
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_PLUGINS, "plugins"},
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_POPUPS, "popups"},
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_GEOLOCATION, "location"},
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_NOTIFICATIONS, "notifications"},
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, "auto-select-certificate"},
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_FULLSCREEN, "fullscreen"},
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_MOUSELOCK, "mouselock"},
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, "register-protocol-handler"},
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_MEDIASTREAM, "media-stream"},
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, "media-stream-mic"},
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, "media-stream-camera"},
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, "ppapi-broker"},
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, "multiple-automatic-downloads"},
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {CONTENT_SETTINGS_TYPE_MIDI_SYSEX, "midi-sysex"},
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, "push-messaging"},
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, "ssl-cert-decisions"},
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  {CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, "protectedContent"},
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// A pseudo content type. We use it to display data like a content setting even
12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// though it is not a real content setting.
12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const char* kZoomContentType = "zoomlevels";
12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)content::BrowserContext* GetBrowserContext(content::WebUI* web_ui) {
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return web_ui->GetWebContents()->GetBrowserContext();
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentSettingsType ContentSettingsTypeFromGroupName(const std::string& name) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kContentSettingsTypeGroupNames); ++i) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (name == kContentSettingsTypeGroupNames[i].name)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kContentSettingsTypeGroupNames[i].type;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED() << name << " is not a recognized content settings type.";
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CONTENT_SETTINGS_TYPE_DEFAULT;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a DictionaryValue* that will act as a data source for a single row
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in a HostContentSettingsMap-controlled exceptions table (e.g., cookies).
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ownership of the pointer is passed to the caller.
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* GetExceptionForPage(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& pattern,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSetting& setting,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& provider_name) {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* exception = new base::DictionaryValue();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kOrigin, pattern.ToString());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kEmbeddingOrigin,
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       secondary_pattern == ContentSettingsPattern::Wildcard() ?
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           std::string() :
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           secondary_pattern.ToString());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSetting, ContentSettingToString(setting));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSource, provider_name);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exception;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a DictionaryValue* that will act as a data source for a single row
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the Geolocation exceptions table. Ownership of the pointer is passed to
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the caller.
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* GetGeolocationExceptionForPage(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& origin,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& embedding_origin,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* exception = new base::DictionaryValue();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSetting, ContentSettingToString(setting));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kOrigin, origin.ToString());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kEmbeddingOrigin, embedding_origin.ToString());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exception;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a DictionaryValue* that will act as a data source for a single row
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the desktop notifications exceptions table. Ownership of the pointer is
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// passed to the caller.
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* GetNotificationExceptionForPage(
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ContentSettingsPattern& primary_pattern,
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ContentSettingsPattern& secondary_pattern,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& provider_name) {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string embedding_origin;
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (secondary_pattern != ContentSettingsPattern::Wildcard())
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    embedding_origin = secondary_pattern.ToString();
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* exception = new base::DictionaryValue();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSetting, ContentSettingToString(setting));
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  exception->SetString(kOrigin, primary_pattern.ToString());
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  exception->SetString(kEmbeddingOrigin, embedding_origin);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSource, provider_name);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exception;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true whenever the |extension| is hosted and has |permission|.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Must have the AppFilter signature.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <APIPermission::ID permission>
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool HostedAppHasPermission(const extensions::Extension& extension,
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            content::BrowserContext* /* context */) {
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return extension.is_hosted_app() &&
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)         extension.permissions_data()->HasAPIPermission(permission);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add an "Allow"-entry to the list of |exceptions| for a |url_pattern| from
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the web extent of a hosted |app|.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddExceptionForHostedApp(const std::string& url_pattern,
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::Extension& app, base::ListValue* exceptions) {
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* exception = new base::DictionaryValue();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSetting, ContentSettingToString(CONTENT_SETTING_ALLOW));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kOrigin, url_pattern);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kEmbeddingOrigin, url_pattern);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kSource, "HostedApp");
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kAppName, app.name());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exception->SetString(kAppId, app.id());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exceptions->Append(exception);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Asks the |profile| for hosted apps which have the |permission| set, and
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// adds their web extent and launch URL to the |exceptions| list.
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AddExceptionsGrantedByHostedApps(content::BrowserContext* context,
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      AppFilter app_filter,
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                      base::ListValue* exceptions) {
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const extensions::ExtensionSet& extensions =
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::ExtensionRegistry::Get(context)->enabled_extensions();
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (extensions::ExtensionSet::const_iterator extension = extensions.begin();
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       extension != extensions.end(); ++extension) {
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!app_filter(*extension->get(), context))
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      continue;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::URLPatternSet web_extent = (*extension)->web_extent();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add patterns from web extent.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (extensions::URLPatternSet::const_iterator pattern = web_extent.begin();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         pattern != web_extent.end(); ++pattern) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string url_pattern = pattern->GetAsString();
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddExceptionForHostedApp(url_pattern, *extension->get(), exceptions);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Retrieve the launch URL.
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    GURL launch_url =
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions::AppLaunchInfo::GetLaunchWebURL(extension->get());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Skip adding the launch URL if it is part of the web extent.
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (web_extent.MatchesURL(launch_url))
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      continue;
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    AddExceptionForHostedApp(launch_url.spec(), *extension->get(), exceptions);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Sort ZoomLevelChanges by host and scheme
24523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// (a.com < http://a.com < https://a.com < b.com).
24623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool HostZoomSort(const content::HostZoomMap::ZoomLevelChange& a,
24723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                  const content::HostZoomMap::ZoomLevelChange& b) {
24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return a.host == b.host ? a.scheme < b.scheme : a.host < b.host;
24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentSettingsHandler::MediaSettingsInfo::MediaSettingsInfo()
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : flash_default_setting(CONTENT_SETTING_DEFAULT),
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      flash_settings_initialized(false),
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_flash_refresh_request_id(0),
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_flash_default_link(false),
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      show_flash_exceptions_link(false),
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_setting(CONTENT_SETTING_DEFAULT),
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_disable_audio(false),
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_disable_video(false),
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_setting_initialized(false),
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      exceptions_initialized(false) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentSettingsHandler::MediaSettingsInfo::~MediaSettingsInfo() {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ContentSettingsHandler::ContentSettingsHandler() : observer_(this) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingsHandler::~ContentSettingsHandler() {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::GetLocalizedValues(
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* localized_strings) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(dhnishi): Standardize to lowerCamelCase.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static OptionsStringResource resources[] = {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "allowException", IDS_EXCEPTIONS_ALLOW_BUTTON },
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "blockException", IDS_EXCEPTIONS_BLOCK_BUTTON },
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "sessionException", IDS_EXCEPTIONS_SESSION_ONLY_BUTTON },
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "askException", IDS_EXCEPTIONS_ASK_BUTTON },
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "otr_exceptions_explanation", IDS_EXCEPTIONS_OTR_LABEL },
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "addNewExceptionInstructions", IDS_EXCEPTIONS_ADD_NEW_INSTRUCTIONS },
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "manageExceptions", IDS_EXCEPTIONS_MANAGE },
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "manage_handlers", IDS_HANDLERS_MANAGE },
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "exceptionPatternHeader", IDS_EXCEPTIONS_PATTERN_HEADER },
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "exceptionBehaviorHeader", IDS_EXCEPTIONS_ACTION_HEADER },
29323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    { "exceptionZoomHeader", IDS_EXCEPTIONS_ZOOM_HEADER },
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "embeddedOnHost", IDS_EXCEPTIONS_GEOLOCATION_EMBEDDED_ON_HOST },
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cookies filter.
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "cookiesTabLabel", IDS_COOKIES_TAB_LABEL },
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "cookies_header", IDS_COOKIES_HEADER },
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "cookiesAllow", IDS_COOKIES_ALLOW_RADIO },
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "cookiesBlock", IDS_COOKIES_BLOCK_RADIO },
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "cookies_session_only", IDS_COOKIES_SESSION_ONLY_RADIO },
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "cookies_block_3rd_party", IDS_COOKIES_BLOCK_3RDPARTY_CHKBOX },
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "cookies_clear_when_close", IDS_COOKIES_CLEAR_WHEN_CLOSE_CHKBOX },
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "cookies_lso_clear_when_close", IDS_COOKIES_LSO_CLEAR_WHEN_CLOSE_CHKBOX },
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "cookies_show_cookies", IDS_COOKIES_SHOW_COOKIES_BUTTON },
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "flash_storage_settings", IDS_FLASH_STORAGE_SETTINGS },
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "flash_storage_url", IDS_FLASH_STORAGE_URL },
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(ENABLE_GOOGLE_NOW)
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    { "googleGeolocationAccessEnable",
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       IDS_GEOLOCATION_GOOGLE_ACCESS_ENABLE_CHKBOX },
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Image filter.
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "imagesTabLabel", IDS_IMAGES_TAB_LABEL },
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "images_header", IDS_IMAGES_HEADER },
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "imagesAllow", IDS_IMAGES_LOAD_RADIO },
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "imagesBlock", IDS_IMAGES_NOLOAD_RADIO },
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // JavaScript filter.
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "javascriptTabLabel", IDS_JAVASCRIPT_TAB_LABEL },
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "javascript_header", IDS_JAVASCRIPT_HEADER },
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "javascriptAllow", IDS_JS_ALLOW_RADIO },
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "javascriptBlock", IDS_JS_DONOTALLOW_RADIO },
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Plug-ins filter.
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "pluginsTabLabel", IDS_PLUGIN_TAB_LABEL },
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "plugins_header", IDS_PLUGIN_HEADER },
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "pluginsAsk", IDS_PLUGIN_ASK_RADIO },
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "pluginsAllow", IDS_PLUGIN_LOAD_RADIO },
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "pluginsBlock", IDS_PLUGIN_NOLOAD_RADIO },
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "disableIndividualPlugins", IDS_PLUGIN_SELECTIVE_DISABLE },
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pop-ups filter.
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "popupsTabLabel", IDS_POPUP_TAB_LABEL },
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "popups_header", IDS_POPUP_HEADER },
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "popupsAllow", IDS_POPUP_ALLOW_RADIO },
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "popupsBlock", IDS_POPUP_BLOCK_RADIO },
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Location filter.
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "locationTabLabel", IDS_GEOLOCATION_TAB_LABEL },
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "location_header", IDS_GEOLOCATION_HEADER },
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "locationAllow", IDS_GEOLOCATION_ALLOW_RADIO },
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "locationAsk", IDS_GEOLOCATION_ASK_RADIO },
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "locationBlock", IDS_GEOLOCATION_BLOCK_RADIO },
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "set_by", IDS_GEOLOCATION_SET_BY_HOVER },
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notifications filter.
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "notificationsTabLabel", IDS_NOTIFICATIONS_TAB_LABEL },
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "notifications_header", IDS_NOTIFICATIONS_HEADER },
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "notificationsAllow", IDS_NOTIFICATIONS_ALLOW_RADIO },
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "notificationsAsk", IDS_NOTIFICATIONS_ASK_RADIO },
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "notificationsBlock", IDS_NOTIFICATIONS_BLOCK_RADIO },
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Fullscreen filter.
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "fullscreenTabLabel", IDS_FULLSCREEN_TAB_LABEL },
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fullscreen_header", IDS_FULLSCREEN_HEADER },
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mouse Lock filter.
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "mouselockTabLabel", IDS_MOUSE_LOCK_TAB_LABEL },
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "mouselock_header", IDS_MOUSE_LOCK_HEADER },
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "mouselockAllow", IDS_MOUSE_LOCK_ALLOW_RADIO },
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "mouselockAsk", IDS_MOUSE_LOCK_ASK_RADIO },
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "mouselockBlock", IDS_MOUSE_LOCK_BLOCK_RADIO },
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_WIN)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Protected Content filter
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "protectedContentTabLabel", IDS_PROTECTED_CONTENT_TAB_LABEL },
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "protectedContentInfo", IDS_PROTECTED_CONTENT_INFO },
3590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    { "protectedContentEnable", IDS_PROTECTED_CONTENT_ENABLE },
3600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    { "protectedContent_header", IDS_PROTECTED_CONTENT_HEADER },
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // defined(OS_CHROMEOS) || defined(OS_WIN)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Media stream capture device filter.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "mediaStreamTabLabel", IDS_MEDIA_STREAM_TAB_LABEL },
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "media-stream_header", IDS_MEDIA_STREAM_HEADER },
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "mediaStreamAsk", IDS_MEDIA_STREAM_ASK_RADIO },
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "mediaStreamBlock", IDS_MEDIA_STREAM_BLOCK_RADIO },
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaStreamAudioAsk", IDS_MEDIA_STREAM_ASK_AUDIO_ONLY_RADIO },
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaStreamAudioBlock", IDS_MEDIA_STREAM_BLOCK_AUDIO_ONLY_RADIO },
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaStreamVideoAsk", IDS_MEDIA_STREAM_ASK_VIDEO_ONLY_RADIO },
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaStreamVideoBlock", IDS_MEDIA_STREAM_BLOCK_VIDEO_ONLY_RADIO },
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaStreamBubbleAudio", IDS_MEDIA_STREAM_AUDIO_MANAGED },
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaStreamBubbleVideo", IDS_MEDIA_STREAM_VIDEO_MANAGED },
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaAudioExceptionHeader", IDS_MEDIA_AUDIO_EXCEPTION_HEADER },
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaVideoExceptionHeader", IDS_MEDIA_VIDEO_EXCEPTION_HEADER },
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaPepperFlashDefaultDivergedLabel",
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_MEDIA_PEPPER_FLASH_DEFAULT_DIVERGED_LABEL },
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaPepperFlashExceptionsDivergedLabel",
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IDS_MEDIA_PEPPER_FLASH_EXCEPTIONS_DIVERGED_LABEL },
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaPepperFlashChangeLink", IDS_MEDIA_PEPPER_FLASH_CHANGE_LINK },
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaPepperFlashGlobalPrivacyURL", IDS_FLASH_GLOBAL_PRIVACY_URL },
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "mediaPepperFlashWebsitePrivacyURL", IDS_FLASH_WEBSITE_PRIVACY_URL },
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // PPAPI broker filter.
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    { "ppapi-broker_header", IDS_PPAPI_BROKER_HEADER },
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ppapiBrokerTabLabel", IDS_PPAPI_BROKER_TAB_LABEL },
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "ppapiBrokerAllow", IDS_PPAPI_BROKER_ALLOW_RADIO },
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "ppapiBrokerAsk", IDS_PPAPI_BROKER_ASK_RADIO },
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "ppapiBrokerBlock", IDS_PPAPI_BROKER_BLOCK_RADIO },
3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Multiple automatic downloads
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "multipleAutomaticDownloadsTabLabel",
3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      IDS_AUTOMATIC_DOWNLOADS_TAB_LABEL },
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "multipleAutomaticDownloadsAllow",
3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      IDS_AUTOMATIC_DOWNLOADS_ALLOW_RADIO },
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "multipleAutomaticDownloadsAsk",
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      IDS_AUTOMATIC_DOWNLOADS_ASK_RADIO },
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    { "multipleAutomaticDownloadsBlock",
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      IDS_AUTOMATIC_DOWNLOADS_BLOCK_RADIO },
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // MIDI system exclusive messages
398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { "midi-sysex_header", IDS_MIDI_SYSEX_TAB_LABEL },
399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { "midiSysExAllow", IDS_MIDI_SYSEX_ALLOW_RADIO },
400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { "midiSysExAsk", IDS_MIDI_SYSEX_ASK_RADIO },
401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { "midiSysExBlock", IDS_MIDI_SYSEX_BLOCK_RADIO },
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Push messaging strings
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "push-messaging_header", IDS_PUSH_MESSAGES_TAB_LABEL },
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "pushMessagingAllow", IDS_PUSH_MESSSAGING_ALLOW_RADIO },
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "pushMessagingAsk", IDS_PUSH_MESSSAGING_ASK_RADIO },
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "pushMessagingBlock", IDS_PUSH_MESSSAGING_BLOCK_RADIO },
40723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    { "zoomlevels_header", IDS_ZOOMLEVELS_HEADER_AND_TAB_LABEL },
40823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    { "zoomLevelsManage", IDS_ZOOMLEVELS_MANAGE_BUTTON },
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterStrings(localized_strings, resources, arraysize(resources));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "contentSettingsPage",
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_CONTENT_SETTINGS_TITLE);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register titles for each of the individual settings whose exception
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dialogs will be processed by |ContentSettingsHandler|.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "cookies",
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_COOKIES_TAB_LABEL);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "images",
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_IMAGES_TAB_LABEL);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "javascript",
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_JAVASCRIPT_TAB_LABEL);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "plugins",
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_PLUGIN_TAB_LABEL);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "popups",
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_POPUP_TAB_LABEL);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "location",
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_GEOLOCATION_TAB_LABEL);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "notifications",
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_NOTIFICATIONS_TAB_LABEL);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "fullscreen",
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_FULLSCREEN_TAB_LABEL);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "mouselock",
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_MOUSE_LOCK_TAB_LABEL);
4350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
4360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RegisterTitle(localized_strings, "protectedContent",
4370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                IDS_PROTECTED_CONTENT_TAB_LABEL);
4380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "media-stream",
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_MEDIA_STREAM_TAB_LABEL);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "ppapi-broker",
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_PPAPI_BROKER_TAB_LABEL);
4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  RegisterTitle(localized_strings, "multiple-automatic-downloads",
4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                IDS_AUTOMATIC_DOWNLOADS_TAB_LABEL);
445a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RegisterTitle(localized_strings, "midi-sysex",
446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                IDS_MIDI_SYSEX_TAB_LABEL);
44723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RegisterTitle(localized_strings, "zoomlevels",
44823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                IDS_ZOOMLEVELS_HEADER_AND_TAB_LABEL);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
450f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  localized_strings->SetString("exceptionsLearnMoreUrl",
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               kExceptionsLearnMoreUrl);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::InitializeHandler() {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_registrar_.Add(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, chrome::NOTIFICATION_PROFILE_CREATED,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_registrar_.Add(
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, chrome::NOTIFICATION_PROFILE_DESTROYED,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_registrar_.Add(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, chrome::NOTIFICATION_DESKTOP_NOTIFICATION_SETTINGS_CHANGED,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::BrowserContext* context = GetBrowserContext(web_ui());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_registrar_.Add(
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED,
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      content::Source<content::BrowserContext>(context));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PrefService* prefs = user_prefs::UserPrefs::Get(context);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_change_registrar_.Init(prefs);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kPepperFlashSettingsEnabled,
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ContentSettingsHandler::OnPepperFlashPrefChanged,
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kAudioCaptureAllowed,
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ContentSettingsHandler::UpdateMediaSettingsView,
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kVideoCaptureAllowed,
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&ContentSettingsHandler::UpdateMediaSettingsView,
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pref_change_registrar_.Add(
485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      prefs::kEnableDRM,
486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(
487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          &ContentSettingsHandler::UpdateProtectedContentExceptionsButton,
488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          base::Unretained(this)));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::HostZoomMap* host_zoom_map =
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::HostZoomMap::GetDefaultForBrowserContext(context);
49223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  host_zoom_map_subscription_ =
49323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      host_zoom_map->AddZoomLevelChangedCallback(
49423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          base::Bind(&ContentSettingsHandler::OnZoomLevelChanged,
49523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                     base::Unretained(this)));
49623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flash_settings_manager_.reset(new PepperFlashSettingsManager(this, context));
49829b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch
49929b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  Profile* profile = Profile::FromWebUI(web_ui());
50029b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  observer_.Add(profile->GetHostContentSettingsMap());
50129b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  if (profile->HasOffTheRecordProfile()) {
50229b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch    auto map = profile->GetOffTheRecordProfile()->GetHostContentSettingsMap();
50329b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch    if (!observer_.IsObserving(map))
50429b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch      observer_.Add(map);
50529b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::InitializePage() {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_ = MediaSettingsInfo();
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RefreshFlashMediaSettings();
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateHandlersEnabledRadios();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAllExceptionsViewsFromModel();
514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateProtectedContentExceptionsButton();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ContentSettingsHandler::OnContentSettingChanged(
51803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
51903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
52003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ContentSettingsType content_type,
52103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string resource_identifier) {
52203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ContentSettingsDetails details(
52303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      primary_pattern, secondary_pattern, content_type, resource_identifier);
52403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(estade): we pretend update_all() is always true.
52503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (details.update_all_types())
52603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    UpdateAllExceptionsViewsFromModel();
52703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  else
52803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    UpdateExceptionsViewFromModel(details.type());
52903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
53003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::Observe(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_PROFILE_DESTROYED: {
53729b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch      Profile* profile = content::Source<Profile>(source).ptr();
53829b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch      if (profile->IsOffTheRecord() &&
53929b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch          observer_.IsObserving(profile->GetHostContentSettingsMap())) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_ui()->CallJavascriptFunction(
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "ContentSettingsExceptionsArea.OTRProfileDestroyed");
54229b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch        observer_.Remove(profile->GetHostContentSettingsMap());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_PROFILE_CREATED: {
54829b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch      Profile* profile = content::Source<Profile>(source).ptr();
54929b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch      if (profile->IsOffTheRecord()) {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UpdateAllOTRExceptionsViewsFromModel();
55129b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch        observer_.Add(profile->GetHostContentSettingsMap());
55229b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch      }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_DESKTOP_NOTIFICATION_SETTINGS_CHANGED: {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateNotificationExceptionsView();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_PROTOCOL_HANDLER_REGISTRY_CHANGED: {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateHandlersEnabledRadios();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::OnGetPermissionSettingsCompleted(
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission default_permission,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (success && request_id == media_settings_.last_flash_refresh_request_id) {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_settings_.flash_settings_initialized = true;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_settings_.flash_default_setting =
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PepperFlashContentSettingsUtils::FlashPermissionToContentSetting(
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            default_permission);
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PepperFlashContentSettingsUtils::FlashSiteSettingsToMediaExceptions(
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sites, &media_settings_.flash_exceptions);
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PepperFlashContentSettingsUtils::SortMediaExceptions(
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &media_settings_.flash_exceptions);
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateFlashMediaLinksVisibility();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateSettingDefaultFromModel(
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsType type) {
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue filter_settings;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string provider_id;
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_settings.SetString(ContentSettingsTypeToGroupName(type) + ".value",
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            GetSettingDefaultFromModel(type, &provider_id));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter_settings.SetString(
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingsTypeToGroupName(type) + ".managedBy", provider_id);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ContentSettings.setContentFilterSettingsValue", filter_settings);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingsHandler::UpdateMediaSettingsView() {
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PrefService* prefs = user_prefs::UserPrefs::Get(GetBrowserContext(web_ui()));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool audio_disabled = !prefs->GetBoolean(prefs::kAudioCaptureAllowed) &&
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->IsManagedPreference(prefs::kAudioCaptureAllowed);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool video_disabled = !prefs->GetBoolean(prefs::kVideoCaptureAllowed) &&
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->IsManagedPreference(prefs::kVideoCaptureAllowed);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.policy_disable_audio = audio_disabled;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.policy_disable_video = video_disabled;
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.default_setting =
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentSettingsMap()->GetDefaultContentSetting(
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM, NULL);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.default_setting_initialized = true;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateFlashMediaLinksVisibility();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue media_ui_settings;
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_ui_settings.SetBoolean("cameraDisabled", video_disabled);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_ui_settings.SetBoolean("micDisabled", audio_disabled);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In case only video is enabled change the text appropriately.
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (audio_disabled && !video_disabled) {
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetString("askText", "mediaStreamVideoAsk");
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetString("blockText", "mediaStreamVideoBlock");
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetBoolean("showBubble", true);
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetString("bubbleText", "mediaStreamBubbleAudio");
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui()->CallJavascriptFunction("ContentSettings.updateMediaUI",
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     media_ui_settings);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In case only audio is enabled change the text appropriately.
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (video_disabled && !audio_disabled) {
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue media_ui_settings;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetString("askText", "mediaStreamAudioAsk");
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetString("blockText", "mediaStreamAudioBlock");
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetBoolean("showBubble", true);
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_ui_settings.SetString("bubbleText", "mediaStreamBubbleVideo");
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui()->CallJavascriptFunction("ContentSettings.updateMediaUI",
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     media_ui_settings);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (audio_disabled && video_disabled) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fake policy controlled default because the user can not change anything
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // until both audio and video are blocked.
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue filter_settings;
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string group_name =
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsTypeToGroupName(CONTENT_SETTINGS_TYPE_MEDIASTREAM);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    filter_settings.SetString(group_name + ".value",
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              ContentSettingToString(CONTENT_SETTING_BLOCK));
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    filter_settings.SetString(group_name + ".managedBy", "policy");
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui()->CallJavascriptFunction(
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "ContentSettings.setContentFilterSettingsValue", filter_settings);
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_ui_settings.SetString("askText", "mediaStreamAsk");
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_ui_settings.SetString("blockText", "mediaStreamBlock");
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_ui_settings.SetBoolean("showBubble", false);
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  media_ui_settings.SetString("bubbleText", std::string());
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.updateMediaUI",
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   media_ui_settings);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ContentSettingsHandler::GetSettingDefaultFromModel(
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsType type, std::string* provider_id) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting default_setting;
6705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  default_setting =
6715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      profile->GetHostContentSettingsMap()->GetDefaultContentSetting(
6725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          type, provider_id);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ContentSettingToString(default_setting);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateHandlersEnabledRadios() {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue handlers_enabled(
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProtocolHandlerRegistry()->enabled());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ContentSettings.updateHandlersEnabledRadios",
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handlers_enabled);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateAllExceptionsViewsFromModel() {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int type = CONTENT_SETTINGS_TYPE_DEFAULT + 1;
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateExceptionsViewFromModel(static_cast<ContentSettingsType>(type));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
69123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Zoom levels are not actually a content type so we need to handle them
69223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // separately.
69323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UpdateZoomLevelsExceptionsView();
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateAllOTRExceptionsViewsFromModel() {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int type = CONTENT_SETTINGS_TYPE_DEFAULT + 1;
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateOTRExceptionsViewFromModel(static_cast<ContentSettingsType>(type));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateExceptionsViewFromModel(
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsType type) {
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateGeolocationExceptionsView();
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateNotificationExceptionsView();
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateMediaSettingsView();
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateMediaExceptionsView();
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MIXEDSCRIPT:
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We don't yet support exceptions for mixed scripting.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE:
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The content settings type CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // is supposed to be set by policy only. Hence there is no user facing UI
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // for this content type and we skip it here.
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS:
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The RPH settings are retrieved separately.
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
730558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      UpdateMIDISysExExceptionsView();
732558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      break;
7335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS:
7345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // The content settings type CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS is
7355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // supposed to be set by flags and field trials only, thus there is no
7365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // user facing UI for this content type and we skip it here.
7375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_METRO_SWITCH_TO_DESKTOP:
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateExceptionsViewFromHostContentSettingsMap(type);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateOTRExceptionsViewFromModel(
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsType type) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE:
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MIXEDSCRIPT:
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_METRO_SWITCH_TO_DESKTOP:
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
7617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS:
762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
7635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS:
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateExceptionsViewFromOTRHostContentSettingsMap(type);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(estade): merge with GetExceptionsFromHostContentSettingsMap.
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateGeolocationExceptionsView() {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* map = profile->GetHostContentSettingsMap();
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType all_settings;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map->GetSettingsForOneType(
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &all_settings);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Group geolocation settings by primary_pattern.
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AllPatternsSettings all_patterns_settings;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContentSettingsForOneType::iterator i = all_settings.begin();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != all_settings.end(); ++i) {
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't add default settings.
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->primary_pattern == ContentSettingsPattern::Wildcard() &&
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->secondary_pattern == ContentSettingsPattern::Wildcard() &&
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->source != kPreferencesSource) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_patterns_settings[std::make_pair(i->primary_pattern, i->source)]
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [i->secondary_pattern] = i->setting;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue exceptions;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExceptionsGrantedByHostedApps(
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile,
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostedAppHasPermission<APIPermission::kGeolocation>,
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &exceptions);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AllPatternsSettings::iterator i = all_patterns_settings.begin();
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != all_patterns_settings.end(); ++i) {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern = i->first.first;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const OnePatternSettings& one_settings = i->second;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnePatternSettings::const_iterator parent =
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        one_settings.find(primary_pattern);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add the "parent" entry for the non-embedded setting.
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting parent_setting =
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parent == one_settings.end() ? CONTENT_SETTING_DEFAULT : parent->second;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exceptions.Append(GetGeolocationExceptionForPage(primary_pattern,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     primary_pattern,
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     parent_setting));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add the "children" for any embedded settings.
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (OnePatternSettings::const_iterator j = one_settings.begin();
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         j != one_settings.end();
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++j) {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Skip the non-embedded setting which we already added above.
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (j == parent)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exceptions.Append(GetGeolocationExceptionForPage(
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          primary_pattern, j->first, j->second));
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue type_string(
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsTypeToGroupName(CONTENT_SETTINGS_TYPE_GEOLOCATION));
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.setExceptions",
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   type_string, exceptions);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is mainly here to keep this function ideologically parallel to
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UpdateExceptionsViewFromHostContentSettingsMap().
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_GEOLOCATION);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateNotificationExceptionsView() {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType settings;
8435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DesktopNotificationProfileUtil::GetNotificationsSettings(profile, &settings);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue exceptions;
8465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddExceptionsGrantedByHostedApps(
8475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      profile,
8485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      HostedAppHasPermission<APIPermission::kNotifications>,
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &exceptions);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContentSettingsForOneType::const_iterator i =
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           settings.begin();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != settings.end();
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't add default settings.
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->primary_pattern == ContentSettingsPattern::Wildcard() &&
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->secondary_pattern == ContentSettingsPattern::Wildcard() &&
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->source != kPreferencesSource) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exceptions.Append(
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetNotificationExceptionForPage(i->primary_pattern,
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        i->secondary_pattern,
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        i->setting,
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        i->source));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue type_string(
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsTypeToGroupName(CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.setExceptions",
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   type_string, exceptions);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is mainly here to keep this function ideologically parallel to
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UpdateExceptionsViewFromHostContentSettingsMap().
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingsHandler::UpdateMediaExceptionsView() {
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue media_exceptions;
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetExceptionsFromHostContentSettingsMap(
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentSettingsMap(),
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &media_exceptions);
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue video_exceptions;
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetExceptionsFromHostContentSettingsMap(
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentSettingsMap(),
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &video_exceptions);
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Merge the |video_exceptions| list to |media_exceptions| list.
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::map<std::string, base::DictionaryValue*> entries_map;
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (base::ListValue::const_iterator media_entry(media_exceptions.begin());
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       media_entry != media_exceptions.end(); ++media_entry) {
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* media_dict = NULL;
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!(*media_entry)->GetAsDictionary(&media_dict))
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_dict->SetString(kVideoSetting,
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ContentSettingToString(CONTENT_SETTING_ASK));
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string media_origin;
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_dict->GetString(kOrigin, &media_origin);
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entries_map[media_origin] = media_dict;
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (base::ListValue::iterator video_entry = video_exceptions.begin();
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       video_entry != video_exceptions.end(); ++video_entry) {
9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* video_dict = NULL;
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!(*video_entry)->GetAsDictionary(&video_dict))
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string video_origin;
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string video_setting;
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    video_dict->GetString(kOrigin, &video_origin);
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    video_dict->GetString(kSetting, &video_setting);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::map<std::string, base::DictionaryValue*>::iterator iter =
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entries_map.find(video_origin);
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (iter == entries_map.end()) {
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::DictionaryValue* exception = new base::DictionaryValue();
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      exception->SetString(kOrigin, video_origin);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      exception->SetString(kSetting,
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ContentSettingToString(CONTENT_SETTING_ASK));
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      exception->SetString(kVideoSetting, video_setting);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      exception->SetString(kSource, kPreferencesSource);
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Append the new entry to the list and map.
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      media_exceptions.Append(exception);
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entries_map[video_origin] = exception;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Modify the existing entry.
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      iter->second->SetString(kVideoSetting, video_setting);
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.exceptions.clear();
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (base::ListValue::const_iterator media_entry = media_exceptions.begin();
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       media_entry != media_exceptions.end(); ++media_entry) {
9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* media_dict = NULL;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool result = (*media_entry)->GetAsDictionary(&media_dict);
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(result);
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string origin;
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string audio_setting;
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string video_setting;
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_dict->GetString(kOrigin, &origin);
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_dict->GetString(kSetting, &audio_setting);
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_dict->GetString(kVideoSetting, &video_setting);
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_settings_.exceptions.push_back(MediaException(
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::FromString(origin),
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingFromString(audio_setting),
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingFromString(video_setting)));
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFlashContentSettingsUtils::SortMediaExceptions(
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &media_settings_.exceptions);
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.exceptions_initialized = true;
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateFlashMediaLinksVisibility();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue type_string(
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ContentSettingsTypeToGroupName(CONTENT_SETTINGS_TYPE_MEDIASTREAM));
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.setExceptions",
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   type_string, media_exceptions);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_MEDIASTREAM);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContentSettingsHandler::UpdateMIDISysExExceptionsView() {
970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableWebMIDI)) {
971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    web_ui()->CallJavascriptFunction(
972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        "ContentSettings.showExperimentalWebMIDISettings",
973a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::FundamentalValue(true));
974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  UpdateExceptionsViewFromHostContentSettingsMap(
978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
98123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ContentSettingsHandler::UpdateZoomLevelsExceptionsView() {
98223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::ListValue zoom_levels_exceptions;
98323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
98423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::HostZoomMap* host_zoom_map =
9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::HostZoomMap::GetDefaultForBrowserContext(
9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GetBrowserContext(web_ui()));
98723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::HostZoomMap::ZoomLevelVector zoom_levels(
98823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      host_zoom_map->GetAllZoomLevels());
98923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::sort(zoom_levels.begin(), zoom_levels.end(), HostZoomSort);
99023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
99123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (content::HostZoomMap::ZoomLevelVector::const_iterator i =
99223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)           zoom_levels.begin();
99323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       i != zoom_levels.end();
99423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       ++i) {
99523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> exception(new base::DictionaryValue);
99623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    switch (i->mode) {
99723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      case content::HostZoomMap::ZOOM_CHANGED_FOR_HOST:
99823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        exception->SetString(kOrigin, i->host);
99923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        break;
100023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      case content::HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST:
1001a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        // These are not stored in preferences and get cleared on next browser
1002a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        // start. Therefore, we don't care for them.
100323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        break;
100423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      case content::HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM:
100523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        NOTREACHED();
100623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
100723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    exception->SetString(kSetting,
100823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                         ContentSettingToString(CONTENT_SETTING_DEFAULT));
100923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
101023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Calculate the zoom percent from the factor. Round up to the nearest whole
101123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // number.
101223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    int zoom_percent = static_cast<int>(
101323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        content::ZoomLevelToZoomFactor(i->zoom_level) * 100 + 0.5);
101423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    exception->SetString(
101523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        kZoom,
101623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_ZOOM_PERCENT,
101723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                   base::IntToString16(zoom_percent)));
101823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    exception->SetString(kSource, kPreferencesSource);
101923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Append the new entry to the list and map.
102023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    zoom_levels_exceptions.Append(exception.release());
102123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
102223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
102323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::StringValue type_string(kZoomContentType);
102423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.setExceptions",
102523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                   type_string, zoom_levels_exceptions);
102623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
102723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap(
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType type) {
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue exceptions;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetExceptionsFromHostContentSettingsMap(
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentSettingsMap(), type, &exceptions);
10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue type_string(ContentSettingsTypeToGroupName(type));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.setExceptions", type_string,
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   exceptions);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateExceptionsViewFromOTRHostContentSettingsMap(type);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(koz): The default for fullscreen is always 'ask'.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/104683
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == CONTENT_SETTINGS_TYPE_FULLSCREEN)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
10450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Also the default for protected contents is managed in another place.
10460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (type == CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER)
10470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
10480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
10490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default may also have changed (we won't get a separate notification).
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If it hasn't changed, this call will be harmless.
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateSettingDefaultFromModel(type);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::UpdateExceptionsViewFromOTRHostContentSettingsMap(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType type) {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HostContentSettingsMap* otr_settings_map = GetOTRContentSettingsMap();
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!otr_settings_map)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue exceptions;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetExceptionsFromHostContentSettingsMap(otr_settings_map, type, &exceptions);
10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue type_string(ContentSettingsTypeToGroupName(type));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("ContentSettings.setOTRExceptions",
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   type_string, exceptions);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::GetExceptionsFromHostContentSettingsMap(
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostContentSettingsMap* map,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType type,
10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* exceptions) {
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType entries;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map->GetSettingsForOneType(type, std::string(), &entries);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Group settings by primary_pattern.
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AllPatternsSettings all_patterns_settings;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContentSettingsForOneType::iterator i = entries.begin();
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != entries.end(); ++i) {
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't add default settings.
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->primary_pattern == ContentSettingsPattern::Wildcard() &&
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->secondary_pattern == ContentSettingsPattern::Wildcard() &&
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->source != kPreferencesSource) {
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Off-the-record HostContentSettingsMap contains incognito content settings
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as well as normal content settings. Here, we use the incongnito settings
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // only.
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (map->is_off_the_record() && !i->incognito)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_patterns_settings[std::make_pair(i->primary_pattern, i->source)]
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        [i->secondary_pattern] = i->setting;
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the exceptions sorted by provider so they will be displayed in
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // precedence order.
10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<std::vector<base::Value*> > all_provider_exceptions;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  all_provider_exceptions.resize(HostContentSettingsMap::NUM_PROVIDER_TYPES);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AllPatternsSettings::iterator i = all_patterns_settings.begin();
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != all_patterns_settings.end();
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++i) {
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern = i->first.first;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const OnePatternSettings& one_settings = i->second;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The "parent" entry either has an identical primary and secondary pattern,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // or has a wildcard secondary. The two cases are indistinguishable in the
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // UI.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnePatternSettings::const_iterator parent =
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        one_settings.find(primary_pattern);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == one_settings.end())
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent = one_settings.find(ContentSettingsPattern::Wildcard());
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& source = i->first.second;
11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<base::Value*>* this_provider_exceptions =
11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &all_provider_exceptions.at(
11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            HostContentSettingsMap::GetProviderTypeFromSource(source));
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add the "parent" entry for the non-embedded setting.
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting parent_setting =
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parent == one_settings.end() ? CONTENT_SETTING_DEFAULT : parent->second;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern =
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parent == one_settings.end() ? primary_pattern : parent->first;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this_provider_exceptions->push_back(GetExceptionForPage(primary_pattern,
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                            secondary_pattern,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                            parent_setting,
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                            source));
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add the "children" for any embedded settings.
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (OnePatternSettings::const_iterator j = one_settings.begin();
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         j != one_settings.end(); ++j) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Skip the non-embedded setting which we already added above.
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (j == parent)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSetting content_setting = j->second;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this_provider_exceptions->push_back(GetExceptionForPage(
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          primary_pattern,
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          j->first,
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content_setting,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          source));
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < all_provider_exceptions.size(); ++i) {
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t j = 0; j < all_provider_exceptions[i].size(); ++j) {
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exceptions->Append(all_provider_exceptions[i][j]);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ContentSettingsHandler::RemoveMediaException(const base::ListValue* args) {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mode;
115323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool rv = args->GetString(1, &mode);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rv);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pattern;
115723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  rv = args->GetString(2, &pattern);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rv);
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostContentSettingsMap* settings_map =
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mode == "normal" ? GetContentSettingsMap() :
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         GetOTRContentSettingsMap();
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (settings_map) {
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings_map->SetWebsiteSetting(ContentSettingsPattern::FromString(pattern),
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    ContentSettingsPattern::Wildcard(),
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    std::string(),
1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    NULL);
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings_map->SetWebsiteSetting(ContentSettingsPattern::FromString(pattern),
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    ContentSettingsPattern::Wildcard(),
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    std::string(),
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    NULL);
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::RemoveExceptionFromHostContentSettingsMap(
117823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const base::ListValue* args,
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsType type) {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mode;
118123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool rv = args->GetString(1, &mode);
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rv);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pattern;
118523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  rv = args->GetString(2, &pattern);
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rv);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The fourth argument to this handler is optional.
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string secondary_pattern;
1190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (args->GetSize() >= 4U) {
11915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    rv = args->GetString(3, &secondary_pattern);
11925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK(rv);
11935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* settings_map =
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode == "normal" ? GetContentSettingsMap() :
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GetOTRContentSettingsMap();
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings_map) {
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings_map->SetWebsiteSetting(
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ContentSettingsPattern::FromString(pattern),
12015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        secondary_pattern.empty() ?
12025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            ContentSettingsPattern::Wildcard() :
12035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            ContentSettingsPattern::FromString(secondary_pattern),
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        type,
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(),
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NULL);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ContentSettingsHandler::RemoveZoomLevelException(
121123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const base::ListValue* args) {
121223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string mode;
121323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool rv = args->GetString(1, &mode);
121423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(rv);
121523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
121623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string pattern;
121723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  rv = args->GetString(2, &pattern);
121823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(rv);
121923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
122023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  content::HostZoomMap* host_zoom_map =
12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::HostZoomMap::GetDefaultForBrowserContext(
12221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          GetBrowserContext(web_ui()));
122323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  double default_level = host_zoom_map->GetDefaultZoomLevel();
1224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  host_zoom_map->SetZoomLevelForHost(pattern, default_level);
122523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
122623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::RegisterMessages() {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("setContentFilter",
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ContentSettingsHandler::SetContentFilter,
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("removeException",
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ContentSettingsHandler::RemoveException,
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("setException",
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ContentSettingsHandler::SetException,
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("checkExceptionPatternValidity",
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ContentSettingsHandler::CheckExceptionPatternValidity,
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentSettingsHandler::SetContentFilter(const base::ListValue* args) {
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(2U, args->GetSize());
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string group, setting;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(args->GetString(0, &group) &&
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        args->GetString(1, &setting))) {
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting default_setting = ContentSettingFromString(setting);
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsType content_type = ContentSettingsTypeFromGroupName(group);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromeOS special case : in Guest mode settings are opened in Incognito
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode, so we need original profile to actually modify settings.
12586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (user_manager::UserManager::Get()->IsLoggedInAsGuest())
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile = profile->GetOriginalProfile();
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HostContentSettingsMap* map = profile->GetHostContentSettingsMap();
12645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  map->SetDefaultContentSetting(content_type, default_setting);
12655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (content_type) {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_COOKIES:
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultCookieSettingChanged"));
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_IMAGES:
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultImagesSettingChanged"));
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_JAVASCRIPT:
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultJavaScriptSettingChanged"));
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_PLUGINS:
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultPluginsSettingChanged"));
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_POPUPS:
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultPopupsSettingChanged"));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultNotificationsSettingChanged"));
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultGeolocationSettingChanged"));
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MOUSELOCK:
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("Options_DefaultMouseLockSettingChanged"));
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          UserMetricsAction("Options_DefaultMediaStreamMicSettingChanged"));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS:
1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::RecordAction(
1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          UserMetricsAction("Options_DefaultMultipleAutomaticDLSettingChange"));
13067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      break;
1307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
1308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content::RecordAction(
1309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          UserMetricsAction("Options_DefaultMIDISysExSettingChanged"));
1310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      break;
1311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
1312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RecordAction(
1313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          UserMetricsAction("Options_DefaultPushMessagingSettingChanged"));
1314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentSettingsHandler::RemoveException(const base::ListValue* args) {
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string type_string;
132223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(0, &type_string));
132323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
132423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Zoom levels are no actual content type so we need to handle them
132523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // separately. They would not be recognized by
132623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // ContentSettingsTypeFromGroupName.
132723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (type_string == kZoomContentType) {
132823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    RemoveZoomLevelException(args);
132923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
133023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string);
13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM)
13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RemoveMediaException(args);
13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RemoveExceptionFromHostContentSettingsMap(args, type);
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentSettingsHandler::SetException(const base::ListValue* args) {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string type_string;
134123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(0, &type_string));
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mode;
134323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(1, &mode));
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pattern;
134523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(2, &pattern));
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string setting;
134723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(3, &setting));
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS ||
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type == CONTENT_SETTINGS_TYPE_MEDIASTREAM ||
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) {
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostContentSettingsMap* settings_map =
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mode == "normal" ? GetContentSettingsMap() :
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GetOTRContentSettingsMap();
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The settings map could be null if the mode was OTR but the OTR profile
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // got destroyed before we received this message.
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!settings_map)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings_map->SetContentSetting(ContentSettingsPattern::FromString(pattern),
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ContentSettingsPattern::Wildcard(),
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    type,
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    std::string(),
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ContentSettingFromString(setting));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingsHandler::CheckExceptionPatternValidity(
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string type_string;
137623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(0, &type_string));
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mode_string;
137823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(1, &mode_string));
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pattern_string;
138023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHECK(args->GetString(2, &pattern_string));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsPattern pattern =
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingsPattern::FromString(pattern_string);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ContentSettings.patternValidityCheckComplete",
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringValue(type_string),
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringValue(mode_string),
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringValue(pattern_string),
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FundamentalValue(pattern.IsValid()));
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ContentSettingsHandler::ContentSettingsTypeToGroupName(
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType type) {
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kContentSettingsTypeGroupNames); ++i) {
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (type == kContentSettingsTypeGroupNames[i].type)
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kContentSettingsTypeGroupNames[i].name;
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::string();
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostContentSettingsMap* ContentSettingsHandler::GetContentSettingsMap() {
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromWebUI(web_ui())->GetHostContentSettingsMap();
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProtocolHandlerRegistry* ContentSettingsHandler::GetProtocolHandlerRegistry() {
14105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ProtocolHandlerRegistryFactory::GetForBrowserContext(
14115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      GetBrowserContext(web_ui()));
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostContentSettingsMap*
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsHandler::GetOTRContentSettingsMap() {
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (profile->HasOffTheRecordProfile())
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile->GetOffTheRecordProfile()->GetHostContentSettingsMap();
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingsHandler::RefreshFlashMediaSettings() {
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.flash_settings_initialized = false;
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media_settings_.last_flash_refresh_request_id =
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      flash_settings_manager_->GetPermissionSettings(
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC);
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingsHandler::OnPepperFlashPrefChanged() {
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowFlashMediaLink(DEFAULT_SETTING, false);
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowFlashMediaLink(EXCEPTIONS, false);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PrefService* prefs = user_prefs::UserPrefs::Get(GetBrowserContext(web_ui()));
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (prefs->GetBoolean(prefs::kPepperFlashSettingsEnabled))
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RefreshFlashMediaSettings();
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_settings_.flash_settings_initialized = false;
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ContentSettingsHandler::OnZoomLevelChanged(
144223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const content::HostZoomMap::ZoomLevelChange& change) {
144323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  UpdateZoomLevelsExceptionsView();
144423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
144523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingsHandler::ShowFlashMediaLink(LinkType link_type, bool show) {
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool& show_link = link_type == DEFAULT_SETTING ?
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      media_settings_.show_flash_default_link :
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      media_settings_.show_flash_exceptions_link;
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (show_link != show) {
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_ui()->CallJavascriptFunction(
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        link_type == DEFAULT_SETTING ?
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "ContentSettings.showMediaPepperFlashDefaultLink" :
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "ContentSettings.showMediaPepperFlashExceptionsLink",
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FundamentalValue(show));
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_link = show;
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingsHandler::UpdateFlashMediaLinksVisibility() {
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!media_settings_.flash_settings_initialized ||
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !media_settings_.default_setting_initialized ||
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !media_settings_.exceptions_initialized) {
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Flash won't send us notifications when its settings get changed, which
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // means the Flash settings in |media_settings_| may be out-dated, especially
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // after we show links to change Flash settings.
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In order to avoid confusion, we won't hide the links once they are showed.
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // One exception is that we will hide them when Pepper Flash is disabled
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (handled in OnPepperFlashPrefChanged()).
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (media_settings_.show_flash_default_link &&
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      media_settings_.show_flash_exceptions_link) {
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!media_settings_.show_flash_default_link) {
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If both audio and video capture are disabled by policy, the link
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // shouldn't be showed. Flash conforms to the policy in this case because
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // it cannot open those devices. We don't have to look at the Flash
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // settings.
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!(media_settings_.policy_disable_audio &&
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          media_settings_.policy_disable_video) &&
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        media_settings_.flash_default_setting !=
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.default_setting) {
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowFlashMediaLink(DEFAULT_SETTING, true);
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!media_settings_.show_flash_exceptions_link) {
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If audio or video capture is disabled by policy, we skip comparison of
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // exceptions for audio or video capture, respectively.
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!PepperFlashContentSettingsUtils::AreMediaExceptionsEqual(
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.default_setting,
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.exceptions,
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.flash_default_setting,
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.flash_exceptions,
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.policy_disable_audio,
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            media_settings_.policy_disable_video)) {
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowFlashMediaLink(EXCEPTIONS, true);
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ContentSettingsHandler::UpdateProtectedContentExceptionsButton() {
15061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
15071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Guests cannot modify exceptions. UIAccountTweaks will disabled the button.
15081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (user_manager::UserManager::Get()->IsLoggedInAsGuest())
15091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
15101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
15111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Exceptions apply only when the feature is enabled.
15131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefService* prefs = user_prefs::UserPrefs::Get(GetBrowserContext(web_ui()));
1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool enable_exceptions = prefs->GetBoolean(prefs::kEnableDRM);
1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      "ContentSettings.enableProtectedContentExceptions",
1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::FundamentalValue(enable_exceptions));
1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
1521