172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/content_settings_handler.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/command_line.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/browser_process.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/content_settings/content_settings_details.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/content_settings/host_content_settings_map.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/geolocation/geolocation_content_settings_map.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/notifications/desktop_notification_service.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/notifications/desktop_notification_service_factory.h"
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/chrome_switches.h"
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/content_settings_helper.h"
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/pref_names.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char* kDisplayPattern = "displayPattern";
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char* kSetting = "setting";
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char* kOrigin = "origin";
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst char* kEmbeddingOrigin = "embeddingOrigin";
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* const kContentSettingsTypeGroupNames[] = {
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "cookies",
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "images",
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "javascript",
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "plugins",
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "popups",
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "location",
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "notifications",
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  "prerender",
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
47dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCOMPILE_ASSERT(arraysize(kContentSettingsTypeGroupNames) ==
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               CONTENT_SETTINGS_NUM_TYPES,
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               invalid_content_settings_type_group_names_size);
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochContentSettingsType ContentSettingsTypeFromGroupName(const std::string& name) {
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (int content_settings_type = CONTENT_SETTINGS_TYPE_COOKIES;
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       content_settings_type < CONTENT_SETTINGS_NUM_TYPES;
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       ++content_settings_type) {
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (name == kContentSettingsTypeGroupNames[content_settings_type])
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return static_cast<ContentSettingsType>(content_settings_type);
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTREACHED() << name << " is not a recognized content settings type.";
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return CONTENT_SETTINGS_TYPE_DEFAULT;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string ContentSettingToString(ContentSetting setting) {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (setting) {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case CONTENT_SETTING_ALLOW:
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "allow";
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case CONTENT_SETTING_ASK:
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "ask";
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case CONTENT_SETTING_BLOCK:
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "block";
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case CONTENT_SETTING_SESSION_ONLY:
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return "session";
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case CONTENT_SETTING_DEFAULT:
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "default";
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case CONTENT_SETTING_NUM_SETTINGS:
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return "";
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochContentSetting ContentSettingFromString(const std::string& name) {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (name == "allow")
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return CONTENT_SETTING_ALLOW;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (name == "ask")
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return CONTENT_SETTING_ASK;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (name == "block")
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return CONTENT_SETTING_BLOCK;
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (name == "session")
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return CONTENT_SETTING_SESSION_ONLY;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTREACHED() << name << " is not a recognized content setting.";
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return CONTENT_SETTING_DEFAULT;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string GeolocationExceptionToString(const GURL& origin,
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         const GURL& embedding_origin) {
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (origin == embedding_origin)
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return content_settings_helper::OriginToString(origin);
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(estade): the page needs to use CSS to indent the string.
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string indent(" ");
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (embedding_origin.is_empty()) {
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // NOTE: As long as the user cannot add/edit entries from the exceptions
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // dialog, it's impossible to actually have a non-default setting for some
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // origin "embedded on any other site", so this row will never appear.  If
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // we add the ability to add/edit exceptions, we'll need to decide when to
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // display this and how "removing" it will function.
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return indent +
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        l10n_util::GetStringUTF8(IDS_EXCEPTIONS_GEOLOCATION_EMBEDDED_ANY_OTHER);
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return indent + l10n_util::GetStringFUTF8(
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      IDS_EXCEPTIONS_GEOLOCATION_EMBEDDED_ON_HOST,
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UTF8ToUTF16(content_settings_helper::OriginToString(embedding_origin)));
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Create a DictionaryValue* that will act as a data source for a single row
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// in a HostContentSettingsMap-controlled exceptions table (e.g., cookies).
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Ownership of the pointer is passed to the caller.
123731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDictionaryValue* GetExceptionForPage(
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ContentSettingsPattern& pattern,
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ContentSetting setting) {
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DictionaryValue* exception = new DictionaryValue();
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kDisplayPattern,
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(pattern.AsString()));
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kSetting,
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(ContentSettingToString(setting)));
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return exception;
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Create a DictionaryValue* that will act as a data source for a single row
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// in the Geolocation exceptions table. Ownership of the pointer is passed to
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// the caller.
139731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDictionaryValue* GetGeolocationExceptionForPage(const GURL& origin,
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                const GURL& embedding_origin,
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                ContentSetting setting) {
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DictionaryValue* exception = new DictionaryValue();
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kDisplayPattern,
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(GeolocationExceptionToString(origin, embedding_origin)));
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kSetting,
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(ContentSettingToString(setting)));
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kOrigin,
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(origin.spec()));
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kEmbeddingOrigin,
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(embedding_origin.spec()));
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return exception;
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Create a DictionaryValue* that will act as a data source for a single row
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// in the desktop notifications exceptions table. Ownership of the pointer is
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// passed to the caller.
161731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDictionaryValue* GetNotificationExceptionForPage(
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const GURL& url,
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ContentSetting setting) {
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DictionaryValue* exception = new DictionaryValue();
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kDisplayPattern,
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(content_settings_helper::OriginToString(url)));
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kSetting,
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(ContentSettingToString(setting)));
171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  exception->Set(
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      kOrigin,
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new StringValue(url.spec()));
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return exception;
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochContentSettingsHandler::ContentSettingsHandler() {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochContentSettingsHandler::~ContentSettingsHandler() {
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentSettingsHandler::GetLocalizedValues(
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DictionaryValue* localized_strings) {
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(localized_strings);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static OptionsStringResource resources[] = {
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "content_exceptions", IDS_COOKIES_EXCEPTIONS_BUTTON },
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "allowException", IDS_EXCEPTIONS_ALLOW_BUTTON },
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "blockException", IDS_EXCEPTIONS_BLOCK_BUTTON },
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "sessionException", IDS_EXCEPTIONS_SESSION_ONLY_BUTTON },
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "askException", IDS_EXCEPTIONS_ASK_BUTTON },
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "addExceptionRow", IDS_EXCEPTIONS_ADD_BUTTON },
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "removeExceptionRow", IDS_EXCEPTIONS_REMOVE_BUTTON },
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "editExceptionRow", IDS_EXCEPTIONS_EDIT_BUTTON },
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "otr_exceptions_explanation", IDS_EXCEPTIONS_OTR_LABEL },
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "examplePattern", IDS_EXCEPTIONS_PATTERN_EXAMPLE },
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "addNewExceptionInstructions", IDS_EXCEPTIONS_ADD_NEW_INSTRUCTIONS },
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "manage_exceptions", IDS_EXCEPTIONS_MANAGE },
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "exceptionPatternHeader", IDS_EXCEPTIONS_PATTERN_HEADER },
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "exceptionBehaviorHeader", IDS_EXCEPTIONS_ACTION_HEADER },
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Cookies filter.
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_tab_label", IDS_COOKIES_TAB_LABEL },
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_header", IDS_COOKIES_HEADER },
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_allow", IDS_COOKIES_ALLOW_RADIO },
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_ask", IDS_COOKIES_ASK_EVERY_TIME_RADIO },
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_block", IDS_COOKIES_BLOCK_RADIO },
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_block_3rd_party", IDS_COOKIES_BLOCK_3RDPARTY_CHKBOX },
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "cookies_clear_when_close", IDS_COOKIES_CLEAR_WHEN_CLOSE_CHKBOX },
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "cookies_lso_clear_when_close", IDS_COOKIES_LSO_CLEAR_WHEN_CLOSE_CHKBOX },
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "cookies_show_cookies", IDS_COOKIES_SHOW_COOKIES_BUTTON },
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "flash_storage_settings", IDS_FLASH_STORAGE_SETTINGS },
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "flash_storage_url", IDS_FLASH_STORAGE_URL },
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Image filter.
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "images_tab_label", IDS_IMAGES_TAB_LABEL },
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "images_header", IDS_IMAGES_HEADER },
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "images_allow", IDS_IMAGES_LOAD_RADIO },
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "images_block", IDS_IMAGES_NOLOAD_RADIO },
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // JavaScript filter.
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "javascript_tab_label", IDS_JAVASCRIPT_TAB_LABEL },
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "javascript_header", IDS_JAVASCRIPT_HEADER },
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "javascript_allow", IDS_JS_ALLOW_RADIO },
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "javascript_block", IDS_JS_DONOTALLOW_RADIO },
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Plug-ins filter.
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "plugins_tab_label", IDS_PLUGIN_TAB_LABEL },
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "plugins_header", IDS_PLUGIN_HEADER },
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "plugins_ask", IDS_PLUGIN_ASK_RADIO },
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "plugins_allow", IDS_PLUGIN_LOAD_RADIO },
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "plugins_block", IDS_PLUGIN_NOLOAD_RADIO },
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "disable_individual_plugins", IDS_PLUGIN_SELECTIVE_DISABLE },
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Pop-ups filter.
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "popups_tab_label", IDS_POPUP_TAB_LABEL },
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "popups_header", IDS_POPUP_HEADER },
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "popups_allow", IDS_POPUP_ALLOW_RADIO },
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "popups_block", IDS_POPUP_BLOCK_RADIO },
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Location filter.
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "location_tab_label", IDS_GEOLOCATION_TAB_LABEL },
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "location_header", IDS_GEOLOCATION_HEADER },
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "location_allow", IDS_GEOLOCATION_ALLOW_RADIO },
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "location_ask", IDS_GEOLOCATION_ASK_RADIO },
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "location_block", IDS_GEOLOCATION_BLOCK_RADIO },
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Notifications filter.
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "notifications_tab_label", IDS_NOTIFICATIONS_TAB_LABEL },
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "notifications_header", IDS_NOTIFICATIONS_HEADER },
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "notifications_allow", IDS_NOTIFICATIONS_ALLOW_RADIO },
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "notifications_ask", IDS_NOTIFICATIONS_ASK_RADIO },
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "notifications_block", IDS_NOTIFICATIONS_BLOCK_RADIO },
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RegisterStrings(localized_strings, resources, arraysize(resources));
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RegisterTitle(localized_strings, "contentSettingsPage",
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                IDS_CONTENT_SETTINGS_TITLE);
255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings->SetBoolean("enable_click_to_play",
256201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      CommandLine::ForCurrentProcess()->HasSwitch(
257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          switches::kEnableClickToPlay));
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::Initialize() {
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const HostContentSettingsMap* settings_map = GetContentSettingsMap();
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<Value> block_3rd_party(Value::CreateBooleanValue(
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      settings_map->BlockThirdPartyCookies()));
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("ContentSettings.setBlockThirdPartyCookies",
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  *block_3rd_party.get());
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  notification_registrar_.Add(
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this, NotificationType::OTR_PROFILE_CREATED,
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NotificationService::AllSources());
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  notification_registrar_.Add(
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this, NotificationType::PROFILE_DESTROYED,
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NotificationService::AllSources());
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  UpdateAllExceptionsViewsFromModel();
2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  notification_registrar_.Add(
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      this, NotificationType::CONTENT_SETTINGS_CHANGED,
27721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      NotificationService::AllSources());
278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  notification_registrar_.Add(
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this, NotificationType::DESKTOP_NOTIFICATION_DEFAULT_CHANGED,
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NotificationService::AllSources());
281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  notification_registrar_.Add(
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      this, NotificationType::DESKTOP_NOTIFICATION_SETTINGS_CHANGED,
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NotificationService::AllSources());
284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* prefs = web_ui_->GetProfile()->GetPrefs();
286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  pref_change_registrar_.Init(prefs);
287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  pref_change_registrar_.Add(prefs::kGeolocationDefaultContentSetting, this);
288513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  pref_change_registrar_.Add(prefs::kGeolocationContentSettings, this);
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::Observe(NotificationType type,
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                     const NotificationSource& source,
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                     const NotificationDetails& details) {
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (type.value) {
295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::PROFILE_DESTROYED: {
296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      Profile* profile = static_cast<Source<Profile> >(source).ptr();
29721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      if (profile->IsOffTheRecord()) {
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        web_ui_->CallJavascriptFunction(
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            "ContentSettingsExceptionsArea.OTRProfileDestroyed");
30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      }
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::OTR_PROFILE_CREATED: {
305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UpdateAllOTRExceptionsViewsFromModel();
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::CONTENT_SETTINGS_CHANGED: {
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const ContentSettingsDetails* settings_details =
31121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          Details<const ContentSettingsDetails>(details).ptr();
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // TODO(estade): we pretend update_all() is always true.
314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (settings_details->update_all_types())
315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        UpdateAllExceptionsViewsFromModel();
316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      else
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        UpdateExceptionsViewFromModel(settings_details->type());
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    case NotificationType::PREF_CHANGED: {
322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const std::string& pref_name = *Details<std::string>(details).ptr();
323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (pref_name == prefs::kGeolocationDefaultContentSetting)
324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_GEOLOCATION);
325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      else if (pref_name == prefs::kGeolocationContentSettings)
326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        UpdateGeolocationExceptionsView();
3274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::DESKTOP_NOTIFICATION_DEFAULT_CHANGED: {
331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::DESKTOP_NOTIFICATION_SETTINGS_CHANGED: {
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UpdateNotificationExceptionsView();
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      OptionsPageUIHandler::Observe(type, source, details);
342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ContentSettingsHandler::UpdateSettingDefaultFromModel(
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType type) {
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DictionaryValue filter_settings;
34821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  filter_settings.SetString(ContentSettingsTypeToGroupName(type) + ".value",
34921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      GetSettingDefaultFromModel(type));
35021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  filter_settings.SetBoolean(ContentSettingsTypeToGroupName(type) + ".managed",
35121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      GetDefaultSettingManagedFromModel(type));
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->CallJavascriptFunction(
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "ContentSettings.setContentFilterSettingsValue", filter_settings);
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string ContentSettingsHandler::GetSettingDefaultFromModel(
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType type) {
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentSetting default_setting;
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    default_setting = web_ui_->GetProfile()->
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        GetGeolocationContentSettingsMap()->GetDefaultContentSetting();
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default_setting = DesktopNotificationServiceFactory::GetForProfile(
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        web_ui_->GetProfile())->GetDefaultContentSetting();
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    default_setting = GetContentSettingsMap()->GetDefaultContentSetting(type);
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ContentSettingToString(default_setting);
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
37321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool ContentSettingsHandler::GetDefaultSettingManagedFromModel(
37421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ContentSettingsType type) {
37521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return web_ui_->GetProfile()->
37721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        GetGeolocationContentSettingsMap()->IsDefaultContentSettingManaged();
37821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return DesktopNotificationServiceFactory::GetForProfile(
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        web_ui_->GetProfile())->IsDefaultContentSettingManaged();
38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
38221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return GetContentSettingsMap()->IsDefaultContentSettingManaged(type);
38321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
38421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
38521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::UpdateAllExceptionsViewsFromModel() {
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (int type = CONTENT_SETTINGS_TYPE_DEFAULT + 1;
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick       type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    UpdateExceptionsViewFromModel(static_cast<ContentSettingsType>(type));
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ContentSettingsHandler::UpdateAllOTRExceptionsViewsFromModel() {
394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (int type = CONTENT_SETTINGS_TYPE_DEFAULT + 1;
395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick       type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateOTRExceptionsViewFromModel(static_cast<ContentSettingsType>(type));
397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::UpdateExceptionsViewFromModel(
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType type) {
402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (type) {
403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UpdateGeolocationExceptionsView();
405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
406dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UpdateNotificationExceptionsView();
408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
409dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case CONTENT_SETTINGS_TYPE_PRERENDER:
410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Prerender is currently (02/24/2011) an experimental feature which is
411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // only turned on via about:flags. There is intentionally no UI in
412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // chrome://preferences for CONTENT_SETTINGS_TYPE_PRERENDER.
413dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // TODO(cbentzel): Change once prerender moves out of about:flags.
414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
416dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UpdateExceptionsViewFromHostContentSettingsMap(type);
417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
418dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
420dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ContentSettingsHandler::UpdateOTRExceptionsViewFromModel(
422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSettingsType type) {
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (type) {
424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case CONTENT_SETTINGS_TYPE_PRERENDER:
427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UpdateExceptionsViewFromOTRHostContentSettingsMap(type);
430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ContentSettingsHandler::UpdateGeolocationExceptionsView() {
435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GeolocationContentSettingsMap* map =
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      web_ui_->GetProfile()->GetGeolocationContentSettingsMap();
437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GeolocationContentSettingsMap::AllOriginsSettings all_settings =
438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      map->GetAllOriginsSettings();
439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GeolocationContentSettingsMap::AllOriginsSettings::const_iterator i;
440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ListValue exceptions;
442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (i = all_settings.begin(); i != all_settings.end(); ++i) {
443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const GURL& origin = i->first;
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const GeolocationContentSettingsMap::OneOriginSettings& one_settings =
445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        i->second;
446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GeolocationContentSettingsMap::OneOriginSettings::const_iterator parent =
448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        one_settings.find(origin);
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Add the "parent" entry for the non-embedded setting.
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ContentSetting parent_setting =
452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        parent == one_settings.end() ? CONTENT_SETTING_DEFAULT : parent->second;
453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    exceptions.Append(
454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        GetGeolocationExceptionForPage(origin, origin, parent_setting));
455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Add the "children" for any embedded settings.
457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    GeolocationContentSettingsMap::OneOriginSettings::const_iterator j;
458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    for (j = one_settings.begin(); j != one_settings.end(); ++j) {
459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Skip the non-embedded setting which we already added above.
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (j == parent)
461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        continue;
462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      exceptions.Append(
464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          GetGeolocationExceptionForPage(origin, j->first, j->second));
465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  StringValue type_string(
469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ContentSettingsTypeToGroupName(CONTENT_SETTINGS_TYPE_GEOLOCATION));
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("ContentSettings.setExceptions",
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  type_string, exceptions);
472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This is mainly here to keep this function ideologically parallel to
474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // UpdateExceptionsViewFromHostContentSettingsMap().
475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_GEOLOCATION);
476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ContentSettingsHandler::UpdateNotificationExceptionsView() {
479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DesktopNotificationService* service =
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DesktopNotificationServiceFactory::GetForProfile(web_ui_->GetProfile());
481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::vector<GURL> allowed(service->GetAllowedOrigins());
483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::vector<GURL> blocked(service->GetBlockedOrigins());
484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ListValue exceptions;
486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (size_t i = 0; i < allowed.size(); ++i) {
487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    exceptions.Append(
488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        GetNotificationExceptionForPage(allowed[i], CONTENT_SETTING_ALLOW));
489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (size_t i = 0; i < blocked.size(); ++i) {
491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    exceptions.Append(
492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        GetNotificationExceptionForPage(blocked[i], CONTENT_SETTING_BLOCK));
493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  StringValue type_string(
496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ContentSettingsTypeToGroupName(CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("ContentSettings.setExceptions",
498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  type_string, exceptions);
499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This is mainly here to keep this function ideologically parallel to
501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // UpdateExceptionsViewFromHostContentSettingsMap().
502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  UpdateSettingDefaultFromModel(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ContentSettingsHandler::UpdateExceptionsViewFromHostContentSettingsMap(
506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ContentSettingsType type) {
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HostContentSettingsMap::SettingsForOneType entries;
5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GetContentSettingsMap()->GetSettingsForOneType(type, "", &entries);
5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ListValue exceptions;
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < entries.size(); ++i) {
512731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    exceptions.Append(GetExceptionForPage(entries[i].first, entries[i].second));
5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  StringValue type_string(ContentSettingsTypeToGroupName(type));
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("ContentSettings.setExceptions", type_string,
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  exceptions);
5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  UpdateExceptionsViewFromOTRHostContentSettingsMap(type);
520731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The default may also have changed (we won't get a separate notification).
5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If it hasn't changed, this call will be harmless.
523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  UpdateSettingDefaultFromModel(type);
524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ContentSettingsHandler::UpdateExceptionsViewFromOTRHostContentSettingsMap(
527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ContentSettingsType type) {
5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const HostContentSettingsMap* otr_settings_map = GetOTRContentSettingsMap();
529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!otr_settings_map)
530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  HostContentSettingsMap::SettingsForOneType otr_entries;
533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  otr_settings_map->GetSettingsForOneType(type, "", &otr_entries);
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ListValue otr_exceptions;
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  for (size_t i = 0; i < otr_entries.size(); ++i) {
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    otr_exceptions.Append(GetExceptionForPage(otr_entries[i].first,
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                              otr_entries[i].second));
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  StringValue type_string(ContentSettingsTypeToGroupName(type));
542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("ContentSettings.setOTRExceptions",
543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  type_string, otr_exceptions);
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ContentSettingsHandler::RegisterMessages() {
54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setContentFilter",
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this,
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  &ContentSettingsHandler::SetContentFilter));
55072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setAllowThirdPartyCookies",
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this,
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  &ContentSettingsHandler::SetAllowThirdPartyCookies));
55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("removeException",
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      NewCallback(this,
55521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                  &ContentSettingsHandler::RemoveException));
55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setException",
5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      NewCallback(this,
5583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                  &ContentSettingsHandler::SetException));
55972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("checkExceptionPatternValidity",
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      NewCallback(this,
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                  &ContentSettingsHandler::CheckExceptionPatternValidity));
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::SetContentFilter(const ListValue* args) {
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK_EQ(2U, args->GetSize());
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string group, setting;
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!(args->GetString(0, &group) &&
5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        args->GetString(1, &setting))) {
5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED();
5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
5713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentSetting default_setting = ContentSettingFromString(setting);
5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentSettingsType content_type = ContentSettingsTypeFromGroupName(group);
575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
57672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->GetProfile()->GetGeolocationContentSettingsMap()->
5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        SetDefaultContentSetting(default_setting);
5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DesktopNotificationServiceFactory::GetForProfile(web_ui_->GetProfile())->
5803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        SetDefaultContentSetting(default_setting);
5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GetContentSettingsMap()->
5833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        SetDefaultContentSetting(content_type, default_setting);
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::SetAllowThirdPartyCookies(const ListValue* args) {
588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 allow = ExtractStringValue(args);
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GetContentSettingsMap()->SetBlockThirdPartyCookies(
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LowerCaseEqualsASCII(allow, "true"));
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ContentSettingsHandler::RemoveException(const ListValue* args) {
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  size_t arg_i = 0;
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string type_string;
5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &type_string));
5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string);
60021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
60121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    std::string origin;
60221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    std::string embedding_origin;
60321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    bool rv = args->GetString(arg_i++, &origin);
60421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(rv);
60521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    rv = args->GetString(arg_i++, &embedding_origin);
60621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(rv);
60721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
60872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    web_ui_->GetProfile()->GetGeolocationContentSettingsMap()->
60921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        SetContentSetting(GURL(origin),
61021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                          GURL(embedding_origin),
61121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                          CONTENT_SETTING_DEFAULT);
61221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
61321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    std::string origin;
61421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    std::string setting;
61521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    bool rv = args->GetString(arg_i++, &origin);
61621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(rv);
61721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    rv = args->GetString(arg_i++, &setting);
61821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(rv);
61921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ContentSetting content_setting = ContentSettingFromString(setting);
62021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (content_setting == CONTENT_SETTING_ALLOW) {
621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DesktopNotificationServiceFactory::GetForProfile(web_ui_->GetProfile())->
62221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          ResetAllowedOrigin(GURL(origin));
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
62421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      DCHECK_EQ(content_setting, CONTENT_SETTING_BLOCK);
625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DesktopNotificationServiceFactory::GetForProfile(web_ui_->GetProfile())->
62621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          ResetBlockedOrigin(GURL(origin));
62721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
62821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else {
62921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    std::string mode;
63021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    bool rv = args->GetString(arg_i++, &mode);
63121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(rv);
63221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
63321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    std::string pattern;
63421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    rv = args->GetString(arg_i++, &pattern);
63521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    DCHECK(rv);
63621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
63721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    HostContentSettingsMap* settings_map =
63821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        mode == "normal" ? GetContentSettingsMap() :
63921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                           GetOTRContentSettingsMap();
64021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // The settings map could be null if the mode was OTR but the OTR profile
64121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // got destroyed before we received this message.
64221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (settings_map) {
64321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      settings_map->SetContentSetting(
64421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          ContentSettingsPattern(pattern),
64521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          ContentSettingsTypeFromGroupName(type_string),
64621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          "",
64721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          CONTENT_SETTING_DEFAULT);
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::SetException(const ListValue* args) {
6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  size_t arg_i = 0;
6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string type_string;
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &type_string));
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string mode;
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &mode));
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string pattern;
6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &pattern));
6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string setting;
6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &setting));
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ContentSettingsType type = ContentSettingsTypeFromGroupName(type_string);
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HostContentSettingsMap* settings_map =
6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      mode == "normal" ? GetContentSettingsMap() :
6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         GetOTRContentSettingsMap();
6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The settings map could be null if the mode was OTR but the OTR profile
6753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // got destroyed before we received this message.
6763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!settings_map)
6773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
6783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
67921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  settings_map->SetContentSetting(ContentSettingsPattern(pattern),
68021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  type,
68121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  "",
68221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  ContentSettingFromString(setting));
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ContentSettingsHandler::CheckExceptionPatternValidity(
6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const ListValue* args) {
6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  size_t arg_i = 0;
6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Value* type;
6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->Get(arg_i++, &type));
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string mode_string;
6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &mode_string));
6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string pattern_string;
6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CHECK(args->GetString(arg_i++, &pattern_string));
6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
69521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ContentSettingsPattern pattern(pattern_string);
6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<Value> mode_value(Value::CreateStringValue(mode_string));
6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<Value> pattern_value(Value::CreateStringValue(pattern_string));
6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<Value> valid_value(Value::CreateBooleanValue(pattern.IsValid()));
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
70172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->CallJavascriptFunction(
702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "ContentSettings.patternValidityCheckComplete",
703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *type,
704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *mode_value.get(),
705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *pattern_value.get(),
706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *valid_value.get());
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstd::string ContentSettingsHandler::ContentSettingsTypeToGroupName(
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType type) {
712dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (type < CONTENT_SETTINGS_TYPE_COOKIES ||
713dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      type >= CONTENT_SETTINGS_NUM_TYPES) {
714dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NOTREACHED();
715dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return "";
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
717dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return kContentSettingsTypeGroupNames[type];
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHostContentSettingsMap* ContentSettingsHandler::GetContentSettingsMap() {
72172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return web_ui_->GetProfile()->GetHostContentSettingsMap();
7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHostContentSettingsMap*
7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsHandler::GetOTRContentSettingsMap() {
72672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Profile* profile = web_ui_->GetProfile();
7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (profile->HasOffTheRecordProfile())
7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return profile->GetOffTheRecordProfile()->GetHostContentSettingsMap();
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return NULL;
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
731