Commit d3fff3e0 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,tbroch@chromium.org

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71470 0039d316-1c4b-4281-b951-d872f2087c98
parent ca1293bb
......@@ -5,18 +5,23 @@
#include "chrome/browser/automation/automation_provider.h"
#include "chrome/browser/automation/automation_provider_observers.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h"
using chromeos::ExistingUserController;
#include "chrome/browser/chromeos/login/login_screen.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "views/window/window_gtk.h"
void AutomationProvider::LoginWithUserAndPass(const std::string& username,
const std::string& password,
IPC::Message* reply_message) {
ExistingUserController* controller =
ExistingUserController::current_controller();
WizardController* controller = WizardController::default_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).
new LoginManagerObserver(this, reply_message);
controller->LoginNewUser(username, password);
new_user_view->Login();
}
......@@ -117,7 +117,7 @@ void EnableTooltipsIfNeeded(const std::vector<UserController*>& controllers) {
} // namespace
ExistingUserController*
ExistingUserController::current_controller_ = NULL;
ExistingUserController::delete_scheduled_instance_ = NULL;
// TODO(xiyuan): Wait for the cached settings update before using them.
ExistingUserController::ExistingUserController(
......@@ -131,9 +131,8 @@ ExistingUserController::ExistingUserController(
bubble_(NULL),
user_settings_(new UserCrosSettingsProvider),
method_factory_(this) {
if (current_controller_)
current_controller_->Delete();
current_controller_ = this;
if (delete_scheduled_instance_)
delete_scheduled_instance_->Delete();
// Calculate the max number of users from available screen size.
bool show_guest = UserCrosSettingsProvider::cached_allow_guest();
......@@ -248,11 +247,10 @@ ExistingUserController::~ExistingUserController() {
STLDeleteElements(&controllers_);
STLDeleteElements(&invisible_controllers_);
DCHECK(current_controller_ != NULL);
current_controller_ = NULL;
}
void ExistingUserController::Delete() {
delete_scheduled_instance_ = NULL;
delete this;
}
......@@ -290,10 +288,7 @@ void ExistingUserController::Login(UserController* source,
// Use the same LoginPerformer for subsequent login as it has state
// such as CAPTCHA challenge token & corresponding user input.
if (!login_performer_.get() || num_login_attempts_ <= 1) {
LoginPerformer::Delegate* delegate = this;
if (login_performer_delegate_.get())
delegate = login_performer_delegate_.get();
login_performer_.reset(new LoginPerformer(delegate));
login_performer_.reset(new LoginPerformer(this));
}
login_performer_->Login(controllers_[selected_view_index_]->user().email(),
UTF16ToUTF8(password));
......@@ -366,6 +361,11 @@ void ExistingUserController::ActivateWizard(const std::string& screen_name) {
controller->set_start_url(start_url_);
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,
&ExistingUserController::Delete);
}
......
......@@ -21,7 +21,6 @@
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/wm_message_listener.h"
#include "gfx/size.h"
#include "testing/gtest/include/gtest/gtest_prod.h"
namespace chromeos {
......@@ -51,11 +50,6 @@ class ExistingUserController : public WmMessageListener::Observer,
ExistingUserController(const std::vector<UserManager::User>& users,
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.
void Init();
......@@ -72,7 +66,6 @@ class ExistingUserController : public WmMessageListener::Observer,
private:
friend class DeleteTask<ExistingUserController>;
friend class MockLoginPerformerDelegate;
~ExistingUserController();
......@@ -136,10 +129,6 @@ class ExistingUserController : public WmMessageListener::Observer,
// Send message to window manager to enable/disable click on other windows.
void SendSetLoginState(bool is_login);
void set_login_performer_delegate(LoginPerformer::Delegate* d) {
login_performer_delegate_.reset(d);
}
// Bounds of the background window.
const gfx::Rect background_bounds_;
......@@ -156,10 +145,6 @@ class ExistingUserController : public WmMessageListener::Observer,
// Used to execute login operations.
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).
size_t selected_view_index_;
......@@ -170,9 +155,9 @@ class ExistingUserController : public WmMessageListener::Observer,
// See comment in ProcessWmMessage.
base::OneShotTimer<ExistingUserController> delete_timer_;
// Pointer to the current instance of the controller to be used by
// automation tests.
static ExistingUserController* current_controller_;
// Pointer to the instance that was scheduled to be deleted soon or NULL
// if there is no such instance.
static ExistingUserController* delete_scheduled_instance_;
// Pointer to shown message bubble. We don't need to delete it because
// it will be deleted on bubble closing.
......@@ -190,8 +175,6 @@ class ExistingUserController : public WmMessageListener::Observer,
// Factory of callbacks.
ScopedRunnableMethodFactory<ExistingUserController> method_factory_;
FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, NewUserLogin);
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
// found in the LICENSE file.
#include "app/l10n_util.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_login_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_performer.h"
#include "chrome/browser/chromeos/login/login_utils.h"
#include "chrome/browser/chromeos/login/login_screen.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_in_process_browser_test.h"
#include "chrome/browser/chromeos/login/wizard_screen.h"
#include "grit/generated_resources.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -27,44 +26,18 @@ using ::testing::Return;
const char kUsername[] = "test_user@gmail.com";
const char kPassword[] = "test_password";
class MockLoginPerformerDelegate : public LoginPerformer::Delegate {
class LoginScreenTest : public WizardInProcessBrowserTest {
public:
explicit MockLoginPerformerDelegate(ExistingUserController* controller)
: controller_(controller) {
LoginScreenTest(): WizardInProcessBrowserTest("login"),
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:
ExistingUserControllerTest()
: chromeos::WizardInProcessBrowserTest(
WizardController::kLoginScreenName),
mock_cryptohome_library_(NULL),
mock_login_library_(NULL),
mock_network_library_(NULL) {
}
ExistingUserController* existing_user_controller() {
return ExistingUserController::current_controller();
}
MockCryptohomeLibrary *mock_cryptohome_library_;
MockLoginLibrary *mock_login_library_;
MockNetworkLibrary *mock_network_library_;
virtual void SetUpInProcessBrowserTestFixture() {
WizardInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
......@@ -76,9 +49,6 @@ class ExistingUserControllerTest : public WizardInProcessBrowserTest {
mock_login_library_ = new MockLoginLibrary();
EXPECT_CALL(*mock_login_library_, EmitLoginPromptReady())
.Times(1);
EXPECT_CALL(*mock_login_library_, RetrieveProperty(_, _, _))
.Times(AnyNumber())
.WillRepeatedly((Return(true)));
cros_mock_->test_api()->SetLoginLibrary(mock_login_library_, true);
cros_mock_->InitMockCryptohomeLibrary();
......@@ -94,20 +64,77 @@ class ExistingUserControllerTest : public WizardInProcessBrowserTest {
cros_mock_->test_api()->SetLoginLibrary(NULL, false);
}
MockCryptohomeLibrary* mock_cryptohome_library_;
MockLoginLibrary* mock_login_library_;
MockNetworkLibrary* mock_network_library_;
private:
DISALLOW_COPY_AND_ASSIGN(ExistingUserControllerTest);
DISALLOW_COPY_AND_ASSIGN(LoginScreenTest);
};
IN_PROC_BROWSER_TEST_F(ExistingUserControllerTest, NewUserLogin) {
MockLoginPerformerDelegate* mock_delegate =
new MockLoginPerformerDelegate(existing_user_controller());
existing_user_controller()->set_login_performer_delegate(mock_delegate);
static void Quit() {
VLOG(1) << "Posting a QuitTask to UI thread";
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
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
......@@ -24,7 +24,7 @@ class MockUserManager : public UserManager {
MOCK_METHOD1(UserLoggedIn, void(const std::string&));
MOCK_METHOD1(RemoveUser, void(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_METHOD1(set_current_user_is_owner, void(bool));
};
......
......@@ -199,6 +199,9 @@ class NewUserView : public ThrobberHostView,
int languages_menubutton_order_;
int sign_in_button_order_;
FRIEND_TEST_ALL_PREFIXES(LoginScreenTest, IncognitoLogin);
friend class LoginScreenTest;
DISALLOW_COPY_AND_ASSIGN(NewUserView);
};
......
......@@ -20,6 +20,9 @@ class ScreenObserver {
// 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.
enum ExitCodes {
LOGIN_SIGN_IN_SELECTED,
LOGIN_GUEST_SELECTED,
LOGIN_CREATE_ACCOUNT,
NETWORK_CONNECTED,
NETWORK_OFFLINE,
ACCOUNT_CREATE_BACK,
......
......@@ -74,7 +74,7 @@ class UserManager : public UserImageLoader::Delegate,
virtual bool IsKnownUser(const std::string& email);
// Returns the logged-in user.
virtual User logged_in_user() const {
virtual const User& logged_in_user() {
return logged_in_user_;
}
......
......@@ -32,6 +32,7 @@
#include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/login/html_page_screen.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/network_screen.h"
#include "chrome/browser/chromeos/login/registration_screen.h"
......@@ -259,6 +260,7 @@ WizardController::WizardController()
is_official_build_(false),
#endif
is_out_of_box_(false),
is_test_mode_(false),
observer_(NULL) {
DCHECK(default_controller_ == NULL);
default_controller_ = this;
......@@ -344,6 +346,12 @@ chromeos::NetworkScreen* WizardController::GetNetworkScreen() {
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() {
if (!account_screen_.get())
account_screen_.reset(new chromeos::AccountScreen(this));
......@@ -406,23 +414,30 @@ chromeos::ExistingUserController* WizardController::ShowLoginScreen() {
// Initiate services customization.
chromeos::ApplyServicesCustomization::StartIfNeeded();
std::vector<chromeos::UserManager::User> users;
if (chromeos::CrosLibrary::Get()->EnsureLoaded())
users = chromeos::UserManager::Get()->GetUsers();
// ExistingUserController deletes itself.
gfx::Rect screen_bounds;
background_widget_->GetBounds(&screen_bounds, true);
chromeos::ExistingUserController* controller =
new chromeos::ExistingUserController(users, screen_bounds);
controller->OwnBackground(background_widget_, background_view_);
controller->Init();
background_widget_ = NULL;
background_view_ = NULL;
MessageLoop::current()->DeleteSoon(FROM_HERE, this);
// When run under automation test show plain login screen.
if (!is_test_mode_ &&
chromeos::CrosLibrary::Get()->EnsureLoaded() &&
CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableLoginImages)) {
std::vector<chromeos::UserManager::User> users =
chromeos::UserManager::Get()->GetUsers();
// ExistingUserController deletes itself.
gfx::Rect screen_bounds;
background_widget_->GetBounds(&screen_bounds, true);
chromeos::ExistingUserController* controller =
new chromeos::ExistingUserController(users, screen_bounds);
controller->OwnBackground(background_widget_, background_view_);
controller->Init();
background_widget_ = NULL;
background_view_ = NULL;
MessageLoop::current()->DeleteSoon(FROM_HERE, this);
return controller;
}
return controller;
SetCurrentScreen(GetLoginScreen());
return NULL;
}
void WizardController::ShowAccountScreen() {
......@@ -524,6 +539,26 @@ void WizardController::RegisterPrefs(PrefService* local_state) {
///////////////////////////////////////////////////////////////////////////////
// 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() {
if (is_official_build_) {
if (!IsEulaAccepted()) {
......@@ -548,14 +583,16 @@ void WizardController::OnNetworkOffline() {
void WizardController::OnAccountCreateBack() {
chromeos::ExistingUserController* controller = ShowLoginScreen();
DCHECK(controller);
controller->SelectNewUser();
if (controller)
controller->SelectNewUser();
}
void WizardController::OnAccountCreated() {
chromeos::ExistingUserController* controller = ShowLoginScreen();
DCHECK(controller);
controller->LoginNewUser(username_, password_);
if (controller)
controller->LoginNewUser(username_, password_);
else
Login(username_, password_);
// TODO(dpolukhin): clear password memory for real. Now it is not
// a problem because we can't extract password from the form.
password_.clear();
......@@ -725,6 +762,8 @@ void WizardController::ShowFirstScreen(const std::string& first_screen_name) {
if (first_screen_name == kNetworkScreenName) {
ShowNetworkScreen();
} else if (first_screen_name == kLoginScreenName) {
// This flag is passed if we're running under automation test.
is_test_mode_ = true;
ShowLoginScreen();
} else if (first_screen_name == kAccountScreenName) {
ShowAccountScreen();
......@@ -752,6 +791,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
bool WizardController::IsEulaAccepted() {
return g_browser_process->local_state()->GetBoolean(kEulaAccepted);
......@@ -795,9 +847,8 @@ void WizardController::MarkDeviceRegistered() {
// Create flag file for boot-time init scripts.
FilePath oobe_complete_path(kOobeCompleteFlagFilePath);
FILE* oobe_flag_file = file_util::OpenFile(oobe_complete_path, "w+b");
if (oobe_flag_file == NULL)
DLOG(WARNING) << kOobeCompleteFlagFilePath << " doesn't exist.";
else
DCHECK(oobe_flag_file != NULL) << kOobeCompleteFlagFilePath;
if (oobe_flag_file != NULL)
file_util::CloseFile(oobe_flag_file);
}
......@@ -806,6 +857,15 @@ void WizardController::MarkDeviceRegistered() {
void WizardController::OnExit(ExitCodes exit_code) {
LOG(INFO) << "Wizard screen exit code: " << 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:
OnNetworkConnected();
break;
......@@ -900,17 +960,18 @@ void ShowLoginWizard(const std::string& first_screen_name,
// Check whether we need to execute OOBE process.
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 =
chromeos::UserManager::Get()->GetUsers();
// 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
// OOBE. See http://crosbug.com/6289
// If we already have user we assume that it is not a second part of OOBE.
// See http://crosbug.com/6289
if (!WizardController::IsDeviceRegistered() && !users.empty()) {
VLOG(1) << "Mark device registered because there are remembered users: "
<< users.size();
......
......@@ -29,6 +29,7 @@ class BackgroundView;
class EulaScreen;
class ExistingUserController;
class HTMLPageScreen;
class LoginScreen;
class NetworkScreen;
class RegistrationScreen;
class StartupCustomizationDocument;
......@@ -105,6 +106,7 @@ class WizardController : public chromeos::ScreenObserver,
// Lazy initializers and getters for screens.
chromeos::NetworkScreen* GetNetworkScreen();
chromeos::LoginScreen* GetLoginScreen();
chromeos::AccountScreen* GetAccountScreen();
chromeos::UpdateScreen* GetUpdateScreen();
chromeos::UserImageScreen* GetUserImageScreen();
......@@ -120,8 +122,9 @@ class WizardController : public chromeos::ScreenObserver,
void ShowEulaScreen();
void ShowRegistrationScreen();
void ShowHTMLPageScreen();
// Shows images login screen and returns the corresponding controller
// instance for optional tweaking.
// Shows the default login screen and returns NULL or shows images login
// screen and returns the corresponding controller instance for optional
// tweaking.
chromeos::ExistingUserController* ShowLoginScreen();
// Returns a pointer to the current screen or NULL if there's no such
......@@ -166,6 +169,9 @@ class WizardController : public chromeos::ScreenObserver,
private:
// Exit handlers:
void OnLoginSignInSelected();
void OnLoginGuestUser();
void OnLoginCreateAccount();
void OnNetworkConnected();
void OnNetworkOffline();
void OnAccountCreateBack();
......@@ -184,11 +190,6 @@ class WizardController : public chromeos::ScreenObserver,
// Shows update screen and starts update process.
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|.
// If |initial_show| initial animation (window & background) is shown.
// Otherwise only window is animated.
......@@ -205,6 +206,11 @@ class WizardController : public chromeos::ScreenObserver,
// Changes status area visibility.
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:
virtual views::View* GetWizardView();
virtual chromeos::ScreenObserver* GetObserver(WizardScreen* screen);
......@@ -231,6 +237,7 @@ class WizardController : public chromeos::ScreenObserver,
// Screens.
scoped_ptr<chromeos::NetworkScreen> network_screen_;
scoped_ptr<chromeos::LoginScreen> login_screen_;
scoped_ptr<chromeos::AccountScreen> account_screen_;
scoped_ptr<chromeos::UpdateScreen> update_screen_;
scoped_ptr<chromeos::UserImageScreen> user_image_screen_;
......@@ -250,6 +257,10 @@ class WizardController : public chromeos::ScreenObserver,
// True if full OOBE flow should be shown.
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.
std::string first_screen_name_;
......
......@@ -7,8 +7,8 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/login/account_screen.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/login_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_selection_view.h"
......@@ -57,8 +57,6 @@ CreateMockWizardScreenHelper<chromeos::NetworkScreen>::Create(
} // namespace
using chromeos::ExistingUserController;
class WizardControllerTest : public chromeos::WizardInProcessBrowserTest {
protected:
WizardControllerTest() : chromeos::WizardInProcessBrowserTest(
......@@ -116,6 +114,7 @@ class WizardControllerFlowTest : public WizardControllerTest {
// Set up the mocks for all screens.
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_update_screen_, update_screen_, MockUpdateScreen);
MOCK(mock_eula_screen_, eula_screen_, chromeos::EulaScreen);
......@@ -129,6 +128,7 @@ class WizardControllerFlowTest : public WizardControllerTest {
}
MockOutShowHide<chromeos::AccountScreen>* mock_account_screen_;
MockOutShowHide<chromeos::LoginScreen>* mock_login_screen_;
MockOutShowHide<chromeos::NetworkScreen>* mock_network_screen_;
MockOutShowHide<MockUpdateScreen>* mock_update_screen_;
MockOutShowHide<chromeos::EulaScreen>* mock_eula_screen_;
......@@ -138,7 +138,6 @@ class WizardControllerFlowTest : public WizardControllerTest {
};
IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
EXPECT_TRUE(ExistingUserController::current_controller() == NULL);
EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
......@@ -151,12 +150,23 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowMain) {
controller()->OnExit(chromeos::ScreenObserver::EULA_ACCEPTED);
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_login_screen_, Show()).Times(1);
controller()->OnExit(chromeos::ScreenObserver::UPDATE_INSTALLED);
EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
set_controller(NULL);
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
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) {
......@@ -174,14 +184,14 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowErrorUpdate) {
controller()->OnExit(chromeos::ScreenObserver::EULA_ACCEPTED);
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_, Hide()).Times(0); // last transition
EXPECT_CALL(*mock_login_screen_, Show()).Times(1);
controller()->OnExit(
chromeos::ScreenObserver::UPDATE_ERROR_UPDATING);
EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
set_controller(NULL);
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
}
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) {
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);
EXPECT_FALSE(ExistingUserController::current_controller() == NULL);
set_controller(NULL);
EXPECT_EQ(controller()->GetLoginScreen(), controller()->current_screen());
}
#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
#else
#define MAYBE_Accelerators Accelerators
......@@ -220,11 +230,12 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) {
views::FocusManager* focus_manager =
controller()->contents()->GetFocusManager();
views::Accelerator accel_account_screen(ui::VKEY_A, 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_image_screen(ui::VKEY_I, false, true, true);
views::Accelerator accel_eula_screen(ui::VKEY_E, false, true, true);
views::Accelerator accel_account_screen(app::VKEY_A, false, true, true);
views::Accelerator accel_login_screen(app::VKEY_L, false, true, true);
views::Accelerator accel_network_screen(app::VKEY_N, false, true, true);
views::Accelerator accel_update_screen(app::VKEY_U, false, true, true);
views::Accelerator accel_image_screen(app::VKEY_I, false, true, true);
views::Accelerator accel_eula_screen(app::VKEY_E, false, true, true);
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_account_screen_, Show()).Times(1);
......@@ -233,6 +244,12 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) {
focus_manager = controller()->contents()->GetFocusManager();
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_TRUE(focus_manager->ProcessAccelerator(accel_network_screen));
EXPECT_EQ(controller()->GetNetworkScreen(), controller()->current_screen());
......@@ -254,5 +271,5 @@ IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, MAYBE_Accelerators) {
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);
......@@ -34,9 +34,6 @@ class WizardInProcessBrowserTest : public CrosInProcessBrowserTest {
virtual void CleanUpOnMainThread();
WizardController* controller() const { return controller_; }
void set_controller(WizardController* controller) {
controller_ = controller;
}
private:
std::string screen_name_;
......
......@@ -592,6 +592,8 @@
'browser/chromeos/login/login_html_dialog.h',
'browser/chromeos/login/login_performer.cc',
'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_utils.cc',
'browser/chromeos/login/login_utils.h',
......
......@@ -2026,8 +2026,8 @@
'browser/chromeos/cros/mock_system_library.h',
'browser/chromeos/cros/mock_touchpad_library.h',
'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_screen_browsertest.cc',
'browser/chromeos/login/mock_authenticator.h',
'browser/chromeos/login/network_screen_browsertest.cc',
'browser/chromeos/login/screen_locker_browsertest.cc',
......
......@@ -1234,6 +1234,9 @@ const char kZygoteProcess[] = "zygote";
// Document Viewer.
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.
const char kLoginManager[] = "login-manager";
......
......@@ -345,6 +345,7 @@ extern const char kZygoteProcess[];
#if defined(OS_CHROMEOS)
extern const char kEnableGView[];
extern const char kEnableLoginImages[];
extern const char kLoginManager[];
// TODO(avayvod): Remove this flag when it's unnecessary for testing
// 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