| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/views/app_list/win/app_list_win.h" | |
| 6 | |
| 7 #include "chrome/browser/ui/app_list/app_list_positioner.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | |
| 9 #include "ui/display/display.h" | |
| 10 #include "ui/gfx/geometry/point.h" | |
| 11 #include "ui/gfx/geometry/rect.h" | |
| 12 #include "ui/gfx/geometry/size.h" | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 const int kScreenWidth = 800; | |
| 17 const int kScreenHeight = 600; | |
| 18 | |
| 19 const int kWindowWidth = 100; | |
| 20 const int kWindowHeight = 200; | |
| 21 | |
| 22 // Size of the normal (non-hidden) taskbar. | |
| 23 const int kTaskbarSize = 30; | |
| 24 | |
| 25 // The distance the taskbar will appear from the edge of the screen. | |
| 26 const int kMinDistanceFromEdge = 3; | |
| 27 | |
| 28 // Max distance the mouse can be from taskbar to count as "near" the taskbar. | |
| 29 const int kSnapDistance = 50; | |
| 30 // A cursor position that is within the taskbar. This must be < kTaskbarSize. | |
| 31 const int kCursorOnTaskbar = kTaskbarSize / 2; | |
| 32 // A cursor position that is within 50 pixels of the taskbar. | |
| 33 const int kCursorNearTaskbar = kTaskbarSize + kSnapDistance; | |
| 34 // A cursor position that is more than 50 pixels away from the taskbar. | |
| 35 const int kCursorAwayFromTaskbar = kCursorNearTaskbar + 1; | |
| 36 | |
| 37 // A position for the center of the window that causes the window to overlap the | |
| 38 // edge of the screen. This must be < kWindowWidth / 2 and < kWindowHeight / 2. | |
| 39 const int kWindowNearEdge = kWindowWidth / 4; | |
| 40 // A position for the center of the window that places the window away from all | |
| 41 // edges of the screen. This must be > kWindowWidth / 2, > kWindowHeight / 2, < | |
| 42 // kScreenWidth - kWindowWidth / 2 and < kScreenHeight - kWindowHeight / 2. | |
| 43 const int kWindowAwayFromEdge = 158; | |
| 44 | |
| 45 // Horizontal offset of the simulated Windows 8 split point. | |
| 46 const int kWin8SplitPoint = 200; | |
| 47 | |
| 48 } // namespace | |
| 49 | |
| 50 class AppListWinUnitTest : public testing::Test { | |
| 51 public: | |
| 52 void SetUp() override { | |
| 53 display_.set_bounds(gfx::Rect(0, 0, kScreenWidth, kScreenHeight)); | |
| 54 display_.set_work_area(gfx::Rect(0, 0, kScreenWidth, kScreenHeight)); | |
| 55 cursor_ = gfx::Point(); | |
| 56 taskbar_rect_ = gfx::Rect(); | |
| 57 center_window_ = false; | |
| 58 } | |
| 59 | |
| 60 // Set the display work area. | |
| 61 void SetWorkArea(int x, int y, int width, int height) { | |
| 62 display_.set_work_area(gfx::Rect(x, y, width, height)); | |
| 63 } | |
| 64 | |
| 65 // Sets up the test environment with the taskbar along a given edge of the | |
| 66 // work area. | |
| 67 void PlaceTaskbar(AppListPositioner::ScreenEdge edge) { | |
| 68 const gfx::Rect& work_area = display_.work_area(); | |
| 69 switch (edge) { | |
| 70 case AppListPositioner::SCREEN_EDGE_UNKNOWN: | |
| 71 taskbar_rect_ = gfx::Rect(); | |
| 72 break; | |
| 73 case AppListPositioner::SCREEN_EDGE_LEFT: | |
| 74 taskbar_rect_ = gfx::Rect( | |
| 75 work_area.x(), work_area.y(), kTaskbarSize, work_area.height()); | |
| 76 break; | |
| 77 case AppListPositioner::SCREEN_EDGE_RIGHT: | |
| 78 taskbar_rect_ = | |
| 79 gfx::Rect(work_area.x() + work_area.width() - kTaskbarSize, | |
| 80 work_area.y(), | |
| 81 kTaskbarSize, | |
| 82 work_area.height()); | |
| 83 break; | |
| 84 case AppListPositioner::SCREEN_EDGE_TOP: | |
| 85 taskbar_rect_ = gfx::Rect( | |
| 86 work_area.x(), work_area.y(), work_area.width(), kTaskbarSize); | |
| 87 break; | |
| 88 case AppListPositioner::SCREEN_EDGE_BOTTOM: | |
| 89 taskbar_rect_ = | |
| 90 gfx::Rect(work_area.x(), | |
| 91 work_area.y() + work_area.height() - kTaskbarSize, | |
| 92 work_area.width(), | |
| 93 kTaskbarSize); | |
| 94 break; | |
| 95 } | |
| 96 } | |
| 97 | |
| 98 // Set up the test mouse cursor in a given location. | |
| 99 void PlaceCursor(int x, int y) { | |
| 100 cursor_ = gfx::Point(x, y); | |
| 101 } | |
| 102 | |
| 103 void EnableWindowCentering() { | |
| 104 center_window_ = true; | |
| 105 } | |
| 106 | |
| 107 gfx::Point DoFindAnchorPoint() const { | |
| 108 return AppListWin::FindAnchorPoint(gfx::Size(kWindowWidth, kWindowHeight), | |
| 109 display_, | |
| 110 cursor_, | |
| 111 taskbar_rect_, | |
| 112 center_window_); | |
| 113 } | |
| 114 | |
| 115 private: | |
| 116 display::Display display_; | |
| 117 gfx::Point cursor_; | |
| 118 gfx::Rect taskbar_rect_; | |
| 119 bool center_window_; | |
| 120 }; | |
| 121 | |
| 122 TEST_F(AppListWinUnitTest, FindAnchorPointNoTaskbar) { | |
| 123 // Position the app list when there is no taskbar on the display. | |
| 124 PlaceCursor(0, 0); | |
| 125 // Expect the app list to be in the bottom-left corner. | |
| 126 EXPECT_EQ( | |
| 127 gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 128 kScreenHeight - kWindowHeight / 2 - kMinDistanceFromEdge), | |
| 129 DoFindAnchorPoint()); | |
| 130 } | |
| 131 | |
| 132 TEST_F(AppListWinUnitTest, FindAnchorPointMouseOffTaskbar) { | |
| 133 // Position the app list when the mouse is away from the taskbar. | |
| 134 | |
| 135 // Bottom taskbar. Expect the app list to be in the bottom-left corner. | |
| 136 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM); | |
| 137 PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorAwayFromTaskbar); | |
| 138 EXPECT_EQ(gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 139 kScreenHeight - kTaskbarSize - kWindowHeight / 2 - | |
| 140 kMinDistanceFromEdge), | |
| 141 DoFindAnchorPoint()); | |
| 142 | |
| 143 // Top taskbar. Expect the app list to be in the top-left corner. | |
| 144 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_TOP); | |
| 145 PlaceCursor(kWindowAwayFromEdge, kCursorAwayFromTaskbar); | |
| 146 EXPECT_EQ(gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 147 kTaskbarSize + kWindowHeight / 2 + kMinDistanceFromEdge), | |
| 148 DoFindAnchorPoint()); | |
| 149 | |
| 150 // Left taskbar. Expect the app list to be in the top-left corner. | |
| 151 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_LEFT); | |
| 152 PlaceCursor(kCursorAwayFromTaskbar, kWindowAwayFromEdge); | |
| 153 EXPECT_EQ(gfx::Point(kTaskbarSize + kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 154 kWindowHeight / 2 + kMinDistanceFromEdge), | |
| 155 DoFindAnchorPoint()); | |
| 156 | |
| 157 // Right taskbar. Expect the app list to be in the top-right corner. | |
| 158 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_RIGHT); | |
| 159 PlaceCursor(kScreenWidth - kCursorAwayFromTaskbar, kWindowAwayFromEdge); | |
| 160 EXPECT_EQ(gfx::Point(kScreenWidth - kTaskbarSize - kWindowWidth / 2 - | |
| 161 kMinDistanceFromEdge, | |
| 162 kWindowHeight / 2 + kMinDistanceFromEdge), | |
| 163 DoFindAnchorPoint()); | |
| 164 } | |
| 165 | |
| 166 TEST_F(AppListWinUnitTest, FindAnchorPointMouseOnTaskbar) { | |
| 167 // Position the app list when the mouse is over the taskbar. | |
| 168 | |
| 169 // Bottom taskbar (mouse well within taskbar). Expect the app list to be at | |
| 170 // the bottom centered on the mouse X coordinate. | |
| 171 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM); | |
| 172 PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorOnTaskbar); | |
| 173 EXPECT_EQ(gfx::Point(kWindowAwayFromEdge, | |
| 174 kScreenHeight - kTaskbarSize - kWindowHeight / 2 - | |
| 175 kMinDistanceFromEdge), | |
| 176 DoFindAnchorPoint()); | |
| 177 | |
| 178 // Bottom taskbar (outside the taskbar but still close enough). | |
| 179 // Expect the app list to be at the bottom centered on the mouse X coordinate. | |
| 180 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM); | |
| 181 PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorNearTaskbar); | |
| 182 EXPECT_EQ(gfx::Point(kWindowAwayFromEdge, | |
| 183 kScreenHeight - kTaskbarSize - kWindowHeight / 2 - | |
| 184 kMinDistanceFromEdge), | |
| 185 DoFindAnchorPoint()); | |
| 186 | |
| 187 // Top taskbar. Expect the app list to be at the top centered on the | |
| 188 // mouse X coordinate. | |
| 189 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_TOP); | |
| 190 PlaceCursor(kWindowAwayFromEdge, kCursorNearTaskbar); | |
| 191 EXPECT_EQ(gfx::Point(kWindowAwayFromEdge, | |
| 192 kTaskbarSize + kWindowHeight / 2 + kMinDistanceFromEdge), | |
| 193 DoFindAnchorPoint()); | |
| 194 | |
| 195 // Left taskbar. Expect the app list to be at the left centered on the | |
| 196 // mouse Y coordinate. | |
| 197 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_LEFT); | |
| 198 PlaceCursor(kCursorNearTaskbar, kWindowAwayFromEdge); | |
| 199 EXPECT_EQ(gfx::Point(kTaskbarSize + kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 200 kWindowAwayFromEdge), | |
| 201 DoFindAnchorPoint()); | |
| 202 | |
| 203 // Right taskbar. Expect the app list to be at the right centered on the | |
| 204 // mouse Y coordinate. | |
| 205 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_RIGHT); | |
| 206 PlaceCursor(kScreenWidth - kCursorNearTaskbar, kWindowAwayFromEdge); | |
| 207 EXPECT_EQ(gfx::Point(kScreenWidth - kTaskbarSize - kWindowWidth / 2 - | |
| 208 kMinDistanceFromEdge, | |
| 209 kWindowAwayFromEdge), | |
| 210 DoFindAnchorPoint()); | |
| 211 | |
| 212 // Bottom taskbar. Mouse near left edge. App list must not go off screen. | |
| 213 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM); | |
| 214 PlaceCursor(kWindowNearEdge, kScreenHeight - kCursorOnTaskbar); | |
| 215 EXPECT_EQ(gfx::Point(kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 216 kScreenHeight - kTaskbarSize - kWindowHeight / 2 - | |
| 217 kMinDistanceFromEdge), | |
| 218 DoFindAnchorPoint()); | |
| 219 | |
| 220 // Bottom taskbar. Mouse near right edge. App list must not go off screen. | |
| 221 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM); | |
| 222 PlaceCursor(kScreenWidth - kWindowNearEdge, kScreenHeight - kCursorOnTaskbar); | |
| 223 EXPECT_EQ(gfx::Point(kScreenWidth - kWindowWidth / 2 - kMinDistanceFromEdge, | |
| 224 kScreenHeight - kTaskbarSize - kWindowHeight / 2 - | |
| 225 kMinDistanceFromEdge), | |
| 226 DoFindAnchorPoint()); | |
| 227 } | |
| 228 | |
| 229 TEST_F(AppListWinUnitTest, FindAnchorPointWin8SplitScreen) { | |
| 230 // Make the work area smaller than the screen, as you would get in Windows 8 | |
| 231 // when there is a split screen and the Desktop is in one side of the screen. | |
| 232 SetWorkArea( | |
| 233 kWin8SplitPoint, 0, kScreenWidth - kWin8SplitPoint, kScreenHeight); | |
| 234 | |
| 235 // No taskbar. Expect the app list to be in the bottom-left corner of the work | |
| 236 // area. | |
| 237 EXPECT_EQ( | |
| 238 gfx::Point(kWin8SplitPoint + kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 239 kScreenHeight - kWindowHeight / 2 - kMinDistanceFromEdge), | |
| 240 DoFindAnchorPoint()); | |
| 241 | |
| 242 // Bottom taskbar (mouse off-screen to the left). Expect the app list to be | |
| 243 // in the bottom-left corner of the work area. | |
| 244 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_BOTTOM); | |
| 245 PlaceCursor(kWindowAwayFromEdge, kScreenHeight - kCursorOnTaskbar); | |
| 246 EXPECT_EQ( | |
| 247 gfx::Point(kWin8SplitPoint + kWindowWidth / 2 + kMinDistanceFromEdge, | |
| 248 kScreenHeight - kTaskbarSize - kWindowHeight / 2 - | |
| 249 kMinDistanceFromEdge), | |
| 250 DoFindAnchorPoint()); | |
| 251 } | |
| 252 | |
| 253 TEST_F(AppListWinUnitTest, FindAnchorPointCentered) { | |
| 254 // Cursor on the top taskbar; enable centered app list mode. | |
| 255 PlaceTaskbar(AppListPositioner::SCREEN_EDGE_TOP); | |
| 256 PlaceCursor(0, 0); | |
| 257 EnableWindowCentering(); | |
| 258 // Expect the app list to be in the center of the screen (ignore the cursor). | |
| 259 EXPECT_EQ(gfx::Point(kScreenWidth / 2, kScreenHeight / 2), | |
| 260 DoFindAnchorPoint()); | |
| 261 } | |
| OLD | NEW |