1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/webui/signin/user_manager_screen_handler.h"
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/bind.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/prefs/pref_service.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/value_conversions.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/values.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/browser_process.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chrome_notification_types.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/api/screenlock_private/screenlock_private_api.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/profiles/profile_avatar_icon_util.h"
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile_info_cache.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache_observer.h"
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile_manager.h"
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/profiles/profile_metrics.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/profiles/profile_window.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/local_auth.h"
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/browser_finder.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/browser_list.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/chrome_pages.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/singleton_tabs.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/user_manager.h"
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/common/pref_names.h"
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/url_constants.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/notification_service.h"
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/web_contents.h"
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/web_ui.h"
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_fetcher.h"
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h"
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/base/l10n/l10n_util.h"
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ui/base/resource/resource_bundle.h"
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/image/image.h"
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/gfx/image/image_util.h"
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// User dictionary keys.
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyUsername[] = "username";
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyDisplayName[]= "displayName";
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyEmailAddress[] = "emailAddress";
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kKeyProfilePath[] = "profilePath";
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyPublicAccount[] = "publicAccount";
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char kKeySupervisedUser[] = "supervisedUser";
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeySignedIn[] = "signedIn";
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyCanRemove[] = "canRemove";
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyIsOwner[] = "isOwner";
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyIsDesktop[] = "isDesktopUser";
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyAvatarUrl[] = "userImage";
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kKeyNeedsSignin[] = "needsSignin";
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// JS API callback names.
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kJsApiUserManagerInitialize[] = "userManagerInitialize";
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kJsApiUserManagerAddUser[] = "addUser";
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kJsApiUserManagerAuthLaunchUser[] = "authenticatedLaunchUser";
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kJsApiUserManagerLaunchGuest[] = "launchGuest";
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kJsApiUserManagerLaunchUser[] = "launchUser";
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kJsApiUserManagerRemoveUser[] = "removeUser";
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kJsApiUserManagerAttemptUnlock[] = "attemptUnlock";
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const size_t kAvatarIconSize = 180;
723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid HandleAndDoNothing(const base::ListValue* args) {
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This callback is run if the only profile has been deleted, and a new
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// profile has been created to replace it.
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void OpenNewWindowForProfile(
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    chrome::HostDesktopType desktop_type,
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Profile* profile,
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Profile::CreateStatus status) {
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (status != Profile::CREATE_STATUS_INITIALIZED)
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  profiles::FindOrCreateNewWindowForProfile(
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    profile,
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    chrome::startup::IS_PROCESS_STARTUP,
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    chrome::startup::IS_FIRST_RUN,
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    desktop_type,
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    false);
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochstd::string GetAvatarImageAtIndex(
933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    size_t index, const ProfileInfoCache& info_cache) {
943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool is_gaia_picture =
953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      info_cache.IsUsingGAIAPictureOfProfileAtIndex(index) &&
963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      info_cache.GetGAIAPictureOfProfileAtIndex(index);
973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // If the avatar is too small (i.e. the old-style low resolution avatar),
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // it will be pixelated when displayed in the User Manager, so we should
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // return the placeholder avatar instead.
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  gfx::Image avatar_image = info_cache.GetAvatarIconOfProfileAtIndex(index);
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (avatar_image.Width() <= profiles::kAvatarIconWidth ||
103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      avatar_image.Height() <= profiles::kAvatarIconHeight ) {
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    avatar_image = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        profiles::GetPlaceholderAvatarIconResourceID());
106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Image resized_image = profiles::GetSizedAvatarIcon(
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      avatar_image, is_gaia_picture, kAvatarIconSize, kAvatarIconSize);
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return webui::GetBitmapDataUrl(resized_image.AsBitmap());
1103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
1113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)size_t GetIndexOfProfileWithEmailAndName(const ProfileInfoCache& info_cache,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const base::string16& email,
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const base::string16& name) {
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (size_t i = 0; i < info_cache.GetNumberOfProfiles(); ++i) {
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (info_cache.GetUserNameOfProfileAtIndex(i) == email &&
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        (name.empty() ||
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         profiles::GetAvatarNameForProfile(
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             info_cache.GetPathOfProfileAtIndex(i)) == name)) {
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return i;
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return std::string::npos;
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)extensions::ScreenlockPrivateEventRouter* GetScreenlockRouter(
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& email) {
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ProfileInfoCache& info_cache =
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      g_browser_process->profile_manager()->GetProfileInfoCache();
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const size_t profile_index = GetIndexOfProfileWithEmailAndName(
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      info_cache, base::UTF8ToUTF16(email), base::string16());
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Profile* profile = g_browser_process->profile_manager()
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ->GetProfileByPath(info_cache.GetPathOfProfileAtIndex(profile_index));
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return extensions::ScreenlockPrivateEventRouter::GetFactoryInstance()->Get(
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      profile);
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool IsGuestModeEnabled() {
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PrefService* service = g_browser_process->local_state();
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(service);
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return service->GetBoolean(prefs::kBrowserGuestModeEnabled);
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool IsAddPersonEnabled() {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrefService* service = g_browser_process->local_state();
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(service);
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return service->GetBoolean(prefs::kBrowserAddPersonEnabled);
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// ProfileUpdateObserver ------------------------------------------------------
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass UserManagerScreenHandler::ProfileUpdateObserver
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : public ProfileInfoCacheObserver {
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProfileUpdateObserver(
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ProfileManager* profile_manager, UserManagerScreenHandler* handler)
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      : profile_manager_(profile_manager),
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        user_manager_handler_(handler) {
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DCHECK(profile_manager_);
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DCHECK(user_manager_handler_);
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    profile_manager_->GetProfileInfoCache().AddObserver(this);
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~ProfileUpdateObserver() {
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DCHECK(profile_manager_);
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    profile_manager_->GetProfileInfoCache().RemoveObserver(this);
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // ProfileInfoCacheObserver implementation:
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If any change has been made to a profile, propagate it to all the
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // visible user manager screens.
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE {
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_manager_handler_->SendUserList();
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnProfileWasRemoved(
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::FilePath& profile_path,
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& profile_name) OVERRIDE {
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(noms): Change 'SendUserList' to 'removeUser' JS-call when
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // UserManager is able to find pod belonging to removed user.
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_manager_handler_->SendUserList();
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnProfileNameChanged(
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::FilePath& profile_path,
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& old_profile_name) OVERRIDE {
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_manager_handler_->SendUserList();
191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void OnProfileAvatarChanged(
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const base::FilePath& profile_path) OVERRIDE {
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_manager_handler_->SendUserList();
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnProfileSigninRequiredChanged(
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::FilePath& profile_path) OVERRIDE {
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    user_manager_handler_->SendUserList();
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProfileManager* profile_manager_;
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  UserManagerScreenHandler* user_manager_handler_;  // Weak; owns us.
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProfileUpdateObserver);
208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// UserManagerScreenHandler ---------------------------------------------------
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)UserManagerScreenHandler::UserManagerScreenHandler()
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : desktop_type_(chrome::GetActiveDesktop()),
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_ptr_factory_(this) {
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  profileInfoCacheObserver_.reset(
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new UserManagerScreenHandler::ProfileUpdateObserver(
217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          g_browser_process->profile_manager(), this));
218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochUserManagerScreenHandler::~UserManagerScreenHandler() {
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScreenlockBridge::Get()->SetLockHandler(NULL);
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void UserManagerScreenHandler::ShowBannerMessage(
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& message) {
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "login.AccountPickerScreen.showBannerMessage",
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringValue(message));
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UserManagerScreenHandler::ShowUserPodCustomIcon(
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& user_email,
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const ScreenlockBridge::UserPodCustomIconOptions& icon_options) {
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> icon = icon_options.ToDictionaryValue();
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!icon || icon->empty())
2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "login.AccountPickerScreen.showUserPodCustomIcon",
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringValue(user_email),
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      *icon);
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UserManagerScreenHandler::HideUserPodCustomIcon(
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& user_email) {
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "login.AccountPickerScreen.hideUserPodCustomIcon",
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringValue(user_email));
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserManagerScreenHandler::EnableInput() {
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Nothing here because UI is not disabled when starting to authenticate.
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserManagerScreenHandler::SetAuthType(
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& user_email,
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ScreenlockBridge::LockHandler::AuthType auth_type,
2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const base::string16& auth_value) {
25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (GetAuthType(user_email) ==
25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD)
26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  user_auth_type_map_[user_email] = auth_type;
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "login.AccountPickerScreen.setAuthType",
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringValue(user_email),
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::FundamentalValue(auth_type),
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::StringValue(auth_value));
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ScreenlockBridge::LockHandler::AuthType UserManagerScreenHandler::GetAuthType(
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& user_email) const {
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  UserAuthTypeMap::const_iterator it = user_auth_type_map_.find(user_email);
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (it == user_auth_type_map_.end())
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return ScreenlockBridge::LockHandler::OFFLINE_PASSWORD;
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return it->second;
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserManagerScreenHandler::Unlock(const std::string& user_email) {
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ProfileInfoCache& info_cache =
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      g_browser_process->profile_manager()->GetProfileInfoCache();
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const size_t profile_index = GetIndexOfProfileWithEmailAndName(
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      info_cache, base::UTF8ToUTF16(user_email), base::string16());
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_LT(profile_index, info_cache.GetNumberOfProfiles());
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  authenticating_profile_index_ = profile_index;
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ReportAuthenticationResult(true, ProfileMetrics::AUTH_LOCAL);
287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UserManagerScreenHandler::AttemptEasySignin(
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& user_email,
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& secret,
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& key_label) {
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::HandleInitialize(const base::ListValue* args) {
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the URL has a hash parameter, store it for later.
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  args->GetString(0, &url_hash_);
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SendUserList();
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  web_ui()->CallJavascriptFunction("cr.ui.Oobe.showUserManagerScreen",
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FundamentalValue(IsGuestModeEnabled()),
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::FundamentalValue(IsAddPersonEnabled()));
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  desktop_type_ = chrome::GetHostDesktopTypeForNativeView(
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      web_ui()->GetWebContents()->GetNativeView());
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScreenlockBridge::Get()->SetLockHandler(this);
308ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
309ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::HandleAddUser(const base::ListValue* args) {
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!IsAddPersonEnabled()) {
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The 'Add User' UI should not be showing.
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profiles::CreateAndSwitchToNewProfile(
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      desktop_type_,
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&UserManagerScreenHandler::OnSwitchToProfileComplete,
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 weak_ptr_factory_.GetWeakPtr()),
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProfileMetrics::ADD_NEW_USER_MANAGER);
321ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
322ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserManagerScreenHandler::HandleAuthenticatedLaunchUser(
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::ListValue* args) {
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 email_address;
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!args->GetString(0, &email_address))
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 display_name;
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!args->GetString(1, &display_name))
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string password;
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!args->GetString(2, &password))
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ProfileInfoCache& info_cache =
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      g_browser_process->profile_manager()->GetProfileInfoCache();
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  size_t profile_index = GetIndexOfProfileWithEmailAndName(
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      info_cache, email_address, display_name);
341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (profile_index >= info_cache.GetNumberOfProfiles()) {
342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NOTREACHED();
343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  authenticating_profile_index_ = profile_index;
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!chrome::ValidateLocalAuthCredentials(profile_index, password)) {
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a second attempt via an on-line authentication call.  This handles
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // profiles that are missing sign-in credentials and also cases where the
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // password has been changed externally.
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    client_login_.reset(new GaiaAuthFetcher(
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this,
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GaiaConstants::kChromeSource,
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        web_ui()->GetWebContents()->GetBrowserContext()->GetRequestContext()));
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string email_string;
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    args->GetString(0, &email_string);
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    client_login_->StartClientLogin(
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        email_string,
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        password,
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GaiaConstants::kSyncService,
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::string(),
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::string(),
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GaiaAuthFetcher::HostedAccountsAllowed);
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    password_attempt_ = password;
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ReportAuthenticationResult(true, ProfileMetrics::AUTH_LOCAL);
369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::HandleRemoveUser(const base::ListValue* args) {
372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(args);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::Value* profile_path_value;
374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!args->Get(0, &profile_path_value))
375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath profile_path;
378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!base::GetValueAsFilePath(*profile_path_value, &profile_path))
379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This handler could have been called for a supervised user, for example
382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // because the user fiddled with the web inspector. Silently return in this
383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // case.
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (Profile::FromWebUI(web_ui())->IsSupervised())
385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!profiles::IsMultipleProfilesEnabled())
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  g_browser_process->profile_manager()->ScheduleProfileForDeletion(
391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      profile_path,
39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(&OpenNewWindowForProfile, desktop_type_));
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ProfileMetrics::LogProfileDeleteUser(
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ProfileMetrics::DELETE_PROFILE_USER_MANAGER);
395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::HandleLaunchGuest(const base::ListValue* args) {
39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (IsGuestModeEnabled()) {
39903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ProfileMetrics::LogProfileSwitchUser(ProfileMetrics::SWITCH_PROFILE_GUEST);
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profiles::SwitchToGuestProfile(
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        desktop_type_,
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&UserManagerScreenHandler::OnSwitchToProfileComplete,
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   weak_ptr_factory_.GetWeakPtr()));
40403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  } else {
40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // The UI should have prevented the user from allowing the selection of
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // guest mode.
40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    NOTREACHED();
40803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
409ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
410ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::HandleLaunchUser(const base::ListValue* args) {
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 email_address;
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 display_name;
414ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!args->GetString(0, &email_address) ||
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !args->GetString(1, &display_name)) {
417ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    NOTREACHED();
418ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
419ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
420ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
421ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ProfileInfoCache& info_cache =
422ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      g_browser_process->profile_manager()->GetProfileInfoCache();
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  size_t profile_index = GetIndexOfProfileWithEmailAndName(
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      info_cache, email_address, display_name);
425ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (profile_index >= info_cache.GetNumberOfProfiles()) {
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NOTREACHED();
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
429ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // It's possible that a user breaks into the user-manager page using the
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // JavaScript Inspector and causes a "locked" profile to call this
433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // unauthenticated version of "launch" instead of the proper one.  Thus,
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // we have to validate in (secure) C++ code that it really is a profile
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // not needing authentication.  If it is, just ignore the "launch" request.
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (info_cache.ProfileIsSigninRequiredAtIndex(profile_index))
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileMetrics::LogProfileAuthResult(ProfileMetrics::AUTH_UNNECESSARY);
439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::FilePath path = info_cache.GetPathOfProfileAtIndex(profile_index);
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profiles::SwitchToProfile(
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      path,
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      desktop_type_,
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      false,  /* reuse any existing windows */
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&UserManagerScreenHandler::OnSwitchToProfileComplete,
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 weak_ptr_factory_.GetWeakPtr()),
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProfileMetrics::SWITCH_PROFILE_MANAGER);
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserManagerScreenHandler::HandleAttemptUnlock(
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::ListValue* args) {
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string email;
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK(args->GetString(0, &email));
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetScreenlockRouter(email)->OnAuthAttempted(GetAuthType(email), "");
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void UserManagerScreenHandler::HandleHardlockUserPod(
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const base::ListValue* args) {
45903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string email;
46003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CHECK(args->GetString(0, &email));
46103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SetAuthType(email,
46203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              ScreenlockBridge::LockHandler::FORCE_OFFLINE_PASSWORD,
46303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              base::string16());
46403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  HideUserPodCustomIcon(email);
46503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
46603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserManagerScreenHandler::OnClientLoginSuccess(
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ClientLoginResult& result) {
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::SetLocalAuthCredentials(authenticating_profile_index_,
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  password_attempt_);
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ReportAuthenticationResult(true, ProfileMetrics::AUTH_ONLINE);
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserManagerScreenHandler::OnClientLoginFailure(
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GoogleServiceAuthError& error) {
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GoogleServiceAuthError::State state = error.state();
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Some "error" results mean the password was correct but some other action
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // should be taken.  For our purposes, we only care that the password was
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // correct so count those as a success.
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool success = (state == GoogleServiceAuthError::NONE ||
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  state == GoogleServiceAuthError::CAPTCHA_REQUIRED ||
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  state == GoogleServiceAuthError::TWO_FACTOR ||
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  state == GoogleServiceAuthError::ACCOUNT_DELETED ||
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  state == GoogleServiceAuthError::ACCOUNT_DISABLED);
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool offline = (state == GoogleServiceAuthError::CONNECTION_FAILED ||
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  state == GoogleServiceAuthError::SERVICE_UNAVAILABLE ||
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  state == GoogleServiceAuthError::REQUEST_CANCELED);
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProfileMetrics::ProfileAuth failure_metric =
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      offline ? ProfileMetrics::AUTH_FAILED_OFFLINE :
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ProfileMetrics::AUTH_FAILED;
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReportAuthenticationResult(
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      success, success ? ProfileMetrics::AUTH_ONLINE : failure_metric);
493ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
494ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::RegisterMessages() {
496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_ui()->RegisterMessageCallback(kJsApiUserManagerInitialize,
497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&UserManagerScreenHandler::HandleInitialize,
498ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::Unretained(this)));
499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_ui()->RegisterMessageCallback(kJsApiUserManagerAddUser,
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&UserManagerScreenHandler::HandleAddUser,
501ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::Unretained(this)));
502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  web_ui()->RegisterMessageCallback(kJsApiUserManagerAuthLaunchUser,
503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Bind(&UserManagerScreenHandler::HandleAuthenticatedLaunchUser,
504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 base::Unretained(this)));
505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_ui()->RegisterMessageCallback(kJsApiUserManagerLaunchGuest,
506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&UserManagerScreenHandler::HandleLaunchGuest,
507ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::Unretained(this)));
508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_ui()->RegisterMessageCallback(kJsApiUserManagerLaunchUser,
509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&UserManagerScreenHandler::HandleLaunchUser,
510ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::Unretained(this)));
511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  web_ui()->RegisterMessageCallback(kJsApiUserManagerRemoveUser,
512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&UserManagerScreenHandler::HandleRemoveUser,
513ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::Unretained(this)));
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  web_ui()->RegisterMessageCallback(kJsApiUserManagerAttemptUnlock,
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::Bind(&UserManagerScreenHandler::HandleAttemptUnlock,
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 base::Unretained(this)));
517ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
518ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const content::WebUI::MessageCallback& kDoNothingCallback =
519ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::Bind(&HandleAndDoNothing);
520ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
521ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Unused callbacks from screen_account_picker.js
522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("accountPickerReady", kDoNothingCallback);
523ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("loginUIStateChanged", kDoNothingCallback);
524ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("hideCaptivePortal", kDoNothingCallback);
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_ui()->RegisterMessageCallback("getTouchViewState", kDoNothingCallback);
526ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Unused callbacks from display_manager.js
527ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("showAddUser", kDoNothingCallback);
528ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("loadWallpaper", kDoNothingCallback);
529ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("updateCurrentScreen", kDoNothingCallback);
530ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->RegisterMessageCallback("loginVisible", kDoNothingCallback);
5313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Unused callbacks from user_pod_row.js
5323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  web_ui()->RegisterMessageCallback("focusPod", kDoNothingCallback);
533ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
534ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::GetLocalizedValues(
536ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    base::DictionaryValue* localized_strings) {
537ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // For Control Bar.
538ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("signedIn",
539ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_SCREEN_LOCK_ACTIVE_USER));
540ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("signinButton",
541ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_LOGIN_BUTTON));
542ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("addUser",
543ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_ADD_USER_BUTTON));
544ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("cancel", l10n_util::GetStringUTF16(IDS_CANCEL));
545ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("browseAsGuest",
546ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_GO_INCOGNITO_BUTTON));
547ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("signOutUser",
548ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_SCREEN_LOCK_SIGN_OUT));
549ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
550ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // For AccountPickerScreen.
551ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("screenType", "login-add-user");
552ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("highlightStrength", "normal");
553ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  localized_strings->SetString("title",
5546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
555ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("passwordHint",
556ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT));
557e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  localized_strings->SetString("signingIn",
558e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch      l10n_util::GetStringUTF16(IDS_LOGIN_POD_SIGNING_IN));
559ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("podMenuButtonAccessibleName",
560ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_LOGIN_POD_MENU_BUTTON_ACCESSIBLE_NAME));
561ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("podMenuRemoveItemAccessibleName",
562ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(
563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          IDS_LOGIN_POD_MENU_REMOVE_ITEM_ACCESSIBLE_NAME));
564ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("removeUser",
565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON));
566ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("passwordFieldAccessibleName",
567ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      l10n_util::GetStringUTF16(IDS_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME));
568ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  localized_strings->SetString("bootIntoWallpaper", "off");
569ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // For AccountPickerScreen, the remove user warning overlay.
571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  localized_strings->SetString("removeUserWarningButtonTitle",
572a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_POD_USER_REMOVE_WARNING_BUTTON));
573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  localized_strings->SetString("removeUserWarningText",
57446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LOGIN_POD_USER_REMOVE_WARNING));
57546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  localized_strings->SetString("removeSupervisedUserWarningText",
57646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringFUTF16(
57746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          IDS_LOGIN_POD_SUPERVISED_USER_REMOVE_WARNING,
57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL)));
579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Strings needed for the User Manager tutorial slides.
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("tutorialNext",
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_NEXT));
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("tutorialDone",
584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_DONE));
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideWelcomeTitle",
586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_INTRO_TITLE));
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideWelcomeText",
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_INTRO_TEXT));
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideYourChromeTitle",
590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(
591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          IDS_USER_MANAGER_TUTORIAL_SLIDE_YOUR_CHROME_TITLE));
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideYourChromeText", l10n_util::GetStringUTF16(
593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IDS_USER_MANAGER_TUTORIAL_SLIDE_YOUR_CHROME_TEXT));
594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideGuestsTitle",
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_GUEST_TITLE));
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideGuestsText",
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_GUEST_TEXT));
598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideFriendsTitle",
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_FRIENDS_TITLE));
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideFriendsText",
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_FRIENDS_TEXT));
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideCompleteTitle",
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_OUTRO_TITLE));
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideCompleteText",
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_USER_MANAGER_TUTORIAL_SLIDE_OUTRO_TEXT));
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideCompleteUserNotFound",
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          IDS_USER_MANAGER_TUTORIAL_SLIDE_OUTRO_USER_NOT_FOUND));
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("slideCompleteAddUser",
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          IDS_USER_MANAGER_TUTORIAL_SLIDE_OUTRO_ADD_USER));
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Strings needed for the user_pod_template public account div, but not ever
614a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // actually displayed for desktop users.
615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  localized_strings->SetString("publicAccountReminder", base::string16());
6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("publicSessionLanguageAndInput",
6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               base::string16());
618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  localized_strings->SetString("publicAccountEnter", base::string16());
619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  localized_strings->SetString("publicAccountEnterAccessibleName",
620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               base::string16());
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("publicSessionSelectLanguage", base::string16());
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("publicSessionSelectKeyboard", base::string16());
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("signinBannerText", base::string16());
624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("launchAppButton", base::string16());
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("multiProfilesRestrictedPolicyTitle",
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               base::string16());
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("multiProfilesNotAllowedPolicyMsg",
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                base::string16());
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  localized_strings->SetString("multiProfilesPrimaryOnlyPolicyMsg",
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                base::string16());
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  localized_strings->SetString("multiProfilesOwnerPrimaryOnlyMsg",
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                base::string16());
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
635ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UserManagerScreenHandler::SendUserList() {
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue users_list;
637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath active_profile_path =
638ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      web_ui()->GetWebContents()->GetBrowserContext()->GetPath();
639ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const ProfileInfoCache& info_cache =
640ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      g_browser_process->profile_manager()->GetProfileInfoCache();
641ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  user_auth_type_map_.clear();
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // If the active user is a supervised user, then they may not perform
6453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // certain actions (i.e. delete another user).
646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool active_user_is_supervised = Profile::FromWebUI(web_ui())->IsSupervised();
647ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (size_t i = 0; i < info_cache.GetNumberOfProfiles(); ++i) {
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* profile_value = new base::DictionaryValue();
649ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
650ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    base::FilePath profile_path = info_cache.GetPathOfProfileAtIndex(i);
651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool is_active_user = (profile_path == active_profile_path);
652ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
653ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetString(
654ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        kKeyUsername, info_cache.GetUserNameOfProfileAtIndex(i));
655ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetString(
656ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        kKeyEmailAddress, info_cache.GetUserNameOfProfileAtIndex(i));
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The profiles displayed in the User Manager are never guest profiles.
658ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetString(
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kKeyDisplayName,
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profiles::GetAvatarNameForProfile(profile_path));
661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    profile_value->SetString(kKeyProfilePath, profile_path.MaybeAsASCII());
662ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetBoolean(kKeyPublicAccount, false);
66346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    profile_value->SetBoolean(
6645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        kKeySupervisedUser, info_cache.ProfileIsSupervisedAtIndex(i));
665ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetBoolean(kKeySignedIn, is_active_user);
6663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    profile_value->SetBoolean(
6673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        kKeyNeedsSignin, info_cache.ProfileIsSigninRequiredAtIndex(i));
668ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetBoolean(kKeyIsOwner, false);
669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    profile_value->SetBoolean(kKeyCanRemove, !active_user_is_supervised);
670ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    profile_value->SetBoolean(kKeyIsDesktop, true);
6713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    profile_value->SetString(
6723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        kKeyAvatarUrl, GetAvatarImageAtIndex(i, info_cache));
673ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // The row of user pods should display the active user first.
675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (is_active_user)
676ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      users_list.Insert(0, profile_value);
677ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    else
678ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      users_list.Append(profile_value);
679ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
680ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  web_ui()->CallJavascriptFunction("login.AccountPickerScreen.loadUsers",
68203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      users_list, base::FundamentalValue(IsGuestModeEnabled()));
683ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void UserManagerScreenHandler::ReportAuthenticationResult(
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool success,
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ProfileMetrics::ProfileAuth auth) {
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileMetrics::LogProfileAuthResult(auth);
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  password_attempt_.clear();
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (success) {
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ProfileInfoCache& info_cache =
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        g_browser_process->profile_manager()->GetProfileInfoCache();
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    info_cache.SetProfileSigninRequiredAtIndex(
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        authenticating_profile_index_, false);
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath path = info_cache.GetPathOfProfileAtIndex(
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        authenticating_profile_index_);
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profiles::SwitchToProfile(
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        path,
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        desktop_type_,
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        true,
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&UserManagerScreenHandler::OnSwitchToProfileComplete,
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   weak_ptr_factory_.GetWeakPtr()),
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ProfileMetrics::SWITCH_PROFILE_UNLOCK);
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    web_ui()->CallJavascriptFunction(
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "cr.ui.Oobe.showSignInError",
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::FundamentalValue(0),
7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::StringValue(l10n_util::GetStringUTF8(
7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            auth == ProfileMetrics::AUTH_FAILED_OFFLINE ?
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                IDS_LOGIN_ERROR_AUTHENTICATING_OFFLINE :
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                IDS_LOGIN_ERROR_AUTHENTICATING)),
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::StringValue(""),
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::FundamentalValue(0));
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UserManagerScreenHandler::OnBrowserWindowReady(Browser* browser) {
7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(browser);
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(browser->window());
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (url_hash_ == profiles::kUserManagerSelectProfileTaskManager) {
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     base::MessageLoop::current()->PostTask(
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         FROM_HERE, base::Bind(&chrome::ShowTaskManager, browser));
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (url_hash_ == profiles::kUserManagerSelectProfileAboutChrome) {
7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     base::MessageLoop::current()->PostTask(
7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         FROM_HERE, base::Bind(&chrome::ShowAboutChrome, browser));
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This call is last as it deletes this object.
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UserManager::Hide();
7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UserManagerScreenHandler::Observe(
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int type,
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const content::NotificationSource& source,
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const content::NotificationDetails& details) {
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (type) {
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case chrome::NOTIFICATION_BROWSER_WINDOW_READY:
7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Only respond to one Browser Window Ready event.
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      registrar_.Remove(this,
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        chrome::NOTIFICATION_BROWSER_WINDOW_READY,
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        content::NotificationService::AllSources());
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OnBrowserWindowReady(content::Source<Browser>(source).ptr());
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    break;
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This callback is run after switching to a new profile has finished. This
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// means either a new browser has been created (but not the window), or an
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// existing one has been found. The HideUserManager task needs to be posted
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// since closing the User Manager before the window is created can flakily
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// cause Chrome to close.
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid UserManagerScreenHandler::OnSwitchToProfileComplete(
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Profile* profile, Profile::CreateStatus profile_create_status) {
7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Browser* browser = chrome::FindAnyBrowser(profile, false, desktop_type_);
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (browser && browser->window()) {
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OnBrowserWindowReady(browser);
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    registrar_.Add(this,
7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   chrome::NOTIFICATION_BROWSER_WINDOW_READY,
7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   content::NotificationService::AllSources());
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
766