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/wm/system_modal_container_layout_manager.h" | 5 #include "ash/wm/system_modal_container_layout_manager.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "ash/public/cpp/shell_window_ids.h" | 9 #include "ash/public/cpp/shell_window_ids.h" |
10 #include "ash/root_window_controller.h" | 10 #include "ash/root_window_controller.h" |
11 #include "ash/session/session_state_delegate.h" | 11 #include "ash/session/session_state_delegate.h" |
12 #include "ash/shell.h" | 12 #include "ash/shell.h" |
| 13 #include "ash/shell_port.h" |
13 #include "ash/test/ash_test_base.h" | 14 #include "ash/test/ash_test_base.h" |
14 #include "ash/wm/container_finder.h" | 15 #include "ash/wm/container_finder.h" |
15 #include "ash/wm/window_util.h" | 16 #include "ash/wm/window_util.h" |
16 #include "ash/wm_shell.h" | |
17 #include "ash/wm_window.h" | 17 #include "ash/wm_window.h" |
18 #include "base/command_line.h" | 18 #include "base/command_line.h" |
19 #include "base/compiler_specific.h" | 19 #include "base/compiler_specific.h" |
20 #include "base/memory/ptr_util.h" | 20 #include "base/memory/ptr_util.h" |
21 #include "base/run_loop.h" | 21 #include "base/run_loop.h" |
22 #include "ui/aura/client/aura_constants.h" | 22 #include "ui/aura/client/aura_constants.h" |
23 #include "ui/aura/test/test_window_delegate.h" | 23 #include "ui/aura/test/test_window_delegate.h" |
24 #include "ui/aura/window.h" | 24 #include "ui/aura/window.h" |
25 #include "ui/aura/window_event_dispatcher.h" | 25 #include "ui/aura/window_event_dispatcher.h" |
26 #include "ui/base/hit_test.h" | 26 #include "ui/base/hit_test.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 } // namespace | 146 } // namespace |
147 | 147 |
148 class SystemModalContainerLayoutManagerTest : public AshTestBase { | 148 class SystemModalContainerLayoutManagerTest : public AshTestBase { |
149 public: | 149 public: |
150 void SetUp() override { | 150 void SetUp() override { |
151 // Allow a virtual keyboard (and initialize it per default). | 151 // Allow a virtual keyboard (and initialize it per default). |
152 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 152 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
153 keyboard::switches::kEnableVirtualKeyboard); | 153 keyboard::switches::kEnableVirtualKeyboard); |
154 AshTestBase::SetUp(); | 154 AshTestBase::SetUp(); |
155 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. | 155 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. |
156 if (!WmShell::Get()->IsRunningInMash()) { | 156 if (!ShellPort::Get()->IsRunningInMash()) { |
157 Shell::GetPrimaryRootWindowController()->ActivateKeyboard( | 157 Shell::GetPrimaryRootWindowController()->ActivateKeyboard( |
158 keyboard::KeyboardController::GetInstance()); | 158 keyboard::KeyboardController::GetInstance()); |
159 } | 159 } |
160 } | 160 } |
161 | 161 |
162 void TearDown() override { | 162 void TearDown() override { |
163 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. | 163 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. |
164 if (!WmShell::Get()->IsRunningInMash()) { | 164 if (!ShellPort::Get()->IsRunningInMash()) { |
165 Shell::GetPrimaryRootWindowController()->DeactivateKeyboard( | 165 Shell::GetPrimaryRootWindowController()->DeactivateKeyboard( |
166 keyboard::KeyboardController::GetInstance()); | 166 keyboard::KeyboardController::GetInstance()); |
167 } | 167 } |
168 AshTestBase::TearDown(); | 168 AshTestBase::TearDown(); |
169 } | 169 } |
170 | 170 |
171 aura::Window* OpenToplevelTestWindow(bool modal) { | 171 aura::Window* OpenToplevelTestWindow(bool modal) { |
172 views::Widget* widget = views::Widget::CreateWindowWithContext( | 172 views::Widget* widget = views::Widget::CreateWindowWithContext( |
173 new TestWindow(modal), CurrentContext()); | 173 new TestWindow(modal), CurrentContext()); |
174 widget->Show(); | 174 widget->Show(); |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 TestWindow::CloseTestWindow(modal1.release()); | 655 TestWindow::CloseTestWindow(modal1.release()); |
656 EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); | 656 EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds()); |
657 EXPECT_TRUE(wm::IsActiveWindow(normal.get())); | 657 EXPECT_TRUE(wm::IsActiveWindow(normal.get())); |
658 } | 658 } |
659 | 659 |
660 // Test that with the visible keyboard, an existing system modal dialog gets | 660 // Test that with the visible keyboard, an existing system modal dialog gets |
661 // positioned into the visible area. | 661 // positioned into the visible area. |
662 TEST_F(SystemModalContainerLayoutManagerTest, | 662 TEST_F(SystemModalContainerLayoutManagerTest, |
663 SystemModalDialogGetPushedFromKeyboard) { | 663 SystemModalDialogGetPushedFromKeyboard) { |
664 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. | 664 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. |
665 if (WmShell::Get()->IsRunningInMash()) | 665 if (ShellPort::Get()->IsRunningInMash()) |
666 return; | 666 return; |
667 | 667 |
668 const gfx::Rect& container_bounds = GetModalContainer()->bounds(); | 668 const gfx::Rect& container_bounds = GetModalContainer()->bounds(); |
669 // Place the window at the bottom of the screen. | 669 // Place the window at the bottom of the screen. |
670 gfx::Size modal_size(100, 100); | 670 gfx::Size modal_size(100, 100); |
671 gfx::Point modal_origin = gfx::Point( | 671 gfx::Point modal_origin = gfx::Point( |
672 (container_bounds.right() - modal_size.width()) / 2, // X centered | 672 (container_bounds.right() - modal_size.width()) / 2, // X centered |
673 container_bounds.bottom() - modal_size.height()); // at bottom | 673 container_bounds.bottom() - modal_size.height()); // at bottom |
674 gfx::Rect modal_bounds = gfx::Rect(modal_origin, modal_size); | 674 gfx::Rect modal_bounds = gfx::Rect(modal_origin, modal_size); |
675 | 675 |
(...skipping 19 matching lines...) Expand all Loading... |
695 EXPECT_NE(modal_bounds.ToString(), modal_window->bounds().ToString()); | 695 EXPECT_NE(modal_bounds.ToString(), modal_window->bounds().ToString()); |
696 EXPECT_EQ(modal_size.ToString(), modal_window->bounds().size().ToString()); | 696 EXPECT_EQ(modal_size.ToString(), modal_window->bounds().size().ToString()); |
697 EXPECT_EQ(modal_origin.x(), modal_window->bounds().x()); | 697 EXPECT_EQ(modal_origin.x(), modal_window->bounds().x()); |
698 } | 698 } |
699 | 699 |
700 // Test that windows will not get cropped through the visible virtual keyboard - | 700 // Test that windows will not get cropped through the visible virtual keyboard - |
701 // if centered. | 701 // if centered. |
702 TEST_F(SystemModalContainerLayoutManagerTest, | 702 TEST_F(SystemModalContainerLayoutManagerTest, |
703 SystemModalDialogGetPushedButNotCroppedFromKeyboard) { | 703 SystemModalDialogGetPushedButNotCroppedFromKeyboard) { |
704 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. | 704 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. |
705 if (WmShell::Get()->IsRunningInMash()) | 705 if (ShellPort::Get()->IsRunningInMash()) |
706 return; | 706 return; |
707 | 707 |
708 const gfx::Rect& container_bounds = GetModalContainer()->bounds(); | 708 const gfx::Rect& container_bounds = GetModalContainer()->bounds(); |
709 const gfx::Size screen_size = Shell::GetPrimaryRootWindow()->bounds().size(); | 709 const gfx::Size screen_size = Shell::GetPrimaryRootWindow()->bounds().size(); |
710 // Place the window at the bottom of the screen. | 710 // Place the window at the bottom of the screen. |
711 gfx::Size modal_size(100, screen_size.height() - 70); | 711 gfx::Size modal_size(100, screen_size.height() - 70); |
712 gfx::Point modal_origin = gfx::Point( | 712 gfx::Point modal_origin = gfx::Point( |
713 (container_bounds.right() - modal_size.width()) / 2, // X centered | 713 (container_bounds.right() - modal_size.width()) / 2, // X centered |
714 container_bounds.bottom() - modal_size.height()); // at bottom | 714 container_bounds.bottom() - modal_size.height()); // at bottom |
715 gfx::Rect modal_bounds = gfx::Rect(modal_origin, modal_size); | 715 gfx::Rect modal_bounds = gfx::Rect(modal_origin, modal_size); |
(...skipping 16 matching lines...) Expand all Loading... |
732 EXPECT_EQ(0, modal_window->bounds().y()); | 732 EXPECT_EQ(0, modal_window->bounds().y()); |
733 | 733 |
734 ShowKeyboard(false); | 734 ShowKeyboard(false); |
735 } | 735 } |
736 | 736 |
737 // Test that windows will not get cropped through the visible virtual keyboard - | 737 // Test that windows will not get cropped through the visible virtual keyboard - |
738 // if not centered. | 738 // if not centered. |
739 TEST_F(SystemModalContainerLayoutManagerTest, | 739 TEST_F(SystemModalContainerLayoutManagerTest, |
740 SystemModalDialogGetPushedButNotCroppedFromKeyboardIfNotCentered) { | 740 SystemModalDialogGetPushedButNotCroppedFromKeyboardIfNotCentered) { |
741 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. | 741 // TODO: mash doesn't support virtual keyboard. http://crbug.com/698892. |
742 if (WmShell::Get()->IsRunningInMash()) | 742 if (ShellPort::Get()->IsRunningInMash()) |
743 return; | 743 return; |
744 | 744 |
745 const gfx::Size screen_size = Shell::GetPrimaryRootWindow()->bounds().size(); | 745 const gfx::Size screen_size = Shell::GetPrimaryRootWindow()->bounds().size(); |
746 // Place the window at the bottom of the screen. | 746 // Place the window at the bottom of the screen. |
747 gfx::Size modal_size(100, screen_size.height() - 70); | 747 gfx::Size modal_size(100, screen_size.height() - 70); |
748 gfx::Point modal_origin = gfx::Point(10, 20); | 748 gfx::Point modal_origin = gfx::Point(10, 20); |
749 gfx::Rect modal_bounds = gfx::Rect(modal_origin, modal_size); | 749 gfx::Rect modal_bounds = gfx::Rect(modal_origin, modal_size); |
750 | 750 |
751 // Create a modal window. | 751 // Create a modal window. |
752 std::unique_ptr<aura::Window> parent(OpenToplevelTestWindow(false)); | 752 std::unique_ptr<aura::Window> parent(OpenToplevelTestWindow(false)); |
(...skipping 15 matching lines...) Expand all Loading... |
768 ShowKeyboard(false); | 768 ShowKeyboard(false); |
769 } | 769 } |
770 | 770 |
771 TEST_F(SystemModalContainerLayoutManagerTest, UpdateModalType) { | 771 TEST_F(SystemModalContainerLayoutManagerTest, UpdateModalType) { |
772 aura::Window* modal_container = Shell::GetContainer( | 772 aura::Window* modal_container = Shell::GetContainer( |
773 Shell::GetPrimaryRootWindow(), kShellWindowId_SystemModalContainer); | 773 Shell::GetPrimaryRootWindow(), kShellWindowId_SystemModalContainer); |
774 views::Widget* widget = views::Widget::CreateWindowWithParent( | 774 views::Widget* widget = views::Widget::CreateWindowWithParent( |
775 new TestWindow(false), modal_container); | 775 new TestWindow(false), modal_container); |
776 widget->Show(); | 776 widget->Show(); |
777 aura::Window* window = widget->GetNativeWindow(); | 777 aura::Window* window = widget->GetNativeWindow(); |
778 EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen()); | 778 EXPECT_FALSE(ShellPort::Get()->IsSystemModalWindowOpen()); |
779 | 779 |
780 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); | 780 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); |
781 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 781 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
782 | 782 |
783 // Setting twice should not cause error. | 783 // Setting twice should not cause error. |
784 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); | 784 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); |
785 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 785 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
786 | 786 |
787 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_NONE); | 787 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_NONE); |
788 EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen()); | 788 EXPECT_FALSE(ShellPort::Get()->IsSystemModalWindowOpen()); |
789 | 789 |
790 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); | 790 window->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_SYSTEM); |
791 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 791 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
792 | 792 |
793 widget->Close(); | 793 widget->Close(); |
794 EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen()); | 794 EXPECT_FALSE(ShellPort::Get()->IsSystemModalWindowOpen()); |
795 } | 795 } |
796 | 796 |
797 TEST_F(SystemModalContainerLayoutManagerTest, VisibilityChange) { | 797 TEST_F(SystemModalContainerLayoutManagerTest, VisibilityChange) { |
798 std::unique_ptr<aura::Window> window(OpenToplevelTestWindow(false)); | 798 std::unique_ptr<aura::Window> window(OpenToplevelTestWindow(false)); |
799 std::unique_ptr<aura::Window> modal_window( | 799 std::unique_ptr<aura::Window> modal_window( |
800 views::Widget::CreateWindowWithContext(new TestWindow(true), | 800 views::Widget::CreateWindowWithContext(new TestWindow(true), |
801 CurrentContext()) | 801 CurrentContext()) |
802 ->GetNativeWindow()); | 802 ->GetNativeWindow()); |
803 SystemModalContainerLayoutManager* layout_manager = | 803 SystemModalContainerLayoutManager* layout_manager = |
804 WmShell::Get() | 804 ShellPort::Get() |
805 ->GetPrimaryRootWindowController() | 805 ->GetPrimaryRootWindowController() |
806 ->GetSystemModalLayoutManager(WmWindow::Get(modal_window.get())); | 806 ->GetSystemModalLayoutManager(WmWindow::Get(modal_window.get())); |
807 | 807 |
808 EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen()); | 808 EXPECT_FALSE(ShellPort::Get()->IsSystemModalWindowOpen()); |
809 EXPECT_FALSE(layout_manager->has_window_dimmer()); | 809 EXPECT_FALSE(layout_manager->has_window_dimmer()); |
810 | 810 |
811 modal_window->Show(); | 811 modal_window->Show(); |
812 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 812 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
813 EXPECT_TRUE(layout_manager->has_window_dimmer()); | 813 EXPECT_TRUE(layout_manager->has_window_dimmer()); |
814 | 814 |
815 // Make sure that a child visibility change should not cause | 815 // Make sure that a child visibility change should not cause |
816 // inconsistent state. | 816 // inconsistent state. |
817 std::unique_ptr<aura::Window> child = base::MakeUnique<aura::Window>(nullptr); | 817 std::unique_ptr<aura::Window> child = base::MakeUnique<aura::Window>(nullptr); |
818 child->SetType(ui::wm::WINDOW_TYPE_CONTROL); | 818 child->SetType(ui::wm::WINDOW_TYPE_CONTROL); |
819 child->Init(ui::LAYER_TEXTURED); | 819 child->Init(ui::LAYER_TEXTURED); |
820 modal_window->AddChild(child.get()); | 820 modal_window->AddChild(child.get()); |
821 child->Show(); | 821 child->Show(); |
822 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 822 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
823 EXPECT_TRUE(layout_manager->has_window_dimmer()); | 823 EXPECT_TRUE(layout_manager->has_window_dimmer()); |
824 | 824 |
825 modal_window->Hide(); | 825 modal_window->Hide(); |
826 EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen()); | 826 EXPECT_FALSE(ShellPort::Get()->IsSystemModalWindowOpen()); |
827 EXPECT_FALSE(layout_manager->has_window_dimmer()); | 827 EXPECT_FALSE(layout_manager->has_window_dimmer()); |
828 | 828 |
829 modal_window->Show(); | 829 modal_window->Show(); |
830 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 830 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
831 EXPECT_TRUE(layout_manager->has_window_dimmer()); | 831 EXPECT_TRUE(layout_manager->has_window_dimmer()); |
832 } | 832 } |
833 | 833 |
834 namespace { | 834 namespace { |
835 | 835 |
836 class InputTestDelegate : public aura::test::TestWindowDelegate { | 836 class InputTestDelegate : public aura::test::TestWindowDelegate { |
837 public: | 837 public: |
838 InputTestDelegate() {} | 838 InputTestDelegate() {} |
839 ~InputTestDelegate() override {} | 839 ~InputTestDelegate() override {} |
840 | 840 |
841 void RunTest(test::AshTestBase* test_base) { | 841 void RunTest(test::AshTestBase* test_base) { |
842 std::unique_ptr<aura::Window> window( | 842 std::unique_ptr<aura::Window> window( |
843 test_base->CreateTestWindowInShellWithDelegate( | 843 test_base->CreateTestWindowInShellWithDelegate( |
844 this, 0, gfx::Rect(0, 0, 100, 100))); | 844 this, 0, gfx::Rect(0, 0, 100, 100))); |
845 window->Show(); | 845 window->Show(); |
846 | 846 |
847 GenerateEvents(window.get()); | 847 GenerateEvents(window.get()); |
848 | 848 |
849 EXPECT_EQ(2, mouse_event_count_); | 849 EXPECT_EQ(2, mouse_event_count_); |
850 EXPECT_EQ(3, scroll_event_count_); | 850 EXPECT_EQ(3, scroll_event_count_); |
851 EXPECT_EQ(4, touch_event_count_); | 851 EXPECT_EQ(4, touch_event_count_); |
852 EXPECT_EQ(10, gesture_event_count_); | 852 EXPECT_EQ(10, gesture_event_count_); |
853 Reset(); | 853 Reset(); |
854 | 854 |
855 views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds( | 855 views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds( |
856 new TestWindow(true), Shell::GetPrimaryRootWindow(), | 856 new TestWindow(true), Shell::GetPrimaryRootWindow(), |
857 gfx::Rect(200, 200, 100, 100)); | 857 gfx::Rect(200, 200, 100, 100)); |
858 widget->Show(); | 858 widget->Show(); |
859 EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen()); | 859 EXPECT_TRUE(ShellPort::Get()->IsSystemModalWindowOpen()); |
860 | 860 |
861 // Events should be blocked. | 861 // Events should be blocked. |
862 GenerateEvents(window.get()); | 862 GenerateEvents(window.get()); |
863 | 863 |
864 EXPECT_EQ(0, mouse_event_count_); | 864 EXPECT_EQ(0, mouse_event_count_); |
865 EXPECT_EQ(0, scroll_event_count_); | 865 EXPECT_EQ(0, scroll_event_count_); |
866 EXPECT_EQ(0, touch_event_count_); | 866 EXPECT_EQ(0, touch_event_count_); |
867 EXPECT_EQ(0, gesture_event_count_); | 867 EXPECT_EQ(0, gesture_event_count_); |
868 Reset(); | 868 Reset(); |
869 | 869 |
870 widget->Close(); | 870 widget->Close(); |
871 EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen()); | 871 EXPECT_FALSE(ShellPort::Get()->IsSystemModalWindowOpen()); |
872 | 872 |
873 GenerateEvents(window.get()); | 873 GenerateEvents(window.get()); |
874 | 874 |
875 EXPECT_EQ(2, mouse_event_count_); | 875 EXPECT_EQ(2, mouse_event_count_); |
876 EXPECT_EQ(3, scroll_event_count_); | 876 EXPECT_EQ(3, scroll_event_count_); |
877 EXPECT_EQ(4, touch_event_count_); | 877 EXPECT_EQ(4, touch_event_count_); |
878 EXPECT_EQ(10, gesture_event_count_); | 878 EXPECT_EQ(10, gesture_event_count_); |
879 } | 879 } |
880 | 880 |
881 private: | 881 private: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
922 | 922 |
923 // Make sure that events are properly blocked in multi displays environment. | 923 // Make sure that events are properly blocked in multi displays environment. |
924 TEST_F(SystemModalContainerLayoutManagerTest, BlockEventsInMultiDisplays) { | 924 TEST_F(SystemModalContainerLayoutManagerTest, BlockEventsInMultiDisplays) { |
925 UpdateDisplay("500x500, 500x500"); | 925 UpdateDisplay("500x500, 500x500"); |
926 InputTestDelegate delegate; | 926 InputTestDelegate delegate; |
927 delegate.RunTest(this); | 927 delegate.RunTest(this); |
928 } | 928 } |
929 | 929 |
930 } // namespace test | 930 } // namespace test |
931 } // namespace ash | 931 } // namespace ash |
OLD | NEW |