create_profile_handler.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/webui/options/create_profile_handler.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/bind.h" 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/files/file_path.h" 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/metrics/histogram.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/prefs/pref_service.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/value_conversions.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/values.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/browser_process.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_registration_utility.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h" 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/webui/options/options_handlers_helper.h" 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/common/pref_names.h" 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "grit/generated_resources.h" 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace options { 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CreateProfileHandler::CreateProfileHandler() 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : profile_creation_type_(NO_CREATION_IN_PROGRESS), 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_(this) { 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CreateProfileHandler::~CreateProfileHandler() { 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CancelProfileRegistration(false); 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::GetLocalizedValues( 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::DictionaryValue* localized_strings) { 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::RegisterMessages() { 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->RegisterMessageCallback( 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "cancelCreateProfile", 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&CreateProfileHandler::HandleCancelProfileCreation, 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(this))); 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->RegisterMessageCallback( 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "createProfile", 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&CreateProfileHandler::CreateProfile, 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(this))); 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateProfileHandler::CreateProfile(const base::ListValue* args) { 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // This handler could have been called for a supervised user, for example 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // because the user fiddled with the web inspector. Silently return in this 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // case. 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* current_profile = Profile::FromWebUI(web_ui()); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (current_profile->IsSupervised()) 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!profiles::IsMultipleProfilesEnabled()) 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // We can have only one in progress profile creation 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // at any given moment, if new ones are initiated just 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // ignore them until we are done with the old one. 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_creation_type_ != NO_CREATION_IN_PROGRESS) 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NON_SUPERVISED_PROFILE_CREATION; 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(profile_path_being_created_.empty()); 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_start_time_ = base::TimeTicks::Now(); 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 name; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 icon; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string supervised_user_id; 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut = false; 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool supervised_user = false; 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (args->GetString(0, &name) && args->GetString(1, &icon)) { 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (args->GetBoolean(2, &create_shortcut)) { 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool success = args->GetBoolean(3, &supervised_user); 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(success); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) success = args->GetString(4, &supervised_user_id); 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(success); 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user) { 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!IsValidExistingSupervisedUserId(supervised_user_id)) 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = SUPERVISED_PROFILE_IMPORT; 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user_id.empty()) { 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = SUPERVISED_PROFILE_CREATION; 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id = 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(); 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // If sync is not yet fully initialized, the creation may take extra time, 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // so show a message. Import doesn't wait for an acknowledgement, so it 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // won't have the same potential delay. 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncService* sync_service = 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile( 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) current_profile); 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncService::SyncStatusSummary status = 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) sync_service->QuerySyncStatusSummary(); 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (status == ProfileSyncService::DATATYPES_NOT_INITIALIZED) { 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ShowProfileCreationWarning(l10n_util::GetStringUTF16( 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_MANAGED_JUST_SIGNED_IN)); 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileMetrics::LogProfileAddNewUser(ProfileMetrics::ADD_NEW_USER_DIALOG); 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_ = ProfileManager::CreateMultiProfileAsync( 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) name, icon, 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&CreateProfileHandler::OnProfileCreated, 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) create_shortcut, 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::GetDesktopType(web_ui()), 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id), 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id); 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::OnProfileCreated( 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& supervised_user_id, 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile, 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::CreateStatus status) { 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (status != Profile::CREATE_STATUS_CREATED) 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RecordProfileCreationMetrics(status); 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (status) { 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_LOCAL_FAIL: { 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ShowProfileCreationError(profile, 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetProfileCreationErrorMessage(LOCAL_ERROR)); 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_CREATED: { 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Do nothing for an intermediate status. 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_INITIALIZED: { 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HandleProfileCreationSuccess(create_shortcut, desktop_type, 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id, profile); 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // User-initiated cancellation is handled in CancelProfileRegistration and 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // does not call this callback. 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_CANCELED: 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Supervised user registration errors are handled in 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // OnSupervisedUserRegistered(). 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_REMOTE_FAIL: 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::MAX_CREATE_STATUS: { 15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::HandleProfileCreationSuccess( 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& supervised_user_id, 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile) { 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (profile_creation_type_) { 17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NON_SUPERVISED_PROFILE_CREATION: { 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(supervised_user_id.empty()); 17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); 17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SUPERVISED_PROFILE_CREATION: 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SUPERVISED_PROFILE_IMPORT: 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RegisterSupervisedUser(create_shortcut, desktop_type, 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id, profile); 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NO_CREATION_IN_PROGRESS: 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CreateProfileHandler::RegisterSupervisedUser( 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& supervised_user_id, 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* new_profile) { 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(profile_path_being_created_.value(), 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new_profile->GetPath().value()); 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService* supervised_user_service = 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(new_profile); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Register the supervised user using the profile of the custodian. 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_registration_utility_ = 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationUtility::Create(Profile::FromWebUI(web_ui())); 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service->RegisterAndInitSync( 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_registration_utility_.get(), 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::FromWebUI(web_ui()), 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id, 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&CreateProfileHandler::OnSupervisedUserRegistered, 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) create_shortcut, 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) desktop_type, 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new_profile)); 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CreateProfileHandler::OnSupervisedUserRegistered( 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile, 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GoogleServiceAuthError& error) { 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::State state = error.state(); 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RecordSupervisedProfileCreationMetrics(state); 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (state == GoogleServiceAuthError::NONE) { 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_msg; 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (state == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS || 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state == GoogleServiceAuthError::USER_NOT_SIGNED_UP || 22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state == GoogleServiceAuthError::ACCOUNT_DELETED || 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state == GoogleServiceAuthError::ACCOUNT_DISABLED) { 22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_msg = GetProfileCreationErrorMessage(SIGNIN_ERROR); 23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_msg = GetProfileCreationErrorMessage(REMOTE_ERROR); 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ShowProfileCreationError(profile, error_msg); 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::CreateShortcutAndShowSuccess( 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile) { 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (create_shortcut) { 24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileShortcutManager* shortcut_manager = 24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_browser_process->profile_manager()->profile_shortcut_manager(); 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (shortcut_manager) 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) shortcut_manager->CreateProfileShortcut(profile->GetPath()); 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(profile_path_being_created_.value(), profile->GetPath().value()); 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_.clear(); 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue dict; 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dict.SetString("name", 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kProfileName)); 25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dict.Set("filePath", base::CreateFilePathValue(profile->GetPath())); 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_supervised = 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_CREATION || 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT; 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dict.SetBoolean("isManaged", is_supervised); 25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->CallJavascriptFunction( 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetJavascriptMethodName(PROFILE_CREATION_SUCCESS), dict); 26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // If the new profile is a supervised user, instead of opening a new window 26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // right away, a confirmation overlay will be shown by JS from the creation 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // dialog. If we are importing an existing supervised profile or creating a 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // new non-supervised user profile we don't show any confirmation, so open 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the new window now. 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_creation_type_ != SUPERVISED_PROFILE_CREATION) { 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Opening the new window must be the last action, after all callbacks 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // have been run, to give them a chance to initialize the profile. 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::OpenNewWindowForProfile(desktop_type, 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile, 27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::CREATE_STATUS_INITIALIZED); 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NO_CREATION_IN_PROGRESS; 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateProfileHandler::ShowProfileCreationError( 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Profile* profile, 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& error) { 28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); 28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NO_CREATION_IN_PROGRESS; 28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_.clear(); 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->CallJavascriptFunction( 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetJavascriptMethodName(PROFILE_CREATION_ERROR), 28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::StringValue(error)); 28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::DeleteProfileAtPath(profile->GetPath(), web_ui()); 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::ShowProfileCreationWarning( 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& warning) { 29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(SUPERVISED_PROFILE_CREATION, profile_creation_type_); 29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->CallJavascriptFunction("BrowserOptions.showCreateProfileWarning", 29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::StringValue(warning)); 29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateProfileHandler::HandleCancelProfileCreation( 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CancelProfileRegistration(true); 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::CancelProfileRegistration(bool user_initiated) { 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_path_being_created_.empty()) 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileManager* manager = g_browser_process->profile_manager(); 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* new_profile = manager->GetProfileByPath(profile_path_being_created_); 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!new_profile) 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Non-supervised user creation cannot be canceled. (Creating a non-supervised 31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // profile shouldn't take significant time, and it can easily be deleted 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // afterward.) 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!new_profile->IsSupervised()) 31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (user_initiated) { 31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.CreateTimeCanceledNoTimeout", 31968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 32068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RecordProfileCreationMetrics(Profile::CREATE_STATUS_CANCELED); 32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(supervised_user_registration_utility_.get()); 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_registration_utility_.reset(); 32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); 32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NO_CREATION_IN_PROGRESS; 32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Cancelling registration means the callback passed into 33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // RegisterAndInitSync() won't be called, so the cleanup must be done here. 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_.clear(); 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::DeleteProfileAtPath(new_profile->GetPath(), web_ui()); 33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::RecordProfileCreationMetrics( 33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::CreateStatus status) { 33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Profile.CreateResult", 33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) status, 33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::MAX_CREATE_STATUS); 34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.CreateTimeNoTimeout", 34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::RecordSupervisedProfileCreationMetrics( 34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::State error_state) { 34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_creation_type_ == SUPERVISED_PROFILE_CREATION) { 34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Profile.SupervisedProfileCreateError", 34968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_state, 35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::NUM_STATES); 35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.SupervisedProfileTotalCreateTime", 35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(SUPERVISED_PROFILE_IMPORT, profile_creation_type_); 35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Profile.SupervisedProfileImportError", 35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_state, 35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::NUM_STATES); 35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.SupervisedProfileTotalImportTime", 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 CreateProfileHandler::GetProfileCreationErrorMessage( 36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileCreationErrorType error) const { 36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int message_id = -1; 36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (error) { 36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SIGNIN_ERROR: 37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_id = 37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_MANAGED_USER_IMPORT_SIGN_IN_ERROR : 37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_SIGN_IN_ERROR; 37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case REMOTE_ERROR: 37668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_id = 37768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_MANAGED_USER_IMPORT_REMOTE_ERROR : 37968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_REMOTE_ERROR; 38068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case LOCAL_ERROR: 38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_id = 38368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_MANAGED_USER_IMPORT_LOCAL_ERROR : 38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_LOCAL_ERROR; 38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 38968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return l10n_util::GetStringUTF16(message_id); 39068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 39268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string CreateProfileHandler::GetJavascriptMethodName( 39368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileCreationStatus status) const { 39468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (status) { 39568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case PROFILE_CREATION_SUCCESS: 39668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 39768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "BrowserOptions.showManagedUserImportSuccess" : 39868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "BrowserOptions.showCreateProfileSuccess"; 39968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case PROFILE_CREATION_ERROR: 40068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 40168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "BrowserOptions.showManagedUserImportError" : 40268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "BrowserOptions.showCreateProfileError"; 40368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 40468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 40568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 40668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return std::string(); 40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 40868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool CreateProfileHandler::IsValidExistingSupervisedUserId( 410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& existing_supervised_user_id) const { 411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (existing_supervised_user_id.empty()) 41268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 41368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 41468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSyncServiceFactory::GetForProfile(profile)-> 417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetSupervisedUsers(); 418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!dict->HasKey(existing_supervised_user_id)) 41968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 42068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Check if this supervised user already exists on this machine. 42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const ProfileInfoCache& cache = 42368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache(); 42468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) { 425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (existing_supervised_user_id == 426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cache.GetSupervisedUserIdOfProfileAtIndex(i)) 42768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 42868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 42968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 43068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 43168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace options 433