Chromium Code Reviews| Index: chrome/browser/ui/webui/options/create_profile_handler.cc |
| diff --git a/chrome/browser/ui/webui/options/create_profile_handler.cc b/chrome/browser/ui/webui/options/create_profile_handler.cc |
| index facc7f0054b23dbd8c8708035b146d20d17f8294..6864c41466bcd44f9699421329094675180d47cb 100644 |
| --- a/chrome/browser/ui/webui/options/create_profile_handler.cc |
| +++ b/chrome/browser/ui/webui/options/create_profile_handler.cc |
| @@ -14,18 +14,22 @@ |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/profiles/profile_metrics.h" |
| #include "chrome/browser/profiles/profiles_state.h" |
| -#include "chrome/browser/supervised_user/supervised_user_registration_utility.h" |
| -#include "chrome/browser/supervised_user/supervised_user_service.h" |
| -#include "chrome/browser/supervised_user/supervised_user_service_factory.h" |
| -#include "chrome/browser/supervised_user/supervised_user_sync_service.h" |
| -#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h" |
| #include "chrome/browser/sync/profile_sync_service.h" |
| #include "chrome/browser/sync/profile_sync_service_factory.h" |
| #include "chrome/browser/ui/webui/options/options_handlers_helper.h" |
| #include "chrome/common/pref_names.h" |
| +#include "content/public/browser/web_ui.h" |
| #include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| +#if defined(ENABLE_MANAGED_USERS) |
| +#include "chrome/browser/supervised_user/supervised_user_registration_utility.h" |
| +#include "chrome/browser/supervised_user/supervised_user_service.h" |
| +#include "chrome/browser/supervised_user/supervised_user_service_factory.h" |
| +#include "chrome/browser/supervised_user/supervised_user_sync_service.h" |
| +#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h" |
| +#endif |
| + |
| namespace options { |
| CreateProfileHandler::CreateProfileHandler() |
| @@ -53,12 +57,12 @@ void CreateProfileHandler::RegisterMessages() { |
| } |
| void CreateProfileHandler::CreateProfile(const base::ListValue* args) { |
| +#if defined(ENABLE_MANAGED_USERS) |
| // This handler could have been called for a supervised user, for example |
| - // because the user fiddled with the web inspector. Silently return in this |
| - // case. |
| - Profile* current_profile = Profile::FromWebUI(web_ui()); |
| - if (current_profile->IsSupervised()) |
| + // because the user fiddled with the web inspector. Silently return. |
| + if (Profile::FromWebUI(web_ui())->IsSupervised()) |
| return; |
| +#endif |
| if (!profiles::IsMultipleProfilesEnabled()) |
| return; |
| @@ -76,42 +80,13 @@ void CreateProfileHandler::CreateProfile(const base::ListValue* args) { |
| base::string16 name; |
| base::string16 icon; |
| - std::string supervised_user_id; |
| bool create_shortcut = false; |
| - bool supervised_user = false; |
| if (args->GetString(0, &name) && args->GetString(1, &icon)) { |
| - if (args->GetBoolean(2, &create_shortcut)) { |
| - bool success = args->GetBoolean(3, &supervised_user); |
| - DCHECK(success); |
| - success = args->GetString(4, &supervised_user_id); |
| - DCHECK(success); |
| - } |
| - } |
| - |
| - if (supervised_user) { |
| - if (!IsValidExistingSupervisedUserId(supervised_user_id)) |
| - return; |
| - |
| - profile_creation_type_ = SUPERVISED_PROFILE_IMPORT; |
| - if (supervised_user_id.empty()) { |
| - profile_creation_type_ = SUPERVISED_PROFILE_CREATION; |
| - supervised_user_id = |
| - SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(); |
| - |
| - // If sync is not yet fully initialized, the creation may take extra time, |
| - // so show a message. Import doesn't wait for an acknowledgement, so it |
| - // won't have the same potential delay. |
| - ProfileSyncService* sync_service = |
| - ProfileSyncServiceFactory::GetInstance()->GetForProfile( |
| - current_profile); |
| - ProfileSyncService::SyncStatusSummary status = |
| - sync_service->QuerySyncStatusSummary(); |
| - if (status == ProfileSyncService::DATATYPES_NOT_INITIALIZED) { |
| - ShowProfileCreationWarning(l10n_util::GetStringUTF16( |
| - IDS_PROFILES_CREATE_SUPERVISED_JUST_SIGNED_IN)); |
| - } |
| - } |
| + args->GetBoolean(2, &create_shortcut); |
| } |
| + std::string supervised_user_id; |
| + if (!GetSupervisedUserIdFromArgs(args, supervised_user_id)) |
| + return; |
| ProfileMetrics::LogProfileAddNewUser(ProfileMetrics::ADD_NEW_USER_DIALOG); |
| @@ -136,8 +111,7 @@ void CreateProfileHandler::OnProfileCreated( |
| switch (status) { |
| case Profile::CREATE_STATUS_LOCAL_FAIL: { |
| - ShowProfileCreationError(profile, |
| - GetProfileCreationErrorMessage(LOCAL_ERROR)); |
| + ShowProfileCreationError(profile, GetProfileCreationErrorMessageLocal()); |
| break; |
| } |
| case Profile::CREATE_STATUS_CREATED: { |
| @@ -173,66 +147,19 @@ void CreateProfileHandler::HandleProfileCreationSuccess( |
| CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); |
| break; |
| } |
| +#if defined(ENABLE_MANAGED_USERS) |
| case SUPERVISED_PROFILE_CREATION: |
| case SUPERVISED_PROFILE_IMPORT: |
| RegisterSupervisedUser(create_shortcut, desktop_type, |
| supervised_user_id, profile); |
| break; |
| +#endif |
| case NO_CREATION_IN_PROGRESS: |
| NOTREACHED(); |
| break; |
| } |
| } |
| -void CreateProfileHandler::RegisterSupervisedUser( |
| - bool create_shortcut, |
| - chrome::HostDesktopType desktop_type, |
| - const std::string& supervised_user_id, |
| - Profile* new_profile) { |
| - DCHECK_EQ(profile_path_being_created_.value(), |
| - new_profile->GetPath().value()); |
| - |
| - SupervisedUserService* supervised_user_service = |
| - SupervisedUserServiceFactory::GetForProfile(new_profile); |
| - |
| - // Register the supervised user using the profile of the custodian. |
| - supervised_user_registration_utility_ = |
| - SupervisedUserRegistrationUtility::Create(Profile::FromWebUI(web_ui())); |
| - supervised_user_service->RegisterAndInitSync( |
| - supervised_user_registration_utility_.get(), |
| - Profile::FromWebUI(web_ui()), |
| - supervised_user_id, |
| - base::Bind(&CreateProfileHandler::OnSupervisedUserRegistered, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - create_shortcut, |
| - desktop_type, |
| - new_profile)); |
| -} |
| - |
| -void CreateProfileHandler::OnSupervisedUserRegistered( |
| - bool create_shortcut, |
| - chrome::HostDesktopType desktop_type, |
| - Profile* profile, |
| - const GoogleServiceAuthError& error) { |
| - GoogleServiceAuthError::State state = error.state(); |
| - RecordSupervisedProfileCreationMetrics(state); |
| - if (state == GoogleServiceAuthError::NONE) { |
| - CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); |
| - return; |
| - } |
| - |
| - base::string16 error_msg; |
| - if (state == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS || |
| - state == GoogleServiceAuthError::USER_NOT_SIGNED_UP || |
| - state == GoogleServiceAuthError::ACCOUNT_DELETED || |
| - state == GoogleServiceAuthError::ACCOUNT_DISABLED) { |
| - error_msg = GetProfileCreationErrorMessage(SIGNIN_ERROR); |
| - } else { |
| - error_msg = GetProfileCreationErrorMessage(REMOTE_ERROR); |
| - } |
| - ShowProfileCreationError(profile, error_msg); |
| -} |
| - |
| void CreateProfileHandler::CreateShortcutAndShowSuccess( |
| bool create_shortcut, |
| chrome::HostDesktopType desktop_type, |
| @@ -252,10 +179,12 @@ void CreateProfileHandler::CreateShortcutAndShowSuccess( |
| dict.SetString("name", |
| profile->GetPrefs()->GetString(prefs::kProfileName)); |
| dict.Set("filePath", base::CreateFilePathValue(profile->GetPath())); |
| +#if defined(ENABLE_MANAGED_USERS) |
| bool is_supervised = |
| profile_creation_type_ == SUPERVISED_PROFILE_CREATION || |
| profile_creation_type_ == SUPERVISED_PROFILE_IMPORT; |
| dict.SetBoolean("isManaged", is_supervised); |
| +#endif |
| web_ui()->CallJavascriptFunction( |
| GetJavascriptMethodName(PROFILE_CREATION_SUCCESS), dict); |
| @@ -264,7 +193,13 @@ void CreateProfileHandler::CreateShortcutAndShowSuccess( |
| // dialog. If we are importing an existing supervised profile or creating a |
| // new non-supervised user profile we don't show any confirmation, so open |
| // the new window now. |
| - if (profile_creation_type_ != SUPERVISED_PROFILE_CREATION) { |
| + bool should_open_new_window = true; |
| +#if defined(ENABLE_MANAGED_USERS) |
| + if (profile_creation_type_ == SUPERVISED_PROFILE_CREATION) |
| + should_open_new_window = false; |
| +#endif |
| + |
| + if (should_open_new_window) { |
| // Opening the new window must be the last action, after all callbacks |
| // have been run, to give them a chance to initialize the profile. |
| helper::OpenNewWindowForProfile(desktop_type, |
| @@ -286,32 +221,112 @@ void CreateProfileHandler::ShowProfileCreationError( |
| helper::DeleteProfileAtPath(profile->GetPath(), web_ui()); |
| } |
| -void CreateProfileHandler::ShowProfileCreationWarning( |
| - const base::string16& warning) { |
| - DCHECK_EQ(SUPERVISED_PROFILE_CREATION, profile_creation_type_); |
| - web_ui()->CallJavascriptFunction("BrowserOptions.showCreateProfileWarning", |
| - base::StringValue(warning)); |
| -} |
| - |
| void CreateProfileHandler::HandleCancelProfileCreation( |
| const base::ListValue* args) { |
| CancelProfileRegistration(true); |
| } |
| +void CreateProfileHandler::RecordProfileCreationMetrics( |
| + Profile::CreateStatus status) { |
| + UMA_HISTOGRAM_ENUMERATION("Profile.CreateResult", |
| + status, |
| + Profile::MAX_CREATE_STATUS); |
| + UMA_HISTOGRAM_MEDIUM_TIMES( |
| + "Profile.CreateTimeNoTimeout", |
| + base::TimeTicks::Now() - profile_creation_start_time_); |
| +} |
| + |
| +base::string16 CreateProfileHandler::GetProfileCreationErrorMessageLocal() |
| + const { |
| + int message_id = IDS_PROFILES_CREATE_LOCAL_ERROR; |
| +#if defined(ENABLE_MANAGED_USERS) |
| + // Local errors can occur during supervised profile import. |
| + if (profile_creation_type_ == SUPERVISED_PROFILE_IMPORT) |
| + message_id = IDS_SUPERVISED_USER_IMPORT_LOCAL_ERROR; |
| +#endif |
| + return l10n_util::GetStringUTF16(message_id); |
| +} |
| + |
| +std::string CreateProfileHandler::GetJavascriptMethodName( |
| + ProfileCreationStatus status) const { |
| + switch (profile_creation_type_) { |
| +#if defined(ENABLE_MANAGED_USERS) |
| + case SUPERVISED_PROFILE_IMPORT: |
| + switch (status) { |
| + case PROFILE_CREATION_SUCCESS: |
| + return "BrowserOptions.showManagedUserImportSuccess"; |
| + case PROFILE_CREATION_ERROR: |
| + return "BrowserOptions.showManagedUserImportError"; |
| + } |
| + break; |
| +#endif |
| + default: |
| + switch (status) { |
| + case PROFILE_CREATION_SUCCESS: |
| + return "BrowserOptions.showCreateProfileSuccess"; |
| + case PROFILE_CREATION_ERROR: |
| + return "BrowserOptions.showCreateProfileError"; |
| + } |
| + break; |
| + } |
| + |
| + NOTREACHED(); |
| + return std::string(); |
| +} |
| + |
| +#if defined(ENABLE_MANAGED_USERS) |
| +bool CreateProfileHandler::GetSupervisedUserIdFromArgs( |
| + const base::ListValue* args, std::string& supervised_user_id) { |
| + bool supervised_user = false; |
| + if (args->GetSize() == 4) { |
| + bool success = args->GetBoolean(3, &supervised_user); |
| + DCHECK(success); |
| + |
| + success = args->GetString(4, &supervised_user_id); |
| + DCHECK(success); |
| + } |
| + |
| + if (supervised_user) { |
| + if (!IsValidExistingSupervisedUserId(supervised_user_id)) |
| + return false; |
| + |
| + profile_creation_type_ = SUPERVISED_PROFILE_IMPORT; |
| + if (supervised_user_id.empty()) { |
| + profile_creation_type_ = SUPERVISED_PROFILE_CREATION; |
| + supervised_user_id = |
| + SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(); |
| + |
| + // If sync is not yet fully initialized, the creation may take extra time, |
| + // so show a message. Import doesn't wait for an acknowledgment, so it |
| + // won't have the same potential delay. |
| + ProfileSyncService* sync_service = |
| + ProfileSyncServiceFactory::GetInstance()->GetForProfile( |
| + Profile::FromWebUI(web_ui())); |
| + ProfileSyncService::SyncStatusSummary status = |
| + sync_service->QuerySyncStatusSummary(); |
| + if (status == ProfileSyncService::DATATYPES_NOT_INITIALIZED) { |
| + ShowProfileCreationWarning(l10n_util::GetStringUTF16( |
| + IDS_PROFILES_CREATE_SUPERVISED_JUST_SIGNED_IN)); |
| + } |
| + } |
| + } |
| + return true; |
| +} |
| + |
| +// Non-supervised user creation cannot be canceled. (Creating a non-supervised |
| +// profile shouldn't take significant time, and it can easily be deleted |
| +// afterward.) |
| void CreateProfileHandler::CancelProfileRegistration(bool user_initiated) { |
| if (profile_path_being_created_.empty()) |
| return; |
| ProfileManager* manager = g_browser_process->profile_manager(); |
| Profile* new_profile = manager->GetProfileByPath(profile_path_being_created_); |
| - if (!new_profile) |
| + if (!new_profile || !new_profile->IsSupervised()) |
| return; |
| - // Non-supervised user creation cannot be canceled. (Creating a non-supervised |
| - // profile shouldn't take significant time, and it can easily be deleted |
| - // afterward.) |
| - if (!new_profile->IsSupervised()) |
| - return; |
| + DCHECK(supervised_user_registration_utility_.get()); |
| + supervised_user_registration_utility_.reset(); |
| if (user_initiated) { |
| UMA_HISTOGRAM_MEDIUM_TIMES( |
| @@ -320,9 +335,6 @@ void CreateProfileHandler::CancelProfileRegistration(bool user_initiated) { |
| RecordProfileCreationMetrics(Profile::CREATE_STATUS_CANCELED); |
| } |
| - DCHECK(supervised_user_registration_utility_.get()); |
| - supervised_user_registration_utility_.reset(); |
| - |
| DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); |
| profile_creation_type_ = NO_CREATION_IN_PROGRESS; |
| @@ -332,14 +344,60 @@ void CreateProfileHandler::CancelProfileRegistration(bool user_initiated) { |
| helper::DeleteProfileAtPath(new_profile->GetPath(), web_ui()); |
| } |
| -void CreateProfileHandler::RecordProfileCreationMetrics( |
| - Profile::CreateStatus status) { |
| - UMA_HISTOGRAM_ENUMERATION("Profile.CreateResult", |
| - status, |
| - Profile::MAX_CREATE_STATUS); |
| - UMA_HISTOGRAM_MEDIUM_TIMES( |
| - "Profile.CreateTimeNoTimeout", |
| - base::TimeTicks::Now() - profile_creation_start_time_); |
| +void CreateProfileHandler::RegisterSupervisedUser( |
| + bool create_shortcut, |
| + chrome::HostDesktopType desktop_type, |
| + const std::string& supervised_user_id, |
| + Profile* new_profile) { |
| + DCHECK_EQ(profile_path_being_created_.value(), |
| + new_profile->GetPath().value()); |
| + |
| + SupervisedUserService* supervised_user_service = |
| + SupervisedUserServiceFactory::GetForProfile(new_profile); |
| + |
| + // Register the supervised user using the profile of the custodian. |
| + supervised_user_registration_utility_ = |
| + SupervisedUserRegistrationUtility::Create(Profile::FromWebUI(web_ui())); |
| + supervised_user_service->RegisterAndInitSync( |
| + supervised_user_registration_utility_.get(), |
| + Profile::FromWebUI(web_ui()), |
| + supervised_user_id, |
| + base::Bind(&CreateProfileHandler::OnSupervisedUserRegistered, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + create_shortcut, |
| + desktop_type, |
| + new_profile)); |
| +} |
| + |
| +void CreateProfileHandler::OnSupervisedUserRegistered( |
| + bool create_shortcut, |
| + chrome::HostDesktopType desktop_type, |
| + Profile* profile, |
| + const GoogleServiceAuthError& error) { |
| + GoogleServiceAuthError::State state = error.state(); |
| + RecordSupervisedProfileCreationMetrics(state); |
| + if (state == GoogleServiceAuthError::NONE) { |
| + CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); |
| + return; |
| + } |
| + |
| + base::string16 error_msg; |
| + if (state == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS || |
| + state == GoogleServiceAuthError::USER_NOT_SIGNED_UP || |
| + state == GoogleServiceAuthError::ACCOUNT_DELETED || |
| + state == GoogleServiceAuthError::ACCOUNT_DISABLED) { |
| + error_msg = GetProfileCreationErrorMessageSignin(); |
| + } else { |
| + error_msg = GetProfileCreationErrorMessageRemote(); |
| + } |
| + ShowProfileCreationError(profile, error_msg); |
| +} |
| + |
| +void CreateProfileHandler::ShowProfileCreationWarning( |
| + const base::string16& warning) { |
| + DCHECK_EQ(SUPERVISED_PROFILE_CREATION, profile_creation_type_); |
| + web_ui()->CallJavascriptFunction("BrowserOptions.showCreateProfileWarning", |
| + base::StringValue(warning)); |
| } |
| void CreateProfileHandler::RecordSupervisedProfileCreationMetrics( |
| @@ -362,50 +420,6 @@ void CreateProfileHandler::RecordSupervisedProfileCreationMetrics( |
| } |
| } |
| -base::string16 CreateProfileHandler::GetProfileCreationErrorMessage( |
| - ProfileCreationErrorType error) const { |
| - int message_id = -1; |
| - switch (error) { |
| - case SIGNIN_ERROR: |
| - message_id = |
| - profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| - IDS_SUPERVISED_USER_IMPORT_SIGN_IN_ERROR : |
| - IDS_PROFILES_CREATE_SIGN_IN_ERROR; |
| - break; |
| - case REMOTE_ERROR: |
| - message_id = |
| - profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| - IDS_SUPERVISED_USER_IMPORT_REMOTE_ERROR : |
| - IDS_PROFILES_CREATE_REMOTE_ERROR; |
| - break; |
| - case LOCAL_ERROR: |
| - message_id = |
| - profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| - IDS_SUPERVISED_USER_IMPORT_LOCAL_ERROR : |
| - IDS_PROFILES_CREATE_LOCAL_ERROR; |
| - break; |
| - } |
| - |
| - return l10n_util::GetStringUTF16(message_id); |
| -} |
| - |
| -std::string CreateProfileHandler::GetJavascriptMethodName( |
| - ProfileCreationStatus status) const { |
| - switch (status) { |
| - case PROFILE_CREATION_SUCCESS: |
| - return profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| - "BrowserOptions.showManagedUserImportSuccess" : |
| - "BrowserOptions.showCreateProfileSuccess"; |
| - case PROFILE_CREATION_ERROR: |
| - return profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| - "BrowserOptions.showManagedUserImportError" : |
| - "BrowserOptions.showCreateProfileError"; |
| - } |
| - |
| - NOTREACHED(); |
| - return std::string(); |
| -} |
| - |
| bool CreateProfileHandler::IsValidExistingSupervisedUserId( |
| const std::string& existing_supervised_user_id) const { |
| if (existing_supervised_user_id.empty()) |
| @@ -429,4 +443,31 @@ bool CreateProfileHandler::IsValidExistingSupervisedUserId( |
| return true; |
| } |
| +base::string16 CreateProfileHandler::GetProfileCreationErrorMessageRemote() |
| + const { |
| + return l10n_util::GetStringUTF16( |
| + profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| + IDS_SUPERVISED_USER_IMPORT_REMOTE_ERROR : |
| + IDS_PROFILES_CREATE_REMOTE_ERROR); |
| +} |
| + |
| +base::string16 CreateProfileHandler::GetProfileCreationErrorMessageSignin() |
| + const { |
| + return l10n_util::GetStringUTF16( |
| + profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? |
| + IDS_SUPERVISED_USER_IMPORT_SIGN_IN_ERROR : |
| + IDS_PROFILES_CREATE_SIGN_IN_ERROR); |
| +} |
| +#else |
| +bool CreateProfileHandler::GetSupervisedUserIdFromArgs( |
|
Bernhard Bauer
2014/07/21 08:55:15
This is meant as a starting point for future refac
mckev
2014/08/05 01:09:14
Fair point. As an alternative I've ifdef'd their
|
| + const base::ListValue* args, std::string& supervised_user_id) { |
| + // An empty string is the expected value when supervised users aren't enabled. |
| + return true; |
| +} |
| +void CreateProfileHandler::CancelProfileRegistration(bool user_initiated) { |
| + // Since cancellation is only supported for supervised users, cancellation |
| + // here is a no-op. |
| +} |
| +#endif |
| + |
| } // namespace options |