summaryrefslogtreecommitdiffstats
path: root/chrome/browser/webui/options/personal_options_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/webui/options/personal_options_handler.cc')
-rw-r--r--chrome/browser/webui/options/personal_options_handler.cc403
1 files changed, 403 insertions, 0 deletions
diff --git a/chrome/browser/webui/options/personal_options_handler.cc b/chrome/browser/webui/options/personal_options_handler.cc
new file mode 100644
index 0000000..64968f2
--- /dev/null
+++ b/chrome/browser/webui/options/personal_options_handler.cc
@@ -0,0 +1,403 @@
+// 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/dom_ui/options/personal_options_handler.h"
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/callback.h"
+#include "base/path_service.h"
+#include "base/stl_util-inl.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "build/build_config.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/dom_ui/options/dom_options_util.h"
+#include "chrome/browser/dom_ui/options/options_managed_banner_handler.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/sync/profile_sync_service.h"
+#include "chrome/browser/sync/sync_setup_flow.h"
+#include "chrome/browser/sync/sync_ui_util.h"
+#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/ui/options/options_page_base.h"
+#include "chrome/browser/ui/options/options_window.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/common/net/gaia/google_service_auth_error.h"
+#include "chrome/common/notification_service.h"
+#include "grit/browser_resources.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"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/user_manager.h"
+#include "chrome/browser/webui/web_ui_util.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#endif // defined(OS_CHROMEOS)
+#if defined(TOOLKIT_GTK)
+#include "chrome/browser/ui/gtk/gtk_theme_provider.h"
+#endif // defined(TOOLKIT_GTK)
+
+PersonalOptionsHandler::PersonalOptionsHandler() {
+}
+
+PersonalOptionsHandler::~PersonalOptionsHandler() {
+ ProfileSyncService* sync_service =
+ web_ui_->GetProfile()->GetProfileSyncService();
+ if (sync_service)
+ sync_service->RemoveObserver(this);
+}
+
+void PersonalOptionsHandler::GetLocalizedValues(
+ DictionaryValue* localized_strings) {
+ DCHECK(localized_strings);
+
+ RegisterTitle(localized_strings, "personalPage",
+ IDS_OPTIONS_CONTENT_TAB_LABEL);
+
+ localized_strings->SetString("syncSection",
+ dom_options_util::StripColon(
+ l10n_util::GetStringUTF16(IDS_SYNC_OPTIONS_GROUP_NAME)));
+ localized_strings->SetString("customizeSync",
+ l10n_util::GetStringUTF16(IDS_SYNC_CUSTOMIZE_BUTTON_LABEL));
+ localized_strings->SetString("privacyDashboardLink",
+ l10n_util::GetStringUTF16(IDS_SYNC_PRIVACY_DASHBOARD_LINK_LABEL));
+
+ localized_strings->SetString("passwords",
+ dom_options_util::StripColon(
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_GROUP_NAME)));
+ localized_strings->SetString("passwordsAskToSave",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_ASKTOSAVE));
+ localized_strings->SetString("passwordsNeverSave",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_NEVERSAVE));
+ localized_strings->SetString("manage_passwords",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MANAGE_PASSWORDS));
+
+ localized_strings->SetString("autofill",
+ dom_options_util::StripColon(
+ l10n_util::GetStringUTF16(IDS_AUTOFILL_SETTING_WINDOWS_GROUP_NAME)));
+ localized_strings->SetString("autoFillEnabled",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_AUTOFILL_ENABLE));
+ localized_strings->SetString("manageAutofillSettings",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_MANAGE_AUTOFILL_SETTINGS));
+
+ localized_strings->SetString("browsingData",
+ dom_options_util::StripColon(
+ l10n_util::GetStringUTF16(IDS_OPTIONS_BROWSING_DATA_GROUP_NAME)));
+ localized_strings->SetString("importData",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_IMPORT_DATA_BUTTON));
+
+ localized_strings->SetString("themesGallery",
+ l10n_util::GetStringUTF16(IDS_THEMES_GALLERY_BUTTON));
+ localized_strings->SetString("themesGalleryURL",
+ l10n_util::GetStringUTF16(IDS_THEMES_GALLERY_URL));
+
+#if defined(TOOLKIT_GTK)
+ localized_strings->SetString("appearance",
+ dom_options_util::StripColon(
+ l10n_util::GetStringUTF16(IDS_APPEARANCE_GROUP_NAME)));
+ localized_strings->SetString("themesGTKButton",
+ l10n_util::GetStringUTF16(IDS_THEMES_GTK_BUTTON));
+ localized_strings->SetString("themesSetClassic",
+ l10n_util::GetStringUTF16(IDS_THEMES_SET_CLASSIC));
+ localized_strings->SetString("showWindowDecorations",
+ l10n_util::GetStringUTF16(IDS_SHOW_WINDOW_DECORATIONS_RADIO));
+ localized_strings->SetString("hideWindowDecorations",
+ l10n_util::GetStringUTF16(IDS_HIDE_WINDOW_DECORATIONS_RADIO));
+#else
+ localized_strings->SetString("themes",
+ dom_options_util::StripColon(
+ l10n_util::GetStringUTF16(IDS_THEMES_GROUP_NAME)));
+ localized_strings->SetString("themesReset",
+ l10n_util::GetStringUTF16(IDS_THEMES_RESET_BUTTON));
+#endif
+
+ // Sync select control.
+ ListValue* sync_select_list = new ListValue;
+ ListValue* datatypes = new ListValue;
+ datatypes->Append(Value::CreateBooleanValue(false));
+ datatypes->Append(
+ Value::CreateStringValue(
+ l10n_util::GetStringUTF8(IDS_SYNC_OPTIONS_SELECT_DATATYPES)));
+ sync_select_list->Append(datatypes);
+ ListValue* everything = new ListValue;
+ everything->Append(Value::CreateBooleanValue(true));
+ everything->Append(
+ Value::CreateStringValue(
+ l10n_util::GetStringUTF8(IDS_SYNC_OPTIONS_SELECT_EVERYTHING)));
+ sync_select_list->Append(everything);
+ localized_strings->Set("syncSelectList", sync_select_list);
+
+ // Sync page.
+ localized_strings->SetString("syncPage",
+ l10n_util::GetStringUTF16(IDS_SYNC_NTP_SYNC_SECTION_TITLE));
+ localized_strings->SetString("sync_title",
+ l10n_util::GetStringUTF16(IDS_CUSTOMIZE_SYNC_DESCRIPTION));
+ localized_strings->SetString("syncsettings",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_PREFERENCES));
+ localized_strings->SetString("syncbookmarks",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_BOOKMARKS));
+ localized_strings->SetString("synctypedurls",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_TYPED_URLS));
+ localized_strings->SetString("syncpasswords",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_PASSWORDS));
+ localized_strings->SetString("syncextensions",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_EXTENSIONS));
+ localized_strings->SetString("syncautofill",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_AUTOFILL));
+ localized_strings->SetString("syncthemes",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_THEMES));
+ localized_strings->SetString("syncapps",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_APPS));
+ localized_strings->SetString("syncsessions",
+ l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_SESSIONS));
+
+#if defined(OS_CHROMEOS)
+ localized_strings->SetString("account",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PERSONAL_ACCOUNT_GROUP_NAME));
+ localized_strings->SetString("enableScreenlock",
+ l10n_util::GetStringUTF16(IDS_OPTIONS_ENABLE_SCREENLOCKER_CHECKBOX));
+#endif
+}
+
+void PersonalOptionsHandler::RegisterMessages() {
+ DCHECK(web_ui_);
+ web_ui_->RegisterMessageCallback(
+ "showSyncActionDialog",
+ NewCallback(this, &PersonalOptionsHandler::ShowSyncActionDialog));
+ web_ui_->RegisterMessageCallback(
+ "showSyncLoginDialog",
+ NewCallback(this, &PersonalOptionsHandler::ShowSyncLoginDialog));
+ web_ui_->RegisterMessageCallback(
+ "showCustomizeSyncDialog",
+ NewCallback(this, &PersonalOptionsHandler::ShowCustomizeSyncDialog));
+ web_ui_->RegisterMessageCallback(
+ "themesReset",
+ NewCallback(this, &PersonalOptionsHandler::ThemesReset));
+#if defined(TOOLKIT_GTK)
+ web_ui_->RegisterMessageCallback(
+ "themesSetGTK",
+ NewCallback(this, &PersonalOptionsHandler::ThemesSetGTK));
+#endif
+ web_ui_->RegisterMessageCallback("updatePreferredDataTypes",
+ NewCallback(this, &PersonalOptionsHandler::OnPreferredDataTypesUpdated));
+#if defined(OS_CHROMEOS)
+ web_ui_->RegisterMessageCallback(
+ "loadAccountPicture",
+ NewCallback(this, &PersonalOptionsHandler::LoadAccountPicture));
+#endif
+}
+
+void PersonalOptionsHandler::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == NotificationType::BROWSER_THEME_CHANGED)
+ ObserveThemeChanged();
+ else
+ OptionsPageUIHandler::Observe(type, source, details);
+}
+
+void PersonalOptionsHandler::OnStateChanged() {
+ string16 status_label;
+ string16 link_label;
+ ProfileSyncService* service = web_ui_->GetProfile()->GetProfileSyncService();
+ DCHECK(service);
+ bool managed = service->IsManaged();
+ bool sync_setup_completed = service->HasSyncSetupCompleted();
+ bool status_has_error = sync_ui_util::GetStatusLabels(service,
+ &status_label, &link_label) == sync_ui_util::SYNC_ERROR;
+
+ string16 start_stop_button_label;
+ bool is_start_stop_button_visible = false;
+ bool is_start_stop_button_enabled = false;
+ if (sync_setup_completed) {
+ start_stop_button_label =
+ l10n_util::GetStringUTF16(IDS_SYNC_STOP_SYNCING_BUTTON_LABEL);
+#if defined(OS_CHROMEOS)
+ is_start_stop_button_visible = false;
+#else
+ is_start_stop_button_visible = true;
+#endif // defined(OS_CHROMEOS)
+ is_start_stop_button_enabled = !managed;
+ } else if (service->SetupInProgress()) {
+ start_stop_button_label =
+ l10n_util::GetStringUTF16(IDS_SYNC_NTP_SETUP_IN_PROGRESS);
+ is_start_stop_button_visible = true;
+ is_start_stop_button_enabled = false;
+ } else {
+ start_stop_button_label =
+ l10n_util::GetStringUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL);
+ is_start_stop_button_visible = true;
+ is_start_stop_button_enabled = !managed;
+ }
+
+ scoped_ptr<Value> completed(Value::CreateBooleanValue(sync_setup_completed));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setSyncSetupCompleted",
+ *completed);
+
+ scoped_ptr<Value> label(Value::CreateStringValue(status_label));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setSyncStatus",
+ *label);
+
+ scoped_ptr<Value> enabled(
+ Value::CreateBooleanValue(is_start_stop_button_enabled));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setStartStopButtonEnabled",
+ *enabled);
+
+ scoped_ptr<Value> visible(
+ Value::CreateBooleanValue(is_start_stop_button_visible));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setStartStopButtonVisible",
+ *visible);
+
+ label.reset(Value::CreateStringValue(start_stop_button_label));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setStartStopButtonLabel",
+ *label);
+
+ label.reset(Value::CreateStringValue(link_label));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setSyncActionLinkLabel",
+ *label);
+
+ enabled.reset(Value::CreateBooleanValue(!managed));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setSyncActionLinkEnabled",
+ *enabled);
+
+ visible.reset(Value::CreateBooleanValue(status_has_error));
+ web_ui_->CallJavascriptFunction(
+ L"PersonalOptions.setSyncStatusErrorVisible", *visible);
+}
+
+void PersonalOptionsHandler::OnLoginSuccess() {
+ OnStateChanged();
+}
+
+void PersonalOptionsHandler::OnLoginFailure(
+ const GoogleServiceAuthError& error) {
+ OnStateChanged();
+}
+
+void PersonalOptionsHandler::ObserveThemeChanged() {
+ Profile* profile = web_ui_->GetProfile();
+#if defined(TOOLKIT_GTK)
+ GtkThemeProvider* provider = GtkThemeProvider::GetFrom(profile);
+ bool is_gtk_theme = provider->UseGtkTheme();
+ FundamentalValue gtk_enabled(!is_gtk_theme);
+ web_ui_->CallJavascriptFunction(
+ L"options.PersonalOptions.setGtkThemeButtonEnabled", gtk_enabled);
+#else
+ BrowserThemeProvider* provider =
+ reinterpret_cast<BrowserThemeProvider*>(profile->GetThemeProvider());
+ bool is_gtk_theme = false;
+#endif
+
+ bool is_classic_theme = !is_gtk_theme && provider->UsingDefaultTheme();
+ FundamentalValue enabled(!is_classic_theme);
+ web_ui_->CallJavascriptFunction(
+ L"options.PersonalOptions.setThemesResetButtonEnabled", enabled);
+}
+
+void PersonalOptionsHandler::Initialize() {
+ banner_handler_.reset(
+ new OptionsManagedBannerHandler(web_ui_,
+ ASCIIToUTF16("PersonalOptions"),
+ OPTIONS_PAGE_CONTENT));
+
+ // Listen for theme installation.
+ registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
+ NotificationService::AllSources());
+ ObserveThemeChanged();
+
+ ProfileSyncService* sync_service =
+ web_ui_->GetProfile()->GetProfileSyncService();
+ if (sync_service) {
+ sync_service->AddObserver(this);
+ OnStateChanged();
+
+ DictionaryValue args;
+ SyncSetupFlow::GetArgsForConfigure(sync_service, &args);
+
+ web_ui_->CallJavascriptFunction(
+ L"PersonalOptions.setRegisteredDataTypes", args);
+ } else {
+ web_ui_->CallJavascriptFunction(L"options.PersonalOptions.hideSyncSection");
+ }
+}
+
+void PersonalOptionsHandler::ShowSyncActionDialog(const ListValue* args) {
+ ProfileSyncService* service = web_ui_->GetProfile()->GetProfileSyncService();
+ DCHECK(service);
+#if defined(OS_CHROMEOS)
+ // ProfileSyncService calls ProfileSyncService::ShowLoginDialog()
+ // for these errors, which currently does not work on ChromeOS.
+ // TODO(stevenjb + jhawkins): This code path should go away for R11 when
+ // we switch to DOM based sync setup UI.
+ const GoogleServiceAuthError& error = service->GetAuthError();
+ if (error.state() == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS ||
+ error.state() == GoogleServiceAuthError::CAPTCHA_REQUIRED ||
+ error.state() == GoogleServiceAuthError::ACCOUNT_DELETED ||
+ error.state() == GoogleServiceAuthError::ACCOUNT_DISABLED ||
+ error.state() == GoogleServiceAuthError::SERVICE_UNAVAILABLE) {
+ ShowSyncLoginDialog(args);
+ }
+#endif
+ service->ShowErrorUI(NULL);
+}
+
+void PersonalOptionsHandler::ShowSyncLoginDialog(const ListValue* args) {
+#if defined(OS_CHROMEOS)
+ std::string email = chromeos::UserManager::Get()->logged_in_user().email();
+ string16 message = l10n_util::GetStringFUTF16(
+ IDS_SYNC_LOGIN_INTRODUCTION,
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
+ web_ui_->GetProfile()->GetBrowserSignin()->RequestSignin(
+ web_ui_->tab_contents(), UTF8ToUTF16(email), message, this);
+#else
+ ProfileSyncService* service = web_ui_->GetProfile()->GetProfileSyncService();
+ DCHECK(service);
+ service->ShowLoginDialog(NULL);
+ ProfileSyncService::SyncEvent(ProfileSyncService::START_FROM_OPTIONS);
+#endif
+}
+
+void PersonalOptionsHandler::ShowCustomizeSyncDialog(const ListValue* args) {
+ ProfileSyncService* service = web_ui_->GetProfile()->GetProfileSyncService();
+ DCHECK(service);
+ service->ShowConfigure(NULL);
+}
+
+void PersonalOptionsHandler::ThemesReset(const ListValue* args) {
+ UserMetricsRecordAction(UserMetricsAction("Options_ThemesReset"));
+ web_ui_->GetProfile()->ClearTheme();
+}
+
+#if defined(TOOLKIT_GTK)
+void PersonalOptionsHandler::ThemesSetGTK(const ListValue* args) {
+ UserMetricsRecordAction(UserMetricsAction("Options_GtkThemeSet"));
+ web_ui_->GetProfile()->SetNativeTheme();
+}
+#endif
+
+void PersonalOptionsHandler::OnPreferredDataTypesUpdated(
+ const ListValue* args) {
+ NotificationService::current()->Notify(
+ NotificationType::SYNC_DATA_TYPES_UPDATED,
+ Source<Profile>(web_ui_->GetProfile()),
+ NotificationService::NoDetails());
+}
+
+#if defined(OS_CHROMEOS)
+void PersonalOptionsHandler::LoadAccountPicture(const ListValue* args) {
+ const SkBitmap& account_picture =
+ chromeos::UserManager::Get()->logged_in_user().image();
+
+ if (!account_picture.isNull()) {
+ StringValue data_url(web_ui_util::GetImageDataUrl(account_picture));
+ web_ui_->CallJavascriptFunction(L"PersonalOptions.setAccountPicture",
+ data_url);
+ }
+}
+#endif