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