| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ash/common/wm/panels/panel_layout_manager.h" | 5 #include "ash/common/wm/panels/panel_layout_manager.h" |
| 6 | 6 |
| 7 #include "ash/common/shelf/shelf_button.h" | 7 #include "ash/common/shelf/shelf_button.h" |
| 8 #include "ash/common/shelf/shelf_layout_manager.h" | 8 #include "ash/common/shelf/shelf_layout_manager.h" |
| 9 #include "ash/common/shelf/shelf_model.h" | 9 #include "ash/common/shelf/shelf_model.h" |
| 10 #include "ash/common/shelf/shelf_view.h" | 10 #include "ash/common/shelf/shelf_view.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 #include "base/compiler_specific.h" | 29 #include "base/compiler_specific.h" |
| 30 #include "base/i18n/rtl.h" | 30 #include "base/i18n/rtl.h" |
| 31 #include "base/run_loop.h" | 31 #include "base/run_loop.h" |
| 32 #include "base/strings/string_number_conversions.h" | 32 #include "base/strings/string_number_conversions.h" |
| 33 #include "ui/aura/client/aura_constants.h" | 33 #include "ui/aura/client/aura_constants.h" |
| 34 #include "ui/aura/test/test_windows.h" | 34 #include "ui/aura/test/test_windows.h" |
| 35 #include "ui/aura/window.h" | 35 #include "ui/aura/window.h" |
| 36 #include "ui/aura/window_event_dispatcher.h" | 36 #include "ui/aura/window_event_dispatcher.h" |
| 37 #include "ui/display/manager/display_manager.h" | 37 #include "ui/display/manager/display_manager.h" |
| 38 #include "ui/display/manager/managed_display_info.h" | 38 #include "ui/display/manager/managed_display_info.h" |
| 39 #include "ui/display/screen.h" |
| 39 #include "ui/display/test/display_manager_test_api.h" | 40 #include "ui/display/test/display_manager_test_api.h" |
| 40 #include "ui/events/event_utils.h" | 41 #include "ui/events/event_utils.h" |
| 41 #include "ui/events/test/event_generator.h" | 42 #include "ui/events/test/event_generator.h" |
| 42 #include "ui/views/widget/widget.h" | 43 #include "ui/views/widget/widget.h" |
| 43 | 44 |
| 44 namespace ash { | 45 namespace ash { |
| 45 | 46 |
| 46 namespace { | 47 namespace { |
| 47 | 48 |
| 48 std::string ToDisplayName(int64_t id) { | 49 std::string ToDisplayName(int64_t id) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 manager->panel_windows_.end(), wm_panel); | 113 manager->panel_windows_.end(), wm_panel); |
| 113 DCHECK(found != manager->panel_windows_.end()); | 114 DCHECK(found != manager->panel_windows_.end()); |
| 114 DCHECK(found->callout_widget); | 115 DCHECK(found->callout_widget); |
| 115 return found->CalloutWidget(); | 116 return found->CalloutWidget(); |
| 116 } | 117 } |
| 117 | 118 |
| 118 void PanelInScreen(aura::Window* panel) { | 119 void PanelInScreen(aura::Window* panel) { |
| 119 gfx::Rect panel_bounds = panel->GetBoundsInRootWindow(); | 120 gfx::Rect panel_bounds = panel->GetBoundsInRootWindow(); |
| 120 gfx::Point root_point = gfx::Point(panel_bounds.x(), panel_bounds.y()); | 121 gfx::Point root_point = gfx::Point(panel_bounds.x(), panel_bounds.y()); |
| 121 display::Display display = | 122 display::Display display = |
| 122 display_manager()->FindDisplayContainingPoint(root_point); | 123 display::Screen::GetScreen()->GetDisplayNearestPoint(root_point); |
| 123 | 124 |
| 124 gfx::Rect panel_bounds_in_screen = panel->GetBoundsInScreen(); | 125 gfx::Rect panel_bounds_in_screen = panel->GetBoundsInScreen(); |
| 125 gfx::Point screen_bottom_right = gfx::Point( | 126 gfx::Point screen_bottom_right = gfx::Point( |
| 126 panel_bounds_in_screen.right(), panel_bounds_in_screen.bottom()); | 127 panel_bounds_in_screen.right(), panel_bounds_in_screen.bottom()); |
| 127 gfx::Rect display_bounds = display.bounds(); | 128 gfx::Rect display_bounds = display.bounds(); |
| 128 EXPECT_TRUE(screen_bottom_right.x() < display_bounds.width() && | 129 EXPECT_TRUE(screen_bottom_right.x() < display_bounds.width() && |
| 129 screen_bottom_right.y() < display_bounds.height()); | 130 screen_bottom_right.y() < display_bounds.height()); |
| 130 } | 131 } |
| 131 | 132 |
| 132 void PanelsNotOverlapping(aura::Window* panel1, aura::Window* panel2) { | 133 void PanelsNotOverlapping(aura::Window* panel1, aura::Window* panel2) { |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 gfx::Rect bounds(0, 0, 201, 201); | 296 gfx::Rect bounds(0, 0, 201, 201); |
| 296 std::unique_ptr<aura::Window> window(CreatePanelWindow(bounds)); | 297 std::unique_ptr<aura::Window> window(CreatePanelWindow(bounds)); |
| 297 EXPECT_EQ(GetPanelContainer(window.get()), window->parent()); | 298 EXPECT_EQ(GetPanelContainer(window.get()), window->parent()); |
| 298 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(window.get())); | 299 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(window.get())); |
| 299 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(window.get())); | 300 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(window.get())); |
| 300 } | 301 } |
| 301 | 302 |
| 302 // Tests for crashes during undocking. | 303 // Tests for crashes during undocking. |
| 303 // See https://crbug.com/632755 | 304 // See https://crbug.com/632755 |
| 304 TEST_F(PanelLayoutManagerTest, UndockTest) { | 305 TEST_F(PanelLayoutManagerTest, UndockTest) { |
| 306 // TODO: mash doesn't support SetFirstDisplayAsInternalDisplay(). |
| 307 // http://crbug.com/698091. |
| 308 if (WmShell::Get()->IsRunningInMash()) |
| 309 return; |
| 310 |
| 305 std::vector<display::ManagedDisplayInfo> info_list; | 311 std::vector<display::ManagedDisplayInfo> info_list; |
| 306 | 312 |
| 307 const int64_t internal_display_id = | 313 const int64_t internal_display_id = |
| 308 display::test::DisplayManagerTestApi( | 314 display::test::DisplayManagerTestApi( |
| 309 Shell::GetInstance()->display_manager()) | 315 Shell::GetInstance()->display_manager()) |
| 310 .SetFirstDisplayAsInternalDisplay(); | 316 .SetFirstDisplayAsInternalDisplay(); |
| 311 | 317 |
| 312 // Create the primary display info. | 318 // Create the primary display info. |
| 313 display::ManagedDisplayInfo internal_display = | 319 display::ManagedDisplayInfo internal_display = |
| 314 CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 1280, 720)); | 320 CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 1280, 720)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 327 info_list.clear(); | 333 info_list.clear(); |
| 328 info_list.push_back(internal_display); | 334 info_list.push_back(internal_display); |
| 329 | 335 |
| 330 // Undock and bring back the native device display as primary display. | 336 // Undock and bring back the native device display as primary display. |
| 331 display_manager()->OnNativeDisplaysChanged(info_list); | 337 display_manager()->OnNativeDisplaysChanged(info_list); |
| 332 } | 338 } |
| 333 | 339 |
| 334 // Tests for any crash during docking and then undocking. | 340 // Tests for any crash during docking and then undocking. |
| 335 // See https://crbug.com/632755 | 341 // See https://crbug.com/632755 |
| 336 TEST_F(PanelLayoutManagerTest, DockUndockTest) { | 342 TEST_F(PanelLayoutManagerTest, DockUndockTest) { |
| 343 // TODO: mash doesn't support SetFirstDisplayAsInternalDisplay(). |
| 344 // http://crbug.com/698091. |
| 345 if (WmShell::Get()->IsRunningInMash()) |
| 346 return; |
| 347 |
| 337 std::vector<display::ManagedDisplayInfo> info_list; | 348 std::vector<display::ManagedDisplayInfo> info_list; |
| 338 | 349 |
| 339 const int64_t internal_display_id = | 350 const int64_t internal_display_id = |
| 340 display::test::DisplayManagerTestApi( | 351 display::test::DisplayManagerTestApi( |
| 341 Shell::GetInstance()->display_manager()) | 352 Shell::GetInstance()->display_manager()) |
| 342 .SetFirstDisplayAsInternalDisplay(); | 353 .SetFirstDisplayAsInternalDisplay(); |
| 343 | 354 |
| 344 // Create the primary display info. | 355 // Create the primary display info. |
| 345 display::ManagedDisplayInfo internal_display = | 356 display::ManagedDisplayInfo internal_display = |
| 346 CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 1280, 720)); | 357 CreateDisplayInfo(internal_display_id, gfx::Rect(0, 0, 1280, 720)); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 TEST_F(PanelLayoutManagerTest, MultiplePanelCallout) { | 500 TEST_F(PanelLayoutManagerTest, MultiplePanelCallout) { |
| 490 gfx::Rect bounds(0, 0, 200, 200); | 501 gfx::Rect bounds(0, 0, 200, 200); |
| 491 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); | 502 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); |
| 492 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); | 503 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); |
| 493 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); | 504 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); |
| 494 std::unique_ptr<aura::Window> w4(CreateNormalWindow(gfx::Rect())); | 505 std::unique_ptr<aura::Window> w4(CreateNormalWindow(gfx::Rect())); |
| 495 shelf_view_test()->RunMessageLoopUntilAnimationsDone(); | 506 shelf_view_test()->RunMessageLoopUntilAnimationsDone(); |
| 496 EXPECT_TRUE(IsPanelCalloutVisible(w1.get())); | 507 EXPECT_TRUE(IsPanelCalloutVisible(w1.get())); |
| 497 EXPECT_TRUE(IsPanelCalloutVisible(w2.get())); | 508 EXPECT_TRUE(IsPanelCalloutVisible(w2.get())); |
| 498 EXPECT_TRUE(IsPanelCalloutVisible(w3.get())); | 509 EXPECT_TRUE(IsPanelCalloutVisible(w3.get())); |
| 510 |
| 511 // TODO: investigate failure. http://crbug.com/698887. |
| 512 if (WmShell::Get()->IsRunningInMash()) |
| 513 return; |
| 514 |
| 499 wm::ActivateWindow(w1.get()); | 515 wm::ActivateWindow(w1.get()); |
| 500 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w1.get())); | 516 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w1.get())); |
| 501 wm::ActivateWindow(w2.get()); | 517 wm::ActivateWindow(w2.get()); |
| 502 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w2.get())); | 518 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w2.get())); |
| 503 wm::ActivateWindow(w3.get()); | 519 wm::ActivateWindow(w3.get()); |
| 504 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w3.get())); | 520 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w3.get())); |
| 505 wm::ActivateWindow(w4.get()); | 521 wm::ActivateWindow(w4.get()); |
| 506 wm::ActivateWindow(w3.get()); | 522 wm::ActivateWindow(w3.get()); |
| 507 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w3.get())); | 523 EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w3.get())); |
| 508 w3.reset(); | 524 w3.reset(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 520 wm::ActivateWindow(w1.get()); | 536 wm::ActivateWindow(w1.get()); |
| 521 shelf_view_test()->RunMessageLoopUntilAnimationsDone(); | 537 shelf_view_test()->RunMessageLoopUntilAnimationsDone(); |
| 522 // Now, windows should be stacked 1 > 2 > 3 | 538 // Now, windows should be stacked 1 > 2 > 3 |
| 523 w1.reset(); | 539 w1.reset(); |
| 524 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); | 540 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); |
| 525 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get())); | 541 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get())); |
| 526 EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get())); | 542 EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get())); |
| 527 } | 543 } |
| 528 | 544 |
| 529 TEST_F(PanelLayoutManagerTest, RemoveMiddlePanel) { | 545 TEST_F(PanelLayoutManagerTest, RemoveMiddlePanel) { |
| 546 // TODO: fails because of ShelfModel. http://crbug.com/698878. |
| 547 if (WmShell::Get()->IsRunningInMash()) |
| 548 return; |
| 549 |
| 530 gfx::Rect bounds(0, 0, 201, 201); | 550 gfx::Rect bounds(0, 0, 201, 201); |
| 531 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); | 551 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); |
| 532 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); | 552 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); |
| 533 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); | 553 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); |
| 534 | 554 |
| 535 // At this point, windows should be stacked with 1 < 2 < 3 | 555 // At this point, windows should be stacked with 1 < 2 < 3 |
| 536 wm::ActivateWindow(w2.get()); | 556 wm::ActivateWindow(w2.get()); |
| 537 // Windows should be stacked 1 < 2 > 3 | 557 // Windows should be stacked 1 < 2 > 3 |
| 538 w2.reset(); | 558 w2.reset(); |
| 539 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get())); | 559 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get())); |
| 540 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get())); | 560 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get())); |
| 541 EXPECT_TRUE(WindowIsAbove(w3.get(), w1.get())); | 561 EXPECT_TRUE(WindowIsAbove(w3.get(), w1.get())); |
| 542 } | 562 } |
| 543 | 563 |
| 544 TEST_F(PanelLayoutManagerTest, RemoveRightPanel) { | 564 TEST_F(PanelLayoutManagerTest, RemoveRightPanel) { |
| 565 // TODO: fails because of ShelfModel. http://crbug.com/698878. |
| 566 if (WmShell::Get()->IsRunningInMash()) |
| 567 return; |
| 568 |
| 545 gfx::Rect bounds(0, 0, 201, 201); | 569 gfx::Rect bounds(0, 0, 201, 201); |
| 546 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); | 570 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); |
| 547 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); | 571 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); |
| 548 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); | 572 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); |
| 549 | 573 |
| 550 // At this point, windows should be stacked with 1 < 2 < 3 | 574 // At this point, windows should be stacked with 1 < 2 < 3 |
| 551 wm::ActivateWindow(w3.get()); | 575 wm::ActivateWindow(w3.get()); |
| 552 // Order shouldn't change. | 576 // Order shouldn't change. |
| 553 w3.reset(); | 577 w3.reset(); |
| 554 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get())); | 578 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get())); |
| 555 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); | 579 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); |
| 556 EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get())); | 580 EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get())); |
| 557 } | 581 } |
| 558 | 582 |
| 559 TEST_F(PanelLayoutManagerTest, RemoveNonActivePanel) { | 583 TEST_F(PanelLayoutManagerTest, RemoveNonActivePanel) { |
| 584 // TODO: fails because of ShelfModel. http://crbug.com/698878. |
| 585 if (WmShell::Get()->IsRunningInMash()) |
| 586 return; |
| 587 |
| 560 gfx::Rect bounds(0, 0, 201, 201); | 588 gfx::Rect bounds(0, 0, 201, 201); |
| 561 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); | 589 std::unique_ptr<aura::Window> w1(CreatePanelWindow(bounds)); |
| 562 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); | 590 std::unique_ptr<aura::Window> w2(CreatePanelWindow(bounds)); |
| 563 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); | 591 std::unique_ptr<aura::Window> w3(CreatePanelWindow(bounds)); |
| 564 | 592 |
| 565 // At this point, windows should be stacked with 1 < 2 < 3 | 593 // At this point, windows should be stacked with 1 < 2 < 3 |
| 566 wm::ActivateWindow(w2.get()); | 594 wm::ActivateWindow(w2.get()); |
| 567 // Windows should be stacked 1 < 2 > 3 | 595 // Windows should be stacked 1 < 2 > 3 |
| 568 w1.reset(); | 596 w1.reset(); |
| 569 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); | 597 EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 wm::GetWindowState(window.get())->Unminimize(); | 669 wm::GetWindowState(window.get())->Unminimize(); |
| 642 RunAllPendingInMessageLoop(); | 670 RunAllPendingInMessageLoop(); |
| 643 EXPECT_TRUE(IsPanelCalloutVisible(window.get())); | 671 EXPECT_TRUE(IsPanelCalloutVisible(window.get())); |
| 644 // Activate the window, ensure callout is visible. | 672 // Activate the window, ensure callout is visible. |
| 645 wm::ActivateWindow(window.get()); | 673 wm::ActivateWindow(window.get()); |
| 646 RunAllPendingInMessageLoop(); | 674 RunAllPendingInMessageLoop(); |
| 647 EXPECT_TRUE(IsPanelCalloutVisible(window.get())); | 675 EXPECT_TRUE(IsPanelCalloutVisible(window.get())); |
| 648 } | 676 } |
| 649 | 677 |
| 650 TEST_F(PanelLayoutManagerTest, PanelMoveBetweenMultipleDisplays) { | 678 TEST_F(PanelLayoutManagerTest, PanelMoveBetweenMultipleDisplays) { |
| 679 // TODO: fails because of ShelfModel. http://crbug.com/698878. |
| 680 if (WmShell::Get()->IsRunningInMash()) |
| 681 return; |
| 682 |
| 651 // Keep the displays wide so that shelves have enough space for launcher | 683 // Keep the displays wide so that shelves have enough space for launcher |
| 652 // buttons. | 684 // buttons. |
| 653 UpdateDisplay("600x400,600x400"); | 685 UpdateDisplay("600x400,600x400"); |
| 654 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 686 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 655 | 687 |
| 656 std::unique_ptr<aura::Window> p1_d1( | 688 std::unique_ptr<aura::Window> p1_d1( |
| 657 CreatePanelWindow(gfx::Rect(0, 0, 50, 50))); | 689 CreatePanelWindow(gfx::Rect(0, 0, 50, 50))); |
| 658 std::unique_ptr<aura::Window> p2_d1( | 690 std::unique_ptr<aura::Window> p2_d1( |
| 659 CreatePanelWindow(gfx::Rect(0, 0, 50, 50))); | 691 CreatePanelWindow(gfx::Rect(0, 0, 50, 50))); |
| 660 std::unique_ptr<aura::Window> p1_d2( | 692 std::unique_ptr<aura::Window> p1_d2( |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 touch.set_location(gfx::Point(bounds.x() - 1, bounds.y() + 5)); | 919 touch.set_location(gfx::Point(bounds.x() - 1, bounds.y() + 5)); |
| 888 target = targeter->FindTargetForEvent(root, &touch); | 920 target = targeter->FindTargetForEvent(root, &touch); |
| 889 EXPECT_NE(w.get(), target); | 921 EXPECT_NE(w.get(), target); |
| 890 } | 922 } |
| 891 | 923 |
| 892 INSTANTIATE_TEST_CASE_P(LtrRtl, | 924 INSTANTIATE_TEST_CASE_P(LtrRtl, |
| 893 PanelLayoutManagerTextDirectionTest, | 925 PanelLayoutManagerTextDirectionTest, |
| 894 testing::Bool()); | 926 testing::Bool()); |
| 895 | 927 |
| 896 } // namespace ash | 928 } // namespace ash |
| OLD | NEW |