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" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/value_conversions.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/values.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/browser_process.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h" 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_registration_utility.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h" 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h" 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/webui/options/options_handlers_helper.h" 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/common/pref_names.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace options { 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CreateProfileHandler::CreateProfileHandler() 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : profile_creation_type_(NO_CREATION_IN_PROGRESS), 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_(this) { 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CreateProfileHandler::~CreateProfileHandler() { 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CancelProfileRegistration(false); 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::GetLocalizedValues( 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::DictionaryValue* localized_strings) { 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::RegisterMessages() { 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->RegisterMessageCallback( 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "cancelCreateProfile", 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&CreateProfileHandler::HandleCancelProfileCreation, 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(this))); 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->RegisterMessageCallback( 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "createProfile", 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&CreateProfileHandler::CreateProfile, 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Unretained(this))); 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateProfileHandler::CreateProfile(const base::ListValue* args) { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // This handler could have been called for a supervised user, for example 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // because the user fiddled with the web inspector. Silently return in this 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // case. 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* current_profile = Profile::FromWebUI(web_ui()); 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (current_profile->IsSupervised()) 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!profiles::IsMultipleProfilesEnabled()) 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // We can have only one in progress profile creation 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // at any given moment, if new ones are initiated just 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // ignore them until we are done with the old one. 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_creation_type_ != NO_CREATION_IN_PROGRESS) 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NON_SUPERVISED_PROFILE_CREATION; 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(profile_path_being_created_.empty()); 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_start_time_ = base::TimeTicks::Now(); 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 name; 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 icon; 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string supervised_user_id; 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut = false; 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool supervised_user = false; 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (args->GetString(0, &name) && args->GetString(1, &icon)) { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TrimWhitespace(name, base::TRIM_ALL, &name); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(!name.empty()); 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (args->GetBoolean(2, &create_shortcut)) { 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool success = args->GetBoolean(3, &supervised_user); 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(success); 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) success = args->GetString(4, &supervised_user_id); 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(success); 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user) { 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!IsValidExistingSupervisedUserId(supervised_user_id)) 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = SUPERVISED_PROFILE_IMPORT; 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user_id.empty()) { 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = SUPERVISED_PROFILE_CREATION; 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id = 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(); 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // If sync is not yet fully initialized, the creation may take extra time, 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // so show a message. Import doesn't wait for an acknowledgement, so it 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // won't have the same potential delay. 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncService* sync_service = 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncServiceFactory::GetInstance()->GetForProfile( 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) current_profile); 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileSyncService::SyncStatusSummary status = 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) sync_service->QuerySyncStatusSummary(); 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (status == ProfileSyncService::DATATYPES_NOT_INITIALIZED) { 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ShowProfileCreationWarning(l10n_util::GetStringUTF16( 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IDS_PROFILES_CREATE_SUPERVISED_JUST_SIGNED_IN)); 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileMetrics::LogProfileAddNewUser(ProfileMetrics::ADD_NEW_USER_DIALOG); 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_ = ProfileManager::CreateMultiProfileAsync( 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) name, icon, 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&CreateProfileHandler::OnProfileCreated, 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) create_shortcut, 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::GetDesktopType(web_ui()), 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id), 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id); 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::OnProfileCreated( 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& supervised_user_id, 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile, 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::CreateStatus status) { 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (status != Profile::CREATE_STATUS_CREATED) 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RecordProfileCreationMetrics(status); 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (status) { 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_LOCAL_FAIL: { 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ShowProfileCreationError(profile, 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetProfileCreationErrorMessage(LOCAL_ERROR)); 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_CREATED: { 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Do nothing for an intermediate status. 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_INITIALIZED: { 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HandleProfileCreationSuccess(create_shortcut, desktop_type, 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id, profile); 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // User-initiated cancellation is handled in CancelProfileRegistration and 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // does not call this callback. 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_CANCELED: 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Supervised user registration errors are handled in 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // OnSupervisedUserRegistered(). 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::CREATE_STATUS_REMOTE_FAIL: 16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case Profile::MAX_CREATE_STATUS: { 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::HandleProfileCreationSuccess( 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& supervised_user_id, 17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile) { 17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (profile_creation_type_) { 17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NON_SUPERVISED_PROFILE_CREATION: { 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(supervised_user_id.empty()); 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SUPERVISED_PROFILE_CREATION: 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SUPERVISED_PROFILE_IMPORT: 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RegisterSupervisedUser(create_shortcut, desktop_type, 182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id, profile); 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case NO_CREATION_IN_PROGRESS: 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CreateProfileHandler::RegisterSupervisedUser( 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& supervised_user_id, 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* new_profile) { 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(profile_path_being_created_.value(), 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new_profile->GetPath().value()); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService* supervised_user_service = 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(new_profile); 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Register the supervised user using the profile of the custodian. 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_registration_utility_ = 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserRegistrationUtility::Create(Profile::FromWebUI(web_ui())); 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service->RegisterAndInitSync( 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_registration_utility_.get(), 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::FromWebUI(web_ui()), 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_id, 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&CreateProfileHandler::OnSupervisedUserRegistered, 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) create_shortcut, 21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) desktop_type, 21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new_profile)); 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CreateProfileHandler::OnSupervisedUserRegistered( 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile, 21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GoogleServiceAuthError& error) { 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::State state = error.state(); 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RecordSupervisedProfileCreationMetrics(state); 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (state == GoogleServiceAuthError::NONE) { 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateShortcutAndShowSuccess(create_shortcut, desktop_type, profile); 22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 error_msg; 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (state == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS || 22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state == GoogleServiceAuthError::USER_NOT_SIGNED_UP || 23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state == GoogleServiceAuthError::ACCOUNT_DELETED || 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) state == GoogleServiceAuthError::ACCOUNT_DISABLED) { 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_msg = GetProfileCreationErrorMessage(SIGNIN_ERROR); 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_msg = GetProfileCreationErrorMessage(REMOTE_ERROR); 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ShowProfileCreationError(profile, error_msg); 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::CreateShortcutAndShowSuccess( 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool create_shortcut, 24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) chrome::HostDesktopType desktop_type, 24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile) { 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (create_shortcut) { 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileShortcutManager* shortcut_manager = 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_browser_process->profile_manager()->profile_shortcut_manager(); 24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (shortcut_manager) 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) shortcut_manager->CreateProfileShortcut(profile->GetPath()); 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(profile_path_being_created_.value(), profile->GetPath().value()); 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_.clear(); 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue dict; 25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dict.SetString("name", 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kProfileName)); 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dict.Set("filePath", base::CreateFilePathValue(profile->GetPath())); 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool is_supervised = 25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_CREATION || 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT; 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dict.SetBoolean("isSupervised", is_supervised); 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->CallJavascriptFunction( 26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetJavascriptMethodName(PROFILE_CREATION_SUCCESS), dict); 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // If the new profile is a supervised user, instead of opening a new window 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // right away, a confirmation overlay will be shown by JS from the creation 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // dialog. If we are importing an existing supervised profile or creating a 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // new non-supervised user profile we don't show any confirmation, so open 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the new window now. 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_creation_type_ != SUPERVISED_PROFILE_CREATION) { 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Opening the new window must be the last action, after all callbacks 27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // have been run, to give them a chance to initialize the profile. 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::OpenNewWindowForProfile(desktop_type, 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile, 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::CREATE_STATUS_INITIALIZED); 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NO_CREATION_IN_PROGRESS; 27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateProfileHandler::ShowProfileCreationError( 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Profile* profile, 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& error) { 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NO_CREATION_IN_PROGRESS; 28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_.clear(); 28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->CallJavascriptFunction( 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetJavascriptMethodName(PROFILE_CREATION_ERROR), 28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::StringValue(error)); 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The ProfileManager calls us back with a NULL profile in some cases. 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (profile) 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) helper::DeleteProfileAtPath(profile->GetPath(), web_ui()); 29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::ShowProfileCreationWarning( 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& warning) { 29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(SUPERVISED_PROFILE_CREATION, profile_creation_type_); 29768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_ui()->CallJavascriptFunction("BrowserOptions.showCreateProfileWarning", 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::StringValue(warning)); 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CreateProfileHandler::HandleCancelProfileCreation( 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* args) { 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CancelProfileRegistration(true); 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::CancelProfileRegistration(bool user_initiated) { 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_path_being_created_.empty()) 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileManager* manager = g_browser_process->profile_manager(); 31168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* new_profile = manager->GetProfileByPath(profile_path_being_created_); 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!new_profile) 31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Non-supervised user creation cannot be canceled. (Creating a non-supervised 31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // profile shouldn't take significant time, and it can easily be deleted 31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // afterward.) 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!new_profile->IsSupervised()) 31968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 32068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (user_initiated) { 32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.CreateTimeCanceledNoTimeout", 32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) RecordProfileCreationMetrics(Profile::CREATE_STATUS_CANCELED); 32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(supervised_user_registration_utility_.get()); 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_registration_utility_.reset(); 33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_NE(NO_CREATION_IN_PROGRESS, profile_creation_type_); 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ = NO_CREATION_IN_PROGRESS; 33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Cancelling registration means the callback passed into 33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // RegisterAndInitSync() won't be called, so the cleanup must be done here. 33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_path_being_created_.clear(); 33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) helper::DeleteProfileAtPath(new_profile->GetPath(), web_ui()); 33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::RecordProfileCreationMetrics( 34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::CreateStatus status) { 34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Profile.CreateResult", 34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) status, 34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile::MAX_CREATE_STATUS); 34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 34668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.CreateTimeNoTimeout", 34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 34968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void CreateProfileHandler::RecordSupervisedProfileCreationMetrics( 35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::State error_state) { 35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (profile_creation_type_ == SUPERVISED_PROFILE_CREATION) { 35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Profile.SupervisedProfileCreateError", 35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_state, 35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::NUM_STATES); 35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.SupervisedProfileTotalCreateTime", 35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(SUPERVISED_PROFILE_IMPORT, profile_creation_type_); 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Profile.SupervisedProfileImportError", 36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) error_state, 36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GoogleServiceAuthError::NUM_STATES); 36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES( 36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "Profile.SupervisedProfileTotalImportTime", 36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks::Now() - profile_creation_start_time_); 36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 CreateProfileHandler::GetProfileCreationErrorMessage( 37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileCreationErrorType error) const { 37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int message_id = -1; 37368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (error) { 37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case SIGNIN_ERROR: 37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_id = 37668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IDS_SUPERVISED_USER_IMPORT_SIGN_IN_ERROR : 37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_SIGN_IN_ERROR; 37968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 38068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case REMOTE_ERROR: 38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_id = 38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IDS_SUPERVISED_USER_IMPORT_REMOTE_ERROR : 38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_REMOTE_ERROR; 38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case LOCAL_ERROR: 38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) message_id = 38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IDS_SUPERVISED_USER_IMPORT_LOCAL_ERROR : 39068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IDS_PROFILES_CREATE_LOCAL_ERROR; 39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 39268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 39368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 39468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return l10n_util::GetStringUTF16(message_id); 39568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 39668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 39768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string CreateProfileHandler::GetJavascriptMethodName( 39868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ProfileCreationStatus status) const { 39968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (status) { 40068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case PROFILE_CREATION_SUCCESS: 40168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "BrowserOptions.showSupervisedUserImportSuccess" : 40368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "BrowserOptions.showCreateProfileSuccess"; 40468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case PROFILE_CREATION_ERROR: 40568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return profile_creation_type_ == SUPERVISED_PROFILE_IMPORT ? 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "BrowserOptions.showSupervisedUserImportError" : 40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "BrowserOptions.showCreateProfileError"; 40868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 40968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 41068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 41168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return std::string(); 41268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 41368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool CreateProfileHandler::IsValidExistingSupervisedUserId( 415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& existing_supervised_user_id) const { 416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (existing_supervised_user_id.empty()) 41768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 41868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 41968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui()); 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dict = 421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSyncServiceFactory::GetForProfile(profile)-> 422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetSupervisedUsers(); 423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!dict->HasKey(existing_supervised_user_id)) 42468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 42568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Check if this supervised user already exists on this machine. 42768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const ProfileInfoCache& cache = 42868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_browser_process->profile_manager()->GetProfileInfoCache(); 42968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) { 430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (existing_supervised_user_id == 431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cache.GetSupervisedUserIdOfProfileAtIndex(i)) 43268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 43368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 43568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 43668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace options 438