diff options
29 files changed, 314 insertions, 57 deletions
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index f25e9fa..4cc1f18 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp @@ -534,6 +534,9 @@ Press any key to continue exploring. <message name="IDS_KIOSK_APPS_BUTTON" desc="Text shown on a button that brings up the kiosk apps menu on login screen"> Apps </message> + <message name="IDS_CANCEL_USER_ADDING" desc="Text shown on a button that cancel adding user into multiprofile session."> + Cancel multiple sign-in + </message> <message name="IDS_LOGIN_OOBE_HELP_DIALOG_TITLE" desc="Default title for help dialogs during OOBE/login"> Help </message> diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc b/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc index f90c254..7ddcafd 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc @@ -255,7 +255,7 @@ void KioskAppLauncher::OnProfilePrepared(Profile* profile) { (new chromeos::StartupAppLauncher(profile, app_id_))->Start(); if (LoginDisplayHostImpl::default_host()) - LoginDisplayHostImpl::default_host()->OnSessionStart(); + LoginDisplayHostImpl::default_host()->Finalize(); UserManager::Get()->SessionStarted(); ReportLaunchResult(KioskAppLaunchError::NONE); diff --git a/chrome/browser/chromeos/login/login_display_host.h b/chrome/browser/chromeos/login/login_display_host.h index 15f4f64..06117c9 100644 --- a/chrome/browser/chromeos/login/login_display_host.h +++ b/chrome/browser/chromeos/login/login_display_host.h @@ -7,6 +7,7 @@ #include <string> +#include "base/callback.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "chrome/browser/chromeos/customization_document.h" @@ -46,9 +47,9 @@ class LoginDisplayHost { // Called when browsing session starts before creating initial browser. virtual void BeforeSessionStart() = 0; - // Called when browsing session starts so + // Called when user enters or returns to browsing session so // LoginDisplayHost instance may delete itself. - virtual void OnSessionStart() = 0; + virtual void Finalize() = 0; // Called when a login has completed successfully. virtual void OnCompleteLogin() = 0; @@ -81,6 +82,11 @@ class LoginDisplayHost { // Result should not be stored. virtual WizardController* GetWizardController() = 0; + // Starts screen for adding user into session. + // |completion_callback| called before display host shutdown. + // |completion_callback| can be null. + virtual void StartUserAdding(const base::Closure& completion_callback) = 0; + // Starts sign in screen. virtual void StartSignInScreen() = 0; diff --git a/chrome/browser/chromeos/login/login_display_host_impl.cc b/chrome/browser/chromeos/login/login_display_host_impl.cc index 48d43cc..f54cb5a 100644 --- a/chrome/browser/chromeos/login/login_display_host_impl.cc +++ b/chrome/browser/chromeos/login/login_display_host_impl.cc @@ -82,10 +82,13 @@ namespace { // URL which corresponds to the login WebUI. -const char kLoginURL[] = "chrome://oobe/login"; +const char kLoginURL[] = "chrome://oobe/login#login"; // URL which corresponds to the OOBE WebUI. -const char kOobeURL[] = "chrome://oobe"; +const char kOobeURL[] = "chrome://oobe#login"; + +// URL which corresponds to the user adding WebUI. +const char kUserAddingURL[] = "chrome://oobe/login#user-adding"; // Duration of sign-in transition animation. const int kLoginFadeoutTransitionDurationMs = 700; @@ -302,7 +305,7 @@ void LoginDisplayHostImpl::BeforeSessionStart() { session_starting_ = true; } -void LoginDisplayHostImpl::OnSessionStart() { +void LoginDisplayHostImpl::Finalize() { DVLOG(1) << "Session starting"; ash::Shell::GetInstance()-> desktop_background_controller()->MoveDesktopToUnlockedContainer(); @@ -310,9 +313,11 @@ void LoginDisplayHostImpl::OnSessionStart() { wizard_controller_->OnSessionStart(); g_browser_process->platform_part()->profile_helper()->ClearSigninProfile( base::Closure()); - // Display host is deleted once animation is completed - // since sign in screen widget has to stay alive. - StartAnimation(); + if (!IsRunningUserAdding()) { + // Display host is deleted once animation is completed + // since sign in screen widget has to stay alive. + StartAnimation(); + } ShutdownDisplayHost(false); } @@ -397,6 +402,34 @@ WizardController* LoginDisplayHostImpl::GetWizardController() { return wizard_controller_.get(); } +void LoginDisplayHostImpl::StartUserAdding( + const base::Closure& completion_callback) { + restore_path_ = RESTORE_ADD_USER_INTO_SESSION; + completion_callback_ = completion_callback; + LOG(INFO) << "Login WebUI >> user adding"; + if (!login_window_) + LoadURL(GURL(kUserAddingURL)); + + // Lock container can be transparent after lock screen animation. + aura::Window* lock_container = ash::Shell::GetContainer( + ash::Shell::GetPrimaryRootWindow(), + ash::internal::kShellWindowId_LockScreenContainersContainer); + lock_container->layer()->SetOpacity(1.0); + + ash::Shell::GetInstance()-> + desktop_background_controller()->MoveDesktopToLockedContainer(); + + sign_in_controller_.reset(); // Only one controller in a time. + sign_in_controller_.reset(new chromeos::ExistingUserController(this)); + SetOobeProgressBarVisible(oobe_progress_bar_visible_ = false); + SetStatusAreaVisible(true); + SetShutdownButtonEnabled(true); + sign_in_controller_->Init( + chromeos::UserManager::Get()->GetUsersAdmittedForMultiProfile()); + CHECK(webui_login_display_); + GetOobeUI()->ShowSigninScreen(webui_login_display_, webui_login_display_); +} + void LoginDisplayHostImpl::StartSignInScreen() { restore_path_ = RESTORE_SIGN_IN; is_showing_login_ = true; @@ -588,6 +621,9 @@ void LoginDisplayHostImpl::ShutdownDisplayHost(bool post_quit_task) { base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); if (post_quit_task) base::MessageLoop::current()->Quit(); + + if (!completion_callback_.is_null()) + completion_callback_.Run(); } void LoginDisplayHostImpl::StartAnimation() { @@ -694,6 +730,9 @@ void LoginDisplayHostImpl::StartPostponedWebUI() { case RESTORE_SIGN_IN: StartSignInScreen(); break; + case RESTORE_ADD_USER_INTO_SESSION: + StartUserAdding(completion_callback_); + break; default: NOTREACHED(); break; @@ -770,6 +809,10 @@ void LoginDisplayHostImpl::ResetLoginWindowAndView() { login_view_ = NULL; } +bool LoginDisplayHostImpl::IsRunningUserAdding() { + return restore_path_ == RESTORE_ADD_USER_INTO_SESSION; +} + //////////////////////////////////////////////////////////////////////////////// // external @@ -832,8 +875,8 @@ void ShowLoginWizard(const std::string& first_screen_name) { (first_screen_name.empty() && oobe_complete) || first_screen_name == chromeos::WizardController::kLoginScreenName; - chromeos::LoginDisplayHost* display_host; - display_host = new chromeos::LoginDisplayHostImpl(screen_bounds); + chromeos::LoginDisplayHost* display_host = + new chromeos::LoginDisplayHostImpl(screen_bounds); if (show_login_screen) { // R11 > R12 migration fix. See http://crosbug.com/p/4898. diff --git a/chrome/browser/chromeos/login/login_display_host_impl.h b/chrome/browser/chromeos/login/login_display_host_impl.h index 824760d..59a431f 100644 --- a/chrome/browser/chromeos/login/login_display_host_impl.h +++ b/chrome/browser/chromeos/login/login_display_host_impl.h @@ -53,7 +53,7 @@ class LoginDisplayHostImpl : public LoginDisplayHost, virtual WebUILoginView* GetWebUILoginView() const OVERRIDE; virtual views::Widget* GetWidget() const OVERRIDE; virtual void BeforeSessionStart() OVERRIDE; - virtual void OnSessionStart() OVERRIDE; + virtual void Finalize() OVERRIDE; virtual void OnCompleteLogin() OVERRIDE; virtual void OpenProxySettings() OVERRIDE; virtual void SetOobeProgressBarVisible(bool visible) OVERRIDE; @@ -64,6 +64,8 @@ class LoginDisplayHostImpl : public LoginDisplayHost, const std::string& first_screen_name, scoped_ptr<DictionaryValue> screen_parameters) OVERRIDE; virtual WizardController* GetWizardController() OVERRIDE; + virtual void StartUserAdding( + const base::Closure& completion_callback) OVERRIDE; virtual void StartSignInScreen() OVERRIDE; virtual void ResumeSignInScreen() OVERRIDE; virtual void OnPreferencesChanged() OVERRIDE; @@ -122,6 +124,9 @@ class LoginDisplayHostImpl : public LoginDisplayHost, // Closes |login_window_| and resets |login_window_| and |login_view_| fields. void ResetLoginWindowAndView(); + // Returns true if hosr running UI for adding users into session. + bool IsRunningUserAdding(); + // Used to calculate position of the screens and background. gfx::Rect background_bounds_; @@ -193,7 +198,8 @@ class LoginDisplayHostImpl : public LoginDisplayHost, enum { RESTORE_UNKNOWN, RESTORE_WIZARD, - RESTORE_SIGN_IN + RESTORE_SIGN_IN, + RESTORE_ADD_USER_INTO_SESSION, } restore_path_; // Stored parameters for StartWizard, required to restore in case of crash. @@ -204,6 +210,9 @@ class LoginDisplayHostImpl : public LoginDisplayHost, // property of the root window for |login_window_|. bool old_ignore_solo_window_frame_painter_policy_value_; + // Called before host deletion. + base::Closure completion_callback_; + DISALLOW_COPY_AND_ASSIGN(LoginDisplayHostImpl); }; diff --git a/chrome/browser/chromeos/login/login_utils.cc b/chrome/browser/chromeos/login/login_utils.cc index 6bfcb61..cc24c34 100644 --- a/chrome/browser/chromeos/login/login_utils.cc +++ b/chrome/browser/chromeos/login/login_utils.cc @@ -312,7 +312,7 @@ void LoginUtilsImpl::DoBrowserLaunch(Profile* profile, // guarantees that the message loop will be referenced by the // browser before it is dereferenced by the login host. if (login_host) - login_host->OnSessionStart(); + login_host->Finalize(); UserManager::Get()->SessionStarted(); } diff --git a/chrome/browser/chromeos/login/mock_login_display_host.h b/chrome/browser/chromeos/login/mock_login_display_host.h index 7cd5839..3d2a574 100644 --- a/chrome/browser/chromeos/login/mock_login_display_host.h +++ b/chrome/browser/chromeos/login/mock_login_display_host.h @@ -22,7 +22,7 @@ class MockLoginDisplayHost : public LoginDisplayHost { MOCK_CONST_METHOD0(GetWebUILoginView, WebUILoginView*(void)); MOCK_CONST_METHOD0(GetWidget, views::Widget*(void)); MOCK_METHOD0(BeforeSessionStart, void(void)); - MOCK_METHOD0(OnSessionStart, void(void)); + MOCK_METHOD0(Finalize, void(void)); MOCK_METHOD0(OnCompleteLogin, void(void)); MOCK_METHOD0(OpenProxySettings, void(void)); MOCK_METHOD1(SetOobeProgressBarVisible, void(bool)); @@ -37,6 +37,7 @@ class MockLoginDisplayHost : public LoginDisplayHost { virtual void StartWizard(const std::string& name, scoped_ptr<base::DictionaryValue> value) OVERRIDE; MOCK_METHOD0(GetWizardController, WizardController*(void)); + MOCK_METHOD1(StartUserAdding, void(const base::Closure&)); MOCK_METHOD0(StartSignInScreen, void(void)); MOCK_METHOD0(ResumeSignInScreen, void(void)); MOCK_METHOD0(OnPreferencesChanged, void(void)); diff --git a/chrome/browser/chromeos/login/mock_user_manager.h b/chrome/browser/chromeos/login/mock_user_manager.h index 8a15ad3..4c22b07 100644 --- a/chrome/browser/chromeos/login/mock_user_manager.h +++ b/chrome/browser/chromeos/login/mock_user_manager.h @@ -25,6 +25,7 @@ class MockUserManager : public UserManager { MOCK_METHOD0(Shutdown, void(void)); MOCK_CONST_METHOD0(GetUsers, const UserList&(void)); + MOCK_CONST_METHOD0(GetUsersAdmittedForMultiProfile, UserList(void)); MOCK_CONST_METHOD0(GetLoggedInUsers, const UserList&(void)); MOCK_METHOD0(GetLRULoggedInUsers, const UserList&(void)); MOCK_METHOD3(UserLoggedIn, void( diff --git a/chrome/browser/chromeos/login/screen_locker.cc b/chrome/browser/chromeos/login/screen_locker.cc index 3abd60b..e319b52 100644 --- a/chrome/browser/chromeos/login/screen_locker.cc +++ b/chrome/browser/chromeos/login/screen_locker.cc @@ -23,6 +23,7 @@ #include "chrome/browser/chromeos/login/authenticator.h" #include "chrome/browser/chromeos/login/login_performer.h" #include "chrome/browser/chromeos/login/login_utils.h" +#include "chrome/browser/chromeos/login/user_adding_screen.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/login/webui_screen_locker.h" #include "chrome/browser/lifetime/application_lifetime.h" @@ -59,7 +60,8 @@ const int kUnlockGuardTimeoutMs = 400; // Observer to start ScreenLocker when the screen lock class ScreenLockObserver : public chromeos::SessionManagerClient::Observer, - public content::NotificationObserver { + public content::NotificationObserver, + public chromeos::UserAddingScreen::Observer { public: ScreenLockObserver() : session_started_(false) { registrar_.Add(this, @@ -96,6 +98,12 @@ class ScreenLockObserver : public chromeos::SessionManagerClient::Observer, virtual void LockScreen() OVERRIDE { VLOG(1) << "Received LockScreen D-Bus signal from session manager"; + if (chromeos::UserAddingScreen::Get()->IsRunning()) { + VLOG(1) << "Waiting for user adding screen to stop"; + chromeos::UserAddingScreen::Get()->AddObserver(this); + chromeos::UserAddingScreen::Get()->Cancel(); + return; + } if (session_started_ && chromeos::UserManager::Get()->CanCurrentUserLock()) { chromeos::ScreenLocker::Show(); @@ -116,6 +124,11 @@ class ScreenLockObserver : public chromeos::SessionManagerClient::Observer, chromeos::ScreenLocker::Hide(); } + virtual void OnUserAddingFinished() OVERRIDE { + chromeos::UserAddingScreen::Get()->RemoveObserver(this); + LockScreen(); + } + private: bool session_started_; content::NotificationRegistrar registrar_; diff --git a/chrome/browser/chromeos/login/user_adding_screen.cc b/chrome/browser/chromeos/login/user_adding_screen.cc new file mode 100644 index 0000000..f4654e8 --- /dev/null +++ b/chrome/browser/chromeos/login/user_adding_screen.cc @@ -0,0 +1,96 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login/user_adding_screen.h" + +#include "base/bind.h" +#include "base/memory/singleton.h" +#include "base/observer_list.h" +#include "chrome/browser/chromeos/login/helper.h" +#include "chrome/browser/chromeos/login/login_display_host_impl.h" +#include "ui/gfx/rect.h" +#include "ui/gfx/size.h" + +namespace chromeos { + +namespace { + +class UserAddingScreenImpl : public UserAddingScreen { + public: + virtual void Start() OVERRIDE; + virtual void Cancel() OVERRIDE; + virtual bool IsRunning() OVERRIDE; + + virtual void AddObserver(Observer* observer) OVERRIDE; + virtual void RemoveObserver(Observer* observer) OVERRIDE; + + static UserAddingScreenImpl* GetInstance(); + private: + friend struct DefaultSingletonTraits<UserAddingScreenImpl>; + + void OnDisplayHostCompletion(); + + UserAddingScreenImpl(); + virtual ~UserAddingScreenImpl(); + + ObserverList<Observer> observers_; + LoginDisplayHost* display_host_; +}; + +void UserAddingScreenImpl::Start() { + CHECK(!IsRunning()); + gfx::Rect screen_bounds(chromeos::CalculateScreenBounds(gfx::Size())); + display_host_ = new chromeos::LoginDisplayHostImpl(screen_bounds); + display_host_->StartUserAdding( + base::Bind(&UserAddingScreenImpl::OnDisplayHostCompletion, + base::Unretained(this))); + FOR_EACH_OBSERVER(Observer, observers_, OnUserAddingStarted()); +} + +void UserAddingScreenImpl::Cancel() { + CHECK(IsRunning()); + display_host_->Finalize(); +} + +bool UserAddingScreenImpl::IsRunning() { + return display_host_ != NULL; +} + +void UserAddingScreenImpl::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void UserAddingScreenImpl::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +void UserAddingScreenImpl::OnDisplayHostCompletion() { + CHECK(IsRunning()); + display_host_ = NULL; + FOR_EACH_OBSERVER(Observer, observers_, OnUserAddingFinished()); +} + +// static +UserAddingScreenImpl* UserAddingScreenImpl::GetInstance() { + return Singleton<UserAddingScreenImpl>::get(); +} + +UserAddingScreenImpl::UserAddingScreenImpl() + : display_host_(NULL) { +} + +UserAddingScreenImpl::~UserAddingScreenImpl() { +} + +} // anonymous namespace + +UserAddingScreen::UserAddingScreen() {} +UserAddingScreen::~UserAddingScreen() {} + +UserAddingScreen* UserAddingScreen::Get() { + return UserAddingScreenImpl::GetInstance(); +} + +} // namespace chromeos + diff --git a/chrome/browser/chromeos/login/user_adding_screen.h b/chrome/browser/chromeos/login/user_adding_screen.h new file mode 100644 index 0000000..fade53b --- /dev/null +++ b/chrome/browser/chromeos/login/user_adding_screen.h @@ -0,0 +1,42 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_USER_ADDING_SCREEN_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_USER_ADDING_SCREEN_H_ + +#include "base/basictypes.h" + +namespace chromeos { + +// An interface that defines screen for adding users into multi-profile session. +// Current implementation is a singleton. +// TODO(dzhioev): get rid of singleton. +class UserAddingScreen { + public: + struct Observer { + virtual void OnUserAddingStarted() {} + virtual void OnUserAddingFinished() {} + virtual ~Observer() {} + }; + + static UserAddingScreen* Get(); + + virtual void Start() = 0; + virtual void Cancel() = 0; + virtual bool IsRunning() = 0; + + virtual void AddObserver(Observer* observer) = 0; + virtual void RemoveObserver(Observer* observer) = 0; + + protected: + UserAddingScreen(); + virtual ~UserAddingScreen(); + + DISALLOW_COPY_AND_ASSIGN(UserAddingScreen); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_USER_ADDING_SCREEN_H_ + diff --git a/chrome/browser/chromeos/login/user_manager.h b/chrome/browser/chromeos/login/user_manager.h index a7a1a02..69780d7 100644 --- a/chrome/browser/chromeos/login/user_manager.h +++ b/chrome/browser/chromeos/login/user_manager.h @@ -110,6 +110,9 @@ class UserManager { // is sorted by last login date with the most recent user at the beginning. virtual const UserList& GetUsers() const = 0; + // Returns list of users admitted for logging in into multiprofile session. + virtual UserList GetUsersAdmittedForMultiProfile() const = 0; + // Returns a list of users who are currently logged in. virtual const UserList& GetLoggedInUsers() const = 0; diff --git a/chrome/browser/chromeos/login/user_manager_impl.cc b/chrome/browser/chromeos/login/user_manager_impl.cc index 32ff174..5b43372 100644 --- a/chrome/browser/chromeos/login/user_manager_impl.cc +++ b/chrome/browser/chromeos/login/user_manager_impl.cc @@ -242,6 +242,16 @@ const UserList& UserManagerImpl::GetUsers() const { return users_; } +UserList UserManagerImpl::GetUsersAdmittedForMultiProfile() const { + UserList result; + const UserList& users = GetUsers(); + for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { + if ((*it)->GetType() == User::USER_TYPE_REGULAR && !(*it)->is_logged_in()) + result.push_back(*it); + } + return result; +} + const UserList& UserManagerImpl::GetLoggedInUsers() const { return logged_in_users_; } diff --git a/chrome/browser/chromeos/login/user_manager_impl.h b/chrome/browser/chromeos/login/user_manager_impl.h index a8c76ba..661a6e5 100644 --- a/chrome/browser/chromeos/login/user_manager_impl.h +++ b/chrome/browser/chromeos/login/user_manager_impl.h @@ -52,6 +52,7 @@ class UserManagerImpl virtual void Shutdown() OVERRIDE; virtual UserImageManager* GetUserImageManager() OVERRIDE; virtual const UserList& GetUsers() const OVERRIDE; + virtual UserList GetUsersAdmittedForMultiProfile() const OVERRIDE; virtual const UserList& GetLoggedInUsers() const OVERRIDE; virtual const UserList& GetLRULoggedInUsers() OVERRIDE; virtual void UserLoggedIn(const std::string& email, diff --git a/chrome/browser/chromeos/login/webui_login_display.cc b/chrome/browser/chromeos/login/webui_login_display.cc index e72d467..3a6ff08 100644 --- a/chrome/browser/chromeos/login/webui_login_display.cc +++ b/chrome/browser/chromeos/login/webui_login_display.cc @@ -8,6 +8,7 @@ #include "chrome/browser/chromeos/accessibility/accessibility_util.h" #include "chrome/browser/chromeos/login/login_display_host_impl.h" #include "chrome/browser/chromeos/login/screen_locker.h" +#include "chrome/browser/chromeos/login/user_adding_screen.h" #include "chrome/browser/chromeos/login/wallpaper_manager.h" #include "chrome/browser/chromeos/login/webui_login_view.h" #include "chrome/browser/profiles/profile_manager.h" @@ -220,6 +221,14 @@ void WebUILoginDisplay::CancelPasswordChangedFlow() { delegate_->CancelPasswordChangedFlow(); } +void WebUILoginDisplay::CancelUserAdding() { + if (!UserAddingScreen::Get()->IsRunning()) { + LOG(ERROR) << "User adding screen not running."; + return; + } + UserAddingScreen::Get()->Cancel(); +} + void WebUILoginDisplay::CreateAccount() { DCHECK(delegate_); if (delegate_) diff --git a/chrome/browser/chromeos/login/webui_login_display.h b/chrome/browser/chromeos/login/webui_login_display.h index 27e8390..725da77 100644 --- a/chrome/browser/chromeos/login/webui_login_display.h +++ b/chrome/browser/chromeos/login/webui_login_display.h @@ -54,6 +54,7 @@ class WebUILoginDisplay : public LoginDisplay, // SigninScreenHandlerDelegate implementation: virtual void CancelPasswordChangedFlow() OVERRIDE; + virtual void CancelUserAdding() OVERRIDE; virtual void CreateAccount() OVERRIDE; virtual void CompleteLogin(const UserContext& user_context) OVERRIDE; virtual void Login(const UserContext& user_context) OVERRIDE; diff --git a/chrome/browser/chromeos/login/webui_screen_locker.cc b/chrome/browser/chromeos/login/webui_screen_locker.cc index 9c24f79..3f3188b 100644 --- a/chrome/browser/chromeos/login/webui_screen_locker.cc +++ b/chrome/browser/chromeos/login/webui_screen_locker.cc @@ -35,7 +35,7 @@ namespace { // URL which corresponds to the login WebUI. -const char kLoginURL[] = "chrome://oobe/login"; +const char kLoginURL[] = "chrome://oobe/login#lock"; } // namespace diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc index 99719ee..33854c8c 100644 --- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc +++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc @@ -59,6 +59,7 @@ #include "chrome/browser/chromeos/login/login_wizard.h" #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/user.h" +#include "chrome/browser/chromeos/login/user_adding_screen.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/mobile_config.h" #include "chrome/browser/chromeos/options/network_config_view.h" @@ -585,25 +586,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, if (UserManager::Get()->GetLoggedInUsers().size() >= 3) return; - // Check whether there're regular users on the list that are not - // currently logged in. - const UserList& users = UserManager::Get()->GetUsers(); - bool has_regular_not_logged_in_users = false; - for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { - const User* user = (*it); - if (user->GetType() == User::USER_TYPE_REGULAR && - !user->is_logged_in()) { - has_regular_not_logged_in_users = true; - break; - } - } - // Launch sign in screen to add another user to current session. - if (has_regular_not_logged_in_users) { - ash::Shell::GetInstance()-> - desktop_background_controller()->MoveDesktopToLockedContainer(); - ShowLoginWizard(std::string()); - } + if (UserManager::Get()->GetUsersAdmittedForMultiProfile().size()) + UserAddingScreen::Get()->Start(); } virtual void ShutDown() OVERRIDE { diff --git a/chrome/browser/resources/chromeos/login/display_manager.js b/chrome/browser/resources/chromeos/login/display_manager.js index 10b57f1..9988cb4 100644 --- a/chrome/browser/resources/chromeos/login/display_manager.js +++ b/chrome/browser/resources/chromeos/login/display_manager.js @@ -505,7 +505,7 @@ cr.define('cr.ui.login', function() { */ isSignInToAddScreen: function() { return document.documentElement.getAttribute('screen') == - 'login-add-user'; + 'user-adding'; }, /** @@ -527,6 +527,17 @@ cr.define('cr.ui.login', function() { * Initializes display manager. */ DisplayManager.initialize = function() { + // Extracting screen type from URL. + var hash = window.location.hash; + var screenType; + if (!hash) { + console.error('Screen type not found. Setting default value "login".'); + screenType = 'login'; + } else { + screenType = hash.substring(1); + } + document.documentElement.setAttribute('screen', screenType); + var link = $('enterprise-info-hint-link'); link.addEventListener( 'click', DisplayManager.handleEnterpriseHintLinkClick); diff --git a/chrome/browser/resources/chromeos/login/header_bar.css b/chrome/browser/resources/chromeos/login/header_bar.css index 7dd5d44..55f4ac5 100644 --- a/chrome/browser/resources/chromeos/login/header_bar.css +++ b/chrome/browser/resources/chromeos/login/header_bar.css @@ -69,7 +69,8 @@ html[dir=rtl] .header-bar-item { #login-header-bar #shutdown-button, #login-header-bar #add-user-button, -#login-header-bar #guest-user-button { +#login-header-bar #guest-user-button, +#login-header-bar #cancel-multiple-sign-in-button { -webkit-padding-start: 24px; background-position: left center; background-repeat: no-repeat; @@ -78,7 +79,8 @@ html[dir=rtl] .header-bar-item { html[dir=rtl] #login-header-bar #shutdown-button, html[dir=rtl] #login-header-bar #add-user-button, -html[dir=rtl] #login-header-bar #guest-user-button { +html[dir=rtl] #login-header-bar #guest-user-button, +html[dir=rtl] #login-header-bar #cancel-multiple-sign-in-button { background-position: right center; } @@ -94,6 +96,11 @@ html[dir=rtl] #login-header-bar #guest-user-button { background-image: url('chrome://theme/IDR_ICON_GUEST_WHITE'); } +#login-header-bar #cancel-multiple-sign-in-button { + /* TODO(dzhioev): replace with appropriate image when possible. */ + background-image: url('chrome://theme/IDR_PANEL_CLOSE'); +} + .button-restricted { border: 1px solid transparent; color: white !important; diff --git a/chrome/browser/resources/chromeos/login/header_bar.html b/chrome/browser/resources/chromeos/login/header_bar.html index cfa6b42..f54dbf3 100644 --- a/chrome/browser/resources/chromeos/login/header_bar.html +++ b/chrome/browser/resources/chromeos/login/header_bar.html @@ -21,4 +21,9 @@ <button id="sign-out-user-button" class="custom-appearance" i18n-content="signOutUser"></button> </div> + <div id="cancel-multiple-sign-in-item" class="header-bar-item" hidden> + <button id="cancel-multiple-sign-in-button" class="custom-appearance" + i18n-content="cancelUserAdding"></button> + </button> + </div> </div> diff --git a/chrome/browser/resources/chromeos/login/header_bar.js b/chrome/browser/resources/chromeos/login/header_bar.js index abffe5f..2ec8d33 100644 --- a/chrome/browser/resources/chromeos/login/header_bar.js +++ b/chrome/browser/resources/chromeos/login/header_bar.js @@ -42,9 +42,11 @@ cr.define('login', function() { this.handleGuestClick_); $('sign-out-user-button').addEventListener('click', this.handleSignoutClick_); + $('cancel-multiple-sign-in-button').addEventListener('click', + this.handleCancelMultipleSignInClick_); if (loadTimeData.getBoolean('enableAppMode') && - loadTimeData.getString('screenType') == 'login') { + document.documentElement.getAttribute('screen') == 'login') { login.AppsMenuButton.decorate($('show-apps-button')); } }, @@ -131,6 +133,15 @@ cr.define('login', function() { }, /** + * Cancel user adding button handler. + * @private + */ + handleCancelMultipleSignInClick_: function(e) { + chrome.send('cancelUserAdding'); + e.stopPropagation(); + }, + + /** * If true then "Browse as Guest" button is shown. * @type {boolean} */ @@ -195,6 +206,7 @@ cr.define('login', function() { $('add-user-button').hidden && $('cancel-add-user-button').hidden; $('apps-header-bar-item').hidden = !this.hasApps_ || (!gaiaIsActive && !accountPickerIsActive); + $('cancel-multiple-sign-in-item').hidden = !isMultiProfilesUI; if (!$('apps-header-bar-item').hidden) $('show-apps-button').didShow(); diff --git a/chrome/browser/resources/chromeos/login/login.html b/chrome/browser/resources/chromeos/login/login.html index 3b7ae69..1fc8888 100644 --- a/chrome/browser/resources/chromeos/login/login.html +++ b/chrome/browser/resources/chromeos/login/login.html @@ -1,5 +1,5 @@ <!DOCTYPE HTML> -<html i18n-values="dir:textdirection;screen:screenType;lockanimations:lockAnimationsType;build:buildType"> +<html i18n-values="dir:textdirection;lockanimations:lockAnimationsType;build:buildType"> <head> <title i18n-content="title"></title> <include src="login_resources.html"> diff --git a/chrome/browser/resources/chromeos/login/oobe.html b/chrome/browser/resources/chromeos/login/oobe.html index e0116e2..091dafd 100644 --- a/chrome/browser/resources/chromeos/login/oobe.html +++ b/chrome/browser/resources/chromeos/login/oobe.html @@ -1,5 +1,5 @@ <!DOCTYPE HTML> -<html i18n-values="dir:textdirection;screen:screenType;lockanimations:lockAnimationsType;build:buildType;highlight:highlightStrength"> +<html i18n-values="dir:textdirection;lockanimations:lockAnimationsType;build:buildType;highlight:highlightStrength"> <head> <title i18n-content="title"></title> <include src="login_resources.html"> diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index c103fa4..7fdd444 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc @@ -330,21 +330,6 @@ void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) { localized_strings->SetString("bootIntoWallpaper", "off"); } - // TODO(nkostylev): Make sure that only one type of login UI - // is active at a time. - // OobeUI is used for these use cases: - // 1. Out-of-box / login - // 2. Lock screen. - // 3. Multi-profiles sign in (add user to current session). - if (LoginDisplayHostImpl::default_host()) { - if (!UserManager::Get()->IsUserLoggedIn()) - localized_strings->SetString("screenType", "login"); - else - localized_strings->SetString("screenType", "login-add-user"); - } else { - localized_strings->SetString("screenType", "lock"); - } - bool keyboard_driven_oobe = false; system::StatisticsProvider::GetInstance()->GetMachineFlag( chromeos::kOemKeyboardDrivenOobeKey, &keyboard_driven_oobe); diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index e7df985..2bcf094 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc @@ -381,6 +381,7 @@ void SigninScreenHandler::DeclareLocalizedValues( builder->Add("signinButton", IDS_LOGIN_BUTTON); builder->Add("shutDown", IDS_SHUTDOWN_BUTTON); builder->Add("addUser", IDS_ADD_USER_BUTTON); + builder->Add("cancelUserAdding", IDS_CANCEL_USER_ADDING); builder->Add("browseAsGuest", IDS_GO_INCOGNITO_BUTTON); builder->Add("cancel", IDS_CANCEL); builder->Add("signOutUser", IDS_SCREEN_LOCK_SIGN_OUT); @@ -786,6 +787,8 @@ void SigninScreenHandler::RegisterMessages() { AddCallback("loginVisible", &SigninScreenHandler::HandleLoginVisible); AddCallback("cancelPasswordChangedFlow", &SigninScreenHandler::HandleCancelPasswordChangedFlow); + AddCallback("cancelUserAdding", + &SigninScreenHandler::HandleCancelUserAdding); AddCallback("migrateUserData", &SigninScreenHandler::HandleMigrateUserData); AddCallback("resyncUserData", &SigninScreenHandler::HandleResyncUserData); AddCallback("loginUIStateChanged", @@ -1429,6 +1432,11 @@ void SigninScreenHandler::HandleCancelPasswordChangedFlow() { weak_factory_.GetWeakPtr())); } +void SigninScreenHandler::HandleCancelUserAdding() { + if (delegate_) + delegate_->CancelUserAdding(); +} + void SigninScreenHandler::HandleMigrateUserData( const std::string& old_password) { if (delegate_) diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index 2c2d730..143cbcd 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h @@ -72,6 +72,9 @@ class SigninScreenHandlerDelegate { // Cancels current password changed flow. virtual void CancelPasswordChangedFlow() = 0; + // Cancels user adding. + virtual void CancelUserAdding() = 0; + // Create a new Google account. virtual void CreateAccount() = 0; @@ -309,6 +312,7 @@ class SigninScreenHandler void HandleOpenProxySettings(); void HandleLoginVisible(const std::string& source); void HandleCancelPasswordChangedFlow(); + void HandleCancelUserAdding(); void HandleMigrateUserData(const std::string& password); void HandleResyncUserData(); void HandleLoginUIStateChanged(const std::string& source, bool new_value); diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index 4c71d489..b4a7b20 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi @@ -517,6 +517,8 @@ 'browser/chromeos/login/tpm_password_fetcher.h', 'browser/chromeos/login/user.cc', 'browser/chromeos/login/user.h', + 'browser/chromeos/login/user_adding_screen.cc', + 'browser/chromeos/login/user_adding_screen.h', 'browser/chromeos/login/user_image.cc', 'browser/chromeos/login/user_image.h', 'browser/chromeos/login/user_image_loader.cc', diff --git a/chrome/test/data/chromeos/oobe_webui_browsertest.js b/chrome/test/data/chromeos/oobe_webui_browsertest.js index 6e9ed92d..eacbeba 100644 --- a/chrome/test/data/chromeos/oobe_webui_browsertest.js +++ b/chrome/test/data/chromeos/oobe_webui_browsertest.js @@ -17,7 +17,7 @@ function OobeWebUITest() {} OobeWebUITest.prototype = { __proto__: testing.Test.prototype, - browsePreload: 'chrome://oobe', + browsePreload: 'chrome://oobe#login', isAsync: false }; |