#include <memory>
#include <utility>
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/public/cpp/test/shell_test_api.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/ash_test_util.h"
#include "ash/test/pixel/ash_pixel_differ.h"
#include "ash/test/pixel/ash_pixel_test_helper.h"
#include "ash/wm/desks/desk.h"
#include "ash/wm/desks/desks_controller.h"
#include "ash/wm/overview/overview_controller.h"
#include "ash/wm/overview/overview_grid.h"
#include "ash/wm/overview/overview_grid_test_api.h"
#include "ash/wm/overview/overview_item.h"
#include "ash/wm/overview/overview_test_util.h"
#include "ash/wm/window_cycle/window_cycle_controller.h"
#include "ash/wm/window_cycle/window_cycle_list.h"
#include "ash/wm/window_cycle/window_cycle_view.h"
#include "ash/wm/window_restore/informed_restore_contents_data.h"
#include "ash/wm/window_restore/informed_restore_controller.h"
#include "ash/wm/window_state.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "chromeos/constants/chromeos_features.h"
#include "components/app_constants/constants.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/aura/window.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/widget/widget.h"
namespace ash {
class WmPixelDiffTest
: public AshTestBase,
public testing::WithParamInterface</*enable_system_blur=*/bool> {
public:
std::optional<pixel_test::InitParams> CreatePixelTestInitParams()
const override {
pixel_test::InitParams init_params;
init_params.system_blur_enabled = GetParam();
return init_params;
}
};
INSTANTIATE_TEST_SUITE_P(
,
WmPixelDiffTest,
testing::Bool());
TEST_P(WmPixelDiffTest, OverviewAndDesksBarBasic) {
UpdateDisplay("1600x1000");
auto* controller = DesksController::Get();
controller->NewDesk(DesksCreationRemovalSource::kKeyboard);
controller->desks()[0]->SetName(u"Desk1", true);
controller->desks()[1]->SetName(u"Desk2", true);
auto window1 = CreateAppWindow(gfx::Rect(300, 300));
auto window2 = CreateAppWindow(gfx::Rect(600, 600, 500, 200));
auto window3 = CreateAppWindow(gfx::Rect(100, 400, 100, 600));
DecorateWindow(window1.get(), u"Window1", SK_ColorDKGRAY);
DecorateWindow(window2.get(), u"Window2", SK_ColorBLUE);
DecorateWindow(window3.get(), u"Window3", SK_ColorGRAY);
EnterOverview();
auto* desk_widget = const_cast<views::Widget*>(
GetOverviewGridForRoot(Shell::GetPrimaryRootWindow())->desks_widget());
auto* overview_widget1 =
GetOverviewItemForWindow(window1.get())->item_widget();
auto* overview_widget2 =
GetOverviewItemForWindow(window2.get())->item_widget();
auto* overview_widget3 =
GetOverviewItemForWindow(window3.get())->item_widget();
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
GenerateScreenshotName("overview_and_desks_bar_basic"),
pixel_test_helper()->IsSystemBlurEnabled() ? 21 : 1,
desk_widget, overview_widget1, overview_widget2, overview_widget3));
}
TEST_P(WmPixelDiffTest, DISABLED_OverviewTabletSnap) {
UpdateDisplay("1600x1000");
ShellTestApi().SetTabletModeEnabledForTest(true);
auto window1 = CreateAppWindow(gfx::Rect(300, 300));
auto window2 = CreateAppWindow(gfx::Rect(300, 300));
auto window3 = CreateAppWindow(gfx::Rect(300, 300));
DecorateWindow(window1.get(), u"Window1", SK_ColorDKGRAY);
DecorateWindow(window2.get(), u"Window2", SK_ColorBLUE);
DecorateWindow(window3.get(), u"Window3", SK_ColorRED);
WindowState::Get(window3.get())->Minimize();
WindowSnapWMEvent wm_left_snap_event(WM_EVENT_SNAP_PRIMARY);
WindowState::Get(window1.get())->Activate();
WindowState::Get(window1.get())->OnWMEvent(&wm_left_snap_event);
ASSERT_TRUE(SplitViewController::Get(Shell::GetPrimaryRootWindow())
->InSplitViewMode());
ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
auto* const snapped_window_widget =
views::Widget::GetWidgetForNativeWindow(window1.get());
auto* const overview_widget2 =
GetOverviewItemForWindow(window2.get())->item_widget();
auto* const overview_widget3 =
GetOverviewItemForWindow(window3.get())->item_widget();
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
GenerateScreenshotName("overview_tablet_snap"),
pixel_test_helper()->IsSystemBlurEnabled() ? 3 : 1,
snapped_window_widget, overview_widget2, overview_widget3));
}
TEST_P(WmPixelDiffTest, WindowCycleBasic) {
UpdateDisplay("1600x1000");
auto* desks_controller = DesksController::Get();
desks_controller->NewDesk(DesksCreationRemovalSource::kKeyboard);
desks_controller->desks()[0]->SetName(u"Desk1", true);
desks_controller->desks()[1]->SetName(u"Desk2", true);
auto window1 = CreateAppWindow(gfx::Rect(300, 300));
auto window2 = CreateAppWindow(gfx::Rect(500, 200));
auto window3 = CreateAppWindow(gfx::Rect(100, 600));
auto window4 = CreateAppWindow(gfx::Rect(800, 600));
DecorateWindow(window1.get(), u"Window1", SK_ColorDKGRAY);
DecorateWindow(window2.get(), u"Window2", SK_ColorBLUE);
DecorateWindow(window3.get(), u"Window3", SK_ColorGRAY);
DecorateWindow(window4.get(), u"Window4", SK_ColorGREEN);
WindowCycleList::SetDisableInitialDelayForTesting(true);
GetEventGenerator()->PressKey(ui::VKEY_TAB, ui::EF_ALT_DOWN);
const WindowCycleView* cycle_view = Shell::Get()
->window_cycle_controller()
->window_cycle_list()
->cycle_view();
ASSERT_TRUE(cycle_view);
views::Widget* widget = const_cast<views::Widget*>(cycle_view->GetWidget());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
GenerateScreenshotName("window_cycle_basic"),
pixel_test_helper()->IsSystemBlurEnabled() ? 28 : 1,
widget));
}
TEST_P(WmPixelDiffTest, InformedRestoreNoScreenshotDialog) {
ash::Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean(
prefs::kShowInformedRestoreOnboarding, false);
UpdateDisplay("1600x1000");
InformedRestoreContentsData::AppInfo chrome_app_info(
app_constants::kChromeAppId, "Chrome", 1);
chrome_app_info.tab_infos = std::vector<InformedRestoreContentsData::TabInfo>(
23, InformedRestoreContentsData::TabInfo(GURL("http://example.com")));
auto data = std::make_unique<InformedRestoreContentsData>();
data->apps_infos.push_back(chrome_app_info);
for (int i = 2; i < 12; ++i) {
data->apps_infos.emplace_back(
"test_id", base::StrCat({"Window ", base::NumberToString(i)}),
i);
}
Shell::Get()->informed_restore_controller()->MaybeStartInformedRestoreSession(
std::move(data));
WaitForOverviewEntered();
OverviewGrid* grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow());
ASSERT_TRUE(grid);
auto* widget = OverviewGridTestApi(grid).informed_restore_widget();
ASSERT_TRUE(widget);
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
GenerateScreenshotName("informed_restore_no_screenshot"),
pixel_test_helper()->IsSystemBlurEnabled() ? 2 : 0,
widget));
}
}