blob: 1cbc09b319dba6d528119e7004e867767f625484 [file] [log] [blame]
[email protected]55ad8c12014-01-17 18:24:331// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]8d625fb2012-07-18 16:40:062// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]55ad8c12014-01-17 18:24:335#include "ash/screen_util.h"
[email protected]8d625fb2012-07-18 16:40:066
Ahmed Fakhry1ac713b2018-11-06 18:57:467#include "ash/root_window_controller.h"
8#include "ash/shelf/shelf.h"
Manu Corneta76b6b02018-08-30 21:02:239#include "ash/shelf/shelf_constants.h"
[email protected]8d625fb2012-07-18 16:40:0610#include "ash/shell.h"
estadea23d6ceb2017-02-15 00:47:0911#include "ash/test/ash_test_base.h"
[email protected]8d625fb2012-07-18 16:40:0612#include "ash/wm/window_util.h"
13#include "ui/aura/env.h"
[email protected]8d625fb2012-07-18 16:40:0614#include "ui/aura/window.h"
[email protected]fcc51c952014-02-21 21:31:2615#include "ui/aura/window_event_dispatcher.h"
rjkroege72f8154f2016-10-29 00:49:0216#include "ui/display/manager/display_manager.h"
Ahmed Fakhry4f8e3722017-10-31 21:01:5817#include "ui/display/unified_desktop_utils.h"
[email protected]8d625fb2012-07-18 16:40:0618#include "ui/views/widget/widget.h"
19#include "ui/views/widget/widget_delegate.h"
yhanada698af192017-02-23 10:57:0720#include "ui/wm/core/coordinate_conversion.h"
[email protected]8d625fb2012-07-18 16:40:0621
22namespace ash {
[email protected]8d625fb2012-07-18 16:40:0623
estadea23d6ceb2017-02-15 00:47:0924using ScreenUtilTest = AshTestBase;
[email protected]8d625fb2012-07-18 16:40:0625
estadea23d6ceb2017-02-15 00:47:0926TEST_F(ScreenUtilTest, Bounds) {
[email protected]f634dd32012-07-23 22:49:0727 UpdateDisplay("600x600,500x500");
[email protected]a2e6af12013-01-07 21:40:3528 views::Widget* primary = views::Widget::CreateWindowWithContextAndBounds(
29 NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
[email protected]8d625fb2012-07-18 16:40:0630 primary->Show();
[email protected]a2e6af12013-01-07 21:40:3531 views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
32 NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
[email protected]8d625fb2012-07-18 16:40:0633 secondary->Show();
34
Manu Corneta76b6b02018-08-30 21:02:2335 // Maximized bounds.
36 const int bottom_inset_first = 600 - ShelfConstants::shelf_size();
37 const int bottom_inset_second = 500 - ShelfConstants::shelf_size();
tdanderson0b7905b2016-06-22 21:53:0338 EXPECT_EQ(
Manu Corneta76b6b02018-08-30 21:02:2339 gfx::Rect(0, 0, 600, bottom_inset_first).ToString(),
Qiang Xu07d7c9e32018-01-18 20:25:4440 screen_util::GetMaximizedWindowBoundsInParent(primary->GetNativeView())
tdanderson0b7905b2016-06-22 21:53:0341 .ToString());
42 EXPECT_EQ(
Manu Corneta76b6b02018-08-30 21:02:2343 gfx::Rect(0, 0, 500, bottom_inset_second).ToString(),
Qiang Xu07d7c9e32018-01-18 20:25:4444 screen_util::GetMaximizedWindowBoundsInParent(secondary->GetNativeView())
tdanderson0b7905b2016-06-22 21:53:0345 .ToString());
[email protected]8d625fb2012-07-18 16:40:0646
[email protected]8d625fb2012-07-18 16:40:0647 // Display bounds
48 EXPECT_EQ("0,0 600x600",
Qiang Xu07d7c9e32018-01-18 20:25:4449 screen_util::GetDisplayBoundsInParent(primary->GetNativeView())
jamescookb8dcef522016-06-25 14:42:5550 .ToString());
[email protected]8d625fb2012-07-18 16:40:0651 EXPECT_EQ("0,0 500x500",
Qiang Xu07d7c9e32018-01-18 20:25:4452 screen_util::GetDisplayBoundsInParent(secondary->GetNativeView())
jamescookb8dcef522016-06-25 14:42:5553 .ToString());
[email protected]8d625fb2012-07-18 16:40:0654
55 // Work area bounds
tdanderson0b7905b2016-06-22 21:53:0356 EXPECT_EQ(
Manu Corneta76b6b02018-08-30 21:02:2357 gfx::Rect(0, 0, 600, bottom_inset_first).ToString(),
Qiang Xu07d7c9e32018-01-18 20:25:4458 screen_util::GetDisplayWorkAreaBoundsInParent(primary->GetNativeView())
tdanderson0b7905b2016-06-22 21:53:0359 .ToString());
60 EXPECT_EQ(
Manu Corneta76b6b02018-08-30 21:02:2361 gfx::Rect(0, 0, 500, bottom_inset_second).ToString(),
Qiang Xu07d7c9e32018-01-18 20:25:4462 screen_util::GetDisplayWorkAreaBoundsInParent(secondary->GetNativeView())
tdanderson0b7905b2016-06-22 21:53:0363 .ToString());
[email protected]8d625fb2012-07-18 16:40:0664}
[email protected]8d625fb2012-07-18 16:40:0665
[email protected]805155f2013-04-10 02:11:2066// Test verifies a stable handling of secondary screen widget changes
67// (crbug.com/226132).
estadea23d6ceb2017-02-15 00:47:0968TEST_F(ScreenUtilTest, StabilityTest) {
[email protected]805155f2013-04-10 02:11:2069 UpdateDisplay("600x600,500x500");
70 views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
71 NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
72 EXPECT_EQ(Shell::GetAllRootWindows()[1],
jamescookb8dcef522016-06-25 14:42:5573 secondary->GetNativeView()->GetRootWindow());
[email protected]805155f2013-04-10 02:11:2074 secondary->Show();
75 secondary->Maximize();
76 secondary->Show();
77 secondary->SetFullscreen(true);
78 secondary->Hide();
79 secondary->Close();
80}
81
estadea23d6ceb2017-02-15 00:47:0982TEST_F(ScreenUtilTest, ConvertRect) {
[email protected]f634dd32012-07-23 22:49:0783 UpdateDisplay("600x600,500x500");
[email protected]8d625fb2012-07-18 16:40:0684
[email protected]a2e6af12013-01-07 21:40:3585 views::Widget* primary = views::Widget::CreateWindowWithContextAndBounds(
86 NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
[email protected]8d625fb2012-07-18 16:40:0687 primary->Show();
[email protected]a2e6af12013-01-07 21:40:3588 views::Widget* secondary = views::Widget::CreateWindowWithContextAndBounds(
89 NULL, CurrentContext(), gfx::Rect(610, 10, 100, 100));
[email protected]8d625fb2012-07-18 16:40:0690 secondary->Show();
91
yhanada698af192017-02-23 10:57:0792 gfx::Rect r1(10, 10, 100, 100);
93 ::wm::ConvertRectFromScreen(primary->GetNativeView(), &r1);
94 EXPECT_EQ("0,0 100x100", r1.ToString());
[email protected]8d625fb2012-07-18 16:40:0695
yhanada698af192017-02-23 10:57:0796 gfx::Rect r2(620, 20, 100, 100);
97 ::wm::ConvertRectFromScreen(secondary->GetNativeView(), &r2);
98 EXPECT_EQ("10,10 100x100", r2.ToString());
99
100 gfx::Rect r3(30, 30, 100, 100);
101 ::wm::ConvertRectToScreen(primary->GetNativeView(), &r3);
102 EXPECT_EQ("40,40 100x100", r3.ToString());
103
104 gfx::Rect r4(40, 40, 100, 100);
105 ::wm::ConvertRectToScreen(secondary->GetNativeView(), &r4);
106 EXPECT_EQ("650,50 100x100", r4.ToString());
[email protected]8d625fb2012-07-18 16:40:06107}
108
estadea23d6ceb2017-02-15 00:47:09109TEST_F(ScreenUtilTest, ShelfDisplayBoundsInUnifiedDesktop) {
rjkroege72f8154f2016-10-29 00:49:02110 display_manager()->SetUnifiedDesktopEnabled(true);
oshima96f6a502015-05-02 08:43:32111
112 views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
113 NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
sky00f0b892017-05-05 17:06:24114 aura::Window* window = widget->GetNativeWindow();
oshima96f6a502015-05-02 08:43:32115
116 UpdateDisplay("500x400");
sky00f0b892017-05-05 17:06:24117 EXPECT_EQ("0,0 500x400",
Qiang Xu07d7c9e32018-01-18 20:25:44118 screen_util::GetDisplayBoundsWithShelf(window).ToString());
oshima96f6a502015-05-02 08:43:32119
120 UpdateDisplay("500x400,600x400");
sky00f0b892017-05-05 17:06:24121 EXPECT_EQ("0,0 500x400",
Qiang Xu07d7c9e32018-01-18 20:25:44122 screen_util::GetDisplayBoundsWithShelf(window).ToString());
oshima96f6a502015-05-02 08:43:32123
124 // Move to the 2nd physical display. Shelf's display still should be
125 // the first.
126 widget->SetBounds(gfx::Rect(800, 0, 100, 100));
127 ASSERT_EQ("800,0 100x100", widget->GetWindowBoundsInScreen().ToString());
128
sky00f0b892017-05-05 17:06:24129 EXPECT_EQ("0,0 500x400",
Qiang Xu07d7c9e32018-01-18 20:25:44130 screen_util::GetDisplayBoundsWithShelf(window).ToString());
oshima96f6a502015-05-02 08:43:32131
132 UpdateDisplay("600x500");
sky00f0b892017-05-05 17:06:24133 EXPECT_EQ("0,0 600x500",
Qiang Xu07d7c9e32018-01-18 20:25:44134 screen_util::GetDisplayBoundsWithShelf(window).ToString());
oshima96f6a502015-05-02 08:43:32135}
136
Ahmed Fakhry4f8e3722017-10-31 21:01:58137TEST_F(ScreenUtilTest, ShelfDisplayBoundsInUnifiedDesktopGrid) {
Ahmed Fakhry4f8e3722017-10-31 21:01:58138 UpdateDisplay("500x400,400x600,300x600,200x300,600x200,350x400");
139 display_manager()->SetUnifiedDesktopEnabled(true);
140
141 views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
142 NULL, CurrentContext(), gfx::Rect(10, 10, 100, 100));
143 aura::Window* window = widget->GetNativeWindow();
144
145 display::DisplayIdList list = display_manager()->GetCurrentDisplayIdList();
146 ASSERT_EQ(6u, list.size());
147 // Create a 3 x 2 vertical layout matrix and set it.
148 // [500 x 400] [400 x 600]
149 // [300 x 600] [200 x 300]
150 // [600 x 200] [350 x 400]
151 display::UnifiedDesktopLayoutMatrix matrix;
152 matrix.resize(3u);
153 matrix[0].emplace_back(list[0]);
154 matrix[0].emplace_back(list[1]);
155 matrix[1].emplace_back(list[2]);
156 matrix[1].emplace_back(list[3]);
157 matrix[2].emplace_back(list[4]);
158 matrix[2].emplace_back(list[5]);
159 display_manager()->SetUnifiedDesktopMatrix(matrix);
160 display::Screen* screen = display::Screen::GetScreen();
161 EXPECT_EQ(gfx::Size(766, 1254), screen->GetPrimaryDisplay().size());
162
Ahmed Fakhry1ac713b2018-11-06 18:57:46163 Shelf* shelf = Shell::GetPrimaryRootWindowController()->shelf();
164 EXPECT_EQ(shelf->alignment(), SHELF_ALIGNMENT_BOTTOM);
165
166 // Regardless of where the window is, the shelf with a bottom alignment is
167 // always in the bottom left display in the matrix.
168 EXPECT_EQ(gfx::Rect(0, 1057, 593, 198),
Qiang Xu07d7c9e32018-01-18 20:25:44169 screen_util::GetDisplayBoundsWithShelf(window));
Ahmed Fakhry4f8e3722017-10-31 21:01:58170
171 // Move to the bottom right display.
172 widget->SetBounds(gfx::Rect(620, 940, 100, 100));
Ahmed Fakhry1ac713b2018-11-06 18:57:46173 EXPECT_EQ(gfx::Rect(0, 1057, 593, 198),
174 screen_util::GetDisplayBoundsWithShelf(window));
175
176 // Change the shelf alignment to left, and expect that it now resides in the
177 // top left display in the matrix.
178 shelf->SetAlignment(SHELF_ALIGNMENT_LEFT);
Ahmed Fakhry4f8e3722017-10-31 21:01:58179 EXPECT_EQ(gfx::Rect(0, 0, 499, 400),
Qiang Xu07d7c9e32018-01-18 20:25:44180 screen_util::GetDisplayBoundsWithShelf(window));
Ahmed Fakhry1ac713b2018-11-06 18:57:46181
182 // Change the shelf alignment to right, and expect that it now resides in the
183 // top right display in the matrix.
184 shelf->SetAlignment(SHELF_ALIGNMENT_RIGHT);
185 EXPECT_EQ(gfx::Rect(499, 0, 267, 400),
186 screen_util::GetDisplayBoundsWithShelf(window));
187
188 // Change alignment back to bottom and change the unified display zoom factor.
189 // Expect that the display with shelf bounds will take into account the zoom
190 // factor.
191 shelf->SetAlignment(SHELF_ALIGNMENT_BOTTOM);
192 display_manager()->UpdateZoomFactor(display::kUnifiedDisplayId, 3.f);
193 const display::Display unified_display =
194 display_manager()->GetDisplayForId(display::kUnifiedDisplayId);
195 EXPECT_FLOAT_EQ(unified_display.device_scale_factor(), 3.f);
196 EXPECT_EQ(gfx::Rect(0, 352, 198, 67),
197 screen_util::GetDisplayBoundsWithShelf(window));
Ahmed Fakhry4f8e3722017-10-31 21:01:58198}
199
Malay Keshavfd6fd0c2018-07-31 22:07:47200TEST_F(ScreenUtilTest, SnapBoundsToDisplayEdge) {
201 UpdateDisplay("2400x1600*1.5");
202
203 gfx::Rect bounds(1555, 0, 45, 1066);
204 views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
205 NULL, CurrentContext(), bounds);
206 aura::Window* window = widget->GetNativeWindow();
207
208 gfx::Rect snapped_bounds =
209 screen_util::SnapBoundsToDisplayEdge(bounds, window);
210
211 EXPECT_EQ(snapped_bounds, gfx::Rect(1555, 0, 45, 1067));
212
213 bounds = gfx::Rect(5, 1000, 1595, 66);
214 snapped_bounds = screen_util::SnapBoundsToDisplayEdge(bounds, window);
215 EXPECT_EQ(snapped_bounds, gfx::Rect(5, 1000, 1595, 67));
216
217 UpdateDisplay("800x600");
218 bounds = gfx::Rect(0, 552, 800, 48);
219 snapped_bounds = screen_util::SnapBoundsToDisplayEdge(bounds, window);
220 EXPECT_EQ(snapped_bounds, gfx::Rect(0, 552, 800, 48));
221}
222
[email protected]8d625fb2012-07-18 16:40:06223} // namespace ash