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