blob: a930d869e8459c69b61a32ec8b83fdd29bb04470 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/focus_cycler.h"
#include "ash/login/ui/lock_contents_view.h"
#include "ash/login/ui/lock_screen.h"
#include "ash/login/ui/login_big_user_view.h"
#include "ash/login/ui/login_test_base.h"
#include "ash/shelf/login_shelf_view.h"
#include "ash/shelf/shelf.h"
#include "ash/shelf/shelf_widget.h"
#include "ash/test/pixel/ash_pixel_differ.h"
#include "ash/test/pixel/ash_pixel_test_init_params.h"
namespace ash {
class LoginShelfViewPixelTestBase : public LoginTestBase {
public:
// Focuses on the login shelf's shutdown button.
void FocusOnShutdownButton() {
views::View* shutdown_button =
GetPrimaryShelf()->shelf_widget()->GetLoginShelfView()->GetViewByID(
LoginShelfView::kShutdown);
views::Widget* shutdown_button_widget = shutdown_button->GetWidget();
Shell::Get()->focus_cycler()->FocusWidget(shutdown_button_widget);
shutdown_button_widget->Activate();
shutdown_button_widget->GetFocusManager()->SetFocusedView(shutdown_button);
}
// LoginTestBase:
void SetUp() override {
LoginTestBase::SetUp();
// The wallpaper has been set when the pixel test is set up.
ShowLoginScreen(/*set_wallpaper=*/false);
SetUserCount(1);
primary_big_user_view_ =
LockContentsView::TestApi(
LockScreen::TestApi(LockScreen::Get()).contents_view())
.primary_big_view();
}
views::View* primary_big_user_view_ = nullptr;
};
class LoginShelfViewPixelTest : public LoginShelfViewPixelTestBase {
public:
// LoginShelfViewPixelTestBase:
absl::optional<pixel_test::InitParams> CreatePixelTestInitParams()
const override {
return pixel_test::InitParams();
}
};
// Verifies that moving the focus by the tab key from the lock contents view
// to the login shelf works as expected.
TEST_F(LoginShelfViewPixelTest, FocusTraversalFromLockContents) {
// Trigger the tab key. Verify that the login user expand button is focused.
aura::Window* primary_shelf_window = GetPrimaryShelf()->GetWindow();
PressAndReleaseKey(ui::VKEY_TAB);
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_login_user_expand_button.rev_0", primary_big_user_view_,
primary_shelf_window));
// Trigger the tab key. Check that the login shelf shutdown button is focused.
PressAndReleaseKey(ui::VKEY_TAB);
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_shutdown_button.rev_0", primary_big_user_view_,
primary_shelf_window));
// Trigger the tab key. Check that the browser as guest button is focused.
PressAndReleaseKey(ui::VKEY_TAB);
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_browser_as_guest_button.rev_0", primary_big_user_view_,
primary_shelf_window));
// Trigger the tab key. Check that the add person button is focused.
PressAndReleaseKey(ui::VKEY_TAB);
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_add_person_button.rev_0", primary_big_user_view_,
primary_shelf_window));
}
// Used to verify the login shelf features with a policy wallpaper.
TEST_F(LoginShelfViewPixelTest, FocusTraversalWithinShelf) {
// Focus on the calendar view.
FocusOnShutdownButton();
PressAndReleaseKey(ui::VKEY_TAB);
PressAndReleaseKey(ui::VKEY_TAB);
PressAndReleaseKey(ui::VKEY_TAB);
aura::Window* primary_shelf_window = GetPrimaryShelf()->GetWindow();
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_calendar_view.rev_0", primary_shelf_window));
// Focus on the time view.
PressAndReleaseKey(ui::VKEY_TAB);
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_time_view.rev_0", primary_shelf_window));
PressAndReleaseKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN);
PressAndReleaseKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN);
// Move the focus back to the add person button.
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"refocus_on_login_shelf.rev_0", primary_shelf_window));
}
class LoginShelfWithPolicyWallpaperPixelTestWithRTL
: public LoginShelfViewPixelTestBase,
public testing::WithParamInterface<bool /*is_rtl=*/> {
public:
// LoginShelfViewPixelTestBase:
absl::optional<pixel_test::InitParams> CreatePixelTestInitParams()
const override {
pixel_test::InitParams init_params;
init_params.wallpaper_init_type = pixel_test::WallpaperInitType::kPolicy;
init_params.under_rtl = GetParam();
return init_params;
}
};
INSTANTIATE_TEST_SUITE_P(RTL,
LoginShelfWithPolicyWallpaperPixelTestWithRTL,
testing::Bool());
// Verifies that focusing on the login shelf widget with a policy wallpaper
// works as expected (see https://crbug.com/1197052).
TEST_P(LoginShelfWithPolicyWallpaperPixelTestWithRTL, FocusOnShutdownButton) {
FocusOnShutdownButton();
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"focus_on_shutdown_button.rev_0", primary_big_user_view_,
GetPrimaryShelf()->GetWindow()));
}
} // namespace ash