summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/chromeos_strings.grdp3
-rw-r--r--chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc2
-rw-r--r--chrome/browser/chromeos/login/login_display_host.h10
-rw-r--r--chrome/browser/chromeos/login/login_display_host_impl.cc59
-rw-r--r--chrome/browser/chromeos/login/login_display_host_impl.h13
-rw-r--r--chrome/browser/chromeos/login/login_utils.cc2
-rw-r--r--chrome/browser/chromeos/login/mock_login_display_host.h3
-rw-r--r--chrome/browser/chromeos/login/mock_user_manager.h1
-rw-r--r--chrome/browser/chromeos/login/screen_locker.cc15
-rw-r--r--chrome/browser/chromeos/login/user_adding_screen.cc96
-rw-r--r--chrome/browser/chromeos/login/user_adding_screen.h42
-rw-r--r--chrome/browser/chromeos/login/user_manager.h3
-rw-r--r--chrome/browser/chromeos/login/user_manager_impl.cc10
-rw-r--r--chrome/browser/chromeos/login/user_manager_impl.h1
-rw-r--r--chrome/browser/chromeos/login/webui_login_display.cc9
-rw-r--r--chrome/browser/chromeos/login/webui_login_display.h1
-rw-r--r--chrome/browser/chromeos/login/webui_screen_locker.cc2
-rw-r--r--chrome/browser/chromeos/system/ash_system_tray_delegate.cc21
-rw-r--r--chrome/browser/resources/chromeos/login/display_manager.js13
-rw-r--r--chrome/browser/resources/chromeos/login/header_bar.css11
-rw-r--r--chrome/browser/resources/chromeos/login/header_bar.html5
-rw-r--r--chrome/browser/resources/chromeos/login/header_bar.js14
-rw-r--r--chrome/browser/resources/chromeos/login/login.html2
-rw-r--r--chrome/browser/resources/chromeos/login/oobe.html2
-rw-r--r--chrome/browser/ui/webui/chromeos/login/oobe_ui.cc15
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc8
-rw-r--r--chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h4
-rw-r--r--chrome/chrome_browser_chromeos.gypi2
-rw-r--r--chrome/test/data/chromeos/oobe_webui_browsertest.js2
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
};