[go: nahoru, domu]

blob: 240f8b66d20a302e87f39d995bd5f7937e6091f7 [file] [log] [blame]
Avi Drissman3a215d1e2022-09-07 19:43:091// Copyright 2018 The Chromium Authors
James Cookb263b512018-03-07 22:30:332// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
David Tsengb774097e2021-03-24 17:31:105#include "ash/accessibility/ui/accessibility_panel_layout_manager.h"
James Cookb263b512018-03-07 22:30:336
7#include <memory>
8
Josiah Krutz1ccb7e922023-06-20 16:28:329#include "ash/accessibility/magnifier/docked_magnifier_controller.h"
Matthew Mourgos75327562019-09-09 21:23:5710#include "ash/public/cpp/shelf_config.h"
James Cookb263b512018-03-07 22:30:3311#include "ash/shell.h"
12#include "ash/test/ash_test_base.h"
13#include "ui/display/display.h"
14#include "ui/display/screen.h"
15#include "ui/views/widget/widget.h"
16
17namespace ash {
18namespace {
19
20// Shorten the name for better line wrapping.
Zach Helfinsteinc62558512018-08-16 18:05:4521constexpr int kDefaultPanelHeight =
22 AccessibilityPanelLayoutManager::kDefaultPanelHeight;
James Cookb263b512018-03-07 22:30:3323
24AccessibilityPanelLayoutManager* GetLayoutManager() {
25 aura::Window* container =
26 Shell::GetContainer(Shell::GetPrimaryRootWindow(),
27 kShellWindowId_AccessibilityPanelContainer);
28 return static_cast<AccessibilityPanelLayoutManager*>(
29 container->layout_manager());
30}
31
32// Simulates Chrome creating the ChromeVoxPanel widget.
33std::unique_ptr<views::Widget> CreateChromeVoxPanel() {
34 std::unique_ptr<views::Widget> widget = std::make_unique<views::Widget>();
35 views::Widget::InitParams params(
36 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
37 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
38 aura::Window* root_window = Shell::GetPrimaryRootWindow();
39 params.parent = Shell::GetContainer(
40 root_window, kShellWindowId_AccessibilityPanelContainer);
Hwanseung Lee28dcc142021-04-15 10:15:4541 params.activatable = views::Widget::InitParams::Activatable::kNo;
James Cookb263b512018-03-07 22:30:3342 params.bounds = gfx::Rect(0, 0, root_window->bounds().width(),
43 root_window->bounds().height());
Ahmed Fakhry32f3c452019-08-01 16:36:3444 widget->Init(std::move(params));
James Cookb263b512018-03-07 22:30:3345 return widget;
46}
47
48using AccessibilityPanelLayoutManagerTest = AshTestBase;
49
50TEST_F(AccessibilityPanelLayoutManagerTest, Basics) {
51 AccessibilityPanelLayoutManager* layout_manager = GetLayoutManager();
52 ASSERT_TRUE(layout_manager);
53
54 // The layout manager doesn't track anything at startup.
55 EXPECT_FALSE(layout_manager->panel_window_for_test());
56
57 // Simulate chrome creating the ChromeVox widget. The layout manager starts
58 // managing it.
59 std::unique_ptr<views::Widget> widget = CreateChromeVoxPanel();
60 widget->Show();
61 EXPECT_EQ(widget->GetNativeWindow(), layout_manager->panel_window_for_test());
62
63 // The layout manager doesn't track anything after the widget closes.
64 widget.reset();
65 EXPECT_FALSE(layout_manager->panel_window_for_test());
66}
67
68TEST_F(AccessibilityPanelLayoutManagerTest, Shutdown) {
69 // Simulate chrome creating the ChromeVox widget.
70 std::unique_ptr<views::Widget> widget = CreateChromeVoxPanel();
71 widget->Show();
72
73 // Don't close the window.
74 widget.release();
75
76 // Ash should not crash if the window is still open at shutdown.
77}
78
James Cookb263b512018-03-07 22:30:3379TEST_F(AccessibilityPanelLayoutManagerTest, PanelFullscreen) {
80 AccessibilityPanelLayoutManager* layout_manager = GetLayoutManager();
81 display::Screen* screen = display::Screen::GetScreen();
82
83 std::unique_ptr<views::Widget> widget = CreateChromeVoxPanel();
84 widget->Show();
85
Zach Helfinsteinc62558512018-08-16 18:05:4586 layout_manager->SetPanelBounds(gfx::Rect(0, 0, 0, kDefaultPanelHeight),
Mike Wassermand13e95a2019-06-28 23:29:4887 AccessibilityPanelState::FULL_WIDTH);
Zach Helfinsteinc62558512018-08-16 18:05:4588
James Cookb263b512018-03-07 22:30:3389 gfx::Rect expected_work_area = screen->GetPrimaryDisplay().work_area();
90
Anastasia Helfinsteinb855e3c2018-12-13 23:02:4091 // When the panel is fullscreen it fills the display and clears the
James Cookb263b512018-03-07 22:30:3392 // work area.
Zach Helfinsteinc62558512018-08-16 18:05:4593 layout_manager->SetPanelBounds(gfx::Rect(),
Mike Wassermand13e95a2019-06-28 23:29:4894 AccessibilityPanelState::FULLSCREEN);
James Cookb263b512018-03-07 22:30:3395 EXPECT_EQ(widget->GetNativeWindow()->bounds(),
96 screen->GetPrimaryDisplay().bounds());
Anastasia Helfinsteinb855e3c2018-12-13 23:02:4097 EXPECT_EQ(screen->GetPrimaryDisplay().work_area().y(), 0);
James Cookb263b512018-03-07 22:30:3398
Anastasia Helfinsteinb855e3c2018-12-13 23:02:4099 // Restoring the panel to default size restores the bounds and sets
James Cookb263b512018-03-07 22:30:33100 // the work area.
Zach Helfinsteinc62558512018-08-16 18:05:45101 layout_manager->SetPanelBounds(gfx::Rect(0, 0, 0, kDefaultPanelHeight),
Mike Wassermand13e95a2019-06-28 23:29:48102 AccessibilityPanelState::FULL_WIDTH);
James Cookb263b512018-03-07 22:30:33103 gfx::Rect expected_bounds(0, 0, screen->GetPrimaryDisplay().bounds().width(),
Zach Helfinsteinc62558512018-08-16 18:05:45104 kDefaultPanelHeight);
James Cookb263b512018-03-07 22:30:33105 EXPECT_EQ(widget->GetNativeWindow()->bounds(), expected_bounds);
106 EXPECT_EQ(screen->GetPrimaryDisplay().work_area(), expected_work_area);
107}
108
Zach Helfinsteinc62558512018-08-16 18:05:45109TEST_F(AccessibilityPanelLayoutManagerTest, SetBounds) {
110 std::unique_ptr<views::Widget> widget = CreateChromeVoxPanel();
111 widget->Show();
112
113 gfx::Rect bounds(0, 0, 100, 100);
Mike Wassermand13e95a2019-06-28 23:29:48114 GetLayoutManager()->SetPanelBounds(bounds, AccessibilityPanelState::BOUNDED);
Zach Helfinsteinc62558512018-08-16 18:05:45115 EXPECT_EQ(widget->GetNativeWindow()->bounds(), bounds);
116}
117
James Cookb263b512018-03-07 22:30:33118TEST_F(AccessibilityPanelLayoutManagerTest, DisplayBoundsChange) {
119 std::unique_ptr<views::Widget> widget = CreateChromeVoxPanel();
120 widget->Show();
Mike Wassermand13e95a2019-06-28 23:29:48121 GetLayoutManager()->SetPanelBounds(gfx::Rect(0, 0, 0, kDefaultPanelHeight),
122 AccessibilityPanelState::FULL_WIDTH);
James Cookb263b512018-03-07 22:30:33123
124 // When the display resolution changes the panel still sits at the top of the
125 // screen.
Mitsuru Oshima3fe31cf2022-04-08 08:59:29126 UpdateDisplay("1200x700,1300x800");
James Cookb263b512018-03-07 22:30:33127 display::Screen* screen = display::Screen::GetScreen();
128 gfx::Rect expected_bounds(0, 0, screen->GetPrimaryDisplay().bounds().width(),
Zach Helfinsteinc62558512018-08-16 18:05:45129 kDefaultPanelHeight);
James Cookb263b512018-03-07 22:30:33130 EXPECT_EQ(widget->GetNativeWindow()->bounds(), expected_bounds);
131
132 gfx::Rect expected_work_area = screen->GetPrimaryDisplay().bounds();
Xianzhu Wang453ea8a2022-04-05 23:32:13133 expected_work_area.Inset(gfx::Insets::TLBR(
134 kDefaultPanelHeight, 0, ShelfConfig::Get()->shelf_size(), 0));
James Cookb263b512018-03-07 22:30:33135 EXPECT_EQ(screen->GetPrimaryDisplay().work_area(), expected_work_area);
136}
137
Josiah Krutz1ccb7e922023-06-20 16:28:32138TEST_F(AccessibilityPanelLayoutManagerTest, DockedMagnifierEnabled) {
139 auto* docked_magnifier_controller =
140 Shell::Get()->docked_magnifier_controller();
141 std::unique_ptr<views::Widget> widget = CreateChromeVoxPanel();
142 widget->Show();
143 GetLayoutManager()->SetPanelBounds(gfx::Rect(0, 0, 0, kDefaultPanelHeight),
144 AccessibilityPanelState::FULL_WIDTH);
145
146 // When Docked Magnifier is enabled, panel sits right below, and work area
147 // sits below the panel.
148 docked_magnifier_controller->SetEnabled(true);
149 int magnifier_height = docked_magnifier_controller->GetTotalMagnifierHeight();
150
151 display::Screen* screen = display::Screen::GetScreen();
152 gfx::Rect expected_bounds(0, magnifier_height,
153 screen->GetPrimaryDisplay().bounds().width(),
154 kDefaultPanelHeight);
155 EXPECT_EQ(widget->GetNativeWindow()->bounds(), expected_bounds);
156
157 gfx::Rect expected_work_area = screen->GetPrimaryDisplay().bounds();
158 expected_work_area.Inset(
159 gfx::Insets::TLBR(magnifier_height + kDefaultPanelHeight, 0,
160 ShelfConfig::Get()->shelf_size(), 0));
161 EXPECT_EQ(screen->GetPrimaryDisplay().work_area(), expected_work_area);
162}
163
James Cookb263b512018-03-07 22:30:33164} // namespace
165} // namespace ash