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