Commit 0a1a1d06 authored by Alexander Hendrich's avatar Alexander Hendrich Committed by Commit Bot

[ash/login] Hide tray buttons for custom login screen UI

This CL will add Oobe dialog state that is used to hide the "Add
person" or "Browse as Guest" buttons when an extensions show UI through
the chrome.loginScreenUi API.

API proposal: go/api-login-screen-ui
Design doc: go/dd-login-screen-extension-ui

Bug: 957573
Change-Id: Ifcdba5c3fce5ff3cc892c3d05c4524580cabd042
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1588555
Commit-Queue: Alexander Hendrich <hendrich@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Reviewed-by: default avatarToni Baržić <tbarzic@chromium.org>
Reviewed-by: default avatarDenis Kuznetsov <antrim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664428}
parent bb07c243
......@@ -49,6 +49,10 @@ enum class OobeDialogState {
// Oobe UI dialog is currently hidden.
HIDDEN = 10,
// Showing login UI provided by a Chrome extension using chrome.loginScreenUi
// API.
EXTENSION_LOGIN = 11,
};
// Supported multi-profile user behavior values.
......
......@@ -659,8 +659,8 @@ void LoginShelfView::UpdateUi() {
// 1. It's in login screen or OOBE. Note: In OOBE, the guest button visibility
// is manually controlled by the WebUI.
// 2. Guest login is allowed.
// 3. OOBE UI dialog is not currently showing wrong HWID warning screen or
// SAML password confirmation screen.
// 3. OOBE UI dialog is not currently showing wrong HWID warning screen, SAML
// password confirmation screen or login UI provided by an extension.
// 4. OOBE UI dialog is not currently showing gaia signin screen, or if there
// are no user views available. If there are no user pods (i.e. Gaia is the
// only signin option), the guest button should be shown if allowed.
......@@ -671,6 +671,7 @@ void LoginShelfView::UpdateUi() {
allow_guest_ &&
dialog_state_ != OobeDialogState::WRONG_HWID_WARNING &&
dialog_state_ != OobeDialogState::SAML_PASSWORD_CONFIRM &&
dialog_state_ != OobeDialogState::EXTENSION_LOGIN &&
(dialog_state_ != OobeDialogState::GAIA_SIGNIN ||
!login_screen_has_users_) &&
!user_session_started);
......
......@@ -364,6 +364,11 @@ TEST_F(LoginShelfViewTest, ShouldUpdateUiAfterDialogStateChange) {
login_shelf_view_->SetKioskApps({}, {});
EXPECT_TRUE(
ShowsShelfButtons({LoginShelfView::kShutdown, LoginShelfView::kAddUser}));
// Only shutdown button is visible when state ==
// OobeDialogState::EXTENSION_LOGIN.
login_shelf_view_->SetLoginDialogState(OobeDialogState::EXTENSION_LOGIN);
EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown}));
}
TEST_F(LoginShelfViewTest, ShouldShowGuestButtonWhenNoUserPods) {
......
......@@ -4,6 +4,9 @@
#include "chrome/browser/chromeos/extensions/login_screen_ui/login_screen_extension_ui_handler.h"
#include "ash/public/cpp/login_screen.h"
#include "ash/public/cpp/login_screen_model.h"
#include "ash/public/cpp/login_types.h"
#include "chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_window.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "components/session_manager/core/session_manager.h"
......@@ -79,6 +82,11 @@ bool LoginScreenExtensionUiHandler::Show(const extensions::Extension* extension,
return false;
}
if (!HasOpenWindow()) {
ash::LoginScreen::Get()->GetModel()->NotifyOobeDialogState(
ash::OobeDialogState::EXTENSION_LOGIN);
}
LoginScreenExtensionUiWindow::CreateOptions create_options(
extension->short_name(), extension->GetResourceURL(resource_path),
can_be_closed_by_user,
......@@ -110,6 +118,12 @@ bool LoginScreenExtensionUiHandler::RemoveWindowForExtension(
if (it == windows_.end())
return false;
windows_.erase(it);
if (!HasOpenWindow()) {
ash::LoginScreen::Get()->GetModel()->NotifyOobeDialogState(
ash::OobeDialogState::HIDDEN);
}
return true;
}
......@@ -118,6 +132,10 @@ bool LoginScreenExtensionUiHandler::HasOpenWindow(
return windows_.find(extension_id) != windows_.end();
}
bool LoginScreenExtensionUiHandler::HasOpenWindow() const {
return !windows_.empty();
}
void LoginScreenExtensionUiHandler::UpdateSessionState() {
session_manager::SessionState state =
session_manager::SessionManager::Get()->session_state();
......
......@@ -62,6 +62,7 @@ class LoginScreenExtensionUiHandler
bool RemoveWindowForExtension(const std::string& extension_id);
bool HasOpenWindow(const std::string& extension_id) const;
bool HasOpenWindow() const;
// session_manager::SessionManagerObserver
void OnSessionStateChanged() override;
......
......@@ -8,11 +8,13 @@
#include "base/test/gtest_util.h"
#include "chrome/browser/chromeos/login/ui/login_screen_extension_ui/login_screen_extension_ui_window.h"
#include "chrome/browser/ui/ash/test_login_screen.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/session_manager/core/session_manager.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_service_manager_context.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"
......@@ -166,12 +168,15 @@ class LoginScreenExtensionUiHandlerUnittest : public testing::Test {
}
content::TestBrowserThreadBundle thread_bundle_;
content::TestServiceManagerContext context_;
session_manager::SessionManager session_manager_;
TestingProfileManager profile_manager_;
extensions::ExtensionRegistry* extension_registry_ = nullptr;
scoped_refptr<const extensions::Extension> extension_;
TestLoginScreen test_login_screen_;
FakeLoginScreenExtensionUiWindowFactory* fake_window_factory_ = nullptr;
std::unique_ptr<LoginScreenExtensionUiHandler> ui_handler_;
......
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