| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <map> | |
| 7 #include <vector> | 6 #include <vector> |
| 8 | 7 |
| 9 #include "ash/accessibility_delegate.h" | 8 #include "ash/accessibility_delegate.h" |
| 10 #include "ash/ash_switches.h" | |
| 11 #include "ash/drag_drop/drag_drop_controller.h" | 9 #include "ash/drag_drop/drag_drop_controller.h" |
| 12 #include "ash/root_window_controller.h" | 10 #include "ash/root_window_controller.h" |
| 13 #include "ash/screen_util.h" | 11 #include "ash/screen_util.h" |
| 14 #include "ash/shelf/shelf.h" | 12 #include "ash/shelf/shelf.h" |
| 15 #include "ash/shelf/shelf_widget.h" | 13 #include "ash/shelf/shelf_widget.h" |
| 16 #include "ash/shell.h" | 14 #include "ash/shell.h" |
| 17 #include "ash/shell_window_ids.h" | 15 #include "ash/shell_window_ids.h" |
| 18 #include "ash/test/ash_test_base.h" | 16 #include "ash/test/ash_test_base.h" |
| 19 #include "ash/test/shelf_test_api.h" | 17 #include "ash/test/shelf_test_api.h" |
| 20 #include "ash/test/shelf_view_test_api.h" | 18 #include "ash/test/shelf_view_test_api.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 bool ShouldActivate() const override { return false; } | 64 bool ShouldActivate() const override { return false; } |
| 67 }; | 65 }; |
| 68 | 66 |
| 69 void CancelDrag(DragDropController* controller, bool* canceled) { | 67 void CancelDrag(DragDropController* controller, bool* canceled) { |
| 70 if (controller->IsDragDropInProgress()) { | 68 if (controller->IsDragDropInProgress()) { |
| 71 *canceled = true; | 69 *canceled = true; |
| 72 controller->DragCancel(); | 70 controller->DragCancel(); |
| 73 } | 71 } |
| 74 } | 72 } |
| 75 | 73 |
| 76 // A short drag distance that will not cause an overview item to close. | |
| 77 const int kShortDragDistance = 10; | |
| 78 | |
| 79 // A far drag distance that will cause an overview item to close. | |
| 80 const int kFarDragDistance = 200; | |
| 81 | |
| 82 // A slow fling velocity that should not cause selctor items to close. | |
| 83 const int kSlowFlingVelocity = 2000; | |
| 84 | |
| 85 // A fast fling velocity that should cause selector items to close. | |
| 86 const int kFastFlingVelocity = 5000; | |
| 87 | |
| 88 } // namespace | 74 } // namespace |
| 89 | 75 |
| 90 // TODO(bruthig): Move all non-simple method definitions out of class | 76 // TODO(bruthig): Move all non-simple method definitions out of class |
| 91 // declaration. | 77 // declaration. |
| 92 class WindowSelectorTest : public test::AshTestBase { | 78 class WindowSelectorTest : public test::AshTestBase { |
| 93 public: | 79 public: |
| 94 WindowSelectorTest() {} | 80 WindowSelectorTest() {} |
| 95 ~WindowSelectorTest() override {} | 81 ~WindowSelectorTest() override {} |
| 96 | 82 |
| 97 void SetUp() override { | 83 void SetUp() override { |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 } | 258 } |
| 273 | 259 |
| 274 private: | 260 private: |
| 275 aura::test::TestWindowDelegate delegate_; | 261 aura::test::TestWindowDelegate delegate_; |
| 276 NonActivatableActivationDelegate non_activatable_activation_delegate_; | 262 NonActivatableActivationDelegate non_activatable_activation_delegate_; |
| 277 scoped_ptr<test::ShelfViewTestAPI> shelf_view_test_; | 263 scoped_ptr<test::ShelfViewTestAPI> shelf_view_test_; |
| 278 | 264 |
| 279 DISALLOW_COPY_AND_ASSIGN(WindowSelectorTest); | 265 DISALLOW_COPY_AND_ASSIGN(WindowSelectorTest); |
| 280 }; | 266 }; |
| 281 | 267 |
| 282 class WindowSelectorSwipeToCloseEnabledTest : public WindowSelectorTest { | |
| 283 public: | |
| 284 WindowSelectorSwipeToCloseEnabledTest() {} | |
| 285 ~WindowSelectorSwipeToCloseEnabledTest() override {} | |
| 286 | |
| 287 // WindowSelectorTest: | |
| 288 void SetUp() override; | |
| 289 | |
| 290 private: | |
| 291 DISALLOW_COPY_AND_ASSIGN(WindowSelectorSwipeToCloseEnabledTest); | |
| 292 }; | |
| 293 | |
| 294 void WindowSelectorSwipeToCloseEnabledTest::SetUp() { | |
| 295 base::CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 296 switches::kAshEnableSwipeToCloseInOverviewMode); | |
| 297 WindowSelectorTest::SetUp(); | |
| 298 } | |
| 299 | |
| 300 // Tests that an a11y alert is sent on entering overview mode. | 268 // Tests that an a11y alert is sent on entering overview mode. |
| 301 TEST_F(WindowSelectorTest, A11yAlertOnOverviewMode) { | 269 TEST_F(WindowSelectorTest, A11yAlertOnOverviewMode) { |
| 302 gfx::Rect bounds(0, 0, 400, 400); | 270 gfx::Rect bounds(0, 0, 400, 400); |
| 303 AccessibilityDelegate* delegate = | 271 AccessibilityDelegate* delegate = |
| 304 ash::Shell::GetInstance()->accessibility_delegate(); | 272 ash::Shell::GetInstance()->accessibility_delegate(); |
| 305 scoped_ptr<aura::Window> window1(CreateWindow(bounds)); | 273 scoped_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 306 EXPECT_NE(delegate->GetLastAccessibilityAlert(), | 274 EXPECT_NE(delegate->GetLastAccessibilityAlert(), |
| 307 ui::A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); | 275 ui::A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); |
| 308 ToggleOverview(); | 276 ToggleOverview(); |
| 309 EXPECT_EQ(delegate->GetLastAccessibilityAlert(), | 277 EXPECT_EQ(delegate->GetLastAccessibilityAlert(), |
| (...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 | 1235 |
| 1268 // Switch to overview mode. | 1236 // Switch to overview mode. |
| 1269 ToggleOverview(); | 1237 ToggleOverview(); |
| 1270 ASSERT_TRUE(IsSelecting()); | 1238 ASSERT_TRUE(IsSelecting()); |
| 1271 | 1239 |
| 1272 // Tap should now exit overview mode. | 1240 // Tap should now exit overview mode. |
| 1273 generator.GestureTapAt(point_in_background_page); | 1241 generator.GestureTapAt(point_in_background_page); |
| 1274 EXPECT_FALSE(IsSelecting()); | 1242 EXPECT_FALSE(IsSelecting()); |
| 1275 } | 1243 } |
| 1276 | 1244 |
| 1277 // Verify swipe to close doesn't work when swipe to close is not enabled. | |
| 1278 TEST_F(WindowSelectorTest, WindowTapDragFarDistance) { | |
| 1279 scoped_ptr<views::Widget> widget = | |
| 1280 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | |
| 1281 | |
| 1282 ToggleOverview(); | |
| 1283 ASSERT_TRUE(IsSelecting()); | |
| 1284 | |
| 1285 aura::Window* window = widget->GetNativeWindow(); | |
| 1286 gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(window)); | |
| 1287 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1288 | |
| 1289 ASSERT_FALSE(widget->IsClosed()); | |
| 1290 | |
| 1291 gfx::Point start(bounds.CenterPoint()); | |
| 1292 gfx::Point end(start.x() - kFarDragDistance, start.y()); | |
| 1293 event_generator.GestureScrollSequence( | |
| 1294 start, end, base::TimeDelta::FromMilliseconds(10), 5); | |
| 1295 | |
| 1296 EXPECT_FALSE(widget->IsClosed()); | |
| 1297 | |
| 1298 RunAllPendingInMessageLoop(); | |
| 1299 EXPECT_TRUE(IsSelecting()); | |
| 1300 } | |
| 1301 | |
| 1302 // Verify the window moves and fades as it is dragged. | |
| 1303 TEST_F(WindowSelectorSwipeToCloseEnabledTest, | |
| 1304 VerifyWindowBehaviourDuringTapDrag) { | |
| 1305 scoped_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400))); | |
| 1306 | |
| 1307 ToggleOverview(); | |
| 1308 | |
| 1309 gfx::Rect bounds = | |
| 1310 ToNearestRect(GetTransformedBoundsInRootWindow(window.get())); | |
| 1311 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1312 | |
| 1313 const gfx::Point drag_start_point(bounds.CenterPoint()); | |
| 1314 const gfx::Point drag_left_point(drag_start_point.x() - kFarDragDistance, | |
| 1315 drag_start_point.y()); | |
| 1316 const gfx::Point drag_right_point(drag_start_point.x() + kFarDragDistance, | |
| 1317 drag_start_point.y()); | |
| 1318 | |
| 1319 const int drag_left_delta_x = drag_start_point.x() - drag_left_point.x(); | |
| 1320 const int drag_right_delta_x = drag_start_point.x() - drag_right_point.x(); | |
| 1321 | |
| 1322 const gfx::Rect original_bounds = window->GetBoundsInScreen(); | |
| 1323 | |
| 1324 ASSERT_EQ(1.0f, window->layer()->opacity()); | |
| 1325 | |
| 1326 event_generator.set_current_location(drag_start_point); | |
| 1327 event_generator.PressTouch(); | |
| 1328 | |
| 1329 EXPECT_EQ(1.0f, window->layer()->opacity()); | |
| 1330 | |
| 1331 event_generator.MoveTouch(drag_left_point); | |
| 1332 | |
| 1333 EXPECT_EQ(original_bounds.x() - drag_left_delta_x, | |
| 1334 window->GetBoundsInScreen().x()); | |
| 1335 EXPECT_EQ(original_bounds.y(), window->GetBoundsInScreen().y()); | |
| 1336 | |
| 1337 EXPECT_LT(window->layer()->opacity(), 0.5f); | |
| 1338 | |
| 1339 event_generator.MoveTouch(drag_start_point); | |
| 1340 | |
| 1341 EXPECT_EQ(original_bounds.x(), window->GetBoundsInScreen().x()); | |
| 1342 EXPECT_EQ(original_bounds.y(), window->GetBoundsInScreen().y()); | |
| 1343 EXPECT_EQ(1.0f, window->layer()->opacity()); | |
| 1344 | |
| 1345 event_generator.MoveTouch(drag_right_point); | |
| 1346 | |
| 1347 EXPECT_EQ(original_bounds.x() - drag_right_delta_x, | |
| 1348 window->GetBoundsInScreen().x()); | |
| 1349 EXPECT_EQ(original_bounds.y(), window->GetBoundsInScreen().y()); | |
| 1350 | |
| 1351 EXPECT_LT(window->layer()->opacity(), 0.5f); | |
| 1352 } | |
| 1353 | |
| 1354 // Test dragging a window a short distance. | |
| 1355 TEST_F(WindowSelectorSwipeToCloseEnabledTest, WindowTapDragShortDistance) { | |
| 1356 scoped_ptr<views::Widget> widget = | |
| 1357 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | |
| 1358 | |
| 1359 ToggleOverview(); | |
| 1360 | |
| 1361 aura::Window* window = widget->GetNativeWindow(); | |
| 1362 gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(window)); | |
| 1363 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1364 | |
| 1365 ASSERT_FALSE(widget->IsClosed()); | |
| 1366 | |
| 1367 gfx::Point start(bounds.CenterPoint()); | |
| 1368 gfx::Point end(start.x() - kShortDragDistance, start.y()); | |
| 1369 event_generator.GestureScrollSequence( | |
| 1370 start, end, base::TimeDelta::FromMilliseconds(10), 5); | |
| 1371 | |
| 1372 EXPECT_FALSE(widget->IsClosed()); | |
| 1373 | |
| 1374 RunAllPendingInMessageLoop(); | |
| 1375 EXPECT_TRUE(IsSelecting()); | |
| 1376 } | |
| 1377 | |
| 1378 // Test dragging a window a far distance. | |
| 1379 TEST_F(WindowSelectorSwipeToCloseEnabledTest, WindowTapDragFarDistance) { | |
| 1380 scoped_ptr<views::Widget> widget = | |
| 1381 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | |
| 1382 | |
| 1383 ToggleOverview(); | |
| 1384 ASSERT_TRUE(IsSelecting()); | |
| 1385 | |
| 1386 aura::Window* window = widget->GetNativeWindow(); | |
| 1387 gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(window)); | |
| 1388 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1389 | |
| 1390 ASSERT_FALSE(widget->IsClosed()); | |
| 1391 | |
| 1392 gfx::Point start(bounds.CenterPoint()); | |
| 1393 gfx::Point end(start.x() - kFarDragDistance, start.y()); | |
| 1394 event_generator.GestureScrollSequence( | |
| 1395 start, end, base::TimeDelta::FromMilliseconds(10), 5); | |
| 1396 | |
| 1397 EXPECT_TRUE(widget->IsClosed()); | |
| 1398 | |
| 1399 RunAllPendingInMessageLoop(); | |
| 1400 EXPECT_FALSE(IsSelecting()); | |
| 1401 } | |
| 1402 | |
| 1403 // Test a slow velocity fling. | |
| 1404 TEST_F(WindowSelectorSwipeToCloseEnabledTest, SlowVelocityFling) { | |
| 1405 scoped_ptr<views::Widget> widget = | |
| 1406 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | |
| 1407 | |
| 1408 ToggleOverview(); | |
| 1409 | |
| 1410 aura::Window* window = widget->GetNativeWindow(); | |
| 1411 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); | |
| 1412 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1413 | |
| 1414 ASSERT_FALSE(widget->IsClosed()); | |
| 1415 | |
| 1416 gfx::Point start(bounds.CenterPoint().x(), bounds.CenterPoint().y()); | |
| 1417 gfx::Point end(start.x() - kShortDragDistance, start.y()); | |
| 1418 const base::TimeDelta kScrollDuration = | |
| 1419 event_generator.CalculateScrollDurationForFlingVelocity( | |
| 1420 start, end, kSlowFlingVelocity, 10); | |
| 1421 event_generator.GestureScrollSequence(start, end, kScrollDuration, 10); | |
| 1422 | |
| 1423 EXPECT_FALSE(widget->IsClosed()); | |
| 1424 | |
| 1425 RunAllPendingInMessageLoop(); | |
| 1426 EXPECT_TRUE(IsSelecting()); | |
| 1427 } | |
| 1428 | |
| 1429 // Test a fast velocity fling. | |
| 1430 TEST_F(WindowSelectorSwipeToCloseEnabledTest, FastVelocityFling) { | |
| 1431 scoped_ptr<views::Widget> widget = | |
| 1432 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | |
| 1433 | |
| 1434 ToggleOverview(); | |
| 1435 ASSERT_TRUE(IsSelecting()); | |
| 1436 | |
| 1437 aura::Window* window = widget->GetNativeWindow(); | |
| 1438 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); | |
| 1439 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1440 | |
| 1441 ASSERT_FALSE(widget->IsClosed()); | |
| 1442 | |
| 1443 gfx::Point start(bounds.CenterPoint().x(), bounds.CenterPoint().y()); | |
| 1444 gfx::Point end(start.x() - kShortDragDistance, start.y()); | |
| 1445 const base::TimeDelta kScrollDuration = | |
| 1446 event_generator.CalculateScrollDurationForFlingVelocity( | |
| 1447 start, end, kFastFlingVelocity, 10); | |
| 1448 event_generator.GestureScrollSequence(start, end, kScrollDuration, 10); | |
| 1449 | |
| 1450 EXPECT_TRUE(widget->IsClosed()); | |
| 1451 | |
| 1452 RunAllPendingInMessageLoop(); | |
| 1453 EXPECT_FALSE(IsSelecting()); | |
| 1454 } | |
| 1455 | |
| 1456 // Test a fast velocity fling. | |
| 1457 TEST_F(WindowSelectorSwipeToCloseEnabledTest, SlowVelocityFlingAtAFarDistance) { | |
| 1458 scoped_ptr<views::Widget> widget = | |
| 1459 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | |
| 1460 | |
| 1461 ToggleOverview(); | |
| 1462 ASSERT_TRUE(IsSelecting()); | |
| 1463 | |
| 1464 aura::Window* window = widget->GetNativeWindow(); | |
| 1465 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); | |
| 1466 ui::test::EventGenerator event_generator(window->GetRootWindow()); | |
| 1467 | |
| 1468 ASSERT_FALSE(widget->IsClosed()); | |
| 1469 | |
| 1470 gfx::Point start(bounds.CenterPoint().x(), bounds.CenterPoint().y()); | |
| 1471 gfx::Point end(start.x() - kFarDragDistance, start.y()); | |
| 1472 const base::TimeDelta kScrollDuration = | |
| 1473 event_generator.CalculateScrollDurationForFlingVelocity( | |
| 1474 start, end, kSlowFlingVelocity, 10); | |
| 1475 event_generator.GestureScrollSequence(start, end, kScrollDuration, 10); | |
| 1476 | |
| 1477 EXPECT_TRUE(widget->IsClosed()); | |
| 1478 | |
| 1479 RunAllPendingInMessageLoop(); | |
| 1480 EXPECT_FALSE(IsSelecting()); | |
| 1481 } | |
| 1482 | |
| 1483 } // namespace ash | 1245 } // namespace ash |
| OLD | NEW |