Commit e451bac2 authored by avayvod@chromium.org's avatar avayvod@chromium.org

Revert 71313 - Removed old login screen from source.

Deleted kEnableLoginImages flag.

BUG=chromium-os:7214
TEST=Old login screen should not show up even under automation tests for login.

Review URL: http://codereview.chromium.org/5809001

TBR=avayvod@chromium.org

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71637 0039d316-1c4b-4281-b951-d872f2087c98
parent 096c7519
...@@ -5,18 +5,23 @@ ...@@ -5,18 +5,23 @@
#include "chrome/browser/automation/automation_provider.h" #include "chrome/browser/automation/automation_provider.h"
#include "chrome/browser/automation/automation_provider_observers.h" #include "chrome/browser/automation/automation_provider_observers.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h" #include "chrome/browser/chromeos/login/login_screen.h"
#include "chrome/browser/chromeos/login/user_manager.h"
using chromeos::ExistingUserController; #include "chrome/browser/chromeos/login/wizard_controller.h"
#include "views/window/window_gtk.h"
void AutomationProvider::LoginWithUserAndPass(const std::string& username, void AutomationProvider::LoginWithUserAndPass(const std::string& username,
const std::string& password, const std::string& password,
IPC::Message* reply_message) { IPC::Message* reply_message) {
ExistingUserController* controller = WizardController* controller = WizardController::default_controller();
ExistingUserController::current_controller(); chromeos::NewUserView* new_user_view =
controller->GetLoginScreen()->view();
new_user_view->SetUsername(username);
new_user_view->SetPassword(password);
// Set up an observer (it will delete itself). // Set up an observer (it will delete itself).
new LoginManagerObserver(this, reply_message); new LoginManagerObserver(this, reply_message);
controller->LoginNewUser(username, password); new_user_view->Login();
} }
...@@ -117,7 +117,7 @@ void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) { ...@@ -117,7 +117,7 @@ void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) {
} // namespace } // namespace
ExistingUserController* ExistingUserController*
ExistingUserController::current_controller_ = NULL; ExistingUserController::delete_scheduled_instance_ = NULL;
// TODO(xiyuan): Wait for the cached settings update before using them. // TODO(xiyuan): Wait for the cached settings update before using them.
ExistingUserController::ExistingUserController( ExistingUserController::ExistingUserController(
...@@ -131,9 +131,8 @@ ExistingUserController::ExistingUserController( ...@@ -131,9 +131,8 @@ ExistingUserController::ExistingUserController(
bubble_(NULL), bubble_(NULL),
user_settings_(new UserCrosSettingsProvider), user_settings_(new UserCrosSettingsProvider),
method_factory_(this) { method_factory_(this) {
if (current_controller_) if (delete_scheduled_instance_)
current_controller_->Delete(); delete_scheduled_instance_->Delete();
current_controller_ = this;
// Calculate the max number of users from available screen size. // Calculate the max number of users from available screen size.
bool show_guest = UserCrosSettingsProvider::cached_allow_guest(); bool show_guest = UserCrosSettingsProvider::cached_allow_guest();
...@@ -248,11 +247,10 @@ ExistingUserController::~ExistingUserController() { ...@@ -248,11 +247,10 @@ ExistingUserController::~ExistingUserController() {
STLDeleteElements(&controllers_); STLDeleteElements(&controllers_);
STLDeleteElements(&invisible_controllers_); STLDeleteElements(&invisible_controllers_);
DCHECK(current_controller_ != NULL);
current_controller_ = NULL;
} }
void ExistingUserController::Delete() { void ExistingUserController::Delete() {
delete_scheduled_instance_ = NULL;
delete this; delete this;
} }
...@@ -290,10 +288,7 @@ void ExistingUserController::Login(UserController* source, ...@@ -290,10 +288,7 @@ void ExistingUserController::Login(UserController* source,
// Use the same LoginPerformer for subsequent login as it has state // Use the same LoginPerformer for subsequent login as it has state
// such as CAPTCHA challenge token & corresponding user input. // such as CAPTCHA challenge token & corresponding user input.
if (!login_performer_.get() || num_login_attempts_ <= 1) { if (!login_performer_.get() || num_login_attempts_ <= 1) {
LoginPerformer::Delegate* delegate = this; login_performer_.reset(new LoginPerformer(this));
if (login_performer_delegate_.get())
delegate = login_performer_delegate_.get();
login_performer_.reset(new LoginPerformer(delegate));
} }
login_performer_->Login(controllers_[selected_view_index_]->user().email(), login_performer_->Login(controllers_[selected_view_index_]->user().email(),
UTF16ToUTF8(password)); UTF16ToUTF8(password));
...@@ -366,6 +361,11 @@ void ExistingUserController::ActivateWizard(const std::string& screen_name) { ...@@ -366,6 +361,11 @@ void ExistingUserController::ActivateWizard(const std::string& screen_name) {
controller->set_start_url(start_url_); controller->set_start_url(start_url_);
controller->Show(); controller->Show();
// And schedule us for deletion. We delay for a second as the window manager
// is doing an animation with our windows.
DCHECK(!delete_scheduled_instance_);
delete_scheduled_instance_ = this;
delete_timer_.Start(base::TimeDelta::FromSeconds(1), this, delete_timer_.Start(base::TimeDelta::FromSeconds(1), this,
&ExistingUserController::Delete); &ExistingUserController::Delete);
} }
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/wm_message_listener.h" #include "chrome/browser/chromeos/wm_message_listener.h"
#include "gfx/size.h" #include "gfx/size.h"
#include "testing/gtest/include/gtest/gtest_prod.h"
namespace chromeos { namespace chromeos {
...@@ -51,11 +50,6 @@ class ExistingUserController : public WmMessageListener::Observer, ...@@ -51,11 +50,6 @@ class ExistingUserController : public WmMessageListener::Observer,
ExistingUserController(const std::vector<UserManager::User>& users, ExistingUserController(const std::vector<UserManager::User>& users,
const gfx::Rect& background_bounds); const gfx::Rect& background_bounds);
// Returns the current existing user controller if it has been created.
static ExistingUserController* current_controller() {
return current_controller_;
}
// Creates and shows the appropriate set of windows. // Creates and shows the appropriate set of windows.
void Init(); void Init();
...@@ -72,7 +66,6 @@ class ExistingUserController : public WmMessageListener::Observer, ...@@ -72,7 +66,6 @@ class ExistingUserController : public WmMessageListener::Observer,
private: private:
friend class DeleteTask<ExistingUserController>; friend class DeleteTask<ExistingUserController>;
friend class MockLoginPerformerDelegate;
~ExistingUserController(); ~ExistingUserController();
...@@ -136,10 +129,6 @@ class ExistingUserController : public WmMessageListener::Observer, ...@@ -136,10 +129,6 @@ class ExistingUserController : public WmMessageListener::Observer,
// Send message to window manager to enable/disable click on other windows. // Send message to window manager to enable/disable click on other windows.
void SendSetLoginState(bool is_login); void SendSetLoginState(bool is_login);
void set_login_performer_delegate(LoginPerformer::Delegate* d) {
login_performer_delegate_.reset(d);
}
// Bounds of the background window. // Bounds of the background window.
const gfx::Rect background_bounds_; const gfx::Rect background_bounds_;
...@@ -156,10 +145,6 @@ class ExistingUserController : public WmMessageListener::Observer, ...@@ -156,10 +145,6 @@ class ExistingUserController : public WmMessageListener::Observer,
// Used to execute login operations. // Used to execute login operations.
scoped_ptr<LoginPerformer> login_performer_; scoped_ptr<LoginPerformer> login_performer_;
// Delegate for login performer to be overridden by tests.
// |this| is used if |login_performer_delegate_| is NULL.
scoped_ptr<LoginPerformer::Delegate> login_performer_delegate_;
// Index of selected view (user). // Index of selected view (user).
size_t selected_view_index_; size_t selected_view_index_;
...@@ -170,9 +155,9 @@ class ExistingUserController : public WmMessageListener::Observer, ...@@ -170,9 +155,9 @@ class ExistingUserController : public WmMessageListener::Observer,
// See comment in ProcessWmMessage. // See comment in ProcessWmMessage.
base::OneShotTimer<ExistingUserController> delete_timer_; base::OneShotTimer<ExistingUserController> delete_timer_;
// Pointer to the current instance of the controller to be used by // Pointer to the instance that was scheduled to be deleted soon or NULL
// automation tests. // if there is no such instance.
static ExistingUserController* current_controller_; static ExistingUserController* delete_scheduled_instance_;
// Pointer to shown message bubble. We don't need to delete it because // Pointer to shown message bubble. We don't need to delete it because
// it will be deleted on bubble closing. // it will be deleted on bubble closing.
...@@ -190,8 +175,6 @@ class ExistingUserController : public WmMessageListener::Observer, ...@@ -190,8 +175,6 @@ class ExistingUserController : public WmMessageListener::Observer,
// Factory of callbacks. // Factory of callbacks.
ScopedRunnableMethodFactory<ExistingUserController> method_factory_; ScopedRunnableMethodFactory<ExistingUserController> method_factory_;
FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, NewUserLogin);
DISALLOW_COPY_AND_ASSIGN(ExistingUserController); DISALLOW_COPY_AND_ASSIGN(ExistingUserController);
}; };
......
// Copyright (c) 2010 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/login_screen.h"
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
#include "base/callback.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/process_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_thread.h"
#include "chrome/browser/chromeos/boot_times_loader.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/login/authentication_notification_details.h"
#include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/login/login_utils.h"
#include "chrome/browser/chromeos/login/message_bubble.h"
#include "chrome/browser/chromeos/login/screen_observer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
namespace chromeos {
LoginScreen::LoginScreen(WizardScreenDelegate* delegate)
: ViewScreen<NewUserView>(delegate,
kNewUserPodFullWidth, kNewUserPodFullHeight),
bubble_(NULL),
authenticator_(NULL) {
if (CrosLibrary::Get()->EnsureLoaded()) {
authenticator_ = LoginUtils::Get()->CreateAuthenticator(this);
}
}
LoginScreen::~LoginScreen() {
ClearErrors();
}
NewUserView* LoginScreen::AllocateView() {
return new NewUserView(this, true, true);
}
void LoginScreen::OnLogin(const std::string& username,
const std::string& password) {
BootTimesLoader::Get()->RecordLoginAttempted();
Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile();
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(authenticator_.get(),
&Authenticator::AuthenticateToLogin,
profile, username, password,
std::string(), std::string()));
}
void LoginScreen::OnLoginOffTheRecord() {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableMethod(authenticator_.get(),
&Authenticator::LoginOffTheRecord));
}
void LoginScreen::OnCreateAccount() {
delegate()->GetObserver(this)->OnExit(ScreenObserver::LOGIN_CREATE_ACCOUNT);
}
void LoginScreen::ClearErrors() {
// bubble_ will be set to NULL in InfoBubbleClosing callback.
if (bubble_)
bubble_->Close();
}
void LoginScreen::OnLoginFailure(const LoginFailure& failure) {
const std::string error = failure.GetErrorString();
VLOG(1) << "LoginManagerView: OnLoginFailure() " << error;
NetworkLibrary* network = CrosLibrary::Get()->GetNetworkLibrary();
// Check networking after trying to login in case user is
// cached locally or the local admin account.
if (!network || !CrosLibrary::Get()->EnsureLoaded()) {
ShowError(IDS_LOGIN_ERROR_NO_NETWORK_LIBRARY, error);
} else if (!network->Connected()) {
ShowError(IDS_LOGIN_ERROR_OFFLINE_FAILED_NETWORK_NOT_CONNECTED, error);
} else {
ShowError(IDS_LOGIN_ERROR_AUTHENTICATING_NEW, error);
}
view()->ClearAndFocusPassword();
view()->EnableInputControls(true);
}
void LoginScreen::OnLoginSuccess(
const std::string& username,
const std::string& password,
const GaiaAuthConsumer::ClientLoginResult& credentials,
bool pending_requests) {
delegate()->GetObserver(this)->OnExit(ScreenObserver::LOGIN_SIGN_IN_SELECTED);
AppendStartUrlToCmdline();
LoginUtils::Get()->CompleteLogin(username,
password,
credentials,
pending_requests);
}
void LoginScreen::OnOffTheRecordLoginSuccess() {
LoginUtils::Get()->CompleteOffTheRecordLogin(start_url_);
}
void LoginScreen::OnHelpLinkActivated() {
AddStartUrl(GetAccountRecoveryHelpUrl());
OnLoginOffTheRecord();
}
void LoginScreen::AppendStartUrlToCmdline() {
if (start_url_.is_valid())
CommandLine::ForCurrentProcess()->AppendArg(start_url_.spec());
}
void LoginScreen::ShowError(int error_id, const std::string& details) {
ClearErrors();
std::wstring error_text = UTF16ToWide(l10n_util::GetStringUTF16(error_id));
// TODO(dpolukhin): show detailed error info. |details| string contains
// low level error info that is not localized and even is not user friendly.
// For now just ignore it because error_text contains all required information
// for end users, developers can see details string in Chrome logs.
bubble_ = MessageBubble::Show(
view()->GetWidget(),
view()->GetPasswordBounds(),
BubbleBorder::LEFT_TOP,
ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_WARNING),
error_text,
UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANT_ACCESS_ACCOUNT_BUTTON)),
this);
}
} // namespace chromeos
// Copyright (c) 2010 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_LOGIN_SCREEN_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_SCREEN_H_
#pragma once
#include <string>
#include "base/ref_counted.h"
#include "chrome/browser/chromeos/login/authenticator.h"
#include "chrome/browser/chromeos/login/login_status_consumer.h"
#include "chrome/browser/chromeos/login/message_bubble.h"
#include "chrome/browser/chromeos/login/new_user_view.h"
#include "chrome/browser/chromeos/login/view_screen.h"
namespace chromeos {
class MessageBubble;
// This screen is obsolete, used only on test images. http://crosbug.com/7214
// TODO(nkostylev): Use ExistingUserController sign in screen for test images.
class LoginScreen : public ViewScreen<NewUserView>,
public NewUserView::Delegate,
public LoginStatusConsumer,
public MessageBubbleDelegate {
public:
explicit LoginScreen(WizardScreenDelegate* delegate);
virtual ~LoginScreen();
bool IsErrorShown() {
return bubble_ != NULL;
}
// NewUserView::Delegate:
virtual void OnLogin(const std::string& username,
const std::string& password);
virtual void OnLoginOffTheRecord();
virtual void OnCreateAccount();
virtual void AddStartUrl(const GURL& start_url) { start_url_ = start_url; }
virtual void ClearErrors();
virtual void NavigateAway() {}
virtual void SetStatusAreaEnabled(bool enable) {}
// Overridden from LoginStatusConsumer.
virtual void OnLoginFailure(const LoginFailure& error);
virtual void OnLoginSuccess(
const std::string& username,
const std::string& password,
const GaiaAuthConsumer::ClientLoginResult& credentials,
bool pending_requests);
virtual void OnOffTheRecordLoginSuccess();
// Overridden from views::InfoBubbleDelegate.
virtual void InfoBubbleClosing(InfoBubble* info_bubble,
bool closed_by_escape) {
bubble_ = NULL;
}
virtual bool CloseOnEscape() { return true; }
virtual bool FadeInOnShow() { return false; }
virtual void OnHelpLinkActivated();
private:
// ViewScreen<NewUserView>:
virtual NewUserView* AllocateView();
// Adds start url to command line.
void AppendStartUrlToCmdline();
// Shows error message with the specified message id.
// If |details| string is not empty, it specify additional error text
// provided by authenticator, it is not localized.
void ShowError(int error_id, const std::string& details);
// Pointer to shown message bubble. We don't need to delete it because
// it will be deleted on bubble closing.
MessageBubble* bubble_;
scoped_refptr<Authenticator> authenticator_;
// URL that will be opened on browser startup.
GURL start_url_;
DISALLOW_COPY_AND_ASSIGN(LoginScreen);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_LOGIN_SCREEN_H_
// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "app/l10n_util.h"
#include "base/message_loop.h" #include "base/message_loop.h"
#include "chrome/browser/chromeos/cros/cros_mock.h" #include "chrome/browser/browser_thread.h"
#include "chrome/browser/chromeos/cros/mock_cryptohome_library.h" #include "chrome/browser/chromeos/cros/mock_cryptohome_library.h"
#include "chrome/browser/chromeos/cros/mock_login_library.h" #include "chrome/browser/chromeos/cros/mock_login_library.h"
#include "chrome/browser/chromeos/cros/mock_network_library.h" #include "chrome/browser/chromeos/cros/mock_network_library.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h" #include "chrome/browser/chromeos/login/login_screen.h"
#include "chrome/browser/chromeos/login/login_performer.h"
#include "chrome/browser/chromeos/login/login_utils.h"
#include "chrome/browser/chromeos/login/mock_authenticator.h" #include "chrome/browser/chromeos/login/mock_authenticator.h"
#include "chrome/browser/chromeos/login/mock_screen_observer.h"
#include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h" #include "chrome/browser/chromeos/login/wizard_in_process_browser_test.h"
#include "chrome/browser/chromeos/login/wizard_screen.h"
#include "grit/generated_resources.h" #include "grit/generated_resources.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -27,44 +26,18 @@ using ::testing::Return; ...@@ -27,44 +26,18 @@ using ::testing::Return;
const char kUsername[] = "test_user@gmail.com"; const char kUsername[] = "test_user@gmail.com";
const char kPassword[] = "test_password"; const char kPassword[] = "test_password";
class MockLoginPerformerDelegate : public LoginPerformer::Delegate { class LoginScreenTest : public WizardInProcessBrowserTest {
public: public:
explicit MockLoginPerformerDelegate(ExistingUserController* controller) LoginScreenTest(): WizardInProcessBrowserTest("login"),
: controller_(controller) { mock_cryptohome_library_(NULL),
mock_login_library_(NULL),
mock_network_library_(NULL) {
} }
void OnLoginSuccess(const std::string&,
const std::string&,
const GaiaAuthConsumer::ClientLoginResult&,
bool) {
LoginPerformer* login_performer = controller_->login_performer_.release();
login_performer = NULL;
controller_->ActivateWizard(WizardController::kUserImageScreenName);
delete WizardController::default_controller();
}
MOCK_METHOD1(OnLoginFailure, void(const LoginFailure&));
MOCK_METHOD1(WhiteListCheckFailed, void(const std::string&));
private:
ExistingUserController* controller_;
DISALLOW_COPY_AND_ASSIGN(MockLoginPerformerDelegate);
};
class ExistingUserControllerTest : public WizardInProcessBrowserTest {
protected: protected:
ExistingUserControllerTest() MockCryptohomeLibrary *mock_cryptohome_library_;
: chromeos::WizardInProcessBrowserTest( MockLoginLibrary *mock_login_library_;
WizardController::kLoginScreenName), MockNetworkLibrary *mock_network_library_;
mock_cryptohome_library_(NULL),
mock_login_library_(NULL),
mock_network_library_(NULL) {
}
ExistingUserController* existing_user_controller() {
return ExistingUserController::current_controller();
}
virtual void SetUpInProcessBrowserTestFixture() { virtual void SetUpInProcessBrowserTestFixture() {
WizardInProcessBrowserTest::SetUpInProcessBrowserTestFixture(); WizardInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
...@@ -76,9 +49,6 @@ class ExistingUserControllerTest : public WizardInProcessBrowserTest { ...@@ -76,9 +49,6 @@ class ExistingUserControllerTest : public WizardInProcessBrowserTest {
mock_login_library_ = new MockLoginLibrary(); mock_login_library_ = new MockLoginLibrary();
EXPECT_CALL(*mock_login_library_, EmitLoginPromptReady()) EXPECT_CALL(*mock_login_library_, EmitLoginPromptReady())
.Times(1); .Times(1);
EXPECT_CALL(*mock_login_library_, RetrieveProperty(_, _, _))
.Times(AnyNumber())
.WillRepeatedly((Return(true)));
cros_mock_->test_api()->SetLoginLibrary(mock_login_library_, true); cros_mock_->test_api()->SetLoginLibrary(mock_login_library_, true);
cros_mock_->InitMockCryptohomeLibrary(); cros_mock_->InitMockCryptohomeLibrary();
...@@ -94,20 +64,77 @@ class ExistingUserControllerTest : public WizardInProcessBrowserTest { ...@@ -94,20 +64,77 @@ class ExistingUserControllerTest : public WizardInProcessBrowserTest {
cros_mock_->test_api()->SetLoginLibrary(NULL, false); cros_mock_->test_api()->SetLoginLibrary(NULL, false);
} }
MockCryptohomeLibrary* mock_cryptohome_library_;
MockLoginLibrary* mock_login_library_;
MockNetworkLibrary* mock_network_library_;
private: private:
DISALLOW_COPY_AND_ASSIGN(ExistingUserControllerTest); DISALLOW_COPY_AND_ASSIGN(LoginScreenTest);
}; };
IN_PROC_BROWSER_TEST_F(ExistingUserControllerTest, NewUserLogin) { static void Quit() {
MockLoginPerformerDelegate* mock_delegate = VLOG(1) << "Posting a QuitTask to UI thread";
new MockLoginPerformerDelegate(existing_user_controller()); BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
existing_user_controller()->set_login_performer_delegate(mock_delegate); new MessageLoop::QuitTask);
}
IN_PROC_BROWSER_TEST_F(LoginScreenTest, TestBasic) {
ASSERT_TRUE(controller() != NULL);
ASSERT_EQ(controller()->current_screen(), controller()->GetLoginScreen());
scoped_ptr<MockScreenObserver> mock_screen_observer(
new MockScreenObserver());
EXPECT_CALL(*mock_screen_observer,
OnExit(ScreenObserver::LOGIN_SIGN_IN_SELECTED))
.WillOnce(InvokeWithoutArgs(Quit));
controller()->set_observer(mock_screen_observer.get());
NewUserView* login = controller()->GetLoginScreen()->view();
login->SetUsername(kUsername);
login->SetPassword(kPassword);
bool old_state = MessageLoop::current()->NestableTasksAllowed();
MessageLoop::current()->SetNestableTasksAllowed(true);
login->Login();
MessageLoop::current()->Run();
MessageLoop::current()->SetNestableTasksAllowed(old_state);
controller()->set_observer(NULL);
}
IN_PROC_BROWSER_TEST_F(LoginScreenTest, AuthenticationFailed) {
ASSERT_TRUE(controller() != NULL);
ASSERT_EQ(controller()->current_screen(), controller()->GetLoginScreen());
scoped_ptr<MockScreenObserver> mock_screen_observer(
new MockScreenObserver());
controller()->set_observer(mock_screen_observer.get());
EXPECT_CALL(*mock_network_library_, Connected())
.Times(AnyNumber())
.WillRepeatedly((Return(true)));
NewUserView* login = controller()->GetLoginScreen()->view();
login->SetUsername(kUsername);
login->SetPassword("wrong password");
bool old_state = MessageLoop::current()->NestableTasksAllowed();
MessageLoop::current()->SetNestableTasksAllowed(true);
login->Login();
MessageLoop::current()->Run();
MessageLoop::current()->SetNestableTasksAllowed(old_state);
ASSERT_EQ(controller()->current_screen(), controller()->GetLoginScreen());
EXPECT_TRUE(controller()->GetLoginScreen()->IsErrorShown());
controller()->set_observer(NULL);
}
IN_PROC_BROWSER_TEST_F(LoginScreenTest, IncognitoLogin) {
ASSERT_TRUE(controller() != NULL);
ASSERT_EQ(controller()->current_screen(), controller()->GetLoginScreen());
scoped_ptr<MockScreenObserver> mock_screen_observer(
new MockScreenObserver());
controller()->set_observer(mock_screen_observer.get());
NewUserView* login = controller()->GetLoginScreen()->view();
existing_user_controller()->LoginNewUser(kUsername, kPassword); login->LinkActivated(login->guest_link_, 0);
controller()->set_observer(NULL);
Quit();
} }
} // namespace chromeos } // namespace chromeos
...@@ -24,7 +24,7 @@ class MockUserManager : public UserManager { ...@@ -24,7 +24,7 @@ class MockUserManager : public UserManager {
MOCK_METHOD1(UserLoggedIn, void(const std::string&)); MOCK_METHOD1(UserLoggedIn, void(const std::string&));
MOCK_METHOD1(RemoveUser, void(const std::string&)); MOCK_METHOD1(RemoveUser, void(const std::string&));
MOCK_METHOD1(IsKnownUser, bool(const std::string&)); MOCK_METHOD1(IsKnownUser, bool(const std::string&));
MOCK_CONST_METHOD0(logged_in_user, User()); MOCK_METHOD0(logged_in_user, const User&());
MOCK_METHOD0(current_user_is_owner, bool()); MOCK_METHOD0(current_user_is_owner, bool());
MOCK_METHOD1(set_current_user_is_owner, void(bool)); MOCK_METHOD1(set_current_user_is_owner, void(bool));
}; };
......
...@@ -199,6 +199,9 @@ class NewUserView : public ThrobberHostView, ...@@ -199,6 +199,9 @@ class NewUserView : public ThrobberHostView,
int languages_menubutton_order_; int languages_menubutton_order_;
int sign_in_button_order_; int sign_in_button_order_;
FRIEND_TEST_ALL_PREFIXES(LoginScreenTest, IncognitoLogin);
friend class LoginScreenTest;
DISALLOW_COPY_AND_ASSIGN(NewUserView); DISALLOW_COPY_AND_ASSIGN(NewUserView);
}; };
......
...@@ -20,6 +20,9 @@ class ScreenObserver { ...@@ -20,6 +20,9 @@ class ScreenObserver {
// login wizard decides what is the next view to show. There must be an // login wizard decides what is the next view to show. There must be an
// exit code for each way to exit the screen for each screen. // exit code for each way to exit the screen for each screen.
enum ExitCodes { enum ExitCodes {
LOGIN_SIGN_IN_SELECTED,
LOGIN_GUEST_SELECTED,
LOGIN_CREATE_ACCOUNT,
NETWORK_CONNECTED, NETWORK_CONNECTED,
NETWORK_OFFLINE, NETWORK_OFFLINE,
ACCOUNT_CREATE_BACK, ACCOUNT_CREATE_BACK,
......
...@@ -74,7 +74,7 @@ class UserManager : public UserImageLoader::Delegate, ...@@ -74,7 +74,7 @@ class UserManager : public UserImageLoader::Delegate,
virtual bool IsKnownUser(const std::string& email); virtual bool IsKnownUser(const std::string& email);
// Returns the logged-in user. // Returns the logged-in user.
virtual User logged_in_user() const { virtual const User& logged_in_user() {
return logged_in_user_; return logged_in_user_;
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/login/html_page_screen.h" #include "chrome/browser/chromeos/login/html_page_screen.h"
#include "chrome/browser/chromeos/login/language_switch_menu.h" #include "chrome/browser/chromeos/login/language_switch_menu.h"
#include "chrome/browser/chromeos/login/login_screen.h"
#include "chrome/browser/chromeos/login/login_utils.h" #include "chrome/browser/chromeos/login/login_utils.h"
#include "chrome/browser/chromeos/login/network_screen.h" #include "chrome/browser/chromeos/login/network_screen.h"
#include "chrome/browser/chromeos/login/registration_screen.h" #include "chrome/browser/chromeos/login/registration_screen.h"
...@@ -259,6 +260,7 @@ WizardController::WizardController() ...@@ -259,6 +260,7 @@ WizardController::WizardController()
is_official_build_(false), is_official_build_(false),
#endif #endif
is_out_of_box_(false), is_out_of_box_(false),
is_test_mode_(false),
observer_(NULL) { observer_(NULL) {
DCHECK(default_controller_ == NULL); DCHECK(default_controller_ == NULL);
default_controller_ = this; default_controller_ = this;
...@@ -346,6 +348,12 @@ chromeos::NetworkScreen* WizardController::GetNetworkScreen() { ...@@ -346,6 +348,12 @@ chromeos::NetworkScreen* WizardController::GetNetworkScreen() {
return network_screen_.get(); return network_screen_.get();
} }
chromeos::LoginScreen* WizardController::GetLoginScreen() {
if (!login_screen_.get())
login_screen_.reset(new chromeos::LoginScreen(this));
return login_screen_.get();
}
chromeos::AccountScreen* WizardController::GetAccountScreen() { chromeos::AccountScreen* WizardController::GetAccountScreen() {
if (!account_screen_.get()) if (!account_screen_.get())
account_screen_.reset(new chromeos::AccountScreen(this)); account_screen_.reset(new chromeos::AccountScreen(this));
...@@ -408,23 +416,30 @@ chromeos::ExistingUserController* WizardController::ShowLoginScreen() { ...@@ -408,23 +416,30 @@ chromeos::ExistingUserController* WizardController::ShowLoginScreen() {
// Initiate services customization. // Initiate services customization.
chromeos::ApplyServicesCustomization::StartIfNeeded(); chromeos::ApplyServicesCustomization::StartIfNeeded();
std::vector<chromeos::UserManager::User> users; // When run under automation test show plain login screen.
if (chromeos::CrosLibrary::Get()->EnsureLoaded()) if (!is_test_mode_ &&
users = chromeos::UserManager::Get()->GetUsers(); chromeos::CrosLibrary::Get()->EnsureLoaded() &&
CommandLine::ForCurrentProcess()->HasSwitch(
// ExistingUserController deletes itself. switches::kEnableLoginImages)) {
gfx::Rect screen_bounds; std::vector<chromeos::UserManager::User> users =
background_widget_->GetBounds(&screen_bounds, true); chromeos::UserManager::Get()->GetUsers();
chromeos::ExistingUserController* controller = // ExistingUserController deletes itself.
new chromeos::ExistingUserController(users, screen_bounds); gfx::Rect screen_bounds;
controller->OwnBackground(background_widget_, background_view_); background_widget_->GetBounds(&screen_bounds, true);
controller->Init(); chromeos::ExistingUserController* controller =
background_widget_ = NULL; new chromeos::ExistingUserController(users, screen_bounds);
background_view_ = NULL; controller->OwnBackground(background_widget_, background_view_);
controller->Init();
MessageLoop::current()->DeleteSoon(FROM_HERE, this); background_widget_ = NULL;
background_view_ = NULL;
MessageLoop::current()->DeleteSoon(FROM_HERE, this);
return controller;
}
return controller; SetCurrentScreen(GetLoginScreen());
return NULL;
} }
void WizardController::ShowAccountScreen() { void WizardController::ShowAccountScreen() {
...@@ -526,6 +541,26 @@ void WizardController::RegisterPrefs(PrefService* local_state) { ...@@ -526,6 +541,26 @@ void WizardController::RegisterPrefs(PrefService* local_state) {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// WizardController, ExitHandlers: // WizardController, ExitHandlers:
void WizardController::OnLoginSignInSelected() {
// Don't show user image screen in case of automated testing.
if (is_test_mode_) {
MessageLoop::current()->DeleteSoon(FROM_HERE, this);
return;
}
// Don't launch browser until we pass image screen.
chromeos::LoginUtils::Get()->EnableBrowserLaunch(false);
ShowUserImageScreen();
}
void WizardController::OnLoginGuestUser() {
// We're on the stack, so don't try and delete us now.
MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
void WizardController::OnLoginCreateAccount() {
ShowAccountScreen();
}
void WizardController::OnNetworkConnected() { void WizardController::OnNetworkConnected() {
if (is_official_build_) { if (is_official_build_) {
if (!IsEulaAccepted()) { if (!IsEulaAccepted()) {
...@@ -550,14 +585,16 @@ void WizardController::OnNetworkOffline() { ...@@ -550,14 +585,16 @@ void WizardController::OnNetworkOffline() {
void WizardController::OnAccountCreateBack() { void WizardController::OnAccountCreateBack() {
chromeos::ExistingUserController* controller = ShowLoginScreen(); chromeos::ExistingUserController* controller = ShowLoginScreen();
DCHECK(controller); if (controller)
controller->SelectNewUser(); controller->SelectNewUser();
} }
void WizardController::OnAccountCreated() { void WizardController::OnAccountCreated() {
chromeos::ExistingUserController* controller = ShowLoginScreen(); chromeos::ExistingUserController* controller = ShowLoginScreen();
DCHECK(controller); if (controller)
controller->LoginNewUser(username_, password_); controller->LoginNewUser(username_, password_);
else
Login(username_, password_);
// TODO(dpolukhin): clear password memory for real. Now it is not // TODO(dpolukhin): clear password memory for real. Now it is not
// a problem because we can't extract password from the form. // a problem because we can't extract password from the form.
password_.clear(); password_.clear();
...@@ -727,6 +764,8 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) { ...@@ -727,6 +764,8 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) {
if (first_screen_name == kNetworkScreenName) { if (first_screen_name == kNetworkScreenName) {
ShowNetworkScreen(); ShowNetworkScreen();
} else if (first_screen_name == kLoginScreenName) { } else if (first_screen_name == kLoginScreenName) {
// This flag is passed if we're running under automation test.
is_test_mode_ = true;
ShowLoginScreen(); ShowLoginScreen();
} else if (first_screen_name == kAccountScreenName) { } else if (first_screen_name == kAccountScreenName) {
ShowAccountScreen(); ShowAccountScreen();
...@@ -754,6 +793,19 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) { ...@@ -754,6 +793,19 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) {
} }
} }
void WizardController::Login(const std::string& username,
const std::string& password) {
chromeos::LoginScreen* login = GetLoginScreen();
if (username.empty())
return;
login->view()->SetUsername(username);
if (password.empty())
return;
login->view()->SetPassword(password);
login->view()->Login();
}
// static // static
bool WizardController::IsEulaAccepted() { bool WizardController::IsEulaAccepted() {
return g_browser_process->local_state()->GetBoolean(kEulaAccepted); return g_browser_process->local_state()->GetBoolean(kEulaAccepted);
...@@ -797,9 +849,8 @@ void WizardController::MarkDeviceRegistered() { ...@@ -797,9 +849,8 @@ void WizardController::MarkDeviceRegistered() {
// Create flag file for boot-time init scripts. // Create flag file for boot-time init scripts.
FilePath oobe_complete_path(kOobeCompleteFlagFilePath); FilePath oobe_complete_path(kOobeCompleteFlagFilePath);
FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b"); FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b");
if (oobe_flag_file == NULL) DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath;
DLOG(WARNING) << kOobeCompleteFlagFilePath << " doesn't exist."; if (oobe_flag_file != NULL)
else
file_util::CloseFile(oobe_flag_file); file_util::CloseFile(oobe_flag_file);
} }
...@@ -808,6 +859,15 @@ void WizardController::MarkDeviceRegistered() { ...@@ -808,6 +859,15 @@ void WizardController::MarkDeviceRegistered() {
void WizardController::OnExit(ExitCodes exit_code) { void WizardController::OnExit(ExitCodes exit_code) {
LOG(INFO) << "Wizard screen exit code: " << exit_code; LOG(INFO) << "Wizard screen exit code: " << exit_code;
switch (exit_code) { switch (exit_code) {
case LOGIN_SIGN_IN_SELECTED:
OnLoginSignInSelected();
break;
case LOGIN_GUEST_SELECTED:
OnLoginGuestUser();
break;
case LOGIN_CREATE_ACCOUNT:
OnLoginCreateAccount();
break;
case NETWORK_CONNECTED: case NETWORK_CONNECTED:
OnNetworkConnected(); OnNetworkConnected();
break; break;
...@@ -902,17 +962,18 @@ void ShowLoginWizard(const std::string& first_screen_name, ...@@ -902,17 +962,18 @@ void ShowLoginWizard(const std::string& first_screen_name,
// Check whether we need to execute OOBE process. // Check whether we need to execute OOBE process.
bool oobe_complete = WizardController::IsOobeCompleted(); bool oobe_complete = WizardController::IsOobeCompleted();
bool show_login_screen =
(first_screen_name.empty() && oobe_complete) ||
first_screen_name == WizardController::kLoginScreenName;
if (show_login_screen && chromeos::CrosLibrary::Get()->EnsureLoaded()) { if (first_screen_name.empty() &&
oobe_complete &&
chromeos::CrosLibrary::Get()->EnsureLoaded() &&
CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableLoginImages)) {
std::vector<chromeos::UserManager::User> users = std::vector<chromeos::UserManager::User> users =
chromeos::UserManager::Get()->GetUsers(); chromeos::UserManager::Get()->GetUsers();
// Fix for users who updated device and thus never passed register screen. // Fix for users who updated device and thus never passed register screen.
// If we already have users, we assume that it is not a second part of // If we already have user we assume that it is not a second part of OOBE.
// OOBE. See http://crosbug.com/6289 // See http://crosbug.com/6289
if (!WizardController::IsDeviceRegistered() && !users.empty()) { if (!WizardController::IsDeviceRegistered() && !users.empty()) {
VLOG(1) << "Mark device registered because there are remembered users: " VLOG(1) << "Mark device registered because there are remembered users: "
<< users.size(); << users.size();
......
...@@ -29,6 +29,7 @@ class BackgroundView; ...@@ -29,6 +29,7 @@ class BackgroundView;
class EulaScreen; class EulaScreen;
class ExistingUserController; class ExistingUserController;
class HTMLPageScreen; class HTMLPageScreen;
class LoginScreen;
class NetworkScreen; class NetworkScreen;
class RegistrationScreen; class RegistrationScreen;
class StartupCustomizationDocument; class StartupCustomizationDocument;
...@@ -105,6 +106,7 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -105,6 +106,7 @@ class WizardController : public chromeos::ScreenObserver,
// Lazy initializers and getters for screens. // Lazy initializers and getters for screens.
chromeos::NetworkScreen* GetNetworkScreen(); chromeos::NetworkScreen* GetNetworkScreen();
chromeos::LoginScreen* GetLoginScreen();
chromeos::AccountScreen* GetAccountScreen(); chromeos::AccountScreen* GetAccountScreen();
chromeos::UpdateScreen* GetUpdateScreen(); chromeos::UpdateScreen* GetUpdateScreen();
chromeos::UserImageScreen* GetUserImageScreen(); chromeos::UserImageScreen* GetUserImageScreen();
...@@ -120,8 +122,9 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -120,8 +122,9 @@ class WizardController : public chromeos::ScreenObserver,
void ShowEulaScreen(); void ShowEulaScreen();
void ShowRegistrationScreen(); void ShowRegistrationScreen();
void ShowHTMLPageScreen(); void ShowHTMLPageScreen();
// Shows images login screen and returns the corresponding controller // Shows the default login screen and returns NULL or shows images login
// instance for optional tweaking. // screen and returns the corresponding controller instance for optional
// tweaking.
chromeos::ExistingUserController* ShowLoginScreen(); chromeos::ExistingUserController* ShowLoginScreen();
// Returns a pointer to the current screen or NULL if there's no such // Returns a pointer to the current screen or NULL if there's no such
...@@ -166,6 +169,9 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -166,6 +169,9 @@ class WizardController : public chromeos::ScreenObserver,
private: private:
// Exit handlers: // Exit handlers:
void OnLoginSignInSelected();
void OnLoginGuestUser();
void OnLoginCreateAccount();
void OnNetworkConnected(); void OnNetworkConnected();
void OnNetworkOffline(); void OnNetworkOffline();
void OnAccountCreateBack(); void OnAccountCreateBack();
...@@ -184,11 +190,6 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -184,11 +190,6 @@ class WizardController : public chromeos::ScreenObserver,
// Shows update screen and starts update process. // Shows update screen and starts update process.
void InitiateOOBEUpdate(); void InitiateOOBEUpdate();
// Overridden from chromeos::ScreenObserver:
virtual void OnExit(ExitCodes exit_code);
virtual void OnSetUserNamePassword(const std::string& username,
const std::string& password);
// Creates wizard screen window with the specified |bounds|. // Creates wizard screen window with the specified |bounds|.
// If |initial_show| initial animation (window & background) is shown. // If |initial_show| initial animation (window & background) is shown.
// Otherwise only window is animated. // Otherwise only window is animated.
...@@ -205,6 +206,11 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -205,6 +206,11 @@ class WizardController : public chromeos::ScreenObserver,
// Changes status area visibility. // Changes status area visibility.
void SetStatusAreaVisible(bool visible); void SetStatusAreaVisible(bool visible);
// Overridden from chromeos::ScreenObserver:
virtual void OnExit(ExitCodes exit_code);
virtual void OnSetUserNamePassword(const std::string& username,
const std::string& password);
// Overridden from WizardScreenDelegate: // Overridden from WizardScreenDelegate:
virtual views::View* GetWizardView(); virtual views::View* GetWizardView();
virtual chromeos::ScreenObserver* GetObserver(WizardScreen* screen); virtual chromeos::ScreenObserver* GetObserver(WizardScreen* screen);
...@@ -231,6 +237,7 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -231,6 +237,7 @@ class WizardController : public chromeos::ScreenObserver,
// Screens. // Screens.
scoped_ptr<chromeos::NetworkScreen> network_screen_; scoped_ptr<chromeos::NetworkScreen> network_screen_;
scoped_ptr<chromeos::LoginScreen> login_screen_;
scoped_ptr<chromeos::AccountScreen> account_screen_; scoped_ptr<chromeos::AccountScreen> account_screen_;
scoped_ptr<chromeos::UpdateScreen> update_screen_; scoped_ptr<chromeos::UpdateScreen> update_screen_;
scoped_ptr<chromeos::UserImageScreen> user_image_screen_; scoped_ptr<chromeos::UserImageScreen> user_image_screen_;
...@@ -250,6 +257,10 @@ class WizardController : public chromeos::ScreenObserver, ...@@ -250,6 +257,10 @@ class WizardController : public chromeos::ScreenObserver,
// True if full OOBE flow should be shown. // True if full OOBE flow should be shown.
bool is_out_of_box_; bool is_out_of_box_;
// True if this is run under automation test and we need to show only
// login screen.
bool is_test_mode_;
// Value of the screen name that WizardController was started with. // Value of the screen name that WizardController was started with.
std::string first_screen_name_; std::string first_screen_name_;
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/account_screen.h" #include "chrome/browser/chromeos/login/account_screen.h"
#include "chrome/browser/chromeos/login/eula_view.h" #include "chrome/browser/chromeos/login/eula_view.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h"
#include "chrome/browser/chromeos/login/language_switch_menu.h" #include "chrome/browser/chromeos/login/language_switch_menu.h"
#include "chrome/browser/chromeos/login/login_screen.h"
#include "chrome/browser/chromeos/login/mock_update_screen.h" #include "chrome/browser/chromeos/login/mock_update_screen.h"
#include "chrome/browser/chromeos/login/network_screen.h" #include "chrome/browser/chromeos/login/network_screen.h"
#include "chrome/browser/chromeos/login/network_selection_view.h" #include "chrome/browser/chromeos/login/network_selection_view.h"
...@@ -57,8 +57,6 @@ CreateMockWizardScreenHelper<chromeos::NetworkScreen>::Create( ...@@ -57,8 +57,6 @@ CreateMockWizardScreenHelper<chromeos::NetworkScreen>::Create(
} // namespace } // namespace
using chromeos::ExistingUserController;
class WizardControllerTest : public chromeos::WizardInProcessBrowserTest { class WizardControllerTest : public chromeos::WizardInProcessBrowserTest {
protected: protected:
WizardControllerTest() : chromeos::WizardInProcessBrowserTest( WizardControllerTest() : chromeos::WizardInProcessBrowserTest(
...@@ -116,6 +114,7 @@ class WizardControllerFlowTest : public WizardControllerTest { ...@@ -116,6 +114,7 @@ class WizardControllerFlowTest : public WizardControllerTest {
// Set up the mocks for all screens. // Set up the mocks for all screens.
MOCK(mock_account_screen_, account_screen_, chromeos::AccountScreen); MOCK(mock_account_screen_, account_screen_, chromeos::AccountScreen);
MOCK(mock_login_screen_, login_screen_, chromeos::LoginScreen);
MOCK(mock_network_screen_, network_screen_, chromeos::NetworkScreen); MOCK(mock_network_screen_, network_screen_, chromeos::NetworkScreen);
MOCK(mock_update_screen_, update_screen_, MockUpdateScreen); MOCK(mock_update_screen_, update_screen_, MockUpdateScreen);
MOCK(mock_eula_screen_, eula_screen_, chromeos::EulaScreen); MOCK(mock_eula_screen_, eula_screen_, chromeos::EulaScreen);
...@@ -129,6 +128,7 @@ class WizardControllerFlowTest : public WizardControllerTest { ...@@ -129,6 +128,7 @@ class WizardControllerFlowTest : public WizardControllerTest {
} }
MockOutShowHide<chromeos::AccountScreen>* mock_account_screen_; MockOutShowHide<chromeos::AccountScreen>* mock_account_screen_;
MockOutShowHide<chromeos::LoginScreen>* mock_login_screen_;
MockOutShowHide<chromeos::NetworkScreen>* mock_network_screen_; MockOutShowHide<chromeos::NetworkScreen>* mock_network_screen_;
MockOutShowHide<MockUpdateScreen>* mock_update_screen_; MockOutShowHide<MockUpdateScreen>* mock_update_screen_;
MockOutShowHide<chromeos::EulaScreen>* mock_eula_screen_; MockOutShowHide<chromeos::EulaScreen>* mock_eula_screen_;
...@@ -138,7 +138,6 @@ class WizardControllerFlowTest : public WizardControllerTest { ...@@ -138,7 +138,6 @@ class WizardControllerFlowTest : public WizardControllerTest {
}; };
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) { IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1); EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(1); EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
...@@ -151,12 +150,23 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) { ...@@ -151,12 +150,23 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
controller()->OnExit(chromeos::ScreenObserver::EULA_ACCEPTED); controller()->OnExit(chromeos::ScreenObserver::EULA_ACCEPTED);
EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen()); EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen());
EXPECT_CALL(*mock_update_screen_, Hide()).Times(0); EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(0); EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
controller()->OnExit(chromeos::ScreenObserver::UPDATE_INSTALLED); controller()->OnExit(chromeos::ScreenObserver::UPDATE_INSTALLED);
EXPECT_FALSE(ExistingUserController::current_controller() == NULL); EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
set_controller(NULL); EXPECT_CALL(*mock_login_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_account_screen_, Show()).Times(1);
controller()->OnExit(chromeos::ScreenObserver::LOGIN_CREATE_ACCOUNT);
EXPECT_EQ(controller()->GetAccountScreen(), controller()->current_screen());
EXPECT_CALL(*mock_account_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
EXPECT_CALL(*mock_login_screen_, Hide()).Times(0); // last transition
controller()->OnExit(chromeos::ScreenObserver::ACCOUNT_CREATED);
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
} }
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) { IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
...@@ -174,14 +184,14 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) { ...@@ -174,14 +184,14 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
controller()->OnExit(chromeos::ScreenObserver::EULA_ACCEPTED); controller()->OnExit(chromeos::ScreenObserver::EULA_ACCEPTED);
EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen()); EXPECT_EQ(controller()->GetUpdateScreen(), controller()->current_screen());
EXPECT_CALL(*mock_update_screen_, Hide()).Times(0); EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(0); EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
EXPECT_CALL(*mock_eula_screen_, Hide()).Times(0); // last transition EXPECT_CALL(*mock_eula_screen_, Hide()).Times(0); // last transition
EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
controller()->OnExit( controller()->OnExit(
chromeos::ScreenObserver::UPDATE_ERROR_UPDATING); chromeos::ScreenObserver::UPDATE_ERROR_UPDATING);
EXPECT_FALSE(ExistingUserController::current_controller() == NULL); EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
set_controller(NULL);
} }
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) { IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
...@@ -202,14 +212,14 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) { ...@@ -202,14 +212,14 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowEulaDeclined) {
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorNetwork) { IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorNetwork) {
EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
controller()->OnExit(chromeos::ScreenObserver::NETWORK_OFFLINE); controller()->OnExit(chromeos::ScreenObserver::NETWORK_OFFLINE);
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
set_controller(NULL);
} }
#if defined(OFFICIAL_BUILD) #if defined(OFFICIAL_BUILD)
// This test is supposed to fail on official build. // This test is supposed to fail on official test.
#define MAYBE_Accelerators DISABLED_Accelerators #define MAYBE_Accelerators DISABLED_Accelerators
#else #else
#define MAYBE_Accelerators Accelerators #define MAYBE_Accelerators Accelerators
...@@ -221,6 +231,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) { ...@@ -221,6 +231,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) {
views::FocusManager* focus_manager = views::FocusManager* focus_manager =
controller()->contents()->GetFocusManager(); controller()->contents()->GetFocusManager();
views::Accelerator accel_account_screen(ui::VKEY_A, false, true, true); views::Accelerator accel_account_screen(ui::VKEY_A, false, true, true);
views::Accelerator accel_login_screen(ui::VKEY_L, false, true, true);
views::Accelerator accel_network_screen(ui::VKEY_N, false, true, true); views::Accelerator accel_network_screen(ui::VKEY_N, false, true, true);
views::Accelerator accel_update_screen(ui::VKEY_U, false, true, true); views::Accelerator accel_update_screen(ui::VKEY_U, false, true, true);
views::Accelerator accel_image_screen(ui::VKEY_I, false, true, true); views::Accelerator accel_image_screen(ui::VKEY_I, false, true, true);
...@@ -233,6 +244,12 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) { ...@@ -233,6 +244,12 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) {
focus_manager = controller()->contents()->GetFocusManager(); focus_manager = controller()->contents()->GetFocusManager();
EXPECT_CALL(*mock_account_screen_, Hide()).Times(1); EXPECT_CALL(*mock_account_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_login_screen));
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
focus_manager = controller()->contents()->GetFocusManager();
EXPECT_CALL(*mock_login_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_network_screen_, Show()).Times(1); EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_network_screen)); EXPECT_TRUE(focus_manager->ProcessAccelerator(accel_network_screen));
EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen()); EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
...@@ -254,5 +271,5 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) { ...@@ -254,5 +271,5 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) {
EXPECT_EQ(controller()->GetEulaScreen(), controller()->current_screen()); EXPECT_EQ(controller()->GetEulaScreen(), controller()->current_screen());
} }
COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 15, COMPILE_ASSERT(chromeos::ScreenObserver::EXIT_CODES_COUNT == 18,
add_tests_for_new_control_flow_you_just_introduced); add_tests_for_new_control_flow_you_just_introduced);
...@@ -34,9 +34,6 @@ class WizardInProcessBrowserTest : public CrosInProcessBrowserTest { ...@@ -34,9 +34,6 @@ class WizardInProcessBrowserTest : public CrosInProcessBrowserTest {
virtual void CleanUpOnMainThread(); virtual void CleanUpOnMainThread();
WizardController* controller() const { return controller_; } WizardController* controller() const { return controller_; }
void set_controller(WizardController* controller) {
controller_ = controller;
}
private: private:
std::string screen_name_; std::string screen_name_;
......
...@@ -593,6 +593,8 @@ ...@@ -593,6 +593,8 @@
'browser/chromeos/login/login_html_dialog.h', 'browser/chromeos/login/login_html_dialog.h',
'browser/chromeos/login/login_performer.cc', 'browser/chromeos/login/login_performer.cc',
'browser/chromeos/login/login_performer.h', 'browser/chromeos/login/login_performer.h',
'browser/chromeos/login/login_screen.cc',
'browser/chromeos/login/login_screen.h',
'browser/chromeos/login/login_status_consumer.h', 'browser/chromeos/login/login_status_consumer.h',
'browser/chromeos/login/login_utils.cc', 'browser/chromeos/login/login_utils.cc',
'browser/chromeos/login/login_utils.h', 'browser/chromeos/login/login_utils.h',
......
...@@ -2028,8 +2028,8 @@ ...@@ -2028,8 +2028,8 @@
'browser/chromeos/cros/mock_system_library.h', 'browser/chromeos/cros/mock_system_library.h',
'browser/chromeos/cros/mock_touchpad_library.h', 'browser/chromeos/cros/mock_touchpad_library.h',
'browser/chromeos/login/account_screen_browsertest.cc', 'browser/chromeos/login/account_screen_browsertest.cc',
'browser/chromeos/login/existing_user_controller_browsertest.cc',
'browser/chromeos/login/login_browsertest.cc', 'browser/chromeos/login/login_browsertest.cc',
'browser/chromeos/login/login_screen_browsertest.cc',
'browser/chromeos/login/mock_authenticator.h', 'browser/chromeos/login/mock_authenticator.h',
'browser/chromeos/login/network_screen_browsertest.cc', 'browser/chromeos/login/network_screen_browsertest.cc',
'browser/chromeos/login/screen_locker_browsertest.cc', 'browser/chromeos/login/screen_locker_browsertest.cc',
......
...@@ -1231,6 +1231,9 @@ const char kZygoteProcess[] = "zygote"; ...@@ -1231,6 +1231,9 @@ const char kZygoteProcess[] = "zygote";
// Document Viewer. // Document Viewer.
const char kEnableGView[] = "enable-gview"; const char kEnableGView[] = "enable-gview";
// Should we show the image based login?
const char kEnableLoginImages[] = "enable-login-images";
// Enable Chrome-as-a-login-manager behavior. // Enable Chrome-as-a-login-manager behavior.
const char kLoginManager[] = "login-manager"; const char kLoginManager[] = "login-manager";
......
...@@ -345,6 +345,7 @@ extern const char kZygoteProcess[]; ...@@ -345,6 +345,7 @@ extern const char kZygoteProcess[];
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
extern const char kEnableGView[]; extern const char kEnableGView[];
extern const char kEnableLoginImages[];
extern const char kLoginManager[]; extern const char kLoginManager[];
// TODO(avayvod): Remove this flag when it's unnecessary for testing // TODO(avayvod): Remove this flag when it's unnecessary for testing
// purposes. // purposes.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment