Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1566)

Unified Diff: chrome/browser/ui/webui/options2/core_options_handler.cc

Issue 8895023: Options2: Pull the trigger. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: DIAF. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/options2/core_options_handler.cc
diff --git a/chrome/browser/ui/webui/options2/core_options_handler.cc b/chrome/browser/ui/webui/options2/core_options_handler.cc
new file mode 100644
index 0000000000000000000000000000000000000000..41402339dfec2fa061a5ec78e5311772c4a561b9
--- /dev/null
+++ b/chrome/browser/ui/webui/options2/core_options_handler.cc
@@ -0,0 +1,466 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/options2/core_options_handler.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/json/json_reader.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/string16.h"
+#include "base/string_number_conversions.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/google/google_util.h"
+#include "chrome/browser/net/url_fixer_upper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/user_metrics.h"
+#include "googleurl/src/gurl.h"
+#include "grit/chromium_strings.h"
+#include "grit/generated_resources.h"
+#include "grit/locale_settings.h"
+#include "grit/theme_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+
+using content::UserMetricsAction;
+
+CoreOptionsHandler::CoreOptionsHandler()
+ : handlers_host_(NULL) {
+}
+
+CoreOptionsHandler::~CoreOptionsHandler() {}
+
+void CoreOptionsHandler::Initialize() {
+ clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled,
+ Profile::FromWebUI(web_ui_),
+ this);
+ UpdateClearPluginLSOData();
+}
+
+void CoreOptionsHandler::GetLocalizedValues(
+ DictionaryValue* localized_strings) {
+ GetStaticLocalizedValues(localized_strings);
+}
+
+void CoreOptionsHandler::GetStaticLocalizedValues(
+ base::DictionaryValue* localized_strings) {
+ DCHECK(localized_strings);
+ // Main
+ localized_strings->SetString("title",
+ l10n_util::GetStringUTF16(IDS_SETTINGS_TITLE));
+
+ // Managed prefs
+ localized_strings->SetString("policyManagedPrefsBannerText",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_POLICY_MANAGED_PREFS));
+ localized_strings->SetString("extensionManagedPrefsBannerText",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_EXTENSION_MANAGED_PREFS));
+ localized_strings->SetString("policyAndExtensionManagedPrefsBannerText",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_POLICY_EXTENSION_MANAGED_PREFS));
+
+ // Controlled settings bubble.
+ localized_strings->SetString("controlledSettingPolicy",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_POLICY));
+ localized_strings->SetString("controlledSettingExtension",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_EXTENSION));
+ localized_strings->SetString("controlledSettingRecommended",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_CONTROLLED_SETTING_RECOMMENDED));
+ localized_strings->SetString("controlledSettingApplyRecommendation",
+ l10n_util::GetStringUTF16(
+ IDS_OPTIONS_CONTROLLED_SETTING_APPLY_RECOMMENDATION));
+
+ // Search
+ RegisterTitle(localized_strings, "searchPage", IDS_OPTIONS_SEARCH_PAGE_TITLE);
+ localized_strings->SetString("searchPlaceholder",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_SEARCH_PLACEHOLDER));
+ localized_strings->SetString("searchPageNoMatches",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_SEARCH_PAGE_NO_MATCHES));
+ localized_strings->SetString("searchPageHelpLabel",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_SEARCH_PAGE_HELP_LABEL));
+ localized_strings->SetString("searchPageHelpTitle",
+ l10n_util::GetStringFUTF16(IDS_OPTIONS_SEARCH_PAGE_HELP_TITLE,
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
+ localized_strings->SetString("searchPageHelpURL",
+ google_util::AppendGoogleLocaleParam(
+ GURL(chrome::kChromeHelpURL)).spec());
+
+ // Common
+ localized_strings->SetString("ok",
+ l10n_util::GetStringUTF16(IDS_OK));
+ localized_strings->SetString("cancel",
+ l10n_util::GetStringUTF16(IDS_CANCEL));
+ localized_strings->SetString("learnMore",
+ l10n_util::GetStringUTF16(IDS_LEARN_MORE));
+ localized_strings->SetString("close",
+ l10n_util::GetStringUTF16(IDS_CLOSE));
+}
+
+void CoreOptionsHandler::Uninitialize() {
+ std::string last_pref;
+ for (PreferenceCallbackMap::const_iterator iter = pref_callback_map_.begin();
+ iter != pref_callback_map_.end();
+ ++iter) {
+ if (last_pref != iter->first) {
+ StopObservingPref(iter->first);
+ last_pref = iter->first;
+ }
+ }
+}
+
+WebUIMessageHandler* CoreOptionsHandler::Attach(WebUI* web_ui) {
+ WebUIMessageHandler* result = WebUIMessageHandler::Attach(web_ui);
+ DCHECK(web_ui_);
+ registrar_.Init(Profile::FromWebUI(web_ui_)->GetPrefs());
+ return result;
+}
+
+void CoreOptionsHandler::Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ if (type == chrome::NOTIFICATION_PREF_CHANGED) {
+ std::string* pref_name = content::Details<std::string>(details).ptr();
+ if (*pref_name == prefs::kClearPluginLSODataEnabled) {
+ // This preference is stored in Local State, not in the user preferences.
+ UpdateClearPluginLSOData();
+ return;
+ }
+ NotifyPrefChanged(*pref_name, std::string());
+ }
+}
+
+void CoreOptionsHandler::RegisterMessages() {
+ web_ui_->RegisterMessageCallback("coreOptionsInitialize",
+ base::Bind(&CoreOptionsHandler::HandleInitialize,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("fetchPrefs",
+ base::Bind(&CoreOptionsHandler::HandleFetchPrefs,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("observePrefs",
+ base::Bind(&CoreOptionsHandler::HandleObservePrefs,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("setBooleanPref",
+ base::Bind(&CoreOptionsHandler::HandleSetBooleanPref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("setIntegerPref",
+ base::Bind(&CoreOptionsHandler::HandleSetIntegerPref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("setDoublePref",
+ base::Bind(&CoreOptionsHandler::HandleSetDoublePref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("setStringPref",
+ base::Bind(&CoreOptionsHandler::HandleSetStringPref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("setURLPref",
+ base::Bind(&CoreOptionsHandler::HandleSetURLPref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("setListPref",
+ base::Bind(&CoreOptionsHandler::HandleSetListPref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("clearPref",
+ base::Bind(&CoreOptionsHandler::HandleClearPref,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("coreOptionsUserMetricsAction",
+ base::Bind(&CoreOptionsHandler::HandleUserMetricsAction,
+ base::Unretained(this)));
+}
+
+void CoreOptionsHandler::HandleInitialize(const ListValue* args) {
+ DCHECK(handlers_host_);
+ handlers_host_->InitializeHandlers();
+}
+
+base::Value* CoreOptionsHandler::FetchPref(const std::string& pref_name) {
+ PrefService* pref_service = Profile::FromWebUI(web_ui_)->GetPrefs();
+
+ const PrefService::Preference* pref =
+ pref_service->FindPreference(pref_name.c_str());
+ if (!pref)
+ return base::Value::CreateNullValue();
+
+ return CreateValueForPref(pref, NULL);
+}
+
+void CoreOptionsHandler::ObservePref(const std::string& pref_name) {
+ registrar_.Add(pref_name.c_str(), this);
+}
+
+void CoreOptionsHandler::SetPref(const std::string& pref_name,
+ const base::Value* value,
+ const std::string& metric) {
+ PrefService* pref_service = Profile::FromWebUI(web_ui_)->GetPrefs();
+
+ switch (value->GetType()) {
+ case base::Value::TYPE_BOOLEAN:
+ case base::Value::TYPE_INTEGER:
+ case base::Value::TYPE_DOUBLE:
+ case base::Value::TYPE_STRING:
+ pref_service->Set(pref_name.c_str(), *value);
+ break;
+
+ default:
+ NOTREACHED();
+ return;
+ }
+
+ pref_service->ScheduleSavePersistentPrefs();
+
+ ProcessUserMetric(value, metric);
+}
+
+void CoreOptionsHandler::ClearPref(const std::string& pref_name,
+ const std::string& metric) {
+ PrefService* pref_service = Profile::FromWebUI(web_ui_)->GetPrefs();
+ pref_service->ClearPref(pref_name.c_str());
+ pref_service->ScheduleSavePersistentPrefs();
+
+ if (!metric.empty())
+ content::RecordComputedAction(metric);
+}
+
+void CoreOptionsHandler::ProcessUserMetric(const base::Value* value,
+ const std::string& metric) {
+ if (metric.empty())
+ return;
+
+ std::string metric_string = metric;
+ if (value->IsType(base::Value::TYPE_BOOLEAN)) {
+ bool bool_value;
+ CHECK(value->GetAsBoolean(&bool_value));
+ metric_string += bool_value ? "_Enable" : "_Disable";
+ }
+
+ content::RecordComputedAction(metric_string);
+}
+
+void CoreOptionsHandler::NotifyPrefChanged(
+ const std::string& pref_name,
+ const std::string& controlling_pref_name) {
+ const PrefService* pref_service = Profile::FromWebUI(web_ui_)->GetPrefs();
+ const PrefService::Preference* pref =
+ pref_service->FindPreference(pref_name.c_str());
+ if (!pref)
+ return;
+ const PrefService::Preference* controlling_pref =
+ !controlling_pref_name.empty() ?
+ pref_service->FindPreference(controlling_pref_name.c_str()) : NULL;
+ std::pair<PreferenceCallbackMap::const_iterator,
+ PreferenceCallbackMap::const_iterator> range;
+ range = pref_callback_map_.equal_range(pref_name);
+ for (PreferenceCallbackMap::const_iterator iter = range.first;
+ iter != range.second; ++iter) {
+ const std::wstring& callback_function = iter->second;
+ ListValue result_value;
+ result_value.Append(base::Value::CreateStringValue(pref_name.c_str()));
+ result_value.Append(CreateValueForPref(pref, controlling_pref));
+ web_ui_->CallJavascriptFunction(WideToASCII(callback_function),
+ result_value);
+ }
+}
+
+DictionaryValue* CoreOptionsHandler::CreateValueForPref(
+ const PrefService::Preference* pref,
+ const PrefService::Preference* controlling_pref) {
+ DictionaryValue* dict = new DictionaryValue;
+ dict->Set("value", pref->GetValue()->DeepCopy());
+ if (!controlling_pref) // No controlling pref is managing actual pref.
+ controlling_pref = pref; // This means pref is controlling itself.
+ if (controlling_pref->IsManaged()) {
+ dict->SetString("controlledBy", "policy");
+ } else if (controlling_pref->IsExtensionControlled()) {
+ dict->SetString("controlledBy", "extension");
+ } else if (controlling_pref->IsRecommended()) {
+ dict->SetString("controlledBy", "recommended");
+ }
+ dict->SetBoolean("disabled", !controlling_pref->IsUserModifiable());
+ return dict;
+}
+
+void CoreOptionsHandler::StopObservingPref(const std::string& path) {
+ registrar_.Remove(path.c_str(), this);
+}
+
+void CoreOptionsHandler::HandleFetchPrefs(const ListValue* args) {
+ // First param is name of callback function, so, there needs to be at least
+ // one more element for the actual preference identifier.
+ DCHECK_GE(static_cast<int>(args->GetSize()), 2);
+
+ // Get callback JS function name.
+ base::Value* callback;
+ if (!args->Get(0, &callback) || !callback->IsType(base::Value::TYPE_STRING))
+ return;
+
+ string16 callback_function;
+ if (!callback->GetAsString(&callback_function))
+ return;
+
+ // Get the list of name for prefs to build the response dictionary.
+ DictionaryValue result_value;
+ base::Value* list_member;
+
+ for (size_t i = 1; i < args->GetSize(); i++) {
+ if (!args->Get(i, &list_member))
+ break;
+
+ if (!list_member->IsType(base::Value::TYPE_STRING))
+ continue;
+
+ std::string pref_name;
+ if (!list_member->GetAsString(&pref_name))
+ continue;
+
+ result_value.Set(pref_name.c_str(), FetchPref(pref_name));
+ }
+ web_ui_->CallJavascriptFunction(UTF16ToASCII(callback_function),
+ result_value);
+}
+
+void CoreOptionsHandler::HandleObservePrefs(const ListValue* args) {
+ // First param is name is JS callback function name, the rest are pref
+ // identifiers that we are observing.
+ DCHECK_GE(static_cast<int>(args->GetSize()), 2);
+
+ // Get preference change callback function name.
+ string16 callback_func_name;
+ if (!args->GetString(0, &callback_func_name))
+ return;
+
+ // Get all other parameters - pref identifiers.
+ for (size_t i = 1; i < args->GetSize(); i++) {
+ base::Value* list_member;
+ if (!args->Get(i, &list_member))
+ break;
+
+ // Just ignore bad pref identifiers for now.
+ std::string pref_name;
+ if (!list_member->IsType(base::Value::TYPE_STRING) ||
+ !list_member->GetAsString(&pref_name))
+ continue;
+
+ if (pref_callback_map_.find(pref_name) == pref_callback_map_.end())
+ ObservePref(pref_name);
+
+ pref_callback_map_.insert(
+ PreferenceCallbackMap::value_type(pref_name,
+ UTF16ToWideHack(callback_func_name)));
+ }
+}
+
+void CoreOptionsHandler::HandleSetBooleanPref(const ListValue* args) {
+ HandleSetPref(args, TYPE_BOOLEAN);
+}
+
+void CoreOptionsHandler::HandleSetIntegerPref(const ListValue* args) {
+ HandleSetPref(args, TYPE_INTEGER);
+}
+
+void CoreOptionsHandler::HandleSetDoublePref(const ListValue* args) {
+ HandleSetPref(args, TYPE_DOUBLE);
+}
+
+void CoreOptionsHandler::HandleSetStringPref(const ListValue* args) {
+ HandleSetPref(args, TYPE_STRING);
+}
+
+void CoreOptionsHandler::HandleSetURLPref(const ListValue* args) {
+ HandleSetPref(args, TYPE_URL);
+}
+
+void CoreOptionsHandler::HandleSetListPref(const ListValue* args) {
+ HandleSetPref(args, TYPE_LIST);
+}
+
+void CoreOptionsHandler::HandleSetPref(const ListValue* args, PrefType type) {
+ DCHECK_GT(static_cast<int>(args->GetSize()), 1);
+
+ std::string pref_name;
+ if (!args->GetString(0, &pref_name))
+ return;
+
+ base::Value* value;
+ if (!args->Get(1, &value))
+ return;
+
+ scoped_ptr<base::Value> temp_value;
+
+ switch (type) {
+ case TYPE_BOOLEAN:
+ CHECK_EQ(base::Value::TYPE_BOOLEAN, value->GetType());
+ break;
+ case TYPE_INTEGER: {
+ // In JS all numbers are doubles.
+ double double_value;
+ CHECK(value->GetAsDouble(&double_value));
+ int int_value = static_cast<int>(double_value);
+ temp_value.reset(base::Value::CreateIntegerValue(int_value));
+ value = temp_value.get();
+ break;
+ }
+ case TYPE_DOUBLE:
+ CHECK_EQ(base::Value::TYPE_DOUBLE, value->GetType());
+ break;
+ case TYPE_STRING:
+ CHECK_EQ(base::Value::TYPE_STRING, value->GetType());
+ break;
+ case TYPE_URL: {
+ std::string original;
+ CHECK(value->GetAsString(&original));
+ GURL fixed = URLFixerUpper::FixupURL(original, std::string());
+ temp_value.reset(base::Value::CreateStringValue(fixed.spec()));
+ value = temp_value.get();
+ break;
+ }
+ case TYPE_LIST: {
+ // In case we have a List pref we got a JSON string.
+ std::string json_string;
+ CHECK(value->GetAsString(&json_string));
+ temp_value.reset(
+ base::JSONReader().JsonToValue(json_string,
+ false, // no check_root
+ false)); // no trailing comma
+ value = temp_value.get();
+ CHECK_EQ(base::Value::TYPE_LIST, value->GetType());
+ break;
+ }
+ default:
+ NOTREACHED();
+ }
+
+ std::string metric;
+ if (args->GetSize() > 2 && !args->GetString(2, &metric))
+ LOG(WARNING) << "Invalid metric parameter: " << pref_name;
+ SetPref(pref_name, value, metric);
+}
+
+void CoreOptionsHandler::HandleClearPref(const ListValue* args) {
+ DCHECK_GT(static_cast<int>(args->GetSize()), 0);
+
+ std::string pref_name;
+ if (!args->GetString(0, &pref_name))
+ return;
+
+ std::string metric;
+ if (args->GetSize() > 1)
+ args->GetString(1, &metric);
+
+ ClearPref(pref_name, metric);
+}
+
+void CoreOptionsHandler::HandleUserMetricsAction(const ListValue* args) {
+ std::string metric = UTF16ToUTF8(ExtractStringValue(args));
+ if (!metric.empty())
+ content::RecordComputedAction(metric);
+}
+
+void CoreOptionsHandler::UpdateClearPluginLSOData() {
+ scoped_ptr<base::Value> enabled(
+ base::Value::CreateBooleanValue(
+ clear_plugin_lso_data_enabled_.GetValue()));
+ web_ui_->CallJavascriptFunction(
+ "OptionsPage.setClearPluginLSODataEnabled", *enabled);
+}
« no previous file with comments | « chrome/browser/ui/webui/options2/core_options_handler.h ('k') | chrome/browser/ui/webui/options2/extension_settings_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698