Commit dc2e9699 authored by Findit's avatar Findit

Revert "cros: Make LoginDisplayHost own LoginDisplay"

This reverts commit 7f596585.

Reason for revert:

Findit (https://goo.gl/kROfz5) identified CL at revision 568084 as the
culprit for failures in the build cycles as shown on:
https://findit-for-me.appspot.com/waterfall/culprit?key=ag9zfmZpbmRpdC1mb3ItbWVyRAsSDVdmU3VzcGVjdGVkQ0wiMWNocm9taXVtLzdmNTk2NTg1YTM4MmI3ZDIzNDQ3NDAxOTY4OTU4OGUxOTE5ZDU2OWYM

Sample Failed Build: https://ci.chromium.org/buildbot/chromium.memory/Linux%20Chromium%20OS%20ASan%20LSan%20Tests%20%281%29/27973

Sample Failed Step: unit_tests

Original change's description:
> cros: Make LoginDisplayHost own LoginDisplay
> 
> Instead of this ownership model
> 
>   LoginDisplayHost owns ExistingUserController owns LoginDisplay
>   LoginDisplayHost owns WebUIScreenLocker owns LoginDisplay
> 
> switch to
> 
>   LoginDisplayHost owns ExistingUserController, LoginDisplay
> 
> This makes it clear that the LoginDisplay instance has one owner, and
> that it shares the same lifetime as LoginDisplayHost.
> 
> Bug: 851012
> Change-Id: I80cb56d8fc244ce5331046ba31defba4cd77c45f
> Reviewed-on: https://chromium-review.googlesource.com/1093741
> Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
> Commit-Queue: Jacob Dufault <jdufault@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#568084}

Change-Id: I144f702fc39267db2ef830b276ca3c77c2c3c262
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 851012
Reviewed-on: https://chromium-review.googlesource.com/1105240
Cr-Commit-Position: refs/heads/master@{#568182}
parent 5fed877b
......@@ -317,6 +317,7 @@ ExistingUserController* ExistingUserController::current_controller_ = nullptr;
ExistingUserController::ExistingUserController(LoginDisplayHost* host)
: host_(host),
login_display_(host_->CreateLoginDisplay(this)),
cros_settings_(CrosSettings::Get()),
network_state_helper_(new login::NetworkStateHelper),
weak_factory_(this) {
......@@ -411,9 +412,9 @@ void ExistingUserController::UpdateLoginDisplay(
show_guest &= !filtered_users.empty();
bool allow_new_user = true;
cros_settings_->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
GetLoginDisplay()->set_parent_window(GetNativeWindow());
GetLoginDisplay()->Init(filtered_users, show_guest, show_users_on_signin,
allow_new_user);
login_display_->set_parent_window(GetNativeWindow());
login_display_->Init(filtered_users, show_guest, show_users_on_signin,
allow_new_user);
host_->OnPreferencesChanged();
}
......@@ -510,6 +511,7 @@ ExistingUserController::~ExistingUserController() {
} else {
NOTREACHED() << "More than one controller are alive.";
}
DCHECK(login_display_.get());
}
////////////////////////////////////////////////////////////////////////////////
......@@ -665,7 +667,7 @@ void ExistingUserController::ContinuePerformLoginWithoutMigration(
void ExistingUserController::RestartLogin(const UserContext& user_context) {
is_login_in_progress_ = false;
login_performer_.reset();
GetLoginDisplay()->ShowSigninUI(user_context.GetAccountId().GetUserEmail());
login_display_->ShowSigninUI(user_context.GetAccountId().GetUserEmail());
}
void ExistingUserController::OnSigninScreenReady() {
......@@ -800,8 +802,8 @@ void ExistingUserController::ShowEncryptionMigrationScreen(
}
void ExistingUserController::ShowTPMError() {
GetLoginDisplay()->SetUIEnabled(false);
GetLoginDisplay()->ShowErrorScreen(LoginDisplay::TPM_ERROR);
login_display_->SetUIEnabled(false);
login_display_->ShowErrorScreen(LoginDisplay::TPM_ERROR);
}
void ExistingUserController::ShowPasswordChangedDialog() {
......@@ -819,8 +821,8 @@ void ExistingUserController::ShowPasswordChangedDialog() {
// us to recover from a lost owner password/homedir.
// TODO(gspencer): We shouldn't have to erase stateful data when
// doing this. See http://crosbug.com/9115 http://crosbug.com/7792
GetLoginDisplay()->ShowPasswordChangedDialog(show_invalid_old_password_error,
display_email_);
login_display_->ShowPasswordChangedDialog(show_invalid_old_password_error,
display_email_);
}
////////////////////////////////////////////////////////////////////////////////
......@@ -854,7 +856,7 @@ void ExistingUserController::OnAuthFailure(const AuthFailure& failure) {
ShowTPMError();
} else if (last_login_attempt_account_id_ == user_manager::GuestAccountId()) {
// Show no errors, just re-enable input.
GetLoginDisplay()->ClearAndEnablePassword();
login_display_->ClearAndEnablePassword();
StartAutoLoginTimer();
} else if (is_known_user &&
failure.reason() == AuthFailure::MISSING_CRYPTOHOME) {
......@@ -879,7 +881,7 @@ void ExistingUserController::OnAuthFailure(const AuthFailure& failure) {
if (auth_flow_offline_)
UMA_HISTOGRAM_BOOLEAN("Login.OfflineFailure.IsKnownUser", is_known_user);
GetLoginDisplay()->ClearAndEnablePassword();
login_display_->ClearAndEnablePassword();
StartAutoLoginTimer();
}
......@@ -896,7 +898,7 @@ void ExistingUserController::OnAuthFailure(const AuthFailure& failure) {
void ExistingUserController::OnAuthSuccess(const UserContext& user_context) {
is_login_in_progress_ = false;
GetLoginDisplay()->set_signin_completed(true);
login_display_->set_signin_completed(true);
// Login performer will be gone so cache this value to use
// once profile is loaded.
......@@ -968,7 +970,7 @@ void ExistingUserController::OnAuthSuccess(const UserContext& user_context) {
void ExistingUserController::OnProfilePrepared(Profile* profile,
bool browser_launched) {
// Reenable clicking on other windows and status area.
GetLoginDisplay()->SetUIEnabled(true);
login_display_->SetUIEnabled(true);
if (browser_launched)
host_ = nullptr;
......@@ -1186,13 +1188,13 @@ void ExistingUserController::ForceOnlineLoginForAccountId(
// Start online sign-in UI for the user.
is_login_in_progress_ = false;
login_performer_.reset();
GetLoginDisplay()->ShowSigninUI(account_id.GetUserEmail());
login_display_->ShowSigninUI(account_id.GetUserEmail());
}
void ExistingUserController::WhiteListCheckFailed(const std::string& email) {
PerformLoginFinishedActions(true /* start auto login timer */);
GetLoginDisplay()->ShowWhitelistCheckFailedError();
login_display_->ShowWhitelistCheckFailedError();
if (auth_status_consumer_) {
auth_status_consumer_->OnAuthFailure(
......@@ -1221,7 +1223,7 @@ void ExistingUserController::SetAuthFlowOffline(bool offline) {
void ExistingUserController::DeviceSettingsChanged() {
// If login was already completed, we should avoid any signin screen
// transitions, see http://crbug.com/461604 for example.
if (host_ != nullptr && !GetLoginDisplay()->is_signin_completed()) {
if (host_ != nullptr && !login_display_->is_signin_completed()) {
// Signed settings or user list changed. Notify views and update them.
UpdateLoginDisplay(user_manager::UserManager::Get()->GetUsers());
ConfigureAutoLogin();
......@@ -1242,10 +1244,6 @@ bool ExistingUserController::password_changed() const {
return password_changed_;
}
LoginDisplay* ExistingUserController::GetLoginDisplay() {
return host_->GetLoginDisplay();
}
void ExistingUserController::LoginAsGuest() {
PerformPreLoginActions(UserContext(user_manager::USER_TYPE_GUEST,
user_manager::GuestAccountId()));
......@@ -1508,7 +1506,7 @@ void ExistingUserController::ShowError(int error_id,
}
}
GetLoginDisplay()->ShowError(error_id, num_login_attempts_, help_topic_id);
login_display_->ShowError(error_id, num_login_attempts_, help_topic_id);
}
void ExistingUserController::SendAccessibilityAlert(
......@@ -1551,7 +1549,7 @@ void ExistingUserController::LoginAsPublicSessionInternal(
void ExistingUserController::PerformPreLoginActions(
const UserContext& user_context) {
// Disable clicking on other windows and status tray.
GetLoginDisplay()->SetUIEnabled(false);
login_display_->SetUIEnabled(false);
if (last_login_attempt_account_id_ != user_context.GetAccountId()) {
last_login_attempt_account_id_ = user_context.GetAccountId();
......@@ -1568,7 +1566,7 @@ void ExistingUserController::PerformLoginFinishedActions(
is_login_in_progress_ = false;
// Reenable clicking on other windows and status area.
GetLoginDisplay()->SetUIEnabled(true);
login_display_->SetUIEnabled(true);
if (start_auto_login_timer)
StartAutoLoginTimer();
......@@ -1588,7 +1586,7 @@ void ExistingUserController::ContinueLoginWhenCryptohomeAvailable(
void ExistingUserController::ContinueLoginIfDeviceNotDisabled(
const base::Closure& continuation) {
// Disable clicking on other windows and status tray.
GetLoginDisplay()->SetUIEnabled(false);
login_display_->SetUIEnabled(false);
// Stop the auto-login timer.
StopAutoLoginTimer();
......@@ -1605,13 +1603,13 @@ void ExistingUserController::ContinueLoginIfDeviceNotDisabled(
if (status == CrosSettingsProvider::PERMANENTLY_UNTRUSTED) {
// If the |cros_settings_| are permanently untrusted, show an error message
// and refuse to log in.
GetLoginDisplay()->ShowError(IDS_LOGIN_ERROR_OWNER_KEY_LOST, 1,
HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT);
login_display_->ShowError(IDS_LOGIN_ERROR_OWNER_KEY_LOST, 1,
HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT);
// Re-enable clicking on other windows and the status area. Do not start the
// auto-login timer though. Without trusted |cros_settings_|, no auto-login
// can succeed.
GetLoginDisplay()->SetUIEnabled(true);
login_display_->SetUIEnabled(true);
return;
}
......@@ -1621,7 +1619,7 @@ void ExistingUserController::ContinueLoginIfDeviceNotDisabled(
// Re-enable clicking on other windows and the status area. Do not start the
// auto-login timer though. On a disabled device, no auto-login can succeed.
GetLoginDisplay()->SetUIEnabled(true);
login_display_->SetUIEnabled(true);
return;
}
......@@ -1708,7 +1706,7 @@ void ExistingUserController::DoLogin(const UserContext& user_context,
// If credentials are missing, refuse to log in.
// Reenable clicking on other windows and status area.
GetLoginDisplay()->SetUIEnabled(true);
login_display_->SetUIEnabled(true);
// Restart the auto-login timer.
StartAutoLoginTimer();
}
......@@ -1744,7 +1742,7 @@ void ExistingUserController::OnTokenHandleChecked(
// permission to collect a feedback.
RecordPasswordChangeFlow(LOGIN_PASSWORD_CHANGE_FLOW_CRYPTOHOME_FAILURE);
VLOG(1) << "Show unrecoverable cryptohome error dialog.";
GetLoginDisplay()->ShowUnrecoverableCrypthomeErrorDialog();
login_display_->ShowUnrecoverableCrypthomeErrorDialog();
}
void ExistingUserController::ClearRecordedNames() {
......
......@@ -49,7 +49,7 @@ class CloudPolicySettings;
namespace chromeos {
class CrosSettings;
class LoginDisplay;
class LoginDisplayHost;
class OAuth2TokenInitializer;
namespace login {
......@@ -139,6 +139,13 @@ class ExistingUserController
auth_status_consumer_ = consumer;
}
// Returns the LoginDisplay created and owned by this controller.
// Used for testing.
LoginDisplay* login_display() { return login_display_.get(); }
// Returns the LoginDisplayHost for this controller.
LoginDisplayHost* login_display_host() { return host_; }
// Returns value of LoginPerformer::auth_mode() (cached if performer is
// destroyed).
LoginPerformer::AuthorizationMode auth_mode() const;
......@@ -155,9 +162,6 @@ class ExistingUserController
FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, ExistingUserLogin);
// Login UI implementation instance.
LoginDisplay* GetLoginDisplay();
void LoginAsGuest();
void LoginAsPublicSession(const UserContext& user_context);
void LoginAsKioskApp(const std::string& app_id, bool diagnostic_mode);
......@@ -212,6 +216,9 @@ class ExistingUserController
// Shows "enable developer features" screen.
void ShowEnableDebuggingScreen();
// Shows demo mode setup screen.
void ShowDemoModeSetupScreen();
// Shows kiosk feature enable screen.
void ShowKioskEnableScreen();
......@@ -348,6 +355,9 @@ class ExistingUserController
// OOBE/login display host.
LoginDisplayHost* host_;
// Login UI implementation instance.
std::unique_ptr<LoginDisplay> login_display_;
// Number of login attempts. Used to show help link when > 1 unsuccessful
// logins for the same user.
size_t num_login_attempts_ = 0;
......
......@@ -51,8 +51,9 @@ class ExistingUserControllerAutoLoginTest : public ::testing::Test {
mock_login_display_ = new MockLoginDisplay();
arc_kiosk_app_manager_.reset(new ArcKioskAppManager());
ON_CALL(*mock_login_display_host_, GetLoginDisplay())
.WillByDefault(Return(mock_login_display_));
EXPECT_CALL(*mock_login_display_host_.get(), CreateLoginDisplay(_))
.Times(1)
.WillOnce(Return(mock_login_display_));
EXPECT_CALL(*mock_user_manager_, Shutdown()).Times(AnyNumber());
EXPECT_CALL(*mock_user_manager_, FindUser(_)).WillRepeatedly(ReturnNull());
......
......@@ -204,21 +204,22 @@ class ExistingUserControllerTest : public policy::DevicePolicyCrosBrowserTest {
DevicePolicyCrosBrowserTest::SetUpInProcessBrowserTestFixture();
mock_login_display_host_ = std::make_unique<MockLoginDisplayHost>();
mock_login_display_ = std::make_unique<MockLoginDisplay>();
mock_login_display_host_.reset(new MockLoginDisplayHost());
mock_login_display_ = new MockLoginDisplay();
SetUpLoginDisplay();
}
virtual void SetUpSessionManager() {}
virtual void SetUpLoginDisplay() {
EXPECT_CALL(*mock_login_display_host_, GetLoginDisplay())
.Times(AnyNumber())
.WillRepeatedly(Return(mock_login_display_.get()));
EXPECT_CALL(*mock_login_display_host_, GetNativeWindow())
EXPECT_CALL(*mock_login_display_host_.get(), CreateLoginDisplay(_))
.Times(1)
.WillOnce(Return(mock_login_display_));
EXPECT_CALL(*mock_login_display_host_.get(), GetNativeWindow())
.Times(1)
.WillOnce(ReturnNull());
EXPECT_CALL(*mock_login_display_host_, OnPreferencesChanged()).Times(1);
EXPECT_CALL(*mock_login_display_host_.get(), OnPreferencesChanged())
.Times(1);
EXPECT_CALL(*mock_login_display_, Init(_, false, true, true)).Times(1);
}
......@@ -288,7 +289,9 @@ class ExistingUserControllerTest : public policy::DevicePolicyCrosBrowserTest {
std::unique_ptr<ExistingUserController> existing_user_controller_;
std::unique_ptr<MockLoginDisplay> mock_login_display_;
// |mock_login_display_| is owned by the ExistingUserController, which calls
// CreateLoginDisplay() on the |mock_login_display_host_| to get it.
MockLoginDisplay* mock_login_display_ = nullptr;
std::unique_ptr<MockLoginDisplayHost> mock_login_display_host_;
// Mock URLFetcher.
......@@ -478,9 +481,9 @@ class ExistingUserControllerPublicSessionTest
}
void SetUpLoginDisplay() override {
EXPECT_CALL(*mock_login_display_host_, GetLoginDisplay())
.Times(AnyNumber())
.WillRepeatedly(Return(mock_login_display_.get()));
EXPECT_CALL(*mock_login_display_host_.get(), CreateLoginDisplay(_))
.Times(1)
.WillOnce(Return(mock_login_display_));
EXPECT_CALL(*mock_login_display_host_.get(), GetNativeWindow())
.Times(AnyNumber())
.WillRepeatedly(ReturnNull());
......@@ -952,13 +955,14 @@ class ExistingUserControllerActiveDirectoryUserWhitelistTest
}
void SetUpLoginDisplay() override {
EXPECT_CALL(*mock_login_display_host_, GetLoginDisplay())
.Times(AnyNumber())
.WillRepeatedly(Return(mock_login_display_.get()));
EXPECT_CALL(*mock_login_display_host_, GetNativeWindow())
EXPECT_CALL(*mock_login_display_host_.get(), CreateLoginDisplay(_))
.Times(1)
.WillOnce(Return(mock_login_display_));
EXPECT_CALL(*mock_login_display_host_.get(), GetNativeWindow())
.Times(1)
.WillOnce(ReturnNull());
EXPECT_CALL(*mock_login_display_host_, OnPreferencesChanged()).Times(1);
EXPECT_CALL(*mock_login_display_host_.get(), OnPreferencesChanged())
.Times(1);
EXPECT_CALL(*mock_login_display_, Init(_, false, true, false)).Times(1);
}
};
......
......@@ -156,10 +156,10 @@ void WebUIScreenLocker::LockScreen() {
LoadURL(GURL(kLoginURL));
OnLockWindowReady();
signin_screen_controller_.reset(new SignInScreenController(GetOobeUI()));
signin_screen_controller_.reset(
new SignInScreenController(GetOobeUI(), this));
login_display_.reset(new LoginDisplayWebUI());
login_display_->set_delegate(this);
login_display_.reset(new LoginDisplayWebUI(this));
login_display_->set_parent_window(GetNativeWindow());
login_display_->Init(screen_locker_->users(), false, true, false);
......
......@@ -8,10 +8,12 @@
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h"
#include "chrome/browser/chromeos/login/screens/gaia_view.h"
#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/ui/login_display_host_webui.h"
#include "chrome/browser/chromeos/login/ui/login_display_webui.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
......@@ -53,8 +55,9 @@ class OobeTest : public OobeBaseTest {
OobeBaseTest::TearDownOnMainThread();
}
LoginDisplay* GetLoginDisplay() {
return LoginDisplayHost::default_host()->GetLoginDisplay();
LoginDisplayWebUI* GetLoginDisplay() {
return static_cast<LoginDisplayWebUI*>(
ExistingUserController::current_controller()->login_display());
}
views::Widget* GetLoginWindowWidget() {
......
......@@ -360,6 +360,11 @@ void UserSelectionScreen::InitEasyUnlock() {
proximity_auth::ScreenlockBridge::Get()->SetLockHandler(this);
}
void UserSelectionScreen::SetLoginDisplayDelegate(
LoginDisplay::Delegate* login_display_delegate) {
login_display_delegate_ = login_display_delegate;
}
// static
void UserSelectionScreen::FillUserDictionary(
user_manager::User* user,
......@@ -754,11 +759,9 @@ void UserSelectionScreen::AttemptEasySignin(const AccountId& account_id,
user_context.SetKey(Key(secret));
user_context.GetKey()->SetLabel(key_label);
// LoginDisplayHost does not exist in views-based lock screen.
if (LoginDisplayHost::default_host()) {
LoginDisplayHost::default_host()->GetLoginDisplay()->delegate()->Login(
user_context, SigninSpecifics());
}
// login display delegate not exist in views-based lock screen.
if (login_display_delegate_)
login_display_delegate_->Login(user_context, SigninSpecifics());
}
void UserSelectionScreen::Show() {}
......
......@@ -39,6 +39,7 @@ class UserSelectionScreen
explicit UserSelectionScreen(const std::string& display_type);
~UserSelectionScreen() override;
void SetLoginDisplayDelegate(LoginDisplay::Delegate* login_display_delegate);
void SetHandler(LoginDisplayWebUIHandler* handler);
void SetView(UserBoardView* view);
......@@ -151,6 +152,7 @@ class UserSelectionScreen
TokenHandleUtil::TokenHandleStatus status);
LoginDisplayWebUIHandler* handler_ = nullptr;
LoginDisplay::Delegate* login_display_delegate_ = nullptr;
// Purpose of the screen (see constants in OobeUI).
const std::string display_type_;
......
......@@ -15,6 +15,7 @@
#include "chrome/browser/chromeos/login/startup_utils.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h"
#include "chrome/browser/chromeos/login/ui/login_display_webui.h"
#include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
......
......@@ -16,7 +16,9 @@ namespace chromeos {
SignInScreenController* SignInScreenController::instance_ = nullptr;
SignInScreenController::SignInScreenController(OobeUI* oobe_ui)
SignInScreenController::SignInScreenController(
OobeUI* oobe_ui,
LoginDisplay::Delegate* login_display_delegate)
: oobe_ui_(oobe_ui), gaia_screen_(new GaiaScreen()) {
DCHECK(!instance_);
instance_ = this;
......@@ -24,6 +26,7 @@ SignInScreenController::SignInScreenController(OobeUI* oobe_ui)
gaia_screen_->set_view(oobe_ui_->GetGaiaScreenView());
std::string display_type = oobe_ui->display_type();
user_selection_screen_.reset(new ChromeUserSelectionScreen(display_type));
user_selection_screen_->SetLoginDisplayDelegate(login_display_delegate);
user_board_view_ = oobe_ui_->GetUserBoardView()->GetWeakPtr();
user_selection_screen_->SetView(user_board_view_.get());
......
......@@ -33,7 +33,8 @@ class SignInScreenController : public user_manager::RemoveUserDelegate,
public user_manager::UserManager::Observer,
public content::NotificationObserver {
public:
explicit SignInScreenController(OobeUI* oobe_ui);
SignInScreenController(OobeUI* oobe_ui,
LoginDisplay::Delegate* login_display_delegate);
~SignInScreenController() override;
// Returns the default wizard controller if it has been created.
......
......@@ -29,7 +29,8 @@ FakeLoginDisplayHost::FakeLoginDisplayHost()
FakeLoginDisplayHost::~FakeLoginDisplayHost() = default;
LoginDisplay* FakeLoginDisplayHost::GetLoginDisplay() {
LoginDisplay* FakeLoginDisplayHost::CreateLoginDisplay(
LoginDisplay::Delegate* delegate) {
return nullptr;
}
......
......@@ -23,7 +23,7 @@ class FakeLoginDisplayHost : public LoginDisplayHost {
~FakeLoginDisplayHost() override;
// chromeos::LoginDisplayHost:
LoginDisplay* GetLoginDisplay() override;
LoginDisplay* CreateLoginDisplay(LoginDisplay::Delegate* delegate) override;
gfx::NativeWindow GetNativeWindow() const override;
OobeUI* GetOobeUI() const override;
WebUILoginView* GetWebUILoginView() const override;
......
......@@ -8,7 +8,7 @@ namespace chromeos {
LoginDisplay::Delegate::~Delegate() = default;
LoginDisplay::LoginDisplay() = default;
LoginDisplay::LoginDisplay(Delegate* delegate) : delegate_(delegate) {}
LoginDisplay::~LoginDisplay() = default;
......
......@@ -79,7 +79,7 @@ class LoginDisplay {
virtual ~Delegate();
};
LoginDisplay();
explicit LoginDisplay(Delegate* delegate);
virtual ~LoginDisplay();
// Clears and enables fields on user pod or GAIA frame.
......
......@@ -52,8 +52,10 @@ class LoginDisplayHost {
// Returns the default LoginDisplayHost instance if it has been created.
static LoginDisplayHost* default_host() { return default_host_; }
// Returns an unowned pointer to the LoginDisplay* instance.
virtual LoginDisplay* GetLoginDisplay() = 0;
// Creates UI implementation specific login display instance (views/WebUI).
// The caller takes ownership of the returned value.
virtual LoginDisplay* CreateLoginDisplay(
LoginDisplay::Delegate* delegate) = 0;
// Returns corresponding native window.
virtual gfx::NativeWindow GetNativeWindow() const = 0;
......
......@@ -31,8 +31,7 @@ constexpr char kAccelSendFeedback[] = "send_feedback";
} // namespace
LoginDisplayHostMojo::LoginDisplayHostMojo()
: login_display_(std::make_unique<LoginDisplayMojo>(this)),
user_board_view_mojo_(std::make_unique<UserBoardViewMojo>()),
: user_board_view_mojo_(std::make_unique<UserBoardViewMojo>()),
user_selection_screen_(
std::make_unique<ChromeUserSelectionScreen>(kLoginDisplay)),
weak_factory_(this) {
......@@ -94,8 +93,13 @@ void LoginDisplayHostMojo::ShowSigninUI(const std::string& email) {
dialog_->Show(true /*closable_by_esc*/);
}
LoginDisplay* LoginDisplayHostMojo::GetLoginDisplay() {
return login_display_.get();
LoginDisplay* LoginDisplayHostMojo::CreateLoginDisplay(
LoginDisplay::Delegate* delegate) {
user_selection_screen_->SetLoginDisplayDelegate(delegate);
LoginDisplayMojo* login_display = new LoginDisplayMojo(delegate, this);
if (GetOobeUI())
GetOobeUI()->signin_screen_handler()->SetDelegate(login_display);
return login_display;
}
gfx::NativeWindow LoginDisplayHostMojo::GetNativeWindow() const {
......@@ -169,7 +173,6 @@ void LoginDisplayHostMojo::OnStartSignInScreen(
// There can only be one |ExistingUserController| instance at a time.
existing_user_controller_.reset();
existing_user_controller_ = std::make_unique<ExistingUserController>(this);
login_display_->set_delegate(existing_user_controller_.get());
// We need auth attempt results to notify views-based lock screen.
existing_user_controller_->set_login_status_consumer(this);
......
......@@ -18,7 +18,6 @@
namespace chromeos {
class ExistingUserController;
class LoginDisplayMojo;
class OobeUIDialogDelegate;
class UserBoardViewMojo;
class UserSelectionScreen;
......@@ -65,7 +64,7 @@ class LoginDisplayHostMojo : public LoginDisplayHostCommon,
}
// LoginDisplayHost:
LoginDisplay* GetLoginDisplay() override;
LoginDisplay* CreateLoginDisplay(LoginDisplay::Delegate* delegate) override;
gfx::NativeWindow GetNativeWindow() const override;
OobeUI* GetOobeUI() const override;
WebUILoginView* GetWebUILoginView() const override;
......@@ -118,8 +117,6 @@ class LoginDisplayHostMojo : public LoginDisplayHostCommon,
// Callback that should be executed the authentication result is available.
AuthenticateUserCallback on_authenticated_;
std::unique_ptr<LoginDisplayMojo> login_display_;
std::unique_ptr<UserBoardViewMojo> user_board_view_mojo_;
std::unique_ptr<UserSelectionScreen> user_selection_screen_;
......
......@@ -490,8 +490,6 @@ LoginDisplayHostWebUI::LoginDisplayHostWebUI()
ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
manager->Initialize(SOUND_STARTUP,
bundle.GetRawDataResource(IDR_SOUND_STARTUP_WAV));
login_display_ = std::make_unique<LoginDisplayWebUI>();
}
LoginDisplayHostWebUI::~LoginDisplayHostWebUI() {
......@@ -530,8 +528,10 @@ LoginDisplayHostWebUI::~LoginDisplayHostWebUI() {
////////////////////////////////////////////////////////////////////////////////
// LoginDisplayHostWebUI, LoginDisplayHost:
LoginDisplay* LoginDisplayHostWebUI::GetLoginDisplay() {
return login_display_.get();
LoginDisplay* LoginDisplayHostWebUI::CreateLoginDisplay(
LoginDisplay::Delegate* delegate) {
login_display_ = new LoginDisplayWebUI(delegate);
return login_display_;
}
gfx::NativeWindow LoginDisplayHostWebUI::GetNativeWindow() const {
......@@ -651,7 +651,8 @@ void LoginDisplayHostWebUI::OnStartUserAdding() {
existing_user_controller_.reset(new ExistingUserController(this));
if (!signin_screen_controller_.get()) {
signin_screen_controller_.reset(new SignInScreenController(GetOobeUI()));
signin_screen_controller_.reset(
new SignInScreenController(GetOobeUI(), login_display_->delegate()));
}
SetOobeProgressBarVisible(oobe_progress_bar_visible_ = false);
......@@ -659,8 +660,8 @@ void LoginDisplayHostWebUI::OnStartUserAdding() {
existing_user_controller_->Init(
user_manager::UserManager::Get()->GetUsersAllowedForMultiProfile());
CHECK(login_display_);
GetOobeUI()->ShowSigninScreen(LoginScreenContext(), login_display_.get(),
login_display_.get());
GetOobeUI()->ShowSigninScreen(LoginScreenContext(), login_display_,
login_display_);
}
void LoginDisplayHostWebUI::CancelUserAdding() {
......@@ -700,10 +701,10 @@ void LoginDisplayHostWebUI::OnStartSignInScreen(
DVLOG(1) << "Starting sign in screen";
existing_user_controller_.reset(); // Only one controller in a time.
existing_user_controller_.reset(new ExistingUserController(this));
login_display_->set_delegate(existing_user_controller_.get());
if (!signin_screen_controller_.get()) {
signin_screen_controller_.reset(new SignInScreenController(GetOobeUI()));
signin_screen_controller_.reset(
new SignInScreenController(GetOobeUI(), login_display_->delegate()));
}
// TODO(crbug.com/784495): This is always false, since
......@@ -713,8 +714,7 @@ void LoginDisplayHostWebUI::OnStartSignInScreen(
existing_user_controller_->Init(user_manager::UserManager::Get()->GetUsers());
CHECK(login_display_);
GetOobeUI()->ShowSigninScreen(context, login_display_.get(),
login_display_.get());
GetOobeUI()->ShowSigninScreen(context, login_display_, login_display_);
TRACE_EVENT_ASYNC_STEP_INTO0("ui", "ShowLoginWebUI", kShowLoginWebUIid,
"WaitForScreenStateInitialize");
......@@ -1135,7 +1135,7 @@ void LoginDisplayHostWebUI::OnLoginPromptVisible() {
// static
void LoginDisplayHostWebUI::DisableRestrictiveProxyCheckForTest() {
default_host()
static_cast<LoginDisplayHostWebUI*>(default_host())
->GetOobeUI()
->GetGaiaScreenView()
->DisableRestrictiveProxyCheckForTest();
......
......@@ -54,7 +54,7 @@ class LoginDisplayHostWebUI : public LoginDisplayHostCommon,
~LoginDisplayHostWebUI() override;
// LoginDisplayHost:
LoginDisplay* GetLoginDisplay() override;
LoginDisplay* CreateLoginDisplay(LoginDisplay::Delegate* delegate) override;
gfx::NativeWindow GetNativeWindow() const override;
OobeUI* GetOobeUI() const override;
WebUILoginView* GetWebUILoginView() const override;
......@@ -197,7 +197,7 @@ class LoginDisplayHostWebUI : public LoginDisplayHostCommon,
WebUILoginView* login_view_ = nullptr;
// Login display we are using.
std::unique_ptr<LoginDisplayWebUI> login_display_;
LoginDisplayWebUI* login_display_ = nullptr;
// True if the login display is the current screen.
bool is_showing_login_ = false;
......
......@@ -24,14 +24,17 @@
namespace chromeos {
LoginDisplayMojo::LoginDisplayMojo(LoginDisplayHostMojo* host) : host_(host) {
LoginDisplayMojo::LoginDisplayMojo(Delegate* delegate,
LoginDisplayHostMojo* host)
: LoginDisplay(delegate), host_(host) {
user_manager::UserManager::Get()->AddObserver(this);
if (host_->GetOobeUI())
host_->GetOobeUI()->signin_screen_handler()->SetDelegate(this);
}
LoginDisplayMojo::~LoginDisplayMojo() {
user_manager::UserManager::Get()->RemoveObserver(this);
// Make sure SigninScreenHandler does not hold a reference to LoginDisplayMojo
// after it is deleted.
if (host_->GetOobeUI())
host_->GetOobeUI()->signin_screen_handler()->SetDelegate(nullptr);
}
......
......@@ -22,7 +22,7 @@ class LoginDisplayMojo : public LoginDisplay,
public SigninScreenHandlerDelegate,
public user_manager::UserManager::Observer {
public:
explicit LoginDisplayMojo(LoginDisplayHostMojo* host);
LoginDisplayMojo(Delegate* delegate, LoginDisplayHostMojo* host);
~LoginDisplayMojo() override;
// LoginDisplay:
......
......@@ -41,7 +41,8 @@ LoginDisplayWebUI::~LoginDisplayWebUI() {
// LoginDisplay implementation: ------------------------------------------------
LoginDisplayWebUI::LoginDisplayWebUI() = default;
LoginDisplayWebUI::LoginDisplayWebUI(LoginDisplay::Delegate* delegate)
: LoginDisplay(delegate) {}
void LoginDisplayWebUI::ClearAndEnablePassword() {
if (webui_handler_)
......
......@@ -27,7 +27,7 @@ class LoginDisplayWebUI : public LoginDisplay,
public SigninScreenHandlerDelegate,
public ui::UserActivityObserver {
public:
LoginDisplayWebUI();
explicit LoginDisplayWebUI(LoginDisplay::Delegate* delegate);
~LoginDisplayWebUI() override;
// LoginDisplay implementation:
......
......@@ -10,7 +10,7 @@
namespace chromeos {
MockLoginDisplay::MockLoginDisplay() = default;
MockLoginDisplay::MockLoginDisplay() : LoginDisplay(nullptr) {}
MockLoginDisplay::~MockLoginDisplay() = default;
......
......@@ -19,7 +19,7 @@ class MockLoginDisplayHost : public LoginDisplayHost {
MockLoginDisplayHost();
virtual ~MockLoginDisplayHost();
MOCK_METHOD0(GetLoginDisplay, LoginDisplay*());
MOCK_METHOD1(CreateLoginDisplay, LoginDisplay*(LoginDisplay::Delegate*));
MOCK_CONST_METHOD0(GetNativeWindow, gfx::NativeWindow(void));
MOCK_CONST_METHOD0(GetOobeUI, OobeUI*(void));
MOCK_CONST_METHOD0(GetWebUILoginView, WebUILoginView*(void));
......
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