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/core_options_handler.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/json/json_reader.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/browser_process.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/google/google_util.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/metrics/user_metrics.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/pref_names.h"
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/url_constants.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "googleurl/src/gurl.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCoreOptionsHandler::CoreOptionsHandler()
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : handlers_host_(NULL) {
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
33731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCoreOptionsHandler::~CoreOptionsHandler() {}
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CoreOptionsHandler::Initialize() {
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled,
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      g_browser_process->local_state(),
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      this);
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateClearPluginLSOData();
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::GetLocalizedValues(
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DictionaryValue* localized_strings) {
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(localized_strings);
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Main
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings->SetString("title",
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_SETTINGS_TITLE));
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Managed prefs
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings->SetString("managedPrefsBannerText",
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_OPTIONS_MANAGED_PREFS));
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Search
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  RegisterTitle(localized_strings, "searchPage", IDS_OPTIONS_SEARCH_PAGE_TITLE);
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  localized_strings->SetString("searchPlaceholder",
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      l10n_util::GetStringUTF16(IDS_OPTIONS_SEARCH_PLACEHOLDER));
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings->SetString("searchPageNoMatches",
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF16(IDS_OPTIONS_SEARCH_PAGE_NO_MATCHES));
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings->SetString("searchPageHelpLabel",
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF16(IDS_OPTIONS_SEARCH_PAGE_HELP_LABEL));
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings->SetString("searchPageHelpTitle",
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringFUTF16(IDS_OPTIONS_SEARCH_PAGE_HELP_TITLE,
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings->SetString("searchPageHelpURL",
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      google_util::AppendGoogleLocaleParam(
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          GURL(chrome::kChromeHelpURL)).spec());
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Common
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings->SetString("ok",
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_OK));
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings->SetString("cancel",
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_CANCEL));
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings->SetString("learnMore",
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_LEARN_MORE));
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings->SetString("close",
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_CLOSE));
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::Uninitialize() {
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string last_pref;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (PreferenceCallbackMap::const_iterator iter = pref_callback_map_.begin();
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       iter != pref_callback_map_.end();
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ++iter) {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (last_pref != iter->first) {
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      StopObservingPref(iter->first);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      last_pref = iter->first;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWebUIMessageHandler* CoreOptionsHandler::Attach(WebUI* web_ui) {
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WebUIMessageHandler* result = WebUIMessageHandler::Attach(web_ui);
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(web_ui_);
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  registrar_.Init(web_ui_->GetProfile()->GetPrefs());
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return result;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CoreOptionsHandler::Observe(NotificationType type,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const NotificationSource& source,
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const NotificationDetails& details) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (type == NotificationType::PREF_CHANGED)
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NotifyPrefChanged(Details<std::string>(details).ptr());
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CoreOptionsHandler::RegisterMessages() {
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("coreOptionsInitialize",
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &CoreOptionsHandler::HandleInitialize));
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("fetchPrefs",
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &CoreOptionsHandler::HandleFetchPrefs));
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("observePrefs",
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &CoreOptionsHandler::HandleObservePrefs));
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setBooleanPref",
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &CoreOptionsHandler::HandleSetBooleanPref));
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setIntegerPref",
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &CoreOptionsHandler::HandleSetIntegerPref));
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setDoublePref",
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NewCallback(this, &CoreOptionsHandler::HandleSetDoublePref));
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setStringPref",
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(this, &CoreOptionsHandler::HandleSetStringPref));
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("setListPref",
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NewCallback(this, &CoreOptionsHandler::HandleSetListPref));
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("clearPref",
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NewCallback(this, &CoreOptionsHandler::HandleClearPref));
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("coreOptionsUserMetricsAction",
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      NewCallback(this, &CoreOptionsHandler::HandleUserMetricsAction));
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleInitialize(const ListValue* args) {
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(handlers_host_);
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  handlers_host_->InitializeHandlers();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickValue* CoreOptionsHandler::FetchPref(const std::string& pref_name) {
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* pref_service = web_ui_->GetProfile()->GetPrefs();
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const PrefService::Preference* pref =
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pref_service->FindPreference(pref_name.c_str());
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Value* return_value;
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (pref) {
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DictionaryValue* dict = new DictionaryValue;
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    dict->Set("value", pref->GetValue()->DeepCopy());
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    dict->SetBoolean("managed", pref->IsManaged());
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return_value = dict;
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return_value = Value::CreateNullValue();
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return return_value;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::ObservePref(const std::string& pref_name) {
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar_.Add(pref_name.c_str(), this);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::SetPref(const std::string& pref_name,
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 const Value* value,
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 const std::string& metric) {
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* pref_service = web_ui_->GetProfile()->GetPrefs();
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (value->GetType()) {
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case Value::TYPE_BOOLEAN:
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case Value::TYPE_INTEGER:
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case Value::TYPE_DOUBLE:
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case Value::TYPE_STRING:
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      pref_service->Set(pref_name.c_str(), *value);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pref_service->ScheduleSavePersistentPrefs();
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ProcessUserMetric(value, metric);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CoreOptionsHandler::ClearPref(const std::string& pref_name,
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                   const std::string& metric) {
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* pref_service = web_ui_->GetProfile()->GetPrefs();
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  pref_service->ClearPref(pref_name.c_str());
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  pref_service->ScheduleSavePersistentPrefs();
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!metric.empty())
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    UserMetricsRecordAction(UserMetricsAction(metric.c_str()));
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CoreOptionsHandler::ProcessUserMetric(const Value* value,
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           const std::string& metric) {
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (metric.empty())
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string metric_string = metric;
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (value->IsType(Value::TYPE_BOOLEAN)) {
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool bool_value;
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    CHECK(value->GetAsBoolean(&bool_value));
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    metric_string += bool_value ? "_Enable" : "_Disable";
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  UserMetricsRecordAction(UserMetricsAction(metric_string.c_str()));
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::StopObservingPref(const std::string& path) {
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  registrar_.Remove(path.c_str(), this);
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleFetchPrefs(const ListValue* args) {
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First param is name of callback function, so, there needs to be at least
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // one more element for the actual preference identifier.
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK_GE(static_cast<int>(args->GetSize()), 2);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get callback JS function name.
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Value* callback;
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!args->Get(0, &callback) || !callback->IsType(Value::TYPE_STRING))
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 callback_function;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!callback->GetAsString(&callback_function))
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the list of name for prefs to build the response dictionary.
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue result_value;
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Value* list_member;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 1; i < args->GetSize(); i++) {
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!args->Get(i, &list_member))
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!list_member->IsType(Value::TYPE_STRING))
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string pref_name;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!list_member->GetAsString(&pref_name))
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    result_value.Set(pref_name.c_str(), FetchPref(pref_name));
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction(UTF16ToASCII(callback_function),
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  result_value);
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleObservePrefs(const ListValue* args) {
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First param is name is JS callback function name, the rest are pref
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // identifiers that we are observing.
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK_GE(static_cast<int>(args->GetSize()), 2);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get preference change callback function name.
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 callback_func_name;
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!args->GetString(0, &callback_func_name))
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get all other parameters - pref identifiers.
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 1; i < args->GetSize(); i++) {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Value* list_member;
2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!args->Get(i, &list_member))
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Just ignore bad pref identifiers for now.
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string pref_name;
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!list_member->IsType(Value::TYPE_STRING) ||
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        !list_member->GetAsString(&pref_name))
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      continue;
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (pref_callback_map_.find(pref_name) == pref_callback_map_.end())
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ObservePref(pref_name);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    pref_callback_map_.insert(
2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        PreferenceCallbackMap::value_type(pref_name,
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                          UTF16ToWideHack(callback_func_name)));
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleSetBooleanPref(const ListValue* args) {
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HandleSetPref(args, Value::TYPE_BOOLEAN);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleSetIntegerPref(const ListValue* args) {
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HandleSetPref(args, Value::TYPE_INTEGER);
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CoreOptionsHandler::HandleSetDoublePref(const ListValue* args) {
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  HandleSetPref(args, Value::TYPE_DOUBLE);
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleSetStringPref(const ListValue* args) {
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HandleSetPref(args, Value::TYPE_STRING);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CoreOptionsHandler::HandleSetListPref(const ListValue* args) {
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  HandleSetPref(args, Value::TYPE_LIST);
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleSetPref(const ListValue* args,
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       Value::ValueType type) {
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK_GT(static_cast<int>(args->GetSize()), 1);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string pref_name;
2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!args->GetString(0, &pref_name))
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Value* value;
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!args->Get(1, &value))
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<Value> temp_value;
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // In JS all numbers are doubles.
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (type == Value::TYPE_INTEGER) {
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    double double_value;
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    CHECK(value->GetAsDouble(&double_value));
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    temp_value.reset(Value::CreateIntegerValue(static_cast<int>(double_value)));
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    value = temp_value.get();
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // In case we have a List pref we got a JSON string.
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (type == Value::TYPE_LIST) {
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string json_string;
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    CHECK(value->GetAsString(&json_string));
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    temp_value.reset(
31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        base::JSONReader().JsonToValue(json_string,
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                       false,  // no check_root
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                       false));  // no trailing comma
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    value = temp_value.get();
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CHECK_EQ(type, value->GetType());
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string metric;
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (args->GetSize() > 2)
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    args->GetString(2, &metric);
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetPref(pref_name, value, metric);
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CoreOptionsHandler::HandleClearPref(const ListValue* args) {
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK_GT(static_cast<int>(args->GetSize()), 0);
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string pref_name;
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!args->GetString(0, &pref_name))
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string metric;
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (args->GetSize() > 1)
342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    args->GetString(1, &metric);
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ClearPref(pref_name, metric);
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::HandleUserMetricsAction(const ListValue* args) {
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string metric = UTF16ToUTF8(ExtractStringValue(args));
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!metric.empty())
3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    UserMetricsRecordAction(UserMetricsAction(metric.c_str()));
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CoreOptionsHandler::UpdateClearPluginLSOData() {
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<Value> enabled(
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Value::CreateBooleanValue(clear_plugin_lso_data_enabled_.GetValue()));
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction(
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "OptionsPage.setClearPluginLSODataEnabled", *enabled);
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid CoreOptionsHandler::NotifyPrefChanged(const std::string* pref_name) {
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (*pref_name == prefs::kClearPluginLSODataEnabled) {
362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This preference is stored in Local State, not in the user preferences.
363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    UpdateClearPluginLSOData();
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* pref_service = web_ui_->GetProfile()->GetPrefs();
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const PrefService::Preference* pref =
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pref_service->FindPreference(pref_name->c_str());
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (pref) {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (PreferenceCallbackMap::const_iterator iter =
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        pref_callback_map_.find(*pref_name);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        iter != pref_callback_map_.end(); ++iter) {
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::wstring& callback_function = iter->second;
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ListValue result_value;
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_value.Append(Value::CreateStringValue(pref_name->c_str()));
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DictionaryValue* dict = new DictionaryValue;
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dict->Set("value", pref->GetValue()->DeepCopy());
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dict->SetBoolean("managed", pref->IsManaged());
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      result_value.Append(dict);
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      web_ui_->CallJavascriptFunction(WideToASCII(callback_function),
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      result_value);
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
388