Index: chrome/browser/ui/webui/options2/personal_options_handler.cc |
diff --git a/chrome/browser/ui/webui/options2/personal_options_handler.cc b/chrome/browser/ui/webui/options2/personal_options_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0a2a36741b803c7c3e08f522c14d6def13ea7f61 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/options2/personal_options_handler.cc |
@@ -0,0 +1,444 @@ |
+// 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/personal_options_handler.h" |
+ |
+#include <string> |
+ |
+#include "base/basictypes.h" |
+#include "base/bind.h" |
+#include "base/command_line.h" |
+#include "base/path_service.h" |
+#include "base/stl_util.h" |
+#include "base/string_number_conversions.h" |
+#include "base/utf_string_conversions.h" |
+#include "base/value_conversions.h" |
+#include "base/values.h" |
+#include "build/build_config.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/google/google_util.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/profiles/profile_info_cache.h" |
+#include "chrome/browser/profiles/profile_info_util.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/theme_service.h" |
+#include "chrome/browser/themes/theme_service_factory.h" |
+#include "chrome/browser/ui/webui/web_ui_util.h" |
+#include "chrome/common/chrome_notification_types.h" |
+#include "chrome/common/chrome_paths.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/net/gaia/google_service_auth_error.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/browser/tab_contents/tab_contents.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/user_metrics.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/chromeos/options/take_photo_dialog.h" |
+#include "chrome/browser/ui/browser_window.h" |
+#include "chrome/browser/ui/views/window.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
+#endif // defined(OS_CHROMEOS) |
+#if defined(TOOLKIT_GTK) |
+#include "chrome/browser/ui/gtk/gtk_theme_service.h" |
+#endif // defined(TOOLKIT_GTK) |
+ |
+using content::UserMetricsAction; |
+ |
+PersonalOptionsHandler::PersonalOptionsHandler() { |
+ multiprofile_ = ProfileManager::IsMultipleProfilesEnabled(); |
+#if defined(OS_CHROMEOS) |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, |
+ content::NotificationService::AllSources()); |
+#endif |
+} |
+ |
+PersonalOptionsHandler::~PersonalOptionsHandler() { |
+ ProfileSyncService* sync_service = |
+ Profile::FromWebUI(web_ui_)->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( |
+ "syncOverview", |
+ l10n_util::GetStringFUTF16(IDS_SYNC_OVERVIEW, |
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); |
+ localized_strings->SetString("syncSection", |
+ l10n_util::GetStringUTF16(IDS_SYNC_OPTIONS_GROUP_NAME)); |
+ localized_strings->SetString("customizeSync", |
+ l10n_util::GetStringUTF16(IDS_SYNC_CUSTOMIZE_BUTTON_LABEL)); |
+ localized_strings->SetString("syncLearnMoreURL", |
+ google_util::StringAppendGoogleLocaleParam(chrome::kSyncLearnMoreURL)); |
+ |
+ localized_strings->SetString("profiles", |
+ l10n_util::GetStringUTF16(IDS_PROFILES_OPTIONS_GROUP_NAME)); |
+ localized_strings->SetString("profilesCreate", |
+ l10n_util::GetStringUTF16(IDS_PROFILES_CREATE_BUTTON_LABEL)); |
+ localized_strings->SetString("profilesManage", |
+ l10n_util::GetStringUTF16(IDS_PROFILES_MANAGE_BUTTON_LABEL)); |
+ localized_strings->SetString("profilesDelete", |
+ l10n_util::GetStringUTF16(IDS_PROFILES_DELETE_BUTTON_LABEL)); |
+ localized_strings->SetString("profilesDeleteSingle", |
+ l10n_util::GetStringUTF16(IDS_PROFILES_DELETE_SINGLE_BUTTON_LABEL)); |
+ localized_strings->SetString("profilesListItemCurrent", |
+ l10n_util::GetStringUTF16(IDS_PROFILES_LIST_ITEM_CURRENT)); |
+ localized_strings->SetString("profilesSingleUser", |
+ l10n_util::GetStringFUTF16(IDS_PROFILES_SINGLE_USER_MESSAGE, |
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME))); |
+ |
+ localized_strings->SetString("passwords", |
+ 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)); |
+#if defined(OS_MACOSX) |
+ ProfileManager* profile_manager = g_browser_process->profile_manager(); |
+ if (profile_manager->GetNumberOfProfiles() > 1) { |
+ localized_strings->SetString("macPasswordsWarning", |
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_MAC_WARNING)); |
+ } |
+#endif |
+ localized_strings->SetString("autologinEnabled", |
+ l10n_util::GetStringUTF16(IDS_OPTIONS_PASSWORDS_AUTOLOGIN)); |
+ |
+ localized_strings->SetString("autofill", |
+ 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", |
+ 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", |
+ 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", |
+ 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_TABS)); |
+ |
+#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)); |
+ localized_strings->SetString("changePicture", |
+ l10n_util::GetStringUTF16(IDS_OPTIONS_CHANGE_PICTURE)); |
+ if (chromeos::UserManager::Get()->user_is_logged_in()) { |
+ localized_strings->SetString("username", |
+ chromeos::UserManager::Get()->logged_in_user().email()); |
+ } |
+#endif |
+} |
+ |
+void PersonalOptionsHandler::RegisterMessages() { |
+ DCHECK(web_ui_); |
+ web_ui_->RegisterMessageCallback( |
+ "themesReset", |
+ base::Bind(&PersonalOptionsHandler::ThemesReset, |
+ base::Unretained(this))); |
+#if defined(TOOLKIT_GTK) |
+ web_ui_->RegisterMessageCallback( |
+ "themesSetGTK", |
+ base::Bind(&PersonalOptionsHandler::ThemesSetGTK, |
+ base::Unretained(this))); |
+#endif |
+ web_ui_->RegisterMessageCallback( |
+ "createProfile", |
+ base::Bind(&PersonalOptionsHandler::CreateProfile, |
+ base::Unretained(this))); |
+} |
+ |
+void PersonalOptionsHandler::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ if (type == chrome::NOTIFICATION_BROWSER_THEME_CHANGED) { |
+ ObserveThemeChanged(); |
+ } else if (multiprofile_ && |
+ type == chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED) { |
+ SendProfilesInfo(); |
+#if defined(OS_CHROMEOS) |
+ } else if (type == chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED) { |
+ UpdateAccountPicture(); |
+#endif |
+ } else { |
+ OptionsPage2UIHandler::Observe(type, source, details); |
+ } |
+} |
+ |
+void PersonalOptionsHandler::OnStateChanged() { |
+ string16 status_label; |
+ string16 link_label; |
+ ProfileSyncService* service = |
+ Profile::FromWebUI(web_ui_)->GetProfileSyncService(); |
+ DCHECK(service); |
+ bool managed = service->IsManaged(); |
+ bool sync_setup_completed = service->HasSyncSetupCompleted(); |
+ bool status_has_error = sync_ui_util::GetStatusLabels( |
+ service, sync_ui_util::WITH_HTML, &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::GetStringFUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL, |
+ l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); |
+ is_start_stop_button_visible = true; |
+ is_start_stop_button_enabled = !managed; |
+ } |
+ |
+ scoped_ptr<Value> completed(Value::CreateBooleanValue(sync_setup_completed)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setSyncSetupCompleted", |
+ *completed); |
+ |
+ scoped_ptr<Value> label(Value::CreateStringValue(status_label)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setSyncStatus", *label); |
+ |
+ scoped_ptr<Value> enabled( |
+ Value::CreateBooleanValue(is_start_stop_button_enabled)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setStartStopButtonEnabled", |
+ *enabled); |
+ |
+ scoped_ptr<Value> visible( |
+ Value::CreateBooleanValue(is_start_stop_button_visible)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setStartStopButtonVisible", |
+ *visible); |
+ |
+ label.reset(Value::CreateStringValue(start_stop_button_label)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setStartStopButtonLabel", |
+ *label); |
+ |
+ label.reset(Value::CreateStringValue(link_label)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setSyncActionLinkLabel", |
+ *label); |
+ |
+ enabled.reset(Value::CreateBooleanValue(!managed)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setSyncActionLinkEnabled", |
+ *enabled); |
+ |
+ visible.reset(Value::CreateBooleanValue(status_has_error)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setSyncStatusErrorVisible", |
+ *visible); |
+ |
+ enabled.reset(Value::CreateBooleanValue( |
+ !service->unrecoverable_error_detected())); |
+ web_ui_->CallJavascriptFunction( |
+ "PersonalOptions.setCustomizeSyncButtonEnabled", |
+ *enabled); |
+ |
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAutologin)) { |
+ visible.reset(Value::CreateBooleanValue( |
+ service->AreCredentialsAvailable())); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setAutoLoginVisible", |
+ *visible); |
+ } |
+ |
+ // Set profile creation text and button if multi-profiles switch is on. |
+ visible.reset(Value::CreateBooleanValue(multiprofile_)); |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setProfilesSectionVisible", |
+ *visible); |
+ if (multiprofile_) |
+ SendProfilesInfo(); |
+} |
+ |
+void PersonalOptionsHandler::ObserveThemeChanged() { |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+#if defined(TOOLKIT_GTK) |
+ GtkThemeService* theme_service = GtkThemeService::GetFrom(profile); |
+ bool is_gtk_theme = theme_service->UsingNativeTheme(); |
+ base::FundamentalValue gtk_enabled(!is_gtk_theme); |
+ web_ui_->CallJavascriptFunction( |
+ "options.PersonalOptions.setGtkThemeButtonEnabled", gtk_enabled); |
+#else |
+ ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile); |
+ bool is_gtk_theme = false; |
+#endif |
+ |
+ bool is_classic_theme = !is_gtk_theme && theme_service->UsingDefaultTheme(); |
+ base::FundamentalValue enabled(!is_classic_theme); |
+ web_ui_->CallJavascriptFunction( |
+ "options.PersonalOptions.setThemesResetButtonEnabled", enabled); |
+} |
+ |
+void PersonalOptionsHandler::Initialize() { |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ |
+ // Listen for theme installation. |
+ registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
+ content::Source<ThemeService>( |
+ ThemeServiceFactory::GetForProfile(profile))); |
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
+ content::NotificationService::AllSources()); |
+ ObserveThemeChanged(); |
+ |
+ ProfileSyncService* sync_service = profile->GetProfileSyncService(); |
+ if (sync_service) { |
+ sync_service->AddObserver(this); |
+ OnStateChanged(); |
+ } else { |
+ web_ui_->CallJavascriptFunction("options.PersonalOptions.hideSyncSection"); |
+ } |
+} |
+ |
+void PersonalOptionsHandler::ThemesReset(const ListValue* args) { |
+ content::RecordAction(UserMetricsAction("Options_ThemesReset")); |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ ThemeServiceFactory::GetForProfile(profile)->UseDefaultTheme(); |
+} |
+ |
+#if defined(TOOLKIT_GTK) |
+void PersonalOptionsHandler::ThemesSetGTK(const ListValue* args) { |
+ content::RecordAction(UserMetricsAction("Options_GtkThemeSet")); |
+ Profile* profile = Profile::FromWebUI(web_ui_); |
+ ThemeServiceFactory::GetForProfile(profile)->SetNativeTheme(); |
+} |
+#endif |
+ |
+#if defined(OS_CHROMEOS) |
+void PersonalOptionsHandler::UpdateAccountPicture() { |
+ std::string email = chromeos::UserManager::Get()->logged_in_user().email(); |
+ if (!email.empty()) { |
+ web_ui_->CallJavascriptFunction("PersonalOptions.updateAccountPicture"); |
+ base::StringValue email_value(email); |
+ web_ui_->CallJavascriptFunction("AccountsOptions.updateAccountPicture", |
+ email_value); |
+ } |
+} |
+#endif |
+ |
+void PersonalOptionsHandler::SendProfilesInfo() { |
+ ProfileInfoCache& cache = |
+ g_browser_process->profile_manager()->GetProfileInfoCache(); |
+ ListValue profile_info_list; |
+ FilePath current_profile_path = |
+ web_ui_->tab_contents()->browser_context()->GetPath(); |
+ for (size_t i = 0, e = cache.GetNumberOfProfiles(); i < e; ++i) { |
+ DictionaryValue* profile_value = new DictionaryValue(); |
+ FilePath profile_path = cache.GetPathOfProfileAtIndex(i); |
+ profile_value->SetString("name", cache.GetNameOfProfileAtIndex(i)); |
+ profile_value->Set("filePath", base::CreateFilePathValue(profile_path)); |
+ profile_value->SetBoolean("isCurrentProfile", |
+ profile_path == current_profile_path); |
+ |
+ bool is_gaia_picture = |
+ cache.IsUsingGAIAPictureOfProfileAtIndex(i) && |
+ cache.GetGAIAPictureOfProfileAtIndex(i); |
+ if (is_gaia_picture) { |
+ gfx::Image icon = profiles::GetAvatarIconForWebUI( |
+ cache.GetAvatarIconOfProfileAtIndex(i), true); |
+ profile_value->SetString("iconURL", web_ui_util::GetImageDataUrl(icon)); |
+ } else { |
+ size_t icon_index = cache.GetAvatarIconIndexOfProfileAtIndex(i); |
+ profile_value->SetString("iconURL", |
+ cache.GetDefaultAvatarIconUrl(icon_index)); |
+ } |
+ |
+ profile_info_list.Append(profile_value); |
+ } |
+ |
+ web_ui_->CallJavascriptFunction("PersonalOptions.setProfilesInfo", |
+ profile_info_list); |
+} |
+ |
+void PersonalOptionsHandler::CreateProfile(const ListValue* args) { |
+ ProfileManager::CreateMultiProfileAsync(); |
+} |