| 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 <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "ash/aura/wm_window_aura.h" | 8 #include "ash/aura/wm_window_aura.h" |
| 9 #include "ash/common/accessibility_delegate.h" | 9 #include "ash/common/accessibility_delegate.h" |
| 10 #include "ash/common/accessibility_types.h" | 10 #include "ash/common/accessibility_types.h" |
| 11 #include "ash/common/ash_switches.h" | 11 #include "ash/common/ash_switches.h" |
| 12 #include "ash/common/material_design/material_design_controller.h" | |
| 13 #include "ash/common/shelf/shelf_widget.h" | 12 #include "ash/common/shelf/shelf_widget.h" |
| 14 #include "ash/common/shelf/wm_shelf.h" | 13 #include "ash/common/shelf/wm_shelf.h" |
| 15 #include "ash/common/shell_window_ids.h" | 14 #include "ash/common/shell_window_ids.h" |
| 16 #include "ash/common/system/tray/system_tray.h" | 15 #include "ash/common/system/tray/system_tray.h" |
| 17 #include "ash/common/test/material_design_controller_test_api.h" | |
| 18 #include "ash/common/wm/dock/docked_window_layout_manager.h" | 16 #include "ash/common/wm/dock/docked_window_layout_manager.h" |
| 19 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" | 17 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" |
| 20 #include "ash/common/wm/mru_window_tracker.h" | 18 #include "ash/common/wm/mru_window_tracker.h" |
| 21 #include "ash/common/wm/overview/scoped_transform_overview_window.h" | 19 #include "ash/common/wm/overview/scoped_transform_overview_window.h" |
| 22 #include "ash/common/wm/overview/window_grid.h" | 20 #include "ash/common/wm/overview/window_grid.h" |
| 23 #include "ash/common/wm/overview/window_selector.h" | 21 #include "ash/common/wm/overview/window_selector.h" |
| 24 #include "ash/common/wm/overview/window_selector_controller.h" | 22 #include "ash/common/wm/overview/window_selector_controller.h" |
| 25 #include "ash/common/wm/overview/window_selector_item.h" | 23 #include "ash/common/wm/overview/window_selector_item.h" |
| 26 #include "ash/common/wm/panels/panel_layout_manager.h" | 24 #include "ash/common/wm/panels/panel_layout_manager.h" |
| 27 #include "ash/common/wm/window_state.h" | 25 #include "ash/common/wm/window_state.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 #include "ui/views/controls/button/image_button.h" | 67 #include "ui/views/controls/button/image_button.h" |
| 70 #include "ui/views/controls/button/label_button.h" | 68 #include "ui/views/controls/button/label_button.h" |
| 71 #include "ui/views/widget/native_widget_aura.h" | 69 #include "ui/views/widget/native_widget_aura.h" |
| 72 #include "ui/views/widget/widget_delegate.h" | 70 #include "ui/views/widget/widget_delegate.h" |
| 73 #include "ui/wm/core/window_util.h" | 71 #include "ui/wm/core/window_util.h" |
| 74 #include "ui/wm/public/activation_delegate.h" | 72 #include "ui/wm/public/activation_delegate.h" |
| 75 | 73 |
| 76 namespace ash { | 74 namespace ash { |
| 77 namespace { | 75 namespace { |
| 78 | 76 |
| 79 // With Material Design the label covers selector item windows with a padding | 77 // The label covers selector item windows with a padding in order to prevent |
| 80 // in order to prevent them from receiving user input events while in overview. | 78 // them from receiving user input events while in overview. |
| 81 static const int kWindowMarginMD = 5; | 79 static const int kWindowMargin = 5; |
| 82 | 80 |
| 83 // With Material Design the overview mode header overlaps original window | 81 // The overview mode header overlaps original window header. This value is used |
| 84 // header. This value is used to set top inset property on the windows. | 82 // to set top inset property on the windows. |
| 85 static const int kHeaderHeight = 32; | 83 static const int kHeaderHeight = 32; |
| 86 | 84 |
| 87 const char kActiveWindowChangedFromOverview[] = | 85 const char kActiveWindowChangedFromOverview[] = |
| 88 "WindowSelector_ActiveWindowChanged"; | 86 "WindowSelector_ActiveWindowChanged"; |
| 89 | 87 |
| 90 class NonActivatableActivationDelegate | 88 class NonActivatableActivationDelegate |
| 91 : public aura::client::ActivationDelegate { | 89 : public aura::client::ActivationDelegate { |
| 92 public: | 90 public: |
| 93 bool ShouldActivate() const override { return false; } | 91 bool ShouldActivate() const override { return false; } |
| 94 }; | 92 }; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 105 int top_view_inset, | 103 int top_view_inset, |
| 106 int title_height) { | 104 int title_height) { |
| 107 return ScopedTransformOverviewWindow::GetItemScale( | 105 return ScopedTransformOverviewWindow::GetItemScale( |
| 108 source.size(), target.size(), top_view_inset, title_height); | 106 source.size(), target.size(), top_view_inset, title_height); |
| 109 } | 107 } |
| 110 | 108 |
| 111 } // namespace | 109 } // namespace |
| 112 | 110 |
| 113 // TODO(bruthig): Move all non-simple method definitions out of class | 111 // TODO(bruthig): Move all non-simple method definitions out of class |
| 114 // declaration. | 112 // declaration. |
| 115 class WindowSelectorTest | 113 class WindowSelectorTest : public test::AshTestBase { |
| 116 : public test::AshTestBase, | |
| 117 public testing::WithParamInterface<ash::MaterialDesignController::Mode> { | |
| 118 public: | 114 public: |
| 119 WindowSelectorTest() {} | 115 WindowSelectorTest() {} |
| 120 ~WindowSelectorTest() override {} | 116 ~WindowSelectorTest() override {} |
| 121 | 117 |
| 122 void SetUp() override { | 118 void SetUp() override { |
| 123 set_material_mode(GetParam()); | |
| 124 test::AshTestBase::SetUp(); | 119 test::AshTestBase::SetUp(); |
| 125 if (!ash::MaterialDesignController::IsOverviewMaterial()) { | |
| 126 base::CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 127 switches::kAshEnableStableOverviewOrder); | |
| 128 } | |
| 129 ASSERT_TRUE(test::TestShelfDelegate::instance()); | 120 ASSERT_TRUE(test::TestShelfDelegate::instance()); |
| 130 | 121 |
| 131 shelf_view_test_.reset(new test::ShelfViewTestAPI( | 122 shelf_view_test_.reset(new test::ShelfViewTestAPI( |
| 132 GetPrimaryShelf()->GetShelfViewForTesting())); | 123 GetPrimaryShelf()->GetShelfViewForTesting())); |
| 133 shelf_view_test_->SetAnimationDuration(1); | 124 shelf_view_test_->SetAnimationDuration(1); |
| 134 ScopedTransformOverviewWindow::SetImmediateCloseForTests(); | 125 ScopedTransformOverviewWindow::SetImmediateCloseForTests(); |
| 135 } | 126 } |
| 136 | 127 |
| 137 aura::Window* CreateWindow(const gfx::Rect& bounds) { | 128 aura::Window* CreateWindow(const gfx::Rect& bounds) { |
| 138 aura::Window* window = | 129 aura::Window* window = |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 } | 344 } |
| 354 | 345 |
| 355 private: | 346 private: |
| 356 aura::test::TestWindowDelegate delegate_; | 347 aura::test::TestWindowDelegate delegate_; |
| 357 NonActivatableActivationDelegate non_activatable_activation_delegate_; | 348 NonActivatableActivationDelegate non_activatable_activation_delegate_; |
| 358 std::unique_ptr<test::ShelfViewTestAPI> shelf_view_test_; | 349 std::unique_ptr<test::ShelfViewTestAPI> shelf_view_test_; |
| 359 | 350 |
| 360 DISALLOW_COPY_AND_ASSIGN(WindowSelectorTest); | 351 DISALLOW_COPY_AND_ASSIGN(WindowSelectorTest); |
| 361 }; | 352 }; |
| 362 | 353 |
| 363 // Note: First argument is optional and intentionally left blank. | |
| 364 // (it's a prefix for the generated test cases) | |
| 365 INSTANTIATE_TEST_CASE_P( | |
| 366 , | |
| 367 WindowSelectorTest, | |
| 368 testing::Values(ash::MaterialDesignController::NON_MATERIAL, | |
| 369 ash::MaterialDesignController::MATERIAL_NORMAL, | |
| 370 ash::MaterialDesignController::MATERIAL_EXPERIMENTAL)); | |
| 371 | |
| 372 #if !defined(OS_WIN) || defined(USE_ASH) | 354 #if !defined(OS_WIN) || defined(USE_ASH) |
| 373 // TODO(msw): Broken on Windows. http://crbug.com/584038 | 355 // TODO(msw): Broken on Windows. http://crbug.com/584038 |
| 374 // Tests that the text field in the overview menu is repositioned and resized | 356 // Tests that the text field in the overview menu is repositioned and resized |
| 375 // after a screen rotation. | 357 // after a screen rotation. |
| 376 TEST_P(WindowSelectorTest, OverviewScreenRotation) { | 358 TEST_F(WindowSelectorTest, OverviewScreenRotation) { |
| 377 gfx::Rect bounds(0, 0, 400, 300); | 359 gfx::Rect bounds(0, 0, 400, 300); |
| 378 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 360 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 379 std::unique_ptr<aura::Window> panel1(CreatePanelWindow(bounds)); | 361 std::unique_ptr<aura::Window> panel1(CreatePanelWindow(bounds)); |
| 380 | 362 |
| 381 // In overview mode the windows should no longer overlap and the text filter | 363 // In overview mode the windows should no longer overlap and the text filter |
| 382 // widget should be focused. | 364 // widget should be focused. |
| 383 ToggleOverview(); | 365 ToggleOverview(); |
| 384 | 366 |
| 385 views::Widget* text_filter = text_filter_widget(); | 367 views::Widget* text_filter = text_filter_widget(); |
| 386 UpdateDisplay("400x300"); | 368 UpdateDisplay("400x300"); |
| 387 | 369 |
| 388 // Formula for initial placement found in window_selector.cc using | 370 // The text filter position is calculated as: |
| 389 // width = 400, height = 300: | 371 // x: 0.5 * (total_bounds.width() - |
| 390 // x: 0.5 * root_window->bounds().width() * (1 - kTextFilterScreenProportion). | 372 // std::min(kTextFilterWidth, total_bounds.width())). |
| 391 // y: -kTextFilterHeight (since there's no text in the filter). | 373 // y: -kTextFilterHeight (since there's no text in the filter). |
| 392 // w: root_window->bounds().width() * kTextFilterScreenProportion. | 374 // w: std::min(kTextFilterWidth, total_bounds.width()). |
| 393 // h: kTextFilterHeight. | 375 // h: kTextFilterHeight. |
| 394 // | 376 gfx::Rect expected_bounds(60, -40, 280, 40); |
| 395 // With Material Design the text filter position is calculated as: | 377 EXPECT_EQ(expected_bounds.ToString(), |
| 396 // x: 0.5 * (total_bounds.width() - | |
| 397 // std::min(kTextFilterWidthMD, total_bounds.width())). | |
| 398 // y: -kTextFilterHeightMD (since there's no text in the filter). | |
| 399 // w: std::min(kTextFilterWidthMD, total_bounds.width()). | |
| 400 // h: kTextFilterHeightMD. | |
| 401 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); | |
| 402 gfx::Rect expected_bounds(150, -32, 100, 32); | |
| 403 gfx::Rect expected_bounds_MD(60, -40, 280, 40); | |
| 404 EXPECT_EQ((material ? expected_bounds_MD : expected_bounds).ToString(), | |
| 405 text_filter->GetClientAreaBoundsInScreen().ToString()); | 378 text_filter->GetClientAreaBoundsInScreen().ToString()); |
| 406 | 379 |
| 407 // Rotates the display, which triggers the WindowSelector's | 380 // Rotates the display, which triggers the WindowSelector's |
| 408 // RepositionTextFilterOnDisplayMetricsChange method. | 381 // RepositionTextFilterOnDisplayMetricsChange method. |
| 409 UpdateDisplay("400x300/r"); | 382 UpdateDisplay("400x300/r"); |
| 410 | 383 |
| 411 // Uses the same formulas as above using width = 300, height = 400. | 384 // Uses the same formulas as above using width = 300, height = 400. |
| 412 expected_bounds = gfx::Rect(112, -32, 75, 32); | 385 expected_bounds = gfx::Rect(10, -40, 280, 40); |
| 413 expected_bounds_MD = gfx::Rect(10, -40, 280, 40); | 386 EXPECT_EQ(expected_bounds.ToString(), |
| 414 EXPECT_EQ((material ? expected_bounds_MD : expected_bounds).ToString(), | |
| 415 text_filter->GetClientAreaBoundsInScreen().ToString()); | 387 text_filter->GetClientAreaBoundsInScreen().ToString()); |
| 416 } | 388 } |
| 417 #endif | 389 #endif |
| 418 | 390 |
| 419 // Tests that an a11y alert is sent on entering overview mode. | 391 // Tests that an a11y alert is sent on entering overview mode. |
| 420 TEST_P(WindowSelectorTest, A11yAlertOnOverviewMode) { | 392 TEST_F(WindowSelectorTest, A11yAlertOnOverviewMode) { |
| 421 gfx::Rect bounds(0, 0, 400, 400); | 393 gfx::Rect bounds(0, 0, 400, 400); |
| 422 AccessibilityDelegate* delegate = WmShell::Get()->accessibility_delegate(); | 394 AccessibilityDelegate* delegate = WmShell::Get()->accessibility_delegate(); |
| 423 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 395 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 424 EXPECT_NE(delegate->GetLastAccessibilityAlert(), | 396 EXPECT_NE(delegate->GetLastAccessibilityAlert(), |
| 425 A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); | 397 A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); |
| 426 ToggleOverview(); | 398 ToggleOverview(); |
| 427 EXPECT_EQ(delegate->GetLastAccessibilityAlert(), | 399 EXPECT_EQ(delegate->GetLastAccessibilityAlert(), |
| 428 A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); | 400 A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); |
| 429 } | 401 } |
| 430 | 402 |
| 431 // Tests that there are no crashes when there is not enough screen space | 403 // Tests that there are no crashes when there is not enough screen space |
| 432 // available to show all of the windows. | 404 // available to show all of the windows. |
| 433 TEST_P(WindowSelectorTest, SmallDisplay) { | 405 TEST_F(WindowSelectorTest, SmallDisplay) { |
| 434 UpdateDisplay("3x1"); | 406 UpdateDisplay("3x1"); |
| 435 gfx::Rect bounds(0, 0, 1, 1); | 407 gfx::Rect bounds(0, 0, 1, 1); |
| 436 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 408 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 437 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 409 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 438 std::unique_ptr<aura::Window> window3(CreateWindow(bounds)); | 410 std::unique_ptr<aura::Window> window3(CreateWindow(bounds)); |
| 439 std::unique_ptr<aura::Window> window4(CreateWindow(bounds)); | 411 std::unique_ptr<aura::Window> window4(CreateWindow(bounds)); |
| 440 window1->SetProperty(aura::client::kTopViewInset, 0); | 412 window1->SetProperty(aura::client::kTopViewInset, 0); |
| 441 window2->SetProperty(aura::client::kTopViewInset, 0); | 413 window2->SetProperty(aura::client::kTopViewInset, 0); |
| 442 window3->SetProperty(aura::client::kTopViewInset, 0); | 414 window3->SetProperty(aura::client::kTopViewInset, 0); |
| 443 window4->SetProperty(aura::client::kTopViewInset, 0); | 415 window4->SetProperty(aura::client::kTopViewInset, 0); |
| 444 ToggleOverview(); | 416 ToggleOverview(); |
| 445 } | 417 } |
| 446 | 418 |
| 447 // Tests entering overview mode with two windows and selecting one by clicking. | 419 // Tests entering overview mode with two windows and selecting one by clicking. |
| 448 TEST_P(WindowSelectorTest, Basic) { | 420 TEST_F(WindowSelectorTest, Basic) { |
| 449 gfx::Rect bounds(0, 0, 400, 400); | 421 gfx::Rect bounds(0, 0, 400, 400); |
| 450 aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 422 aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
| 451 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 423 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 452 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 424 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 453 std::unique_ptr<aura::Window> panel1(CreatePanelWindow(bounds)); | 425 std::unique_ptr<aura::Window> panel1(CreatePanelWindow(bounds)); |
| 454 std::unique_ptr<aura::Window> panel2(CreatePanelWindow(bounds)); | 426 std::unique_ptr<aura::Window> panel2(CreatePanelWindow(bounds)); |
| 455 | 427 |
| 456 EXPECT_TRUE(WindowsOverlapping(window1.get(), window2.get())); | 428 EXPECT_TRUE(WindowsOverlapping(window1.get(), window2.get())); |
| 457 EXPECT_TRUE(WindowsOverlapping(panel1.get(), panel2.get())); | 429 EXPECT_TRUE(WindowsOverlapping(panel1.get(), panel2.get())); |
| 458 wm::ActivateWindow(window2.get()); | 430 wm::ActivateWindow(window2.get()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 475 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); | 447 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 476 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); | 448 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); |
| 477 EXPECT_EQ(window1.get(), GetFocusedWindow()); | 449 EXPECT_EQ(window1.get(), GetFocusedWindow()); |
| 478 | 450 |
| 479 // Cursor should have been unlocked. | 451 // Cursor should have been unlocked. |
| 480 EXPECT_FALSE(aura::client::GetCursorClient(root_window)->IsCursorLocked()); | 452 EXPECT_FALSE(aura::client::GetCursorClient(root_window)->IsCursorLocked()); |
| 481 } | 453 } |
| 482 | 454 |
| 483 // Tests that entering overview mode with an App-list active properly focuses | 455 // Tests that entering overview mode with an App-list active properly focuses |
| 484 // and activates the overview text filter window. | 456 // and activates the overview text filter window. |
| 485 TEST_P(WindowSelectorTest, TextFilterActive) { | 457 TEST_F(WindowSelectorTest, TextFilterActive) { |
| 486 gfx::Rect bounds(0, 0, 400, 400); | 458 gfx::Rect bounds(0, 0, 400, 400); |
| 487 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 459 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 488 wm::ActivateWindow(window1.get()); | 460 wm::ActivateWindow(window1.get()); |
| 489 | 461 |
| 490 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); | 462 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 491 EXPECT_EQ(window1.get(), GetFocusedWindow()); | 463 EXPECT_EQ(window1.get(), GetFocusedWindow()); |
| 492 | 464 |
| 493 WmShell::Get()->ToggleAppList(); | 465 WmShell::Get()->ToggleAppList(); |
| 494 | 466 |
| 495 // Activating overview cancels the App-list which normally would activate the | 467 // Activating overview cancels the App-list which normally would activate the |
| 496 // previously active |window1|. Overview mode should properly transfer focus | 468 // previously active |window1|. Overview mode should properly transfer focus |
| 497 // and activation to the text filter widget. | 469 // and activation to the text filter widget. |
| 498 ToggleOverview(); | 470 ToggleOverview(); |
| 499 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); | 471 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); |
| 500 EXPECT_TRUE(wm::IsActiveWindow(GetFocusedWindow())); | 472 EXPECT_TRUE(wm::IsActiveWindow(GetFocusedWindow())); |
| 501 EXPECT_EQ(text_filter_widget()->GetNativeWindow(), GetFocusedWindow()); | 473 EXPECT_EQ(text_filter_widget()->GetNativeWindow(), GetFocusedWindow()); |
| 502 } | 474 } |
| 503 | 475 |
| 504 // Tests that the ordering of windows is near the windows' original positions. | |
| 505 TEST_P(WindowSelectorTest, MinimizeMovement) { | |
| 506 // With Material Design the order of windows in overview mode is MRU. | |
| 507 if (ash::MaterialDesignController::IsOverviewMaterial()) | |
| 508 return; | |
| 509 aura::Window* root_window = Shell::GetPrimaryRootWindow(); | |
| 510 gfx::Rect left_bounds(0, 0, root_window->bounds().width() / 2, | |
| 511 root_window->bounds().height()); | |
| 512 gfx::Rect right_bounds(root_window->bounds().width() / 2, 0, | |
| 513 root_window->bounds().width() / 2, | |
| 514 root_window->bounds().height()); | |
| 515 std::unique_ptr<aura::Window> left_window(CreateWindow(left_bounds)); | |
| 516 WmWindow* left_window_wm = WmWindowAura::Get(left_window.get()); | |
| 517 std::unique_ptr<aura::Window> right_window(CreateWindow(right_bounds)); | |
| 518 WmWindow* right_window_wm = WmWindowAura::Get(right_window.get()); | |
| 519 | |
| 520 // The window should stay on the same side of the screen regardless of which | |
| 521 // one was active on entering overview mode. | |
| 522 wm::GetWindowState(left_window.get())->Activate(); | |
| 523 ToggleOverview(); | |
| 524 const std::vector<WindowSelectorItem*>& overview1(GetWindowItemsForRoot(0)); | |
| 525 EXPECT_EQ(overview1[0]->GetWindow(), left_window_wm); | |
| 526 EXPECT_EQ(overview1[1]->GetWindow(), right_window_wm); | |
| 527 ToggleOverview(); | |
| 528 | |
| 529 // Active the right window, the order should be the same. | |
| 530 wm::GetWindowState(right_window.get())->Activate(); | |
| 531 ToggleOverview(); | |
| 532 const std::vector<WindowSelectorItem*>& overview2(GetWindowItemsForRoot(0)); | |
| 533 EXPECT_EQ(overview2[0]->GetWindow(), left_window_wm); | |
| 534 EXPECT_EQ(overview2[1]->GetWindow(), right_window_wm); | |
| 535 ToggleOverview(); | |
| 536 | |
| 537 // Switch the window positions, and the order should be switched. | |
| 538 left_window->SetBounds(right_bounds); | |
| 539 right_window->SetBounds(left_bounds); | |
| 540 ToggleOverview(); | |
| 541 const std::vector<WindowSelectorItem*>& overview3(GetWindowItemsForRoot(0)); | |
| 542 EXPECT_EQ(overview3[0]->GetWindow(), right_window_wm); | |
| 543 EXPECT_EQ(overview3[1]->GetWindow(), left_window_wm); | |
| 544 ToggleOverview(); | |
| 545 } | |
| 546 | |
| 547 // Tests that the ordering of windows is near the windows' original positions | |
| 548 // on a second display. | |
| 549 TEST_P(WindowSelectorTest, MinimizeMovementSecondDisplay) { | |
| 550 // With Material Design the order of windows in overview mode is MRU. | |
| 551 if (ash::MaterialDesignController::IsOverviewMaterial() || | |
| 552 !SupportsMultipleDisplays()) { | |
| 553 return; | |
| 554 } | |
| 555 // Verify the same works on the second display | |
| 556 UpdateDisplay("400x400,400x400"); | |
| 557 gfx::Rect left_bounds(400, 0, 200, 400); | |
| 558 gfx::Rect right_bounds(600, 0, 200, 400); | |
| 559 std::unique_ptr<aura::Window> left_window(CreateWindow(left_bounds)); | |
| 560 WmWindow* left_window_wm = WmWindowAura::Get(left_window.get()); | |
| 561 std::unique_ptr<aura::Window> right_window(CreateWindow(right_bounds)); | |
| 562 WmWindow* right_window_wm = WmWindowAura::Get(right_window.get()); | |
| 563 | |
| 564 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | |
| 565 EXPECT_EQ(root_windows[1], left_window->GetRootWindow()); | |
| 566 EXPECT_EQ(root_windows[1], right_window->GetRootWindow()); | |
| 567 | |
| 568 wm::GetWindowState(left_window.get())->Activate(); | |
| 569 ToggleOverview(); | |
| 570 const std::vector<WindowSelectorItem*>& overview1(GetWindowItemsForRoot(0)); | |
| 571 EXPECT_EQ(overview1[0]->GetWindow(), left_window_wm); | |
| 572 EXPECT_EQ(overview1[1]->GetWindow(), right_window_wm); | |
| 573 ToggleOverview(); | |
| 574 | |
| 575 // Active the right window, the order should be the same. | |
| 576 wm::GetWindowState(right_window.get())->Activate(); | |
| 577 ToggleOverview(); | |
| 578 const std::vector<WindowSelectorItem*>& overview2(GetWindowItemsForRoot(0)); | |
| 579 EXPECT_EQ(overview2[0]->GetWindow(), left_window_wm); | |
| 580 EXPECT_EQ(overview2[1]->GetWindow(), right_window_wm); | |
| 581 ToggleOverview(); | |
| 582 } | |
| 583 | |
| 584 // Tests that the ordering of windows is stable across different overview | 476 // Tests that the ordering of windows is stable across different overview |
| 585 // sessions even when the windows have the same bounds. | 477 // sessions even when the windows have the same bounds. |
| 586 TEST_P(WindowSelectorTest, WindowsOrder) { | 478 TEST_F(WindowSelectorTest, WindowsOrder) { |
| 587 gfx::Rect bounds(0, 0, 400, 400); | 479 gfx::Rect bounds(0, 0, 400, 400); |
| 588 std::unique_ptr<aura::Window> window1(CreateWindowWithId(bounds, 1)); | 480 std::unique_ptr<aura::Window> window1(CreateWindowWithId(bounds, 1)); |
| 589 std::unique_ptr<aura::Window> window2(CreateWindowWithId(bounds, 2)); | 481 std::unique_ptr<aura::Window> window2(CreateWindowWithId(bounds, 2)); |
| 590 std::unique_ptr<aura::Window> window3(CreateWindowWithId(bounds, 3)); | 482 std::unique_ptr<aura::Window> window3(CreateWindowWithId(bounds, 3)); |
| 591 | 483 |
| 592 // Before Material Design the initial ordering is not defined, but should | 484 // The order of windows in overview mode is MRU. |
| 593 // remain consistent the next time overview is started. | |
| 594 // With Material Design the order of windows in overview mode is MRU. | |
| 595 wm::GetWindowState(window1.get())->Activate(); | 485 wm::GetWindowState(window1.get())->Activate(); |
| 596 ToggleOverview(); | 486 ToggleOverview(); |
| 597 const std::vector<WindowSelectorItem*>& overview1(GetWindowItemsForRoot(0)); | 487 const std::vector<WindowSelectorItem*>& overview1(GetWindowItemsForRoot(0)); |
| 598 int initial_order[3] = {overview1[0]->GetWindow()->GetShellWindowId(), | 488 EXPECT_EQ(1, overview1[0]->GetWindow()->GetShellWindowId()); |
| 599 overview1[1]->GetWindow()->GetShellWindowId(), | 489 EXPECT_EQ(3, overview1[1]->GetWindow()->GetShellWindowId()); |
| 600 overview1[2]->GetWindow()->GetShellWindowId()}; | 490 EXPECT_EQ(2, overview1[2]->GetWindow()->GetShellWindowId()); |
| 601 if (ash::MaterialDesignController::IsOverviewMaterial()) { | |
| 602 // With Material Design the order should be MRU. | |
| 603 EXPECT_EQ(1, overview1[0]->GetWindow()->GetShellWindowId()); | |
| 604 EXPECT_EQ(3, overview1[1]->GetWindow()->GetShellWindowId()); | |
| 605 EXPECT_EQ(2, overview1[2]->GetWindow()->GetShellWindowId()); | |
| 606 } | |
| 607 ToggleOverview(); | 491 ToggleOverview(); |
| 608 | 492 |
| 609 // Activate the second window. | 493 // Activate the second window. |
| 610 wm::GetWindowState(window2.get())->Activate(); | 494 wm::GetWindowState(window2.get())->Activate(); |
| 611 ToggleOverview(); | 495 ToggleOverview(); |
| 612 const std::vector<WindowSelectorItem*>& overview2(GetWindowItemsForRoot(0)); | 496 const std::vector<WindowSelectorItem*>& overview2(GetWindowItemsForRoot(0)); |
| 613 | 497 |
| 614 if (ash::MaterialDesignController::IsOverviewMaterial()) { | 498 // The order should be MRU. |
| 615 // With Material Design the order should be MRU. | 499 EXPECT_EQ(2, overview2[0]->GetWindow()->GetShellWindowId()); |
| 616 EXPECT_EQ(2, overview2[0]->GetWindow()->GetShellWindowId()); | 500 EXPECT_EQ(1, overview2[1]->GetWindow()->GetShellWindowId()); |
| 617 EXPECT_EQ(1, overview2[1]->GetWindow()->GetShellWindowId()); | 501 EXPECT_EQ(3, overview2[2]->GetWindow()->GetShellWindowId()); |
| 618 EXPECT_EQ(3, overview2[2]->GetWindow()->GetShellWindowId()); | |
| 619 } else { | |
| 620 // Before Material Design the order should be the same as the first time. | |
| 621 EXPECT_EQ(initial_order[0], overview2[0]->GetWindow()->GetShellWindowId()); | |
| 622 EXPECT_EQ(initial_order[1], overview2[1]->GetWindow()->GetShellWindowId()); | |
| 623 EXPECT_EQ(initial_order[2], overview2[2]->GetWindow()->GetShellWindowId()); | |
| 624 } | |
| 625 ToggleOverview(); | 502 ToggleOverview(); |
| 626 } | 503 } |
| 627 | 504 |
| 628 // Tests entering overview mode with docked windows | 505 // Tests entering overview mode with docked windows |
| 629 TEST_P(WindowSelectorTest, BasicWithDocked) { | 506 TEST_F(WindowSelectorTest, BasicWithDocked) { |
| 630 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 507 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
| 631 gfx::Rect bounds(300, 0, 200, 200); | 508 gfx::Rect bounds(300, 0, 200, 200); |
| 632 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 509 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 633 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 510 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 634 std::unique_ptr<aura::Window> docked1(CreateWindow(bounds)); | 511 std::unique_ptr<aura::Window> docked1(CreateWindow(bounds)); |
| 635 std::unique_ptr<aura::Window> docked2(CreateWindow(bounds)); | 512 std::unique_ptr<aura::Window> docked2(CreateWindow(bounds)); |
| 636 | 513 |
| 637 wm::WMEvent dock_event(wm::WM_EVENT_DOCK); | 514 wm::WMEvent dock_event(wm::WM_EVENT_DOCK); |
| 638 wm::GetWindowState(docked1.get())->OnWMEvent(&dock_event); | 515 wm::GetWindowState(docked1.get())->OnWMEvent(&dock_event); |
| 639 | 516 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 657 | 534 |
| 658 ToggleOverview(); | 535 ToggleOverview(); |
| 659 | 536 |
| 660 EXPECT_FALSE(WindowsOverlapping(window1.get(), window2.get())); | 537 EXPECT_FALSE(WindowsOverlapping(window1.get(), window2.get())); |
| 661 | 538 |
| 662 gfx::Rect container_bounds = docked1->parent()->bounds(); | 539 gfx::Rect container_bounds = docked1->parent()->bounds(); |
| 663 ShelfWidget* shelf = GetPrimaryShelf()->shelf_widget(); | 540 ShelfWidget* shelf = GetPrimaryShelf()->shelf_widget(); |
| 664 DockedWindowLayoutManager* manager = | 541 DockedWindowLayoutManager* manager = |
| 665 DockedWindowLayoutManager::Get(WmWindowAura::Get(docked1.get())); | 542 DockedWindowLayoutManager::Get(WmWindowAura::Get(docked1.get())); |
| 666 | 543 |
| 667 if (ash::MaterialDesignController::IsOverviewMaterial()) { | 544 // Docked windows get shown and transformed. |
| 668 // Docked windows get shown and transformed. | 545 EXPECT_TRUE(docked2->IsVisible()); |
| 669 EXPECT_TRUE(docked2->IsVisible()); | |
| 670 | 546 |
| 671 // Docked area shrinks. | 547 // Docked area shrinks. |
| 672 DockedWindowLayoutManager* manager = | 548 EXPECT_EQ(0, manager->docked_bounds().width()); |
| 673 DockedWindowLayoutManager::Get(WmWindowAura::Get(docked1.get())); | |
| 674 EXPECT_EQ(0, manager->docked_bounds().width()); | |
| 675 | 549 |
| 676 // Work area takes the whole screen minus the shelf. | 550 // Work area takes the whole screen minus the shelf. |
| 677 gfx::Rect work_area = display::Screen::GetScreen() | 551 gfx::Rect work_area = display::Screen::GetScreen() |
| 678 ->GetDisplayNearestWindow(docked1.get()) | 552 ->GetDisplayNearestWindow(docked1.get()) |
| 679 .work_area(); | 553 .work_area(); |
| 680 gfx::Size expected_work_area_bounds(container_bounds.size()); | 554 gfx::Size expected_work_area_bounds(container_bounds.size()); |
| 681 expected_work_area_bounds.Enlarge( | 555 expected_work_area_bounds.Enlarge(0, |
| 682 0, -shelf->GetWindowBoundsInScreen().height()); | 556 -shelf->GetWindowBoundsInScreen().height()); |
| 683 EXPECT_EQ(expected_work_area_bounds.ToString(), | 557 EXPECT_EQ(expected_work_area_bounds.ToString(), work_area.size().ToString()); |
| 684 work_area.size().ToString()); | 558 |
| 685 } else { | |
| 686 // Docked windows stays the same. | |
| 687 EXPECT_EQ(docked_bounds.ToString(), | |
| 688 docked1->GetBoundsInScreen().ToString()); | |
| 689 EXPECT_FALSE(docked2->IsVisible()); | |
| 690 } | |
| 691 // Docked window can still be activated, which will exit the overview mode. | 559 // Docked window can still be activated, which will exit the overview mode. |
| 692 ClickWindow(docked1.get()); | 560 ClickWindow(docked1.get()); |
| 693 EXPECT_TRUE(wm::IsActiveWindow(docked1.get())); | 561 EXPECT_TRUE(wm::IsActiveWindow(docked1.get())); |
| 694 EXPECT_FALSE(window_selector_controller()->IsSelecting()); | 562 EXPECT_FALSE(window_selector_controller()->IsSelecting()); |
| 695 | 563 |
| 696 // Docked area has a window in it. | 564 // Docked area has a window in it. |
| 697 EXPECT_GT(manager->docked_bounds().width(), 0); | 565 EXPECT_GT(manager->docked_bounds().width(), 0); |
| 698 | 566 |
| 699 // Work area takes the whole screen minus the shelf and the docked area. | 567 // Work area takes the whole screen minus the shelf and the docked area. |
| 700 gfx::Rect work_area = display::Screen::GetScreen() | 568 work_area = display::Screen::GetScreen() |
| 701 ->GetDisplayNearestWindow(docked1.get()) | 569 ->GetDisplayNearestWindow(docked1.get()) |
| 702 .work_area(); | 570 .work_area(); |
| 703 gfx::Size expected_work_area_bounds(container_bounds.size()); | 571 expected_work_area_bounds = container_bounds.size(); |
| 704 expected_work_area_bounds.Enlarge(-manager->docked_bounds().width(), | 572 expected_work_area_bounds.Enlarge(-manager->docked_bounds().width(), |
| 705 -shelf->GetWindowBoundsInScreen().height()); | 573 -shelf->GetWindowBoundsInScreen().height()); |
| 706 EXPECT_EQ(expected_work_area_bounds.ToString(), work_area.size().ToString()); | 574 EXPECT_EQ(expected_work_area_bounds.ToString(), work_area.size().ToString()); |
| 707 } | 575 } |
| 708 | 576 |
| 709 // Tests that selecting a docked window updates docked layout pushing another | 577 // Tests that selecting a docked window updates docked layout pushing another |
| 710 // window to get docked-minimized. | 578 // window to get docked-minimized. |
| 711 TEST_P(WindowSelectorTest, ActivateDockedWindow) { | 579 TEST_F(WindowSelectorTest, ActivateDockedWindow) { |
| 712 if (!ash::MaterialDesignController::IsOverviewMaterial()) | |
| 713 return; | |
| 714 | |
| 715 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 580 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
| 716 gfx::Rect bounds(300, 0, 200, 200); | 581 gfx::Rect bounds(300, 0, 200, 200); |
| 717 std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds); | 582 std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds); |
| 718 std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds); | 583 std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds); |
| 719 | 584 |
| 720 aura::test::TestWindowDelegate delegate; | 585 aura::test::TestWindowDelegate delegate; |
| 721 delegate.set_minimum_size(gfx::Size(200, 500)); | 586 delegate.set_minimum_size(gfx::Size(200, 500)); |
| 722 std::unique_ptr<aura::Window> docked_window1( | 587 std::unique_ptr<aura::Window> docked_window1( |
| 723 CreateTestWindowInShellWithDelegate(&delegate, -1, bounds)); | 588 CreateTestWindowInShellWithDelegate(&delegate, -1, bounds)); |
| 724 docked_window1->SetProperty(aura::client::kTopViewInset, kHeaderHeight); | 589 docked_window1->SetProperty(aura::client::kTopViewInset, kHeaderHeight); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 | 625 |
| 761 // |docked_window1| is docked-minimized and hidden. | 626 // |docked_window1| is docked-minimized and hidden. |
| 762 EXPECT_FALSE(docked_window1->IsVisible()); | 627 EXPECT_FALSE(docked_window1->IsVisible()); |
| 763 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType()); | 628 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType()); |
| 764 // |docked_window2| is docked and visible. | 629 // |docked_window2| is docked and visible. |
| 765 EXPECT_TRUE(docked_window2->IsVisible()); | 630 EXPECT_TRUE(docked_window2->IsVisible()); |
| 766 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state2->GetStateType()); | 631 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state2->GetStateType()); |
| 767 } | 632 } |
| 768 | 633 |
| 769 // Tests that clicking on the close button closes the docked window. | 634 // Tests that clicking on the close button closes the docked window. |
| 770 TEST_P(WindowSelectorTest, CloseDockedWindow) { | 635 TEST_F(WindowSelectorTest, CloseDockedWindow) { |
| 771 if (!ash::MaterialDesignController::IsOverviewMaterial()) | |
| 772 return; | |
| 773 | |
| 774 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 636 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
| 775 gfx::Rect bounds(300, 0, 200, 200); | 637 gfx::Rect bounds(300, 0, 200, 200); |
| 776 std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds); | 638 std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds); |
| 777 std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds); | 639 std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds); |
| 778 | 640 |
| 779 aura::test::TestWindowDelegate delegate; | 641 aura::test::TestWindowDelegate delegate; |
| 780 delegate.set_minimum_size(gfx::Size(200, 500)); | 642 delegate.set_minimum_size(gfx::Size(200, 500)); |
| 781 std::unique_ptr<aura::Window> docked_window1( | 643 std::unique_ptr<aura::Window> docked_window1( |
| 782 CreateTestWindowInShellWithDelegate(&delegate, -1, bounds)); | 644 CreateTestWindowInShellWithDelegate(&delegate, -1, bounds)); |
| 783 docked_window1->SetProperty(aura::client::kTopViewInset, kHeaderHeight); | 645 docked_window1->SetProperty(aura::client::kTopViewInset, kHeaderHeight); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 | 684 |
| 823 // Window bounds are still the same. | 685 // Window bounds are still the same. |
| 824 EXPECT_EQ(expected_bounds1.ToString(), docked_window1->bounds().ToString()); | 686 EXPECT_EQ(expected_bounds1.ToString(), docked_window1->bounds().ToString()); |
| 825 | 687 |
| 826 // |docked_window1| returns to docked-minimized and hidden state. | 688 // |docked_window1| returns to docked-minimized and hidden state. |
| 827 EXPECT_FALSE(docked_window1->IsVisible()); | 689 EXPECT_FALSE(docked_window1->IsVisible()); |
| 828 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType()); | 690 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType()); |
| 829 } | 691 } |
| 830 | 692 |
| 831 // Tests that clicking on the close button closes the docked-minimized window. | 693 // Tests that clicking on the close button closes the docked-minimized window. |
| 832 TEST_P(WindowSelectorTest, CloseDockedMinimizedWindow) { | 694 TEST_F(WindowSelectorTest, CloseDockedMinimizedWindow) { |
| 833 if (!ash::MaterialDesignController::IsOverviewMaterial()) | |
| 834 return; | |
| 835 | |
| 836 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 695 // aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
| 837 gfx::Rect bounds(300, 0, 200, 200); | 696 gfx::Rect bounds(300, 0, 200, 200); |
| 838 std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds); | 697 std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds); |
| 839 std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds); | 698 std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds); |
| 840 | 699 |
| 841 aura::test::TestWindowDelegate delegate; | 700 aura::test::TestWindowDelegate delegate; |
| 842 delegate.set_minimum_size(gfx::Size(200, 500)); | 701 delegate.set_minimum_size(gfx::Size(200, 500)); |
| 843 std::unique_ptr<aura::Window> docked_window1( | 702 std::unique_ptr<aura::Window> docked_window1( |
| 844 CreateTestWindowInShellWithDelegate(&delegate, -1, bounds)); | 703 CreateTestWindowInShellWithDelegate(&delegate, -1, bounds)); |
| 845 docked_window1->SetProperty(aura::client::kTopViewInset, kHeaderHeight); | 704 docked_window1->SetProperty(aura::client::kTopViewInset, kHeaderHeight); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 // Window bounds are still the same. | 744 // Window bounds are still the same. |
| 886 EXPECT_EQ(expected_bounds1.ToString(), | 745 EXPECT_EQ(expected_bounds1.ToString(), |
| 887 docked_window1->GetTargetBounds().ToString()); | 746 docked_window1->GetTargetBounds().ToString()); |
| 888 | 747 |
| 889 // |docked_window1| returns to docked and visible state. | 748 // |docked_window1| returns to docked and visible state. |
| 890 EXPECT_TRUE(docked_window1->IsVisible()); | 749 EXPECT_TRUE(docked_window1->IsVisible()); |
| 891 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType()); | 750 EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType()); |
| 892 } | 751 } |
| 893 | 752 |
| 894 // Tests selecting a window by tapping on it. | 753 // Tests selecting a window by tapping on it. |
| 895 TEST_P(WindowSelectorTest, BasicGesture) { | 754 TEST_F(WindowSelectorTest, BasicGesture) { |
| 896 gfx::Rect bounds(0, 0, 400, 400); | 755 gfx::Rect bounds(0, 0, 400, 400); |
| 897 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 756 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 898 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 757 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 899 wm::ActivateWindow(window1.get()); | 758 wm::ActivateWindow(window1.get()); |
| 900 EXPECT_EQ(window1.get(), GetFocusedWindow()); | 759 EXPECT_EQ(window1.get(), GetFocusedWindow()); |
| 901 ToggleOverview(); | 760 ToggleOverview(); |
| 902 EXPECT_EQ(text_filter_widget()->GetNativeWindow(), GetFocusedWindow()); | 761 EXPECT_EQ(text_filter_widget()->GetNativeWindow(), GetFocusedWindow()); |
| 903 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 762 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 904 window2.get()); | 763 window2.get()); |
| 905 generator.GestureTapAt( | 764 generator.GestureTapAt( |
| 906 gfx::ToEnclosingRect(GetTransformedTargetBounds(window2.get())) | 765 gfx::ToEnclosingRect(GetTransformedTargetBounds(window2.get())) |
| 907 .CenterPoint()); | 766 .CenterPoint()); |
| 908 EXPECT_EQ(window2.get(), GetFocusedWindow()); | 767 EXPECT_EQ(window2.get(), GetFocusedWindow()); |
| 909 } | 768 } |
| 910 | 769 |
| 911 // Tests that the user action WindowSelector_ActiveWindowChanged is | 770 // Tests that the user action WindowSelector_ActiveWindowChanged is |
| 912 // recorded when the mouse/touchscreen/keyboard are used to select a window | 771 // recorded when the mouse/touchscreen/keyboard are used to select a window |
| 913 // in overview mode which is different from the previously-active window. | 772 // in overview mode which is different from the previously-active window. |
| 914 TEST_P(WindowSelectorTest, ActiveWindowChangedUserActionRecorded) { | 773 TEST_F(WindowSelectorTest, ActiveWindowChangedUserActionRecorded) { |
| 915 base::UserActionTester user_action_tester; | 774 base::UserActionTester user_action_tester; |
| 916 gfx::Rect bounds(0, 0, 400, 400); | 775 gfx::Rect bounds(0, 0, 400, 400); |
| 917 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 776 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 918 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 777 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 919 | 778 |
| 920 // Tap on |window2| to activate it and exit overview. | 779 // Tap on |window2| to activate it and exit overview. |
| 921 wm::ActivateWindow(window1.get()); | 780 wm::ActivateWindow(window1.get()); |
| 922 ToggleOverview(); | 781 ToggleOverview(); |
| 923 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 782 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 924 window2.get()); | 783 window2.get()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 942 ASSERT_TRUE(SelectWindow(window2.get())); | 801 ASSERT_TRUE(SelectWindow(window2.get())); |
| 943 SendKey(ui::VKEY_RETURN); | 802 SendKey(ui::VKEY_RETURN); |
| 944 EXPECT_EQ( | 803 EXPECT_EQ( |
| 945 3, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview)); | 804 3, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview)); |
| 946 } | 805 } |
| 947 | 806 |
| 948 // Tests that the user action WindowSelector_ActiveWindowChanged is not | 807 // Tests that the user action WindowSelector_ActiveWindowChanged is not |
| 949 // recorded when the mouse/touchscreen/keyboard are used to select the | 808 // recorded when the mouse/touchscreen/keyboard are used to select the |
| 950 // already-active window from overview mode. Also verifies that entering and | 809 // already-active window from overview mode. Also verifies that entering and |
| 951 // exiting overview without selecting a window does not record the action. | 810 // exiting overview without selecting a window does not record the action. |
| 952 TEST_P(WindowSelectorTest, ActiveWindowChangedUserActionNotRecorded) { | 811 TEST_F(WindowSelectorTest, ActiveWindowChangedUserActionNotRecorded) { |
| 953 base::UserActionTester user_action_tester; | 812 base::UserActionTester user_action_tester; |
| 954 gfx::Rect bounds(0, 0, 400, 400); | 813 gfx::Rect bounds(0, 0, 400, 400); |
| 955 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 814 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 956 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 815 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 957 | 816 |
| 958 // Set |window1| to be initially active. | 817 // Set |window1| to be initially active. |
| 959 wm::ActivateWindow(window1.get()); | 818 wm::ActivateWindow(window1.get()); |
| 960 ToggleOverview(); | 819 ToggleOverview(); |
| 961 | 820 |
| 962 // Tap on |window1| to exit overview. | 821 // Tap on |window1| to exit overview. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 986 // Entering and exiting overview without user input should not record | 845 // Entering and exiting overview without user input should not record |
| 987 // the action. | 846 // the action. |
| 988 ToggleOverview(); | 847 ToggleOverview(); |
| 989 ToggleOverview(); | 848 ToggleOverview(); |
| 990 EXPECT_EQ( | 849 EXPECT_EQ( |
| 991 0, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview)); | 850 0, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview)); |
| 992 } | 851 } |
| 993 | 852 |
| 994 // Tests that the user action WindowSelector_ActiveWindowChanged is not | 853 // Tests that the user action WindowSelector_ActiveWindowChanged is not |
| 995 // recorded when overview mode exits as a result of closing its only window. | 854 // recorded when overview mode exits as a result of closing its only window. |
| 996 TEST_P(WindowSelectorTest, ActiveWindowChangedUserActionWindowClose) { | 855 TEST_F(WindowSelectorTest, ActiveWindowChangedUserActionWindowClose) { |
| 997 base::UserActionTester user_action_tester; | 856 base::UserActionTester user_action_tester; |
| 998 std::unique_ptr<views::Widget> widget = | 857 std::unique_ptr<views::Widget> widget = |
| 999 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | 858 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); |
| 1000 | 859 |
| 1001 ToggleOverview(); | 860 ToggleOverview(); |
| 1002 | 861 |
| 1003 aura::Window* window = widget->GetNativeWindow(); | 862 aura::Window* window = widget->GetNativeWindow(); |
| 1004 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); | 863 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); |
| 1005 gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() + 5); | 864 gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() + 5); |
| 1006 ui::test::EventGenerator event_generator(window->GetRootWindow(), point); | 865 ui::test::EventGenerator event_generator(window->GetRootWindow(), point); |
| 1007 | 866 |
| 1008 ASSERT_FALSE(widget->IsClosed()); | 867 ASSERT_FALSE(widget->IsClosed()); |
| 1009 event_generator.ClickLeftButton(); | 868 event_generator.ClickLeftButton(); |
| 1010 ASSERT_TRUE(widget->IsClosed()); | 869 ASSERT_TRUE(widget->IsClosed()); |
| 1011 EXPECT_EQ( | 870 EXPECT_EQ( |
| 1012 0, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview)); | 871 0, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview)); |
| 1013 } | 872 } |
| 1014 | 873 |
| 1015 // Tests that we do not crash and overview mode remains engaged if the desktop | 874 // Tests that we do not crash and overview mode remains engaged if the desktop |
| 1016 // is tapped while a finger is already down over a window. | 875 // is tapped while a finger is already down over a window. |
| 1017 TEST_P(WindowSelectorTest, NoCrashWithDesktopTap) { | 876 TEST_F(WindowSelectorTest, NoCrashWithDesktopTap) { |
| 1018 std::unique_ptr<aura::Window> window( | 877 std::unique_ptr<aura::Window> window( |
| 1019 CreateWindow(gfx::Rect(200, 300, 250, 450))); | 878 CreateWindow(gfx::Rect(200, 300, 250, 450))); |
| 1020 | 879 |
| 1021 ToggleOverview(); | 880 ToggleOverview(); |
| 1022 | 881 |
| 1023 gfx::Rect bounds = | 882 gfx::Rect bounds = |
| 1024 gfx::ToEnclosingRect(GetTransformedBoundsInRootWindow(window.get())); | 883 gfx::ToEnclosingRect(GetTransformedBoundsInRootWindow(window.get())); |
| 1025 ui::test::EventGenerator event_generator(window->GetRootWindow(), | 884 ui::test::EventGenerator event_generator(window->GetRootWindow(), |
| 1026 bounds.CenterPoint()); | 885 bounds.CenterPoint()); |
| 1027 | 886 |
| 1028 // Press down on the window. | 887 // Press down on the window. |
| 1029 const int kTouchId = 19; | 888 const int kTouchId = 19; |
| 1030 event_generator.PressTouchId(kTouchId); | 889 event_generator.PressTouchId(kTouchId); |
| 1031 | 890 |
| 1032 // Tap on the desktop, which should not cause a crash. Overview mode should | 891 // Tap on the desktop, which should not cause a crash. Overview mode should |
| 1033 // be disengaged. | 892 // be disengaged. |
| 1034 event_generator.GestureTapAt(gfx::Point(0, 0)); | 893 event_generator.GestureTapAt(gfx::Point(0, 0)); |
| 1035 EXPECT_FALSE(IsSelecting()); | 894 EXPECT_FALSE(IsSelecting()); |
| 1036 | 895 |
| 1037 event_generator.ReleaseTouchId(kTouchId); | 896 event_generator.ReleaseTouchId(kTouchId); |
| 1038 } | 897 } |
| 1039 | 898 |
| 1040 // Tests that we do not crash and a window is selected when appropriate when | 899 // Tests that we do not crash and a window is selected when appropriate when |
| 1041 // we click on a window during touch. | 900 // we click on a window during touch. |
| 1042 TEST_P(WindowSelectorTest, ClickOnWindowDuringTouch) { | 901 TEST_F(WindowSelectorTest, ClickOnWindowDuringTouch) { |
| 1043 gfx::Rect bounds(0, 0, 400, 400); | 902 gfx::Rect bounds(0, 0, 400, 400); |
| 1044 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 903 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1045 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 904 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1046 wm::ActivateWindow(window2.get()); | 905 wm::ActivateWindow(window2.get()); |
| 1047 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); | 906 EXPECT_FALSE(wm::IsActiveWindow(window1.get())); |
| 1048 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); | 907 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 1049 | 908 |
| 1050 ToggleOverview(); | 909 ToggleOverview(); |
| 1051 | 910 |
| 1052 gfx::Rect window1_bounds = | 911 gfx::Rect window1_bounds = |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1072 event_generator.MoveMouseToCenterOf(window1.get()); | 931 event_generator.MoveMouseToCenterOf(window1.get()); |
| 1073 event_generator.PressTouchId(kTouchId); | 932 event_generator.PressTouchId(kTouchId); |
| 1074 event_generator.ClickLeftButton(); | 933 event_generator.ClickLeftButton(); |
| 1075 EXPECT_FALSE(IsSelecting()); | 934 EXPECT_FALSE(IsSelecting()); |
| 1076 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); | 935 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 1077 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); | 936 EXPECT_FALSE(wm::IsActiveWindow(window2.get())); |
| 1078 event_generator.ReleaseTouchId(kTouchId); | 937 event_generator.ReleaseTouchId(kTouchId); |
| 1079 } | 938 } |
| 1080 | 939 |
| 1081 // Tests that a window does not receive located events when in overview mode. | 940 // Tests that a window does not receive located events when in overview mode. |
| 1082 TEST_P(WindowSelectorTest, WindowDoesNotReceiveEvents) { | 941 TEST_F(WindowSelectorTest, WindowDoesNotReceiveEvents) { |
| 1083 gfx::Rect window_bounds(20, 10, 200, 300); | 942 gfx::Rect window_bounds(20, 10, 200, 300); |
| 1084 aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 943 aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
| 1085 std::unique_ptr<aura::Window> window(CreateWindow(window_bounds)); | 944 std::unique_ptr<aura::Window> window(CreateWindow(window_bounds)); |
| 1086 | 945 |
| 1087 gfx::Point point1(window_bounds.x() + 10, window_bounds.y() + 10); | 946 gfx::Point point1(window_bounds.x() + 10, window_bounds.y() + 10); |
| 1088 | 947 |
| 1089 ui::MouseEvent event1(ui::ET_MOUSE_PRESSED, point1, point1, | 948 ui::MouseEvent event1(ui::ET_MOUSE_PRESSED, point1, point1, |
| 1090 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE); | 949 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE); |
| 1091 | 950 |
| 1092 ui::EventTarget* root_target = root_window; | 951 ui::EventTarget* root_target = root_window; |
| 1093 ui::EventTargeter* targeter = root_target->GetEventTargeter(); | 952 ui::EventTargeter* targeter = root_target->GetEventTargeter(); |
| 1094 | 953 |
| 1095 // The event should target the window because we are still not in overview | 954 // The event should target the window because we are still not in overview |
| 1096 // mode. | 955 // mode. |
| 1097 EXPECT_EQ(window.get(), targeter->FindTargetForEvent(root_target, &event1)); | 956 EXPECT_EQ(window.get(), targeter->FindTargetForEvent(root_target, &event1)); |
| 1098 | 957 |
| 1099 ToggleOverview(); | 958 ToggleOverview(); |
| 1100 | 959 |
| 1101 // The bounds have changed, take that into account. | 960 // The bounds have changed, take that into account. |
| 1102 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window.get()); | 961 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window.get()); |
| 1103 gfx::Point point2(bounds.x() + 10, bounds.y() + 10); | 962 gfx::Point point2(bounds.x() + 10, bounds.y() + 10); |
| 1104 ui::MouseEvent event2(ui::ET_MOUSE_PRESSED, point2, point2, | 963 ui::MouseEvent event2(ui::ET_MOUSE_PRESSED, point2, point2, |
| 1105 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE); | 964 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE); |
| 1106 | 965 |
| 1107 // Now the transparent window should be intercepting this event. | 966 // Now the transparent window should be intercepting this event. |
| 1108 EXPECT_NE(window.get(), targeter->FindTargetForEvent(root_target, &event2)); | 967 EXPECT_NE(window.get(), targeter->FindTargetForEvent(root_target, &event2)); |
| 1109 } | 968 } |
| 1110 | 969 |
| 1111 // Tests that clicking on the close button effectively closes the window. | 970 // Tests that clicking on the close button effectively closes the window. |
| 1112 TEST_P(WindowSelectorTest, CloseButton) { | 971 TEST_F(WindowSelectorTest, CloseButton) { |
| 1113 std::unique_ptr<views::Widget> widget = | 972 std::unique_ptr<views::Widget> widget = |
| 1114 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | 973 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); |
| 1115 | 974 |
| 1116 ToggleOverview(); | 975 ToggleOverview(); |
| 1117 | 976 |
| 1118 aura::Window* window = widget->GetNativeWindow(); | 977 aura::Window* window = widget->GetNativeWindow(); |
| 1119 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); | 978 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window); |
| 1120 gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() + 5); | 979 gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() + 5); |
| 1121 ui::test::EventGenerator event_generator(window->GetRootWindow(), point); | 980 ui::test::EventGenerator event_generator(window->GetRootWindow(), point); |
| 1122 | 981 |
| 1123 EXPECT_FALSE(widget->IsClosed()); | 982 EXPECT_FALSE(widget->IsClosed()); |
| 1124 event_generator.ClickLeftButton(); | 983 event_generator.ClickLeftButton(); |
| 1125 EXPECT_TRUE(widget->IsClosed()); | 984 EXPECT_TRUE(widget->IsClosed()); |
| 1126 } | 985 } |
| 1127 | 986 |
| 1128 // Tests that clicking on the close button on a secondary display effectively | 987 // Tests that clicking on the close button on a secondary display effectively |
| 1129 // closes the window. | 988 // closes the window. |
| 1130 TEST_P(WindowSelectorTest, CloseButtonOnMultipleDisplay) { | 989 TEST_F(WindowSelectorTest, CloseButtonOnMultipleDisplay) { |
| 1131 if (!SupportsMultipleDisplays()) | 990 if (!SupportsMultipleDisplays()) |
| 1132 return; | 991 return; |
| 1133 | 992 |
| 1134 UpdateDisplay("600x400,600x400"); | 993 UpdateDisplay("600x400,600x400"); |
| 1135 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 994 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 1136 | 995 |
| 1137 std::unique_ptr<aura::Window> window1( | 996 std::unique_ptr<aura::Window> window1( |
| 1138 CreateWindow(gfx::Rect(650, 300, 250, 450))); | 997 CreateWindow(gfx::Rect(650, 300, 250, 450))); |
| 1139 | 998 |
| 1140 // We need a widget for the close button to work because windows are closed | 999 // We need a widget for the close button to work because windows are closed |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1159 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window2); | 1018 gfx::RectF bounds = GetTransformedBoundsInRootWindow(window2); |
| 1160 gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() + 5); | 1019 gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() + 5); |
| 1161 ui::test::EventGenerator event_generator(window2->GetRootWindow(), point); | 1020 ui::test::EventGenerator event_generator(window2->GetRootWindow(), point); |
| 1162 | 1021 |
| 1163 EXPECT_FALSE(widget->IsClosed()); | 1022 EXPECT_FALSE(widget->IsClosed()); |
| 1164 event_generator.ClickLeftButton(); | 1023 event_generator.ClickLeftButton(); |
| 1165 EXPECT_TRUE(widget->IsClosed()); | 1024 EXPECT_TRUE(widget->IsClosed()); |
| 1166 } | 1025 } |
| 1167 | 1026 |
| 1168 // Tests entering overview mode with two windows and selecting one. | 1027 // Tests entering overview mode with two windows and selecting one. |
| 1169 TEST_P(WindowSelectorTest, FullscreenWindow) { | 1028 TEST_F(WindowSelectorTest, FullscreenWindow) { |
| 1170 gfx::Rect bounds(0, 0, 400, 400); | 1029 gfx::Rect bounds(0, 0, 400, 400); |
| 1171 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1030 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1172 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1031 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1173 std::unique_ptr<aura::Window> panel1(CreatePanelWindow(bounds)); | 1032 std::unique_ptr<aura::Window> panel1(CreatePanelWindow(bounds)); |
| 1174 wm::ActivateWindow(window1.get()); | 1033 wm::ActivateWindow(window1.get()); |
| 1175 | 1034 |
| 1176 const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN); | 1035 const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN); |
| 1177 wm::GetWindowState(window1.get())->OnWMEvent(&toggle_fullscreen_event); | 1036 wm::GetWindowState(window1.get())->OnWMEvent(&toggle_fullscreen_event); |
| 1178 // The panel is hidden in fullscreen mode. | 1037 // The panel is hidden in fullscreen mode. |
| 1179 EXPECT_FALSE(panel1->IsVisible()); | 1038 EXPECT_FALSE(panel1->IsVisible()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1195 // fullscreen. | 1054 // fullscreen. |
| 1196 // TODO(flackr): Currently the panel remains hidden, but should become visible | 1055 // TODO(flackr): Currently the panel remains hidden, but should become visible |
| 1197 // again. | 1056 // again. |
| 1198 ToggleOverview(); | 1057 ToggleOverview(); |
| 1199 ClickWindow(window2.get()); | 1058 ClickWindow(window2.get()); |
| 1200 EXPECT_TRUE(wm::GetWindowState(window1.get())->IsFullscreen()); | 1059 EXPECT_TRUE(wm::GetWindowState(window1.get())->IsFullscreen()); |
| 1201 } | 1060 } |
| 1202 | 1061 |
| 1203 // Tests that the shelf dimming state is removed while in overview and restored | 1062 // Tests that the shelf dimming state is removed while in overview and restored |
| 1204 // on exiting overview. | 1063 // on exiting overview. |
| 1205 TEST_P(WindowSelectorTest, OverviewUndimsShelf) { | 1064 TEST_F(WindowSelectorTest, OverviewUndimsShelf) { |
| 1206 gfx::Rect bounds(0, 0, 400, 400); | 1065 gfx::Rect bounds(0, 0, 400, 400); |
| 1207 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1066 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1208 wm::WindowState* window_state = wm::GetWindowState(window1.get()); | 1067 wm::WindowState* window_state = wm::GetWindowState(window1.get()); |
| 1209 window_state->Maximize(); | 1068 window_state->Maximize(); |
| 1210 ShelfWidget* shelf = GetPrimaryShelf()->shelf_widget(); | 1069 ShelfWidget* shelf = GetPrimaryShelf()->shelf_widget(); |
| 1211 EXPECT_TRUE(shelf->GetDimsShelf()); | 1070 EXPECT_TRUE(shelf->GetDimsShelf()); |
| 1212 ToggleOverview(); | 1071 ToggleOverview(); |
| 1213 EXPECT_FALSE(shelf->GetDimsShelf()); | 1072 EXPECT_FALSE(shelf->GetDimsShelf()); |
| 1214 ToggleOverview(); | 1073 ToggleOverview(); |
| 1215 EXPECT_TRUE(shelf->GetDimsShelf()); | 1074 EXPECT_TRUE(shelf->GetDimsShelf()); |
| 1216 } | 1075 } |
| 1217 | 1076 |
| 1218 // Tests that entering overview when a fullscreen window is active in maximized | 1077 // Tests that entering overview when a fullscreen window is active in maximized |
| 1219 // mode correctly applies the transformations to the window and correctly | 1078 // mode correctly applies the transformations to the window and correctly |
| 1220 // updates the window bounds on exiting overview mode: http://crbug.com/401664. | 1079 // updates the window bounds on exiting overview mode: http://crbug.com/401664. |
| 1221 TEST_P(WindowSelectorTest, FullscreenWindowMaximizeMode) { | 1080 TEST_F(WindowSelectorTest, FullscreenWindowMaximizeMode) { |
| 1222 gfx::Rect bounds(0, 0, 400, 400); | 1081 gfx::Rect bounds(0, 0, 400, 400); |
| 1223 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1082 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1224 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1083 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1225 WmShell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( | 1084 WmShell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( |
| 1226 true); | 1085 true); |
| 1227 wm::ActivateWindow(window2.get()); | 1086 wm::ActivateWindow(window2.get()); |
| 1228 wm::ActivateWindow(window1.get()); | 1087 wm::ActivateWindow(window1.get()); |
| 1229 gfx::Rect normal_window_bounds(window1->bounds()); | 1088 gfx::Rect normal_window_bounds(window1->bounds()); |
| 1230 const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN); | 1089 const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN); |
| 1231 wm::GetWindowState(window1.get())->OnWMEvent(&toggle_fullscreen_event); | 1090 wm::GetWindowState(window1.get())->OnWMEvent(&toggle_fullscreen_event); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1249 | 1108 |
| 1250 // Enter overview again and select window 2. Selecting window 2 should show | 1109 // Enter overview again and select window 2. Selecting window 2 should show |
| 1251 // the shelf bringing window2 back to the normal bounds. | 1110 // the shelf bringing window2 back to the normal bounds. |
| 1252 ToggleOverview(); | 1111 ToggleOverview(); |
| 1253 ClickWindow(window2.get()); | 1112 ClickWindow(window2.get()); |
| 1254 EXPECT_EQ(normal_window_bounds.ToString(), | 1113 EXPECT_EQ(normal_window_bounds.ToString(), |
| 1255 window2->GetTargetBounds().ToString()); | 1114 window2->GetTargetBounds().ToString()); |
| 1256 } | 1115 } |
| 1257 | 1116 |
| 1258 // Tests that beginning window selection hides the app list. | 1117 // Tests that beginning window selection hides the app list. |
| 1259 TEST_P(WindowSelectorTest, SelectingHidesAppList) { | 1118 TEST_F(WindowSelectorTest, SelectingHidesAppList) { |
| 1260 gfx::Rect bounds(0, 0, 400, 400); | 1119 gfx::Rect bounds(0, 0, 400, 400); |
| 1261 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1120 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1262 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1121 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1263 WmShell::Get()->ShowAppList(); | 1122 WmShell::Get()->ShowAppList(); |
| 1264 EXPECT_TRUE(WmShell::Get()->GetAppListTargetVisibility()); | 1123 EXPECT_TRUE(WmShell::Get()->GetAppListTargetVisibility()); |
| 1265 ToggleOverview(); | 1124 ToggleOverview(); |
| 1266 EXPECT_FALSE(WmShell::Get()->GetAppListTargetVisibility()); | 1125 EXPECT_FALSE(WmShell::Get()->GetAppListTargetVisibility()); |
| 1267 ToggleOverview(); | 1126 ToggleOverview(); |
| 1268 } | 1127 } |
| 1269 | 1128 |
| 1270 // Tests that a minimized window's visibility and layer visibility is correctly | 1129 // Tests that a minimized window's visibility and layer visibility is correctly |
| 1271 // changed when entering overview and restored when leaving overview mode. | 1130 // changed when entering overview and restored when leaving overview mode. |
| 1272 // Crashes after the skia roll in http://crrev.com/274114. | 1131 // Crashes after the skia roll in http://crrev.com/274114. |
| 1273 // http://crbug.com/379570 | 1132 // http://crbug.com/379570 |
| 1274 TEST_P(WindowSelectorTest, DISABLED_MinimizedWindowVisibility) { | 1133 TEST_F(WindowSelectorTest, DISABLED_MinimizedWindowVisibility) { |
| 1275 gfx::Rect bounds(0, 0, 400, 400); | 1134 gfx::Rect bounds(0, 0, 400, 400); |
| 1276 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1135 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1277 wm::WindowState* window_state = wm::GetWindowState(window1.get()); | 1136 wm::WindowState* window_state = wm::GetWindowState(window1.get()); |
| 1278 window_state->Minimize(); | 1137 window_state->Minimize(); |
| 1279 EXPECT_FALSE(window1->IsVisible()); | 1138 EXPECT_FALSE(window1->IsVisible()); |
| 1280 EXPECT_FALSE(window1->layer()->GetTargetVisibility()); | 1139 EXPECT_FALSE(window1->layer()->GetTargetVisibility()); |
| 1281 { | 1140 { |
| 1282 ui::ScopedAnimationDurationScaleMode test_duration_mode( | 1141 ui::ScopedAnimationDurationScaleMode test_duration_mode( |
| 1283 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); | 1142 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); |
| 1284 ToggleOverview(); | 1143 ToggleOverview(); |
| 1285 EXPECT_TRUE(window1->IsVisible()); | 1144 EXPECT_TRUE(window1->IsVisible()); |
| 1286 EXPECT_TRUE(window1->layer()->GetTargetVisibility()); | 1145 EXPECT_TRUE(window1->layer()->GetTargetVisibility()); |
| 1287 } | 1146 } |
| 1288 { | 1147 { |
| 1289 ui::ScopedAnimationDurationScaleMode test_duration_mode( | 1148 ui::ScopedAnimationDurationScaleMode test_duration_mode( |
| 1290 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); | 1149 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); |
| 1291 ToggleOverview(); | 1150 ToggleOverview(); |
| 1292 EXPECT_FALSE(window1->IsVisible()); | 1151 EXPECT_FALSE(window1->IsVisible()); |
| 1293 EXPECT_FALSE(window1->layer()->GetTargetVisibility()); | 1152 EXPECT_FALSE(window1->layer()->GetTargetVisibility()); |
| 1294 } | 1153 } |
| 1295 } | 1154 } |
| 1296 | 1155 |
| 1297 // Tests that it is safe to destroy a window while the overview header animation | 1156 // Tests that it is safe to destroy a window while the overview header animation |
| 1298 // is still active. See http://crbug.com/646350. | 1157 // is still active. See http://crbug.com/646350. |
| 1299 TEST_P(WindowSelectorTest, SafeToDestroyWindowDuringAnimation) { | 1158 TEST_F(WindowSelectorTest, SafeToDestroyWindowDuringAnimation) { |
| 1300 gfx::Rect bounds(0, 0, 400, 400); | 1159 gfx::Rect bounds(0, 0, 400, 400); |
| 1301 { | 1160 { |
| 1302 // Quickly enter and exit overview mode to activate header animations. | 1161 // Quickly enter and exit overview mode to activate header animations. |
| 1303 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); | 1162 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); |
| 1304 ui::ScopedAnimationDurationScaleMode test_duration_mode( | 1163 ui::ScopedAnimationDurationScaleMode test_duration_mode( |
| 1305 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); | 1164 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); |
| 1306 ToggleOverview(); | 1165 ToggleOverview(); |
| 1307 EXPECT_TRUE(IsSelecting()); | 1166 EXPECT_TRUE(IsSelecting()); |
| 1308 | 1167 |
| 1309 gfx::SlideAnimation* animation = | 1168 gfx::SlideAnimation* animation = |
| 1310 GetBackgroundViewAnimationForWindow(0, window.get()); | 1169 GetBackgroundViewAnimationForWindow(0, window.get()); |
| 1311 if (ash::MaterialDesignController::IsOverviewMaterial()) | 1170 ASSERT_NE(nullptr, animation); |
| 1312 ASSERT_NE(nullptr, animation); | |
| 1313 ToggleOverview(); | 1171 ToggleOverview(); |
| 1314 EXPECT_FALSE(IsSelecting()); | 1172 EXPECT_FALSE(IsSelecting()); |
| 1315 if (animation) | 1173 if (animation) |
| 1316 EXPECT_TRUE(animation->is_animating()); | 1174 EXPECT_TRUE(animation->is_animating()); |
| 1317 | 1175 |
| 1318 // Close the window while the overview header animation is active. | 1176 // Close the window while the overview header animation is active. |
| 1319 window.reset(); | 1177 window.reset(); |
| 1320 | 1178 |
| 1321 // Progress animation to the end - should not crash. | 1179 // Progress animation to the end - should not crash. |
| 1322 if (animation) { | 1180 if (animation) { |
| 1323 animation->SetCurrentValue(1.0); | 1181 animation->SetCurrentValue(1.0); |
| 1324 animation->Reset(1.0); | 1182 animation->Reset(1.0); |
| 1325 } | 1183 } |
| 1326 } | 1184 } |
| 1327 } | 1185 } |
| 1328 | 1186 |
| 1329 // Tests that a bounds change during overview is corrected for. | 1187 // Tests that a bounds change during overview is corrected for. |
| 1330 TEST_P(WindowSelectorTest, BoundsChangeDuringOverview) { | 1188 TEST_F(WindowSelectorTest, BoundsChangeDuringOverview) { |
| 1331 std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400))); | 1189 std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400))); |
| 1332 // Use overview headers above the window in this test. | 1190 // Use overview headers above the window in this test. |
| 1333 window->SetProperty(aura::client::kTopViewInset, 0); | 1191 window->SetProperty(aura::client::kTopViewInset, 0); |
| 1334 ToggleOverview(); | 1192 ToggleOverview(); |
| 1335 gfx::Rect overview_bounds = | 1193 gfx::Rect overview_bounds = |
| 1336 ToEnclosingRect(GetTransformedTargetBounds(window.get())); | 1194 ToEnclosingRect(GetTransformedTargetBounds(window.get())); |
| 1337 window->SetBounds(gfx::Rect(200, 0, 200, 200)); | 1195 window->SetBounds(gfx::Rect(200, 0, 200, 200)); |
| 1338 gfx::Rect new_overview_bounds = | 1196 gfx::Rect new_overview_bounds = |
| 1339 ToEnclosingRect(GetTransformedTargetBounds(window.get())); | 1197 ToEnclosingRect(GetTransformedTargetBounds(window.get())); |
| 1340 EXPECT_EQ(overview_bounds.x(), new_overview_bounds.x()); | 1198 EXPECT_EQ(overview_bounds.x(), new_overview_bounds.x()); |
| 1341 EXPECT_EQ(overview_bounds.y(), new_overview_bounds.y()); | 1199 EXPECT_EQ(overview_bounds.y(), new_overview_bounds.y()); |
| 1342 EXPECT_EQ(overview_bounds.width(), new_overview_bounds.width()); | 1200 EXPECT_EQ(overview_bounds.width(), new_overview_bounds.width()); |
| 1343 EXPECT_EQ(overview_bounds.height(), new_overview_bounds.height()); | 1201 EXPECT_EQ(overview_bounds.height(), new_overview_bounds.height()); |
| 1344 ToggleOverview(); | 1202 ToggleOverview(); |
| 1345 } | 1203 } |
| 1346 | 1204 |
| 1347 // Tests that a newly created window aborts overview. | 1205 // Tests that a newly created window aborts overview. |
| 1348 TEST_P(WindowSelectorTest, NewWindowCancelsOveriew) { | 1206 TEST_F(WindowSelectorTest, NewWindowCancelsOveriew) { |
| 1349 gfx::Rect bounds(0, 0, 400, 400); | 1207 gfx::Rect bounds(0, 0, 400, 400); |
| 1350 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1208 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1351 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1209 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1352 ToggleOverview(); | 1210 ToggleOverview(); |
| 1353 EXPECT_TRUE(IsSelecting()); | 1211 EXPECT_TRUE(IsSelecting()); |
| 1354 | 1212 |
| 1355 // A window being created should exit overview mode. | 1213 // A window being created should exit overview mode. |
| 1356 std::unique_ptr<aura::Window> window3(CreateWindow(bounds)); | 1214 std::unique_ptr<aura::Window> window3(CreateWindow(bounds)); |
| 1357 EXPECT_FALSE(IsSelecting()); | 1215 EXPECT_FALSE(IsSelecting()); |
| 1358 } | 1216 } |
| 1359 | 1217 |
| 1360 // Tests that a window activation exits overview mode. | 1218 // Tests that a window activation exits overview mode. |
| 1361 TEST_P(WindowSelectorTest, ActivationCancelsOveriew) { | 1219 TEST_F(WindowSelectorTest, ActivationCancelsOveriew) { |
| 1362 gfx::Rect bounds(0, 0, 400, 400); | 1220 gfx::Rect bounds(0, 0, 400, 400); |
| 1363 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1221 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1364 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1222 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1365 window2->Focus(); | 1223 window2->Focus(); |
| 1366 ToggleOverview(); | 1224 ToggleOverview(); |
| 1367 EXPECT_TRUE(IsSelecting()); | 1225 EXPECT_TRUE(IsSelecting()); |
| 1368 | 1226 |
| 1369 // A window being activated should exit overview mode. | 1227 // A window being activated should exit overview mode. |
| 1370 window1->Focus(); | 1228 window1->Focus(); |
| 1371 EXPECT_FALSE(IsSelecting()); | 1229 EXPECT_FALSE(IsSelecting()); |
| 1372 | 1230 |
| 1373 // window1 should be focused after exiting even though window2 was focused on | 1231 // window1 should be focused after exiting even though window2 was focused on |
| 1374 // entering overview because we exited due to an activation. | 1232 // entering overview because we exited due to an activation. |
| 1375 EXPECT_EQ(window1.get(), GetFocusedWindow()); | 1233 EXPECT_EQ(window1.get(), GetFocusedWindow()); |
| 1376 } | 1234 } |
| 1377 | 1235 |
| 1378 // Tests that exiting overview mode without selecting a window restores focus | 1236 // Tests that exiting overview mode without selecting a window restores focus |
| 1379 // to the previously focused window. | 1237 // to the previously focused window. |
| 1380 TEST_P(WindowSelectorTest, CancelRestoresFocus) { | 1238 TEST_F(WindowSelectorTest, CancelRestoresFocus) { |
| 1381 gfx::Rect bounds(0, 0, 400, 400); | 1239 gfx::Rect bounds(0, 0, 400, 400); |
| 1382 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); | 1240 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); |
| 1383 wm::ActivateWindow(window.get()); | 1241 wm::ActivateWindow(window.get()); |
| 1384 EXPECT_EQ(window.get(), GetFocusedWindow()); | 1242 EXPECT_EQ(window.get(), GetFocusedWindow()); |
| 1385 | 1243 |
| 1386 // In overview mode, the text filter widget should be focused. | 1244 // In overview mode, the text filter widget should be focused. |
| 1387 ToggleOverview(); | 1245 ToggleOverview(); |
| 1388 EXPECT_EQ(text_filter_widget()->GetNativeWindow(), GetFocusedWindow()); | 1246 EXPECT_EQ(text_filter_widget()->GetNativeWindow(), GetFocusedWindow()); |
| 1389 | 1247 |
| 1390 // If canceling overview mode, focus should be restored. | 1248 // If canceling overview mode, focus should be restored. |
| 1391 ToggleOverview(); | 1249 ToggleOverview(); |
| 1392 EXPECT_EQ(window.get(), GetFocusedWindow()); | 1250 EXPECT_EQ(window.get(), GetFocusedWindow()); |
| 1393 } | 1251 } |
| 1394 | 1252 |
| 1395 // Tests that overview mode is exited if the last remaining window is destroyed. | 1253 // Tests that overview mode is exited if the last remaining window is destroyed. |
| 1396 TEST_P(WindowSelectorTest, LastWindowDestroyed) { | 1254 TEST_F(WindowSelectorTest, LastWindowDestroyed) { |
| 1397 gfx::Rect bounds(0, 0, 400, 400); | 1255 gfx::Rect bounds(0, 0, 400, 400); |
| 1398 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1256 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1399 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1257 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1400 ToggleOverview(); | 1258 ToggleOverview(); |
| 1401 | 1259 |
| 1402 window1.reset(); | 1260 window1.reset(); |
| 1403 window2.reset(); | 1261 window2.reset(); |
| 1404 EXPECT_FALSE(IsSelecting()); | 1262 EXPECT_FALSE(IsSelecting()); |
| 1405 } | 1263 } |
| 1406 | 1264 |
| 1407 // Tests that entering overview mode restores a window to its original | 1265 // Tests that entering overview mode restores a window to its original |
| 1408 // target location. | 1266 // target location. |
| 1409 TEST_P(WindowSelectorTest, QuickReentryRestoresInitialTransform) { | 1267 TEST_F(WindowSelectorTest, QuickReentryRestoresInitialTransform) { |
| 1410 gfx::Rect bounds(0, 0, 400, 400); | 1268 gfx::Rect bounds(0, 0, 400, 400); |
| 1411 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); | 1269 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); |
| 1412 gfx::Rect initial_bounds = | 1270 gfx::Rect initial_bounds = |
| 1413 ToEnclosingRect(GetTransformedBounds(window.get())); | 1271 ToEnclosingRect(GetTransformedBounds(window.get())); |
| 1414 ToggleOverview(); | 1272 ToggleOverview(); |
| 1415 // Quickly exit and reenter overview mode. The window should still be | 1273 // Quickly exit and reenter overview mode. The window should still be |
| 1416 // animating when we reenter. We cannot short circuit animations for this but | 1274 // animating when we reenter. We cannot short circuit animations for this but |
| 1417 // we also don't have to wait for them to complete. | 1275 // we also don't have to wait for them to complete. |
| 1418 { | 1276 { |
| 1419 ui::ScopedAnimationDurationScaleMode test_duration_mode( | 1277 ui::ScopedAnimationDurationScaleMode test_duration_mode( |
| 1420 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); | 1278 ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); |
| 1421 ToggleOverview(); | 1279 ToggleOverview(); |
| 1422 ToggleOverview(); | 1280 ToggleOverview(); |
| 1423 } | 1281 } |
| 1424 EXPECT_NE(initial_bounds, | 1282 EXPECT_NE(initial_bounds, |
| 1425 ToEnclosingRect(GetTransformedTargetBounds(window.get()))); | 1283 ToEnclosingRect(GetTransformedTargetBounds(window.get()))); |
| 1426 ToggleOverview(); | 1284 ToggleOverview(); |
| 1427 EXPECT_FALSE(IsSelecting()); | 1285 EXPECT_FALSE(IsSelecting()); |
| 1428 EXPECT_EQ(initial_bounds, | 1286 EXPECT_EQ(initial_bounds, |
| 1429 ToEnclosingRect(GetTransformedTargetBounds(window.get()))); | 1287 ToEnclosingRect(GetTransformedTargetBounds(window.get()))); |
| 1430 } | 1288 } |
| 1431 | 1289 |
| 1432 // Tests that windows with modal child windows are transformed with the modal | 1290 // Tests that windows with modal child windows are transformed with the modal |
| 1433 // child even though not activatable themselves. | 1291 // child even though not activatable themselves. |
| 1434 TEST_P(WindowSelectorTest, ModalChild) { | 1292 TEST_F(WindowSelectorTest, ModalChild) { |
| 1435 gfx::Rect bounds(0, 0, 400, 400); | 1293 gfx::Rect bounds(0, 0, 400, 400); |
| 1436 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1294 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1437 std::unique_ptr<aura::Window> child1(CreateWindow(bounds)); | 1295 std::unique_ptr<aura::Window> child1(CreateWindow(bounds)); |
| 1438 child1->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW); | 1296 child1->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW); |
| 1439 ::wm::AddTransientChild(window1.get(), child1.get()); | 1297 ::wm::AddTransientChild(window1.get(), child1.get()); |
| 1440 EXPECT_EQ(window1->parent(), child1->parent()); | 1298 EXPECT_EQ(window1->parent(), child1->parent()); |
| 1441 ToggleOverview(); | 1299 ToggleOverview(); |
| 1442 EXPECT_TRUE(window1->IsVisible()); | 1300 EXPECT_TRUE(window1->IsVisible()); |
| 1443 EXPECT_TRUE(child1->IsVisible()); | 1301 EXPECT_TRUE(child1->IsVisible()); |
| 1444 EXPECT_EQ(ToEnclosingRect(GetTransformedTargetBounds(child1.get())), | 1302 EXPECT_EQ(ToEnclosingRect(GetTransformedTargetBounds(child1.get())), |
| 1445 ToEnclosingRect(GetTransformedTargetBounds(window1.get()))); | 1303 ToEnclosingRect(GetTransformedTargetBounds(window1.get()))); |
| 1446 ToggleOverview(); | 1304 ToggleOverview(); |
| 1447 } | 1305 } |
| 1448 | 1306 |
| 1449 // Tests that clicking a modal window's parent activates the modal window in | 1307 // Tests that clicking a modal window's parent activates the modal window in |
| 1450 // overview. | 1308 // overview. |
| 1451 TEST_P(WindowSelectorTest, ClickModalWindowParent) { | 1309 TEST_F(WindowSelectorTest, ClickModalWindowParent) { |
| 1452 std::unique_ptr<aura::Window> window1( | 1310 std::unique_ptr<aura::Window> window1( |
| 1453 CreateWindow(gfx::Rect(0, 0, 180, 180))); | 1311 CreateWindow(gfx::Rect(0, 0, 180, 180))); |
| 1454 std::unique_ptr<aura::Window> child1( | 1312 std::unique_ptr<aura::Window> child1( |
| 1455 CreateWindow(gfx::Rect(200, 0, 180, 180))); | 1313 CreateWindow(gfx::Rect(200, 0, 180, 180))); |
| 1456 child1->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW); | 1314 child1->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW); |
| 1457 ::wm::AddTransientChild(window1.get(), child1.get()); | 1315 ::wm::AddTransientChild(window1.get(), child1.get()); |
| 1458 EXPECT_FALSE(WindowsOverlapping(window1.get(), child1.get())); | 1316 EXPECT_FALSE(WindowsOverlapping(window1.get(), child1.get())); |
| 1459 EXPECT_EQ(window1->parent(), child1->parent()); | 1317 EXPECT_EQ(window1->parent(), child1->parent()); |
| 1460 ToggleOverview(); | 1318 ToggleOverview(); |
| 1461 // Given that their relative positions are preserved, the windows should still | 1319 // Given that their relative positions are preserved, the windows should still |
| 1462 // not overlap. | 1320 // not overlap. |
| 1463 EXPECT_FALSE(WindowsOverlapping(window1.get(), child1.get())); | 1321 EXPECT_FALSE(WindowsOverlapping(window1.get(), child1.get())); |
| 1464 ClickWindow(window1.get()); | 1322 ClickWindow(window1.get()); |
| 1465 EXPECT_FALSE(IsSelecting()); | 1323 EXPECT_FALSE(IsSelecting()); |
| 1466 | 1324 |
| 1467 // Clicking on window1 should activate child1. | 1325 // Clicking on window1 should activate child1. |
| 1468 EXPECT_TRUE(wm::IsActiveWindow(child1.get())); | 1326 EXPECT_TRUE(wm::IsActiveWindow(child1.get())); |
| 1469 } | 1327 } |
| 1470 | 1328 |
| 1471 // Tests that windows remain on the display they are currently on in overview | 1329 // Tests that windows remain on the display they are currently on in overview |
| 1472 // mode, and that the close buttons are on matching displays. | 1330 // mode, and that the close buttons are on matching displays. |
| 1473 TEST_P(WindowSelectorTest, MultipleDisplays) { | 1331 TEST_F(WindowSelectorTest, MultipleDisplays) { |
| 1474 if (!SupportsMultipleDisplays()) | 1332 if (!SupportsMultipleDisplays()) |
| 1475 return; | 1333 return; |
| 1476 | 1334 |
| 1477 UpdateDisplay("600x400,600x400"); | 1335 UpdateDisplay("600x400,600x400"); |
| 1478 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 1336 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 1479 gfx::Rect bounds1(0, 0, 400, 400); | 1337 gfx::Rect bounds1(0, 0, 400, 400); |
| 1480 gfx::Rect bounds2(650, 0, 400, 400); | 1338 gfx::Rect bounds2(650, 0, 400, 400); |
| 1481 | 1339 |
| 1482 std::unique_ptr<aura::Window> window1(CreateWindow(bounds1)); | 1340 std::unique_ptr<aura::Window> window1(CreateWindow(bounds1)); |
| 1483 std::unique_ptr<aura::Window> window2(CreateWindow(bounds1)); | 1341 std::unique_ptr<aura::Window> window2(CreateWindow(bounds1)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1522 GetWindowItemForWindow(0, panel1.get())); | 1380 GetWindowItemForWindow(0, panel1.get())); |
| 1523 IsWindowAndCloseButtonInScreen(panel2.get(), | 1381 IsWindowAndCloseButtonInScreen(panel2.get(), |
| 1524 GetWindowItemForWindow(0, panel2.get())); | 1382 GetWindowItemForWindow(0, panel2.get())); |
| 1525 IsWindowAndCloseButtonInScreen(panel3.get(), | 1383 IsWindowAndCloseButtonInScreen(panel3.get(), |
| 1526 GetWindowItemForWindow(1, panel3.get())); | 1384 GetWindowItemForWindow(1, panel3.get())); |
| 1527 IsWindowAndCloseButtonInScreen(panel4.get(), | 1385 IsWindowAndCloseButtonInScreen(panel4.get(), |
| 1528 GetWindowItemForWindow(1, panel4.get())); | 1386 GetWindowItemForWindow(1, panel4.get())); |
| 1529 } | 1387 } |
| 1530 | 1388 |
| 1531 // Tests shutting down during overview. | 1389 // Tests shutting down during overview. |
| 1532 TEST_P(WindowSelectorTest, Shutdown) { | 1390 TEST_F(WindowSelectorTest, Shutdown) { |
| 1533 gfx::Rect bounds(0, 0, 400, 400); | 1391 gfx::Rect bounds(0, 0, 400, 400); |
| 1534 // These windows will be deleted when the test exits and the Shell instance | 1392 // These windows will be deleted when the test exits and the Shell instance |
| 1535 // is shut down. | 1393 // is shut down. |
| 1536 aura::Window* window1(CreateWindow(bounds)); | 1394 aura::Window* window1(CreateWindow(bounds)); |
| 1537 aura::Window* window2(CreateWindow(bounds)); | 1395 aura::Window* window2(CreateWindow(bounds)); |
| 1538 aura::Window* window3(CreatePanelWindow(bounds)); | 1396 aura::Window* window3(CreatePanelWindow(bounds)); |
| 1539 aura::Window* window4(CreatePanelWindow(bounds)); | 1397 aura::Window* window4(CreatePanelWindow(bounds)); |
| 1540 | 1398 |
| 1541 wm::ActivateWindow(window4); | 1399 wm::ActivateWindow(window4); |
| 1542 wm::ActivateWindow(window3); | 1400 wm::ActivateWindow(window3); |
| 1543 wm::ActivateWindow(window2); | 1401 wm::ActivateWindow(window2); |
| 1544 wm::ActivateWindow(window1); | 1402 wm::ActivateWindow(window1); |
| 1545 | 1403 |
| 1546 ToggleOverview(); | 1404 ToggleOverview(); |
| 1547 } | 1405 } |
| 1548 | 1406 |
| 1549 // Tests removing a display during overview. | 1407 // Tests removing a display during overview. |
| 1550 TEST_P(WindowSelectorTest, RemoveDisplay) { | 1408 TEST_F(WindowSelectorTest, RemoveDisplay) { |
| 1551 if (!SupportsMultipleDisplays()) | 1409 if (!SupportsMultipleDisplays()) |
| 1552 return; | 1410 return; |
| 1553 | 1411 |
| 1554 UpdateDisplay("400x400,400x400"); | 1412 UpdateDisplay("400x400,400x400"); |
| 1555 gfx::Rect bounds1(0, 0, 100, 100); | 1413 gfx::Rect bounds1(0, 0, 100, 100); |
| 1556 gfx::Rect bounds2(450, 0, 100, 100); | 1414 gfx::Rect bounds2(450, 0, 100, 100); |
| 1557 std::unique_ptr<aura::Window> window1(CreateWindow(bounds1)); | 1415 std::unique_ptr<aura::Window> window1(CreateWindow(bounds1)); |
| 1558 std::unique_ptr<aura::Window> window2(CreateWindow(bounds2)); | 1416 std::unique_ptr<aura::Window> window2(CreateWindow(bounds2)); |
| 1559 std::unique_ptr<aura::Window> window3(CreatePanelWindow(bounds1)); | 1417 std::unique_ptr<aura::Window> window3(CreatePanelWindow(bounds1)); |
| 1560 std::unique_ptr<aura::Window> window4(CreatePanelWindow(bounds2)); | 1418 std::unique_ptr<aura::Window> window4(CreatePanelWindow(bounds2)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1572 | 1430 |
| 1573 ToggleOverview(); | 1431 ToggleOverview(); |
| 1574 EXPECT_TRUE(IsSelecting()); | 1432 EXPECT_TRUE(IsSelecting()); |
| 1575 UpdateDisplay("400x400"); | 1433 UpdateDisplay("400x400"); |
| 1576 EXPECT_FALSE(IsSelecting()); | 1434 EXPECT_FALSE(IsSelecting()); |
| 1577 } | 1435 } |
| 1578 | 1436 |
| 1579 // Tests starting overview during a drag and drop tracking operation. | 1437 // Tests starting overview during a drag and drop tracking operation. |
| 1580 // TODO(flackr): Fix memory corruption crash when running locally (not failing | 1438 // TODO(flackr): Fix memory corruption crash when running locally (not failing |
| 1581 // on bots). See http://crbug.com/342528. | 1439 // on bots). See http://crbug.com/342528. |
| 1582 TEST_P(WindowSelectorTest, DISABLED_DragDropInProgress) { | 1440 TEST_F(WindowSelectorTest, DISABLED_DragDropInProgress) { |
| 1583 bool drag_canceled_by_test = false; | 1441 bool drag_canceled_by_test = false; |
| 1584 gfx::Rect bounds(0, 0, 400, 400); | 1442 gfx::Rect bounds(0, 0, 400, 400); |
| 1585 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); | 1443 std::unique_ptr<aura::Window> window(CreateWindow(bounds)); |
| 1586 test::ShellTestApi shell_test_api(Shell::GetInstance()); | 1444 test::ShellTestApi shell_test_api(Shell::GetInstance()); |
| 1587 DragDropController* drag_drop_controller = | 1445 DragDropController* drag_drop_controller = |
| 1588 shell_test_api.drag_drop_controller(); | 1446 shell_test_api.drag_drop_controller(); |
| 1589 ui::OSExchangeData data; | 1447 ui::OSExchangeData data; |
| 1590 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1448 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1591 FROM_HERE, | 1449 FROM_HERE, |
| 1592 base::Bind(&WindowSelectorTest::ToggleOverview, base::Unretained(this))); | 1450 base::Bind(&WindowSelectorTest::ToggleOverview, base::Unretained(this))); |
| 1593 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1451 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1594 FROM_HERE, | 1452 FROM_HERE, |
| 1595 base::Bind(&CancelDrag, drag_drop_controller, &drag_canceled_by_test)); | 1453 base::Bind(&CancelDrag, drag_drop_controller, &drag_canceled_by_test)); |
| 1596 data.SetString(base::UTF8ToUTF16("I am being dragged")); | 1454 data.SetString(base::UTF8ToUTF16("I am being dragged")); |
| 1597 drag_drop_controller->StartDragAndDrop( | 1455 drag_drop_controller->StartDragAndDrop( |
| 1598 data, window->GetRootWindow(), window.get(), gfx::Point(5, 5), | 1456 data, window->GetRootWindow(), window.get(), gfx::Point(5, 5), |
| 1599 ui::DragDropTypes::DRAG_MOVE, ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE); | 1457 ui::DragDropTypes::DRAG_MOVE, ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE); |
| 1600 RunAllPendingInMessageLoop(); | 1458 RunAllPendingInMessageLoop(); |
| 1601 EXPECT_FALSE(drag_canceled_by_test); | 1459 EXPECT_FALSE(drag_canceled_by_test); |
| 1602 ASSERT_TRUE(IsSelecting()); | 1460 ASSERT_TRUE(IsSelecting()); |
| 1603 RunAllPendingInMessageLoop(); | 1461 RunAllPendingInMessageLoop(); |
| 1604 } | 1462 } |
| 1605 | 1463 |
| 1606 // Test that a label is created under the window on entering overview mode. | 1464 // Test that a label is created under the window on entering overview mode. |
| 1607 TEST_P(WindowSelectorTest, CreateLabelUnderWindow) { | 1465 TEST_F(WindowSelectorTest, CreateLabelUnderWindow) { |
| 1608 std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 300, 500))); | 1466 std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 300, 500))); |
| 1609 base::string16 window_title = base::UTF8ToUTF16("My window"); | 1467 base::string16 window_title = base::UTF8ToUTF16("My window"); |
| 1610 window->SetTitle(window_title); | 1468 window->SetTitle(window_title); |
| 1611 ToggleOverview(); | 1469 ToggleOverview(); |
| 1612 WindowSelectorItem* window_item = GetWindowItemsForRoot(0).back(); | 1470 WindowSelectorItem* window_item = GetWindowItemsForRoot(0).back(); |
| 1613 views::LabelButton* label = GetLabelButtonView(window_item); | 1471 views::LabelButton* label = GetLabelButtonView(window_item); |
| 1614 // Has the label view been created? | 1472 // Has the label view been created? |
| 1615 ASSERT_TRUE(label); | 1473 ASSERT_TRUE(label); |
| 1616 | 1474 |
| 1617 // Verify the label matches the window title. | 1475 // Verify the label matches the window title. |
| 1618 EXPECT_EQ(label->GetText(), window_title); | 1476 EXPECT_EQ(label->GetText(), window_title); |
| 1619 | 1477 |
| 1620 // Update the window title and check that the label is updated, too. | 1478 // Update the window title and check that the label is updated, too. |
| 1621 base::string16 updated_title = base::UTF8ToUTF16("Updated title"); | 1479 base::string16 updated_title = base::UTF8ToUTF16("Updated title"); |
| 1622 window->SetTitle(updated_title); | 1480 window->SetTitle(updated_title); |
| 1623 EXPECT_EQ(label->GetText(), updated_title); | 1481 EXPECT_EQ(label->GetText(), updated_title); |
| 1624 | 1482 |
| 1625 // Labels are located based on target_bounds, not the actual window item | 1483 // Labels are located based on target_bounds, not the actual window item |
| 1626 // bounds. | 1484 // bounds. |
| 1627 gfx::Rect label_bounds = label->GetWidget()->GetWindowBoundsInScreen(); | 1485 gfx::Rect label_bounds = label->GetWidget()->GetWindowBoundsInScreen(); |
| 1628 if (ash::MaterialDesignController::IsOverviewMaterial()) | 1486 label_bounds.Inset(kWindowMargin, kWindowMargin); |
| 1629 label_bounds.Inset(kWindowMarginMD, kWindowMarginMD); | |
| 1630 EXPECT_EQ(window_item->target_bounds(), label_bounds); | 1487 EXPECT_EQ(window_item->target_bounds(), label_bounds); |
| 1631 } | 1488 } |
| 1632 | 1489 |
| 1633 // Tests that overview updates the window positions if the display orientation | 1490 // Tests that overview updates the window positions if the display orientation |
| 1634 // changes. | 1491 // changes. |
| 1635 TEST_P(WindowSelectorTest, DisplayOrientationChanged) { | 1492 TEST_F(WindowSelectorTest, DisplayOrientationChanged) { |
| 1636 aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); | 1493 aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); |
| 1637 UpdateDisplay("600x200"); | 1494 UpdateDisplay("600x200"); |
| 1638 EXPECT_EQ("0,0 600x200", root_window->bounds().ToString()); | 1495 EXPECT_EQ("0,0 600x200", root_window->bounds().ToString()); |
| 1639 gfx::Rect window_bounds(0, 0, 150, 150); | 1496 gfx::Rect window_bounds(0, 0, 150, 150); |
| 1640 ScopedVector<aura::Window> windows; | 1497 ScopedVector<aura::Window> windows; |
| 1641 for (int i = 0; i < 3; i++) { | 1498 for (int i = 0; i < 3; i++) { |
| 1642 windows.push_back(CreateWindow(window_bounds)); | 1499 windows.push_back(CreateWindow(window_bounds)); |
| 1643 } | 1500 } |
| 1644 | 1501 |
| 1645 ToggleOverview(); | 1502 ToggleOverview(); |
| 1646 for (ScopedVector<aura::Window>::iterator iter = windows.begin(); | 1503 for (ScopedVector<aura::Window>::iterator iter = windows.begin(); |
| 1647 iter != windows.end(); ++iter) { | 1504 iter != windows.end(); ++iter) { |
| 1648 EXPECT_TRUE(root_window->bounds().Contains( | 1505 EXPECT_TRUE(root_window->bounds().Contains( |
| 1649 ToEnclosingRect(GetTransformedTargetBounds(*iter)))); | 1506 ToEnclosingRect(GetTransformedTargetBounds(*iter)))); |
| 1650 } | 1507 } |
| 1651 | 1508 |
| 1652 // Rotate the display, windows should be repositioned to be within the screen | 1509 // Rotate the display, windows should be repositioned to be within the screen |
| 1653 // bounds. | 1510 // bounds. |
| 1654 UpdateDisplay("600x200/r"); | 1511 UpdateDisplay("600x200/r"); |
| 1655 EXPECT_EQ("0,0 200x600", root_window->bounds().ToString()); | 1512 EXPECT_EQ("0,0 200x600", root_window->bounds().ToString()); |
| 1656 for (ScopedVector<aura::Window>::iterator iter = windows.begin(); | 1513 for (ScopedVector<aura::Window>::iterator iter = windows.begin(); |
| 1657 iter != windows.end(); ++iter) { | 1514 iter != windows.end(); ++iter) { |
| 1658 EXPECT_TRUE(root_window->bounds().Contains( | 1515 EXPECT_TRUE(root_window->bounds().Contains( |
| 1659 ToEnclosingRect(GetTransformedTargetBounds(*iter)))); | 1516 ToEnclosingRect(GetTransformedTargetBounds(*iter)))); |
| 1660 } | 1517 } |
| 1661 } | 1518 } |
| 1662 | 1519 |
| 1663 // Tests traversing some windows in overview mode with the tab key. | 1520 // Tests traversing some windows in overview mode with the tab key. |
| 1664 TEST_P(WindowSelectorTest, BasicTabKeyNavigation) { | 1521 TEST_F(WindowSelectorTest, BasicTabKeyNavigation) { |
| 1665 gfx::Rect bounds(0, 0, 100, 100); | 1522 gfx::Rect bounds(0, 0, 100, 100); |
| 1666 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1523 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1667 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1524 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1668 ToggleOverview(); | 1525 ToggleOverview(); |
| 1669 | 1526 |
| 1670 const std::vector<WindowSelectorItem*>& overview_windows = | 1527 const std::vector<WindowSelectorItem*>& overview_windows = |
| 1671 GetWindowItemsForRoot(0); | 1528 GetWindowItemsForRoot(0); |
| 1672 SendKey(ui::VKEY_TAB); | 1529 SendKey(ui::VKEY_TAB); |
| 1673 EXPECT_EQ(GetSelectedWindow(), | 1530 EXPECT_EQ(GetSelectedWindow(), |
| 1674 WmWindowAura::GetAuraWindow(overview_windows[0]->GetWindow())); | 1531 WmWindowAura::GetAuraWindow(overview_windows[0]->GetWindow())); |
| 1675 SendKey(ui::VKEY_TAB); | 1532 SendKey(ui::VKEY_TAB); |
| 1676 EXPECT_EQ(GetSelectedWindow(), | 1533 EXPECT_EQ(GetSelectedWindow(), |
| 1677 WmWindowAura::GetAuraWindow(overview_windows[1]->GetWindow())); | 1534 WmWindowAura::GetAuraWindow(overview_windows[1]->GetWindow())); |
| 1678 SendKey(ui::VKEY_TAB); | 1535 SendKey(ui::VKEY_TAB); |
| 1679 EXPECT_EQ(GetSelectedWindow(), | 1536 EXPECT_EQ(GetSelectedWindow(), |
| 1680 WmWindowAura::GetAuraWindow(overview_windows[0]->GetWindow())); | 1537 WmWindowAura::GetAuraWindow(overview_windows[0]->GetWindow())); |
| 1681 } | 1538 } |
| 1682 | 1539 |
| 1683 // Tests that pressing Ctrl+W while a window is selected in overview closes it. | 1540 // Tests that pressing Ctrl+W while a window is selected in overview closes it. |
| 1684 TEST_P(WindowSelectorTest, CloseWindowWithKey) { | 1541 TEST_F(WindowSelectorTest, CloseWindowWithKey) { |
| 1685 gfx::Rect bounds(0, 0, 100, 100); | 1542 gfx::Rect bounds(0, 0, 100, 100); |
| 1686 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1543 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1687 std::unique_ptr<views::Widget> widget = | 1544 std::unique_ptr<views::Widget> widget = |
| 1688 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); | 1545 CreateWindowWidget(gfx::Rect(0, 0, 400, 400)); |
| 1689 aura::Window* window1 = widget->GetNativeWindow(); | 1546 aura::Window* window1 = widget->GetNativeWindow(); |
| 1690 ToggleOverview(); | 1547 ToggleOverview(); |
| 1691 | 1548 |
| 1692 SendKey(ui::VKEY_RIGHT); | 1549 SendKey(ui::VKEY_RIGHT); |
| 1693 EXPECT_EQ(window1, GetSelectedWindow()); | 1550 EXPECT_EQ(window1, GetSelectedWindow()); |
| 1694 SendCtrlKey(ui::VKEY_W); | 1551 SendCtrlKey(ui::VKEY_W); |
| 1695 EXPECT_TRUE(widget->IsClosed()); | 1552 EXPECT_TRUE(widget->IsClosed()); |
| 1696 } | 1553 } |
| 1697 | 1554 |
| 1698 // Tests traversing some windows in overview mode with the arrow keys in every | 1555 // Tests traversing some windows in overview mode with the arrow keys in every |
| 1699 // possible direction. | 1556 // possible direction. |
| 1700 TEST_P(WindowSelectorTest, BasicArrowKeyNavigation) { | 1557 TEST_F(WindowSelectorTest, BasicArrowKeyNavigation) { |
| 1701 const size_t test_windows = 9; | 1558 const size_t test_windows = 9; |
| 1702 UpdateDisplay("800x600"); | 1559 UpdateDisplay("800x600"); |
| 1703 ScopedVector<aura::Window> windows; | 1560 ScopedVector<aura::Window> windows; |
| 1704 for (size_t i = test_windows; i > 0; i--) | 1561 for (size_t i = test_windows; i > 0; i--) |
| 1705 windows.push_back(CreateWindowWithId(gfx::Rect(0, 0, 100, 100), i)); | 1562 windows.push_back(CreateWindowWithId(gfx::Rect(0, 0, 100, 100), i)); |
| 1706 | 1563 |
| 1707 ui::KeyboardCode arrow_keys[] = {ui::VKEY_RIGHT, ui::VKEY_DOWN, ui::VKEY_LEFT, | 1564 ui::KeyboardCode arrow_keys[] = {ui::VKEY_RIGHT, ui::VKEY_DOWN, ui::VKEY_LEFT, |
| 1708 ui::VKEY_UP}; | 1565 ui::VKEY_UP}; |
| 1709 // Expected window layout, assuming that the text filtering feature is | 1566 // The rows contain variable number of items making vertical navigation not |
| 1710 // enabled by default (i.e., --ash-disable-text-filtering-in-overview-mode | 1567 // feasible. [Down] is equivalent to [Right] and [Up] is equivalent to [Left]. |
| 1711 // is not being used). | |
| 1712 // +-------+ +-------+ +-------+ +-------+ | |
| 1713 // | 1 | | 2 | | 3 | | 4 | | |
| 1714 // +-------+ +-------+ +-------+ +-------+ | |
| 1715 // +-------+ +-------+ +-------+ +-------+ | |
| 1716 // | 5 | | 6 | | 7 | | 8 | | |
| 1717 // +-------+ +-------+ +-------+ +-------+ | |
| 1718 // +-------+ | |
| 1719 // | 9 | | |
| 1720 // +-------+ | |
| 1721 // Index for each window during a full loop plus wrapping around. | |
| 1722 int index_path_for_direction[][test_windows + 1] = { | 1568 int index_path_for_direction[][test_windows + 1] = { |
| 1723 {1, 2, 3, 4, 5, 6, 7, 8, 9, 1}, // Right | 1569 {1, 2, 3, 4, 5, 6, 7, 8, 9, 1}, // Right |
| 1724 {1, 5, 9, 2, 6, 3, 7, 4, 8, 1}, // Down | |
| 1725 {9, 8, 7, 6, 5, 4, 3, 2, 1, 9}, // Left | |
| 1726 {8, 4, 7, 3, 6, 2, 9, 5, 1, 8} // Up | |
| 1727 }; | |
| 1728 // With Material Design the rows contain variable number of items making | |
| 1729 // vertical navigation not feasible. [Down] key is equivalent to [Right]. | |
| 1730 // [Up] is equivalent to [Left]. | |
| 1731 int index_path_for_direction_MD[][test_windows + 1] = { | |
| 1732 {1, 2, 3, 4, 5, 6, 7, 8, 9, 1}, // Right | |
| 1733 {1, 2, 3, 4, 5, 6, 7, 8, 9, 1}, // Down (same as Right) | 1570 {1, 2, 3, 4, 5, 6, 7, 8, 9, 1}, // Down (same as Right) |
| 1734 {9, 8, 7, 6, 5, 4, 3, 2, 1, 9}, // Left | 1571 {9, 8, 7, 6, 5, 4, 3, 2, 1, 9}, // Left |
| 1735 {9, 8, 7, 6, 5, 4, 3, 2, 1, 9} // Up (same as Left) | 1572 {9, 8, 7, 6, 5, 4, 3, 2, 1, 9} // Up (same as Left) |
| 1736 }; | 1573 }; |
| 1737 | 1574 |
| 1738 for (size_t key_index = 0; key_index < arraysize(arrow_keys); key_index++) { | 1575 for (size_t key_index = 0; key_index < arraysize(arrow_keys); key_index++) { |
| 1739 ToggleOverview(); | 1576 ToggleOverview(); |
| 1740 const std::vector<WindowSelectorItem*>& overview_windows = | 1577 const std::vector<WindowSelectorItem*>& overview_windows = |
| 1741 GetWindowItemsForRoot(0); | 1578 GetWindowItemsForRoot(0); |
| 1742 for (size_t i = 0; i < test_windows + 1; i++) { | 1579 for (size_t i = 0; i < test_windows + 1; i++) { |
| 1743 SendKey(arrow_keys[key_index]); | 1580 SendKey(arrow_keys[key_index]); |
| 1744 // TODO(flackr): Add a more readable error message by constructing a | 1581 // TODO(flackr): Add a more readable error message by constructing a |
| 1745 // string from the window IDs. | 1582 // string from the window IDs. |
| 1746 const int index = ash::MaterialDesignController::IsOverviewMaterial() | 1583 const int index = index_path_for_direction[key_index][i]; |
| 1747 ? index_path_for_direction_MD[key_index][i] | |
| 1748 : index_path_for_direction[key_index][i]; | |
| 1749 EXPECT_EQ(GetSelectedWindow()->id(), | 1584 EXPECT_EQ(GetSelectedWindow()->id(), |
| 1750 overview_windows[index - 1]->GetWindow()->GetShellWindowId()); | 1585 overview_windows[index - 1]->GetWindow()->GetShellWindowId()); |
| 1751 } | 1586 } |
| 1752 ToggleOverview(); | 1587 ToggleOverview(); |
| 1753 } | 1588 } |
| 1754 } | 1589 } |
| 1755 | 1590 |
| 1756 // Tests basic selection across multiple monitors. | 1591 // Tests basic selection across multiple monitors. |
| 1757 TEST_P(WindowSelectorTest, BasicMultiMonitorArrowKeyNavigation) { | 1592 TEST_F(WindowSelectorTest, BasicMultiMonitorArrowKeyNavigation) { |
| 1758 if (!SupportsMultipleDisplays()) | 1593 if (!SupportsMultipleDisplays()) |
| 1759 return; | 1594 return; |
| 1760 | 1595 |
| 1761 UpdateDisplay("400x400,400x400"); | 1596 UpdateDisplay("400x400,400x400"); |
| 1762 gfx::Rect bounds1(0, 0, 100, 100); | 1597 gfx::Rect bounds1(0, 0, 100, 100); |
| 1763 gfx::Rect bounds2(450, 0, 100, 100); | 1598 gfx::Rect bounds2(450, 0, 100, 100); |
| 1764 std::unique_ptr<aura::Window> window4(CreateWindow(bounds2)); | 1599 std::unique_ptr<aura::Window> window4(CreateWindow(bounds2)); |
| 1765 std::unique_ptr<aura::Window> window3(CreateWindow(bounds2)); | 1600 std::unique_ptr<aura::Window> window3(CreateWindow(bounds2)); |
| 1766 std::unique_ptr<aura::Window> window2(CreateWindow(bounds1)); | 1601 std::unique_ptr<aura::Window> window2(CreateWindow(bounds1)); |
| 1767 std::unique_ptr<aura::Window> window1(CreateWindow(bounds1)); | 1602 std::unique_ptr<aura::Window> window1(CreateWindow(bounds1)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1781 SendKey(ui::VKEY_RIGHT); | 1616 SendKey(ui::VKEY_RIGHT); |
| 1782 EXPECT_EQ(GetSelectedWindow(), | 1617 EXPECT_EQ(GetSelectedWindow(), |
| 1783 WmWindowAura::GetAuraWindow(overview_root2[0]->GetWindow())); | 1618 WmWindowAura::GetAuraWindow(overview_root2[0]->GetWindow())); |
| 1784 SendKey(ui::VKEY_RIGHT); | 1619 SendKey(ui::VKEY_RIGHT); |
| 1785 EXPECT_EQ(GetSelectedWindow(), | 1620 EXPECT_EQ(GetSelectedWindow(), |
| 1786 WmWindowAura::GetAuraWindow(overview_root2[1]->GetWindow())); | 1621 WmWindowAura::GetAuraWindow(overview_root2[1]->GetWindow())); |
| 1787 } | 1622 } |
| 1788 | 1623 |
| 1789 // Tests first monitor when display order doesn't match left to right screen | 1624 // Tests first monitor when display order doesn't match left to right screen |
| 1790 // positions. | 1625 // positions. |
| 1791 TEST_P(WindowSelectorTest, MultiMonitorReversedOrder) { | 1626 TEST_F(WindowSelectorTest, MultiMonitorReversedOrder) { |
| 1792 if (!SupportsMultipleDisplays()) | 1627 if (!SupportsMultipleDisplays()) |
| 1793 return; | 1628 return; |
| 1794 | 1629 |
| 1795 UpdateDisplay("400x400,400x400"); | 1630 UpdateDisplay("400x400,400x400"); |
| 1796 Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( | 1631 Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays( |
| 1797 test::CreateDisplayLayout(display::DisplayPlacement::LEFT, 0)); | 1632 test::CreateDisplayLayout(display::DisplayPlacement::LEFT, 0)); |
| 1798 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 1633 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 1799 gfx::Rect bounds1(-350, 0, 100, 100); | 1634 gfx::Rect bounds1(-350, 0, 100, 100); |
| 1800 gfx::Rect bounds2(0, 0, 100, 100); | 1635 gfx::Rect bounds2(0, 0, 100, 100); |
| 1801 std::unique_ptr<aura::Window> window2(CreateWindow(bounds2)); | 1636 std::unique_ptr<aura::Window> window2(CreateWindow(bounds2)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1813 ToggleOverview(); | 1648 ToggleOverview(); |
| 1814 ToggleOverview(); | 1649 ToggleOverview(); |
| 1815 | 1650 |
| 1816 // Coming from right to left, we should select window2 first being on the | 1651 // Coming from right to left, we should select window2 first being on the |
| 1817 // display on the right. | 1652 // display on the right. |
| 1818 SendKey(ui::VKEY_LEFT); | 1653 SendKey(ui::VKEY_LEFT); |
| 1819 EXPECT_EQ(GetSelectedWindow(), window2.get()); | 1654 EXPECT_EQ(GetSelectedWindow(), window2.get()); |
| 1820 } | 1655 } |
| 1821 | 1656 |
| 1822 // Tests three monitors where the grid becomes empty on one of the monitors. | 1657 // Tests three monitors where the grid becomes empty on one of the monitors. |
| 1823 TEST_P(WindowSelectorTest, ThreeMonitor) { | 1658 TEST_F(WindowSelectorTest, ThreeMonitor) { |
| 1824 if (!SupportsMultipleDisplays()) | 1659 if (!SupportsMultipleDisplays()) |
| 1825 return; | 1660 return; |
| 1826 | 1661 |
| 1827 UpdateDisplay("400x400,400x400,400x400"); | 1662 UpdateDisplay("400x400,400x400,400x400"); |
| 1828 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 1663 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 1829 gfx::Rect bounds1(0, 0, 100, 100); | 1664 gfx::Rect bounds1(0, 0, 100, 100); |
| 1830 gfx::Rect bounds2(400, 0, 100, 100); | 1665 gfx::Rect bounds2(400, 0, 100, 100); |
| 1831 gfx::Rect bounds3(800, 0, 100, 100); | 1666 gfx::Rect bounds3(800, 0, 100, 100); |
| 1832 std::unique_ptr<aura::Window> window3(CreateWindow(bounds3)); | 1667 std::unique_ptr<aura::Window> window3(CreateWindow(bounds3)); |
| 1833 std::unique_ptr<aura::Window> window2(CreateWindow(bounds2)); | 1668 std::unique_ptr<aura::Window> window2(CreateWindow(bounds2)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1856 SendKey(ui::VKEY_RIGHT); | 1691 SendKey(ui::VKEY_RIGHT); |
| 1857 | 1692 |
| 1858 // If the window on the second display is removed, the selected window should | 1693 // If the window on the second display is removed, the selected window should |
| 1859 // remain window3. | 1694 // remain window3. |
| 1860 EXPECT_EQ(GetSelectedWindow(), window3.get()); | 1695 EXPECT_EQ(GetSelectedWindow(), window3.get()); |
| 1861 window2.reset(); | 1696 window2.reset(); |
| 1862 EXPECT_EQ(GetSelectedWindow(), window3.get()); | 1697 EXPECT_EQ(GetSelectedWindow(), window3.get()); |
| 1863 } | 1698 } |
| 1864 | 1699 |
| 1865 // Tests selecting a window in overview mode with the return key. | 1700 // Tests selecting a window in overview mode with the return key. |
| 1866 TEST_P(WindowSelectorTest, SelectWindowWithReturnKey) { | 1701 TEST_F(WindowSelectorTest, SelectWindowWithReturnKey) { |
| 1867 gfx::Rect bounds(0, 0, 100, 100); | 1702 gfx::Rect bounds(0, 0, 100, 100); |
| 1868 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1703 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1869 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1704 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1870 ToggleOverview(); | 1705 ToggleOverview(); |
| 1871 | 1706 |
| 1872 // Pressing the return key without a selection widget should not do anything. | 1707 // Pressing the return key without a selection widget should not do anything. |
| 1873 SendKey(ui::VKEY_RETURN); | 1708 SendKey(ui::VKEY_RETURN); |
| 1874 EXPECT_TRUE(IsSelecting()); | 1709 EXPECT_TRUE(IsSelecting()); |
| 1875 | 1710 |
| 1876 // Select the first window. | 1711 // Select the first window. |
| 1877 ASSERT_TRUE(SelectWindow(window1.get())); | 1712 ASSERT_TRUE(SelectWindow(window1.get())); |
| 1878 SendKey(ui::VKEY_RETURN); | 1713 SendKey(ui::VKEY_RETURN); |
| 1879 ASSERT_FALSE(IsSelecting()); | 1714 ASSERT_FALSE(IsSelecting()); |
| 1880 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); | 1715 EXPECT_TRUE(wm::IsActiveWindow(window1.get())); |
| 1881 | 1716 |
| 1882 // Select the second window. | 1717 // Select the second window. |
| 1883 ToggleOverview(); | 1718 ToggleOverview(); |
| 1884 ASSERT_TRUE(SelectWindow(window2.get())); | 1719 ASSERT_TRUE(SelectWindow(window2.get())); |
| 1885 SendKey(ui::VKEY_RETURN); | 1720 SendKey(ui::VKEY_RETURN); |
| 1886 EXPECT_FALSE(IsSelecting()); | 1721 EXPECT_FALSE(IsSelecting()); |
| 1887 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); | 1722 EXPECT_TRUE(wm::IsActiveWindow(window2.get())); |
| 1888 } | 1723 } |
| 1889 | 1724 |
| 1890 // Tests that overview mode hides the callout widget. | 1725 // Tests that overview mode hides the callout widget. |
| 1891 TEST_P(WindowSelectorTest, WindowOverviewHidesCalloutWidgets) { | 1726 TEST_F(WindowSelectorTest, WindowOverviewHidesCalloutWidgets) { |
| 1892 std::unique_ptr<aura::Window> panel1( | 1727 std::unique_ptr<aura::Window> panel1( |
| 1893 CreatePanelWindow(gfx::Rect(0, 0, 100, 100))); | 1728 CreatePanelWindow(gfx::Rect(0, 0, 100, 100))); |
| 1894 WmWindow* wm_panel1 = WmWindowAura::Get(panel1.get()); | 1729 WmWindow* wm_panel1 = WmWindowAura::Get(panel1.get()); |
| 1895 std::unique_ptr<aura::Window> panel2( | 1730 std::unique_ptr<aura::Window> panel2( |
| 1896 CreatePanelWindow(gfx::Rect(0, 0, 100, 100))); | 1731 CreatePanelWindow(gfx::Rect(0, 0, 100, 100))); |
| 1897 WmWindow* wm_panel2 = WmWindowAura::Get(panel2.get()); | 1732 WmWindow* wm_panel2 = WmWindowAura::Get(panel2.get()); |
| 1898 PanelLayoutManager* panel_manager = PanelLayoutManager::Get(wm_panel1); | 1733 PanelLayoutManager* panel_manager = PanelLayoutManager::Get(wm_panel1); |
| 1899 | 1734 |
| 1900 // By default, panel callout widgets are visible. | 1735 // By default, panel callout widgets are visible. |
| 1901 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel1)->IsVisible()); | 1736 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel1)->IsVisible()); |
| 1902 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel2)->IsVisible()); | 1737 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel2)->IsVisible()); |
| 1903 | 1738 |
| 1904 // Toggling the overview should hide the callout widgets. | 1739 // Toggling the overview should hide the callout widgets. |
| 1905 ToggleOverview(); | 1740 ToggleOverview(); |
| 1906 EXPECT_FALSE(panel_manager->GetCalloutWidgetForPanel(wm_panel1)->IsVisible()); | 1741 EXPECT_FALSE(panel_manager->GetCalloutWidgetForPanel(wm_panel1)->IsVisible()); |
| 1907 EXPECT_FALSE(panel_manager->GetCalloutWidgetForPanel(wm_panel2)->IsVisible()); | 1742 EXPECT_FALSE(panel_manager->GetCalloutWidgetForPanel(wm_panel2)->IsVisible()); |
| 1908 | 1743 |
| 1909 // Ending the overview should show them again. | 1744 // Ending the overview should show them again. |
| 1910 ToggleOverview(); | 1745 ToggleOverview(); |
| 1911 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel1)->IsVisible()); | 1746 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel1)->IsVisible()); |
| 1912 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel2)->IsVisible()); | 1747 EXPECT_TRUE(panel_manager->GetCalloutWidgetForPanel(wm_panel2)->IsVisible()); |
| 1913 } | 1748 } |
| 1914 | 1749 |
| 1915 // Creates three windows and tests filtering them by title. | 1750 // Creates three windows and tests filtering them by title. |
| 1916 TEST_P(WindowSelectorTest, BasicTextFiltering) { | 1751 TEST_F(WindowSelectorTest, BasicTextFiltering) { |
| 1917 gfx::Rect bounds(0, 0, 100, 100); | 1752 gfx::Rect bounds(0, 0, 100, 100); |
| 1918 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1753 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1919 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1754 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1920 std::unique_ptr<aura::Window> window0(CreateWindow(bounds)); | 1755 std::unique_ptr<aura::Window> window0(CreateWindow(bounds)); |
| 1921 base::string16 window2_title = base::UTF8ToUTF16("Highway to test"); | 1756 base::string16 window2_title = base::UTF8ToUTF16("Highway to test"); |
| 1922 base::string16 window1_title = base::UTF8ToUTF16("For those about to test"); | 1757 base::string16 window1_title = base::UTF8ToUTF16("For those about to test"); |
| 1923 base::string16 window0_title = base::UTF8ToUTF16("We salute you"); | 1758 base::string16 window0_title = base::UTF8ToUTF16("We salute you"); |
| 1924 window0->SetTitle(window0_title); | 1759 window0->SetTitle(window0_title); |
| 1925 window1->SetTitle(window1_title); | 1760 window1->SetTitle(window1_title); |
| 1926 window2->SetTitle(window2_title); | 1761 window2->SetTitle(window2_title); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1953 // All the items should match the empty string. The filter widget should also | 1788 // All the items should match the empty string. The filter widget should also |
| 1954 // disappear. | 1789 // disappear. |
| 1955 FilterItems(""); | 1790 FilterItems(""); |
| 1956 EXPECT_FALSE(showing_filter_widget()); | 1791 EXPECT_FALSE(showing_filter_widget()); |
| 1957 EXPECT_FALSE(GetWindowItemForWindow(grid_index, window0.get())->dimmed()); | 1792 EXPECT_FALSE(GetWindowItemForWindow(grid_index, window0.get())->dimmed()); |
| 1958 EXPECT_FALSE(GetWindowItemForWindow(grid_index, window1.get())->dimmed()); | 1793 EXPECT_FALSE(GetWindowItemForWindow(grid_index, window1.get())->dimmed()); |
| 1959 EXPECT_FALSE(GetWindowItemForWindow(grid_index, window2.get())->dimmed()); | 1794 EXPECT_FALSE(GetWindowItemForWindow(grid_index, window2.get())->dimmed()); |
| 1960 } | 1795 } |
| 1961 | 1796 |
| 1962 // Tests selecting in the overview with dimmed and undimmed items. | 1797 // Tests selecting in the overview with dimmed and undimmed items. |
| 1963 TEST_P(WindowSelectorTest, TextFilteringSelection) { | 1798 TEST_F(WindowSelectorTest, TextFilteringSelection) { |
| 1964 gfx::Rect bounds(0, 0, 100, 100); | 1799 gfx::Rect bounds(0, 0, 100, 100); |
| 1965 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); | 1800 std::unique_ptr<aura::Window> window2(CreateWindow(bounds)); |
| 1966 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1801 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 1967 std::unique_ptr<aura::Window> window0(CreateWindow(bounds)); | 1802 std::unique_ptr<aura::Window> window0(CreateWindow(bounds)); |
| 1968 base::string16 window2_title = base::UTF8ToUTF16("Rock and roll"); | 1803 base::string16 window2_title = base::UTF8ToUTF16("Rock and roll"); |
| 1969 base::string16 window1_title = base::UTF8ToUTF16("Rock and"); | 1804 base::string16 window1_title = base::UTF8ToUTF16("Rock and"); |
| 1970 base::string16 window0_title = base::UTF8ToUTF16("Rock"); | 1805 base::string16 window0_title = base::UTF8ToUTF16("Rock"); |
| 1971 window0->SetTitle(window0_title); | 1806 window0->SetTitle(window0_title); |
| 1972 window1->SetTitle(window1_title); | 1807 window1->SetTitle(window1_title); |
| 1973 window2->SetTitle(window2_title); | 1808 window2->SetTitle(window2_title); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1987 FilterItems("Pop"); | 1822 FilterItems("Pop"); |
| 1988 EXPECT_FALSE(selection_widget_active()); | 1823 EXPECT_FALSE(selection_widget_active()); |
| 1989 | 1824 |
| 1990 // Undimming one window should automatically select it. | 1825 // Undimming one window should automatically select it. |
| 1991 FilterItems("Rock and roll"); | 1826 FilterItems("Rock and roll"); |
| 1992 EXPECT_EQ(GetSelectedWindow(), window2.get()); | 1827 EXPECT_EQ(GetSelectedWindow(), window2.get()); |
| 1993 } | 1828 } |
| 1994 | 1829 |
| 1995 // Tests that transferring focus from the text filter to a window that is not a | 1830 // Tests that transferring focus from the text filter to a window that is not a |
| 1996 // top level window does not cancel overview mode. | 1831 // top level window does not cancel overview mode. |
| 1997 TEST_P(WindowSelectorTest, ShowTextFilterMenu) { | 1832 TEST_F(WindowSelectorTest, ShowTextFilterMenu) { |
| 1998 gfx::Rect bounds(0, 0, 100, 100); | 1833 gfx::Rect bounds(0, 0, 100, 100); |
| 1999 std::unique_ptr<aura::Window> window0(CreateWindow(bounds)); | 1834 std::unique_ptr<aura::Window> window0(CreateWindow(bounds)); |
| 2000 base::string16 window0_title = base::UTF8ToUTF16("Test"); | 1835 base::string16 window0_title = base::UTF8ToUTF16("Test"); |
| 2001 window0->SetTitle(window0_title); | 1836 window0->SetTitle(window0_title); |
| 2002 wm::GetWindowState(window0.get())->Minimize(); | 1837 wm::GetWindowState(window0.get())->Minimize(); |
| 2003 ToggleOverview(); | 1838 ToggleOverview(); |
| 2004 | 1839 |
| 2005 EXPECT_FALSE(selection_widget_active()); | 1840 EXPECT_FALSE(selection_widget_active()); |
| 2006 EXPECT_FALSE(showing_filter_widget()); | 1841 EXPECT_FALSE(showing_filter_widget()); |
| 2007 FilterItems("Test"); | 1842 FilterItems("Test"); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2026 generator.MoveMouseTo(point_in_text_filter); | 1861 generator.MoveMouseTo(point_in_text_filter); |
| 2027 generator.ClickLeftButton(); | 1862 generator.ClickLeftButton(); |
| 2028 EXPECT_TRUE(IsSelecting()); | 1863 EXPECT_TRUE(IsSelecting()); |
| 2029 | 1864 |
| 2030 // Cancel overview mode. | 1865 // Cancel overview mode. |
| 2031 ToggleOverview(); | 1866 ToggleOverview(); |
| 2032 ASSERT_FALSE(IsSelecting()); | 1867 ASSERT_FALSE(IsSelecting()); |
| 2033 } | 1868 } |
| 2034 | 1869 |
| 2035 // Tests clicking on the desktop itself to cancel overview mode. | 1870 // Tests clicking on the desktop itself to cancel overview mode. |
| 2036 TEST_P(WindowSelectorTest, CancelOverviewOnMouseClick) { | 1871 TEST_F(WindowSelectorTest, CancelOverviewOnMouseClick) { |
| 2037 // Overview disabled by default. | 1872 // Overview disabled by default. |
| 2038 EXPECT_FALSE(IsSelecting()); | 1873 EXPECT_FALSE(IsSelecting()); |
| 2039 | 1874 |
| 2040 // Point and bounds selected so that they don't intersect. This causes | 1875 // Point and bounds selected so that they don't intersect. This causes |
| 2041 // events located at the point to be passed to WallpaperController, | 1876 // events located at the point to be passed to WallpaperController, |
| 2042 // and not the window. | 1877 // and not the window. |
| 2043 gfx::Point point_in_background_page(0, 0); | 1878 gfx::Point point_in_background_page(0, 0); |
| 2044 gfx::Rect bounds(10, 10, 100, 100); | 1879 gfx::Rect bounds(10, 10, 100, 100); |
| 2045 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1880 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 2046 ui::test::EventGenerator& generator = GetEventGenerator(); | 1881 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2047 // Move mouse to point in the background page. Sending an event here will pass | 1882 // Move mouse to point in the background page. Sending an event here will pass |
| 2048 // it to the WallpaperController in both regular and overview mode. | 1883 // it to the WallpaperController in both regular and overview mode. |
| 2049 generator.MoveMouseTo(point_in_background_page); | 1884 generator.MoveMouseTo(point_in_background_page); |
| 2050 | 1885 |
| 2051 // Clicking on the background page while not in overview should not toggle | 1886 // Clicking on the background page while not in overview should not toggle |
| 2052 // overview. | 1887 // overview. |
| 2053 generator.ClickLeftButton(); | 1888 generator.ClickLeftButton(); |
| 2054 EXPECT_FALSE(IsSelecting()); | 1889 EXPECT_FALSE(IsSelecting()); |
| 2055 | 1890 |
| 2056 // Switch to overview mode. | 1891 // Switch to overview mode. |
| 2057 ToggleOverview(); | 1892 ToggleOverview(); |
| 2058 ASSERT_TRUE(IsSelecting()); | 1893 ASSERT_TRUE(IsSelecting()); |
| 2059 | 1894 |
| 2060 // Click should now exit overview mode. | 1895 // Click should now exit overview mode. |
| 2061 generator.ClickLeftButton(); | 1896 generator.ClickLeftButton(); |
| 2062 EXPECT_FALSE(IsSelecting()); | 1897 EXPECT_FALSE(IsSelecting()); |
| 2063 } | 1898 } |
| 2064 | 1899 |
| 2065 // Tests tapping on the desktop itself to cancel overview mode. | 1900 // Tests tapping on the desktop itself to cancel overview mode. |
| 2066 TEST_P(WindowSelectorTest, CancelOverviewOnTap) { | 1901 TEST_F(WindowSelectorTest, CancelOverviewOnTap) { |
| 2067 // Overview disabled by default. | 1902 // Overview disabled by default. |
| 2068 EXPECT_FALSE(IsSelecting()); | 1903 EXPECT_FALSE(IsSelecting()); |
| 2069 | 1904 |
| 2070 // Point and bounds selected so that they don't intersect. This causes | 1905 // Point and bounds selected so that they don't intersect. This causes |
| 2071 // events located at the point to be passed to WallpaperController, | 1906 // events located at the point to be passed to WallpaperController, |
| 2072 // and not the window. | 1907 // and not the window. |
| 2073 gfx::Point point_in_background_page(0, 0); | 1908 gfx::Point point_in_background_page(0, 0); |
| 2074 gfx::Rect bounds(10, 10, 100, 100); | 1909 gfx::Rect bounds(10, 10, 100, 100); |
| 2075 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); | 1910 std::unique_ptr<aura::Window> window1(CreateWindow(bounds)); |
| 2076 ui::test::EventGenerator& generator = GetEventGenerator(); | 1911 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2077 | 1912 |
| 2078 // Tapping on the background page while not in overview should not toggle | 1913 // Tapping on the background page while not in overview should not toggle |
| 2079 // overview. | 1914 // overview. |
| 2080 generator.GestureTapAt(point_in_background_page); | 1915 generator.GestureTapAt(point_in_background_page); |
| 2081 EXPECT_FALSE(IsSelecting()); | 1916 EXPECT_FALSE(IsSelecting()); |
| 2082 | 1917 |
| 2083 // Switch to overview mode. | 1918 // Switch to overview mode. |
| 2084 ToggleOverview(); | 1919 ToggleOverview(); |
| 2085 ASSERT_TRUE(IsSelecting()); | 1920 ASSERT_TRUE(IsSelecting()); |
| 2086 | 1921 |
| 2087 // Tap should now exit overview mode. | 1922 // Tap should now exit overview mode. |
| 2088 generator.GestureTapAt(point_in_background_page); | 1923 generator.GestureTapAt(point_in_background_page); |
| 2089 EXPECT_FALSE(IsSelecting()); | 1924 EXPECT_FALSE(IsSelecting()); |
| 2090 } | 1925 } |
| 2091 | 1926 |
| 2092 // Tests that transformed Rect scaling preserves its aspect ratio. | 1927 // Tests that transformed Rect scaling preserves its aspect ratio. |
| 2093 // With Material Design the window scale is determined by the target height and | 1928 // The window scale is determined by the target height and so the test is |
| 2094 // so the test is actually testing that the width is calculated correctly. | 1929 // actually testing that the width is calculated correctly. Since all |
| 2095 // Since all calculations are done with floating point values and then safely | 1930 // calculations are done with floating point values and then safely converted to |
| 2096 // converted to integers (using ceiled and floored values where appropriate), | 1931 // integers (using ceiled and floored values where appropriate), the |
| 2097 // the expectations are forgiving (use *_NEAR) within a single pixel. | 1932 // expectations are forgiving (use *_NEAR) within a single pixel. |
| 2098 TEST_P(WindowSelectorTest, TransformedRectMaintainsAspect) { | 1933 TEST_F(WindowSelectorTest, TransformedRectMaintainsAspect) { |
| 2099 gfx::Rect rect(50, 50, 200, 400); | 1934 gfx::Rect rect(50, 50, 200, 400); |
| 2100 gfx::Rect bounds(100, 100, 50, 50); | 1935 gfx::Rect bounds(100, 100, 50, 50); |
| 2101 gfx::Rect transformed_rect = | 1936 gfx::Rect transformed_rect = |
| 2102 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( | 1937 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( |
| 2103 rect, bounds, 0, 0); | 1938 rect, bounds, 0, 0); |
| 2104 float scale = GetItemScale(rect, bounds, 0, 0); | 1939 float scale = GetItemScale(rect, bounds, 0, 0); |
| 2105 EXPECT_NEAR(scale * rect.width(), transformed_rect.width(), 1); | 1940 EXPECT_NEAR(scale * rect.width(), transformed_rect.width(), 1); |
| 2106 EXPECT_NEAR(scale * rect.height(), transformed_rect.height(), 1); | 1941 EXPECT_NEAR(scale * rect.height(), transformed_rect.height(), 1); |
| 2107 | 1942 |
| 2108 rect = gfx::Rect(50, 50, 400, 200); | 1943 rect = gfx::Rect(50, 50, 400, 200); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2132 rect = gfx::Rect(50, 50, 50, 25); | 1967 rect = gfx::Rect(50, 50, 50, 25); |
| 2133 scale = GetItemScale(rect, bounds, 0, 0); | 1968 scale = GetItemScale(rect, bounds, 0, 0); |
| 2134 transformed_rect = | 1969 transformed_rect = |
| 2135 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( | 1970 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( |
| 2136 rect, bounds, 0, 0); | 1971 rect, bounds, 0, 0); |
| 2137 EXPECT_NEAR(scale * rect.width(), transformed_rect.width(), 1); | 1972 EXPECT_NEAR(scale * rect.width(), transformed_rect.width(), 1); |
| 2138 EXPECT_NEAR(scale * rect.height(), transformed_rect.height(), 1); | 1973 EXPECT_NEAR(scale * rect.height(), transformed_rect.height(), 1); |
| 2139 } | 1974 } |
| 2140 | 1975 |
| 2141 // Tests that transformed Rect fits in target bounds and is vertically centered. | 1976 // Tests that transformed Rect fits in target bounds and is vertically centered. |
| 2142 TEST_P(WindowSelectorTest, TransformedRectIsCentered) { | 1977 TEST_F(WindowSelectorTest, TransformedRectIsCentered) { |
| 2143 gfx::Rect rect(50, 50, 200, 400); | 1978 gfx::Rect rect(50, 50, 200, 400); |
| 2144 gfx::Rect bounds(100, 100, 50, 50); | 1979 gfx::Rect bounds(100, 100, 50, 50); |
| 2145 gfx::Rect transformed_rect = | 1980 gfx::Rect transformed_rect = |
| 2146 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( | 1981 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( |
| 2147 rect, bounds, 0, 0); | 1982 rect, bounds, 0, 0); |
| 2148 EXPECT_GE(transformed_rect.x(), bounds.x()); | 1983 EXPECT_GE(transformed_rect.x(), bounds.x()); |
| 2149 EXPECT_LE(transformed_rect.right(), bounds.right()); | 1984 EXPECT_LE(transformed_rect.right(), bounds.right()); |
| 2150 EXPECT_GE(transformed_rect.y(), bounds.y()); | 1985 EXPECT_GE(transformed_rect.y(), bounds.y()); |
| 2151 EXPECT_LE(transformed_rect.bottom(), bounds.bottom()); | 1986 EXPECT_LE(transformed_rect.bottom(), bounds.bottom()); |
| 2152 EXPECT_NEAR(transformed_rect.x() - bounds.x(), | 1987 EXPECT_NEAR(transformed_rect.x() - bounds.x(), |
| 2153 bounds.right() - transformed_rect.right(), 1); | 1988 bounds.right() - transformed_rect.right(), 1); |
| 2154 EXPECT_NEAR(transformed_rect.y() - bounds.y(), | 1989 EXPECT_NEAR(transformed_rect.y() - bounds.y(), |
| 2155 bounds.bottom() - transformed_rect.bottom(), 1); | 1990 bounds.bottom() - transformed_rect.bottom(), 1); |
| 2156 } | 1991 } |
| 2157 | 1992 |
| 2158 // Tests that transformed Rect fits in target bounds and is vertically centered | 1993 // Tests that transformed Rect fits in target bounds and is vertically centered |
| 2159 // when inset and header height are specified. | 1994 // when inset and header height are specified. |
| 2160 TEST_P(WindowSelectorTest, TransformedRectIsCenteredWithInset) { | 1995 TEST_F(WindowSelectorTest, TransformedRectIsCenteredWithInset) { |
| 2161 gfx::Rect rect(50, 50, 400, 200); | 1996 gfx::Rect rect(50, 50, 400, 200); |
| 2162 gfx::Rect bounds(100, 100, 50, 50); | 1997 gfx::Rect bounds(100, 100, 50, 50); |
| 2163 const int inset = 20; | 1998 const int inset = 20; |
| 2164 const int header_height = 10; | 1999 const int header_height = 10; |
| 2165 const float scale = GetItemScale(rect, bounds, inset, header_height); | 2000 const float scale = GetItemScale(rect, bounds, inset, header_height); |
| 2166 gfx::Rect transformed_rect = | 2001 gfx::Rect transformed_rect = |
| 2167 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( | 2002 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( |
| 2168 rect, bounds, inset, header_height); | 2003 rect, bounds, inset, header_height); |
| 2169 if (ash::MaterialDesignController::IsOverviewMaterial()) { | 2004 // The |rect| width does not fit and therefore it gets centered outside |
| 2170 // With Material Design the |rect| width does not fit and therefore it gets | 2005 // |bounds| starting before |bounds.x()| and ending after |bounds.right()|. |
| 2171 // centered outside |bounds| starting before |bounds.x()| and ending after | 2006 EXPECT_LE(transformed_rect.x(), bounds.x()); |
| 2172 // |bounds.right()|. | 2007 EXPECT_GE(transformed_rect.right(), bounds.right()); |
| 2173 EXPECT_LE(transformed_rect.x(), bounds.x()); | |
| 2174 EXPECT_GE(transformed_rect.right(), bounds.right()); | |
| 2175 } else { | |
| 2176 EXPECT_GE(transformed_rect.x(), bounds.x()); | |
| 2177 EXPECT_LE(transformed_rect.right(), bounds.right()); | |
| 2178 } | |
| 2179 EXPECT_GE( | 2008 EXPECT_GE( |
| 2180 transformed_rect.y() + gfx::ToCeiledInt(scale * inset) - header_height, | 2009 transformed_rect.y() + gfx::ToCeiledInt(scale * inset) - header_height, |
| 2181 bounds.y()); | 2010 bounds.y()); |
| 2182 EXPECT_LE(transformed_rect.bottom(), bounds.bottom()); | 2011 EXPECT_LE(transformed_rect.bottom(), bounds.bottom()); |
| 2183 EXPECT_NEAR(transformed_rect.x() - bounds.x(), | 2012 EXPECT_NEAR(transformed_rect.x() - bounds.x(), |
| 2184 bounds.right() - transformed_rect.right(), 1); | 2013 bounds.right() - transformed_rect.right(), 1); |
| 2185 EXPECT_NEAR( | 2014 EXPECT_NEAR( |
| 2186 transformed_rect.y() + (int)(scale * inset) - header_height - bounds.y(), | 2015 transformed_rect.y() + (int)(scale * inset) - header_height - bounds.y(), |
| 2187 bounds.bottom() - transformed_rect.bottom(), 1); | 2016 bounds.bottom() - transformed_rect.bottom(), 1); |
| 2188 } | 2017 } |
| 2189 | 2018 |
| 2190 } // namespace ash | 2019 } // namespace ash |
| OLD | NEW |