summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/webui/options2/manage_profile_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/webui/options2/manage_profile_handler.cc')
-rw-r--r--chrome/browser/ui/webui/options2/manage_profile_handler.cc300
1 files changed, 300 insertions, 0 deletions
diff --git a/chrome/browser/ui/webui/options2/manage_profile_handler.cc b/chrome/browser/ui/webui/options2/manage_profile_handler.cc
new file mode 100644
index 0000000..4c29788
--- /dev/null
+++ b/chrome/browser/ui/webui/options2/manage_profile_handler.cc
@@ -0,0 +1,300 @@
+// 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/manage_profile_handler.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/string_number_conversions.h"
+#include "base/utf_string_conversions.h"
+#include "base/value_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/gaia_info_update_service.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/profiles/profile_metrics.h"
+#include "chrome/browser/ui/webui/web_ui_util.h"
+#include "chrome/common/chrome_notification_types.h"
+#include "content/browser/tab_contents/tab_contents.h"
+#include "content/public/browser/notification_service.h"
+#include "grit/generated_resources.h"
+
+ManageProfileHandler::ManageProfileHandler() {
+}
+
+ManageProfileHandler::~ManageProfileHandler() {
+}
+
+void ManageProfileHandler::GetLocalizedValues(
+ DictionaryValue* localized_strings) {
+ DCHECK(localized_strings);
+
+ static OptionsStringResource resources[] = {
+ { "manageProfilesTitle", IDS_PROFILES_MANAGE_TITLE },
+ { "manageProfilesNameLabel", IDS_PROFILES_MANAGE_NAME_LABEL },
+ { "manageProfilesDuplicateNameError",
+ IDS_PROFILES_MANAGE_DUPLICATE_NAME_ERROR },
+ { "manageProfilesIconLabel", IDS_PROFILES_MANAGE_ICON_LABEL },
+ { "deleteProfileTitle", IDS_PROFILES_DELETE_TITLE },
+ { "deleteProfileOK", IDS_PROFILES_DELETE_OK_BUTTON_LABEL },
+ { "deleteProfileMessage", IDS_PROFILES_DELETE_MESSAGE },
+ };
+
+ RegisterStrings(localized_strings, resources, arraysize(resources));
+}
+
+void ManageProfileHandler::Initialize() {
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
+ content::NotificationService::AllSources());
+ SendProfileNames();
+}
+
+void ManageProfileHandler::RegisterMessages() {
+ web_ui_->RegisterMessageCallback("setProfileNameAndIcon",
+ base::Bind(&ManageProfileHandler::SetProfileNameAndIcon,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("deleteProfile",
+ base::Bind(&ManageProfileHandler::DeleteProfile,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("requestDefaultProfileIcons",
+ base::Bind(&ManageProfileHandler::RequestDefaultProfileIcons,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("requestProfileInfo",
+ base::Bind(&ManageProfileHandler::RequestProfileInfo,
+ base::Unretained(this)));
+ web_ui_->RegisterMessageCallback("profileIconSelectionChanged",
+ base::Bind(&ManageProfileHandler::ProfileIconSelectionChanged,
+ base::Unretained(this)));
+}
+
+void ManageProfileHandler::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ if (type == chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED) {
+ SendProfileNames();
+ SendProfileIcons();
+ } else {
+ OptionsPage2UIHandler::Observe(type, source, details);
+ }
+}
+
+void ManageProfileHandler::RequestDefaultProfileIcons(const ListValue* args) {
+ SendProfileIcons();
+}
+
+void ManageProfileHandler::SendProfileIcons() {
+ ListValue image_url_list;
+
+ // First add the GAIA picture if it's available.
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+ Profile* profile = Profile::FromWebUI(web_ui_);
+ size_t profile_index = cache.GetIndexOfProfileWithPath(profile->GetPath());
+ if (profile_index != std::string::npos) {
+ const gfx::Image* icon =
+ cache.GetGAIAPictureOfProfileAtIndex(profile_index);
+ if (icon) {
+ gfx::Image icon2 = profiles::GetAvatarIconForWebUI(*icon, true);
+ gaia_picture_url_ = web_ui_util::GetImageDataUrl(icon2);
+ image_url_list.Append(Value::CreateStringValue(gaia_picture_url_));
+ }
+ }
+
+ // Next add the default avatar icons.
+ for (size_t i = 0; i < ProfileInfoCache::GetDefaultAvatarIconCount(); i++) {
+ std::string url = ProfileInfoCache::GetDefaultAvatarIconUrl(i);
+ image_url_list.Append(Value::CreateStringValue(url));
+ }
+
+ web_ui_->CallJavascriptFunction(
+ "ManageProfileOverlay.receiveDefaultProfileIcons",
+ image_url_list);
+}
+
+void ManageProfileHandler::SendProfileNames() {
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+ DictionaryValue profile_name_dict;
+ for (size_t i = 0, e = cache.GetNumberOfProfiles(); i < e; ++i)
+ profile_name_dict.SetBoolean(UTF16ToUTF8(cache.GetNameOfProfileAtIndex(i)),
+ true);
+
+ web_ui_->CallJavascriptFunction("ManageProfileOverlay.receiveProfileNames",
+ profile_name_dict);
+}
+
+void ManageProfileHandler::SetProfileNameAndIcon(const ListValue* args) {
+ DCHECK(args);
+
+ Value* file_path_value;
+ FilePath profile_file_path;
+ if (!args->Get(0, &file_path_value) ||
+ !base::GetValueAsFilePath(*file_path_value, &profile_file_path))
+ return;
+
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+ size_t profile_index = cache.GetIndexOfProfileWithPath(profile_file_path);
+ if (profile_index == std::string::npos)
+ return;
+
+ string16 new_profile_name;
+ if (!args->GetString(1, &new_profile_name))
+ return;
+
+ if (new_profile_name == cache.GetGAIANameOfProfileAtIndex(profile_index)) {
+ // Set the profile to use the GAIA name as the profile name. Note, this
+ // is a little weird if the user typed their GAIA name manually but
+ // it's not a big deal.
+ cache.SetIsUsingGAIANameOfProfileAtIndex(profile_index, true);
+ // Using the GAIA name as the profile name can invalidate the profile index.
+ profile_index = cache.GetIndexOfProfileWithPath(profile_file_path);
+ if (profile_index == std::string::npos)
+ return;
+ } else {
+ cache.SetNameOfProfileAtIndex(profile_index, new_profile_name);
+ // Changing the profile name can invalidate the profile index.
+ profile_index = cache.GetIndexOfProfileWithPath(profile_file_path);
+ if (profile_index == std::string::npos)
+ return;
+
+ cache.SetIsUsingGAIANameOfProfileAtIndex(profile_index, false);
+ // Unsetting the GAIA name as the profile name can invalidate the profile
+ // index.
+ profile_index = cache.GetIndexOfProfileWithPath(profile_file_path);
+ if (profile_index == std::string::npos)
+ return;
+ }
+
+ std::string icon_url;
+ if (!args->GetString(2, &icon_url))
+ return;
+
+ // Metrics logging variable.
+ bool previously_using_gaia_icon =
+ cache.IsUsingGAIANameOfProfileAtIndex(profile_index);
+
+ size_t new_icon_index;
+ if (icon_url == gaia_picture_url_) {
+ cache.SetIsUsingGAIAPictureOfProfileAtIndex(profile_index, true);
+ if (!previously_using_gaia_icon) {
+ // Only log if they changed to the GAIA photo.
+ // Selection of GAIA photo as avatar is logged as part of the function
+ // below.
+ ProfileMetrics::LogProfileSwitchGaia(ProfileMetrics::GAIA_OPT_IN);
+ }
+ } else if (cache.IsDefaultAvatarIconUrl(icon_url, &new_icon_index)) {
+ ProfileMetrics::LogProfileAvatarSelection(new_icon_index);
+ cache.SetAvatarIconOfProfileAtIndex(profile_index, new_icon_index);
+ cache.SetIsUsingGAIAPictureOfProfileAtIndex(profile_index, false);
+ }
+
+ ProfileMetrics::LogProfileUpdate(profile_file_path);
+}
+
+void ManageProfileHandler::DeleteProfile(const ListValue* args) {
+ DCHECK(args);
+
+ ProfileMetrics::LogProfileDeleteUser(ProfileMetrics::PROFILE_DELETED);
+
+ Value* file_path_value;
+ FilePath profile_file_path;
+ if (!args->Get(0, &file_path_value) ||
+ !base::GetValueAsFilePath(*file_path_value, &profile_file_path))
+ return;
+
+ g_browser_process->profile_manager()->ScheduleProfileForDeletion(
+ profile_file_path);
+}
+
+void ManageProfileHandler::RequestProfileInfo(const ListValue* args) {
+ DCHECK(args);
+
+ Value* index_value;
+ double index_double;
+ if (!args->Get(0, &index_value) || !index_value->GetAsDouble(&index_double))
+ return;
+
+ int index = static_cast<int>(index_double);
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+ int profile_count = cache.GetNumberOfProfiles();
+ if (index < 0 && index >= profile_count)
+ return;
+
+ FilePath profile_path = cache.GetPathOfProfileAtIndex(index);
+ FilePath current_profile_path = Profile::FromWebUI(web_ui_)->GetPath();
+ bool is_current_profile =
+ profile_path == Profile::FromWebUI(web_ui_)->GetPath();
+
+ DictionaryValue profile_value;
+ profile_value.SetString("name", cache.GetNameOfProfileAtIndex(index));
+ profile_value.Set("filePath", base::CreateFilePathValue(profile_path));
+ profile_value.SetBoolean("isCurrentProfile", is_current_profile);
+
+ bool is_gaia_picture =
+ cache.IsUsingGAIAPictureOfProfileAtIndex(index) &&
+ cache.GetGAIAPictureOfProfileAtIndex(index);
+ if (is_gaia_picture) {
+ gfx::Image icon = profiles::GetAvatarIconForWebUI(
+ cache.GetAvatarIconOfProfileAtIndex(index), true);
+ profile_value.SetString("iconURL", web_ui_util::GetImageDataUrl(icon));
+ } else {
+ size_t icon_index = cache.GetAvatarIconIndexOfProfileAtIndex(index);
+ profile_value.SetString("iconURL",
+ cache.GetDefaultAvatarIconUrl(icon_index));
+ }
+
+ web_ui_->CallJavascriptFunction("ManageProfileOverlay.setProfileInfo",
+ profile_value);
+
+ // Ensure that we have the most up to date GAIA picture.
+ if (is_current_profile) {
+ GAIAInfoUpdateService* service =
+ Profile::FromWebUI(web_ui_)->GetGAIAInfoUpdateService();
+ if (service)
+ service->Update();
+ }
+}
+
+void ManageProfileHandler::ProfileIconSelectionChanged(
+ const base::ListValue* args) {
+ DCHECK(args);
+
+ Value* file_path_value;
+ FilePath file_path;
+ if (!args->Get(0, &file_path_value) ||
+ !base::GetValueAsFilePath(*file_path_value, &file_path)) {
+ return;
+ }
+
+ // Currently this only supports editing the current profile's info.
+ if (file_path != Profile::FromWebUI(web_ui_)->GetPath())
+ return;
+
+ std::string icon_url;
+ if (!args->GetString(1, &icon_url))
+ return;
+
+ if (icon_url != gaia_picture_url_)
+ return;
+
+ // If the selection is the GAIA picture then also show the GAIA name in the
+ // text field.
+ ProfileInfoCache& cache =
+ g_browser_process->profile_manager()->GetProfileInfoCache();
+ size_t i = cache.GetIndexOfProfileWithPath(file_path);
+ if (i == std::string::npos)
+ return;
+ string16 gaia_name = cache.GetGAIANameOfProfileAtIndex(i);
+ if (gaia_name.empty())
+ return;
+
+ StringValue gaia_name_value(gaia_name);
+ web_ui_->CallJavascriptFunction("ManageProfileOverlay.setProfileName",
+ gaia_name_value);
+}