Index: chrome/browser/ui/webui/options/browser_options_handler.cc |
=================================================================== |
--- chrome/browser/ui/webui/options/browser_options_handler.cc (revision 203598) |
+++ chrome/browser/ui/webui/options/browser_options_handler.cc (working copy) |
@@ -12,6 +12,7 @@ |
#include "base/bind_helpers.h" |
#include "base/command_line.h" |
#include "base/memory/singleton.h" |
+#include "base/metrics/histogram.h" |
#include "base/path_service.h" |
#include "base/prefs/pref_service.h" |
#include "base/stl_util.h" |
@@ -32,8 +33,10 @@ |
#include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h" |
#include "chrome/browser/printing/cloud_print/cloud_print_setup_flow.h" |
#include "chrome/browser/printing/cloud_print/cloud_print_url.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_metrics.h" |
#include "chrome/browser/profiles/profile_shortcut_manager.h" |
#include "chrome/browser/search/search.h" |
#include "chrome/browser/search_engines/template_url.h" |
@@ -146,6 +149,31 @@ |
shortcut_manager->CreateProfileShortcut(profile->GetPath()); |
} |
+void RunProfileCreationCallbacks( |
+ const std::vector<ProfileManager::CreateCallback>& callbacks, |
+ Profile* profile, |
+ Profile::CreateStatus status) { |
+ std::vector<ProfileManager::CreateCallback>::const_iterator it; |
+ for (it = callbacks.begin(); it != callbacks.end(); ++it) { |
+ it->Run(profile, status); |
+ } |
+} |
+ |
+void OpenNewWindowForProfile( |
+ chrome::HostDesktopType desktop_type, |
+ Profile* profile, |
+ Profile::CreateStatus status) { |
+ if (status != Profile::CREATE_STATUS_INITIALIZED) |
+ return; |
+ |
+ ProfileManager::FindOrCreateNewWindowForProfile( |
+ profile, |
+ chrome::startup::IS_PROCESS_STARTUP, |
+ chrome::startup::IS_FIRST_RUN, |
+ desktop_type, |
+ false); |
+} |
+ |
} // namespace |
BrowserOptionsHandler::BrowserOptionsHandler() |
@@ -485,9 +513,8 @@ |
values->Set("profilesInfo", GetProfilesInfoList().release()); |
#if defined(ENABLE_MANAGED_USERS) |
- ManagedUserService* service = |
- ManagedUserServiceFactory::GetForProfile(Profile::FromWebUI(web_ui())); |
- values->SetBoolean("profileIsManaged", service->ProfileIsManaged()); |
+ values->SetBoolean("profileIsManaged", |
+ ManagedUserService::ProfileIsManaged(Profile::FromWebUI(web_ui()))); |
#endif |
#if !defined(OS_CHROMEOS) |
@@ -539,6 +566,10 @@ |
base::Bind(&BrowserOptionsHandler::CreateProfile, |
base::Unretained(this))); |
web_ui()->RegisterMessageCallback( |
+ "deleteProfile", |
+ base::Bind(&BrowserOptionsHandler::DeleteProfile, |
+ base::Unretained(this))); |
+ web_ui()->RegisterMessageCallback( |
"themesReset", |
base::Bind(&BrowserOptionsHandler::ThemesReset, |
base::Unretained(this))); |
@@ -1072,9 +1103,7 @@ |
// This handler could have been called in managed mode, for example because |
// the user fiddled with the web inspector. Silently return in this case. |
Profile* profile = Profile::FromWebUI(web_ui()); |
- ManagedUserService* service = |
- ManagedUserServiceFactory::GetForProfile(profile); |
- if (service->ProfileIsManaged()) |
+ if (ManagedUserService::ProfileIsManaged(profile)) |
return; |
#endif |
@@ -1089,7 +1118,6 @@ |
string16 name; |
string16 icon; |
- std::vector<ProfileManager::CreateCallback> callbacks; |
bool create_shortcut = false; |
bool managed_user = false; |
if (args->GetString(0, &name) && args->GetString(1, &icon)) { |
@@ -1099,43 +1127,74 @@ |
} |
} |
+ std::vector<ProfileManager::CreateCallback> callbacks; |
if (create_shortcut) |
callbacks.push_back(base::Bind(&CreateDesktopShortcutForProfile)); |
+ ProfileManager::CreateCallback show_user_feedback = |
+ base::Bind(&BrowserOptionsHandler::ShowProfileCreationFeedback, |
+ weak_ptr_factory_.GetWeakPtr(), desktop_type, managed_user); |
+ |
if (managed_user && ManagedUserService::AreManagedUsersEnabled()) { |
#if defined(ENABLE_MANAGED_USERS) |
- ManagedUserRegistrationService* registration_service = |
- ManagedUserRegistrationServiceFactory::GetForProfile(profile); |
- callbacks.push_back(registration_service->GetRegistrationAndInitCallback()); |
+ callbacks.push_back( |
+ base::Bind(&BrowserOptionsHandler::RegisterNewManagedUser, |
+ weak_ptr_factory_.GetWeakPtr(), show_user_feedback)); |
#else |
NOTREACHED(); |
#endif |
+ } else { |
+ callbacks.push_back(show_user_feedback); |
} |
+ ProfileMetrics::LogProfileAddNewUser(ProfileMetrics::ADD_NEW_USER_DIALOG); |
+ |
ProfileManager::CreateMultiProfileAsync( |
- name, icon, base::Bind(&BrowserOptionsHandler::OnProfileCreated, |
- weak_ptr_factory_.GetWeakPtr(), |
- desktop_type, managed_user, callbacks), |
+ name, icon, base::Bind(&RunProfileCreationCallbacks, callbacks), |
managed_user); |
} |
-void BrowserOptionsHandler::OnProfileCreated( |
+void BrowserOptionsHandler::RegisterNewManagedUser( |
+ const ProfileManager::CreateCallback& callback, |
+ Profile* profile, |
+ Profile::CreateStatus status) { |
+ |
James Hawkins
2013/06/03 18:43:45
nit: Remove blank line.
|
+ if (status != Profile::CREATE_STATUS_INITIALIZED) |
+ return; |
+ |
+ ManagedUserService* managed_user_service = |
+ ManagedUserServiceFactory::GetForProfile(profile); |
+ DCHECK(managed_user_service->ProfileIsManaged()); |
+ ManagedUserRegistrationService* registration_service = |
+ ManagedUserRegistrationServiceFactory::GetForProfile(profile); |
+ |
+ managed_user_service->RegisterAndInitSync(registration_service, callback); |
+} |
+ |
+void BrowserOptionsHandler::ShowProfileCreationFeedback( |
chrome::HostDesktopType desktop_type, |
bool is_managed, |
- const std::vector<ProfileManager::CreateCallback>& callbacks, |
Profile* profile, |
Profile::CreateStatus status) { |
- std::vector<ProfileManager::CreateCallback>::const_iterator it; |
- for (it = callbacks.begin(); it != callbacks.end(); ++it) { |
- it->Run(profile, status); |
+ if (status != Profile::CREATE_STATUS_CREATED) { |
+ UMA_HISTOGRAM_ENUMERATION("Profile.CreateResult", |
+ status, |
+ Profile::MAX_CREATE_STATUS); |
} |
switch (status) { |
- case Profile::CREATE_STATUS_FAIL: { |
+ case Profile::CREATE_STATUS_LOCAL_FAIL: { |
web_ui()->CallJavascriptFunction( |
"BrowserOptions.showCreateProfileLocalError"); |
+ DeleteProfileAtPath(profile->GetPath()); |
break; |
} |
+ case Profile::CREATE_STATUS_REMOTE_FAIL: { |
+ web_ui()->CallJavascriptFunction( |
+ "BrowserOptions.showCreateProfileRemoteError"); |
+ DeleteProfileAtPath(profile->GetPath()); |
+ break; |
+ } |
case Profile::CREATE_STATUS_CREATED: { |
// Do nothing for an intermediate status. |
break; |
@@ -1155,18 +1214,55 @@ |
if (!is_managed) { |
// Opening the new window must be the last action, after all callbacks |
// have been run, to give them a chance to initialize the profile. |
- ProfileManager::FindOrCreateNewWindowForProfile( |
- profile, |
- chrome::startup::IS_PROCESS_STARTUP, |
- chrome::startup::IS_FIRST_RUN, |
- desktop_type, |
- false); |
+ OpenNewWindowForProfile(desktop_type, |
+ profile, |
+ Profile::CREATE_STATUS_INITIALIZED); |
} |
break; |
} |
+ case Profile::MAX_CREATE_STATUS: { |
+ NOTREACHED(); |
+ break; |
+ } |
} |
} |
+void BrowserOptionsHandler::DeleteProfile(const ListValue* args) { |
+ DCHECK(args); |
+ const Value* file_path_value; |
+ if (!args->Get(0, &file_path_value)) |
+ return; |
+ |
+ base::FilePath file_path; |
+ if (!base::GetValueAsFilePath(*file_path_value, &file_path)) |
+ return; |
+ DeleteProfileAtPath(file_path); |
+} |
+ |
+void BrowserOptionsHandler::DeleteProfileAtPath(base::FilePath file_path) { |
+#if defined(ENABLE_MANAGED_USERS) |
+ // This handler could have been called in managed mode, for example because |
+ // the user fiddled with the web inspector. Silently return in this case. |
+ if (ManagedUserService::ProfileIsManaged(Profile::FromWebUI(web_ui()))) |
+ return; |
+#endif |
+ |
+ if (!ProfileManager::IsMultipleProfilesEnabled()) |
+ return; |
+ |
+ ProfileMetrics::LogProfileDeleteUser(ProfileMetrics::PROFILE_DELETED); |
+ |
+ Browser* browser = |
+ chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()); |
+ chrome::HostDesktopType desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE; |
+ if (browser) |
+ desktop_type = browser->host_desktop_type(); |
+ |
+ g_browser_process->profile_manager()->ScheduleProfileForDeletion( |
+ file_path, |
+ base::Bind(&OpenNewWindowForProfile, desktop_type)); |
+} |
+ |
void BrowserOptionsHandler::ObserveThemeChanged() { |
Profile* profile = Profile::FromWebUI(web_ui()); |
#if defined(TOOLKIT_GTK) |