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/root_window_controller.h" | 5 #include "ash/root_window_controller.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "ash/aura/wm_window_aura.h" | 9 #include "ash/aura/wm_window_aura.h" |
10 #include "ash/common/material_design/material_design_controller.h" | 10 #include "ash/common/material_design/material_design_controller.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "ui/aura/env.h" | 30 #include "ui/aura/env.h" |
31 #include "ui/aura/test/test_window_delegate.h" | 31 #include "ui/aura/test/test_window_delegate.h" |
32 #include "ui/aura/test/test_windows.h" | 32 #include "ui/aura/test/test_windows.h" |
33 #include "ui/aura/window.h" | 33 #include "ui/aura/window.h" |
34 #include "ui/aura/window_event_dispatcher.h" | 34 #include "ui/aura/window_event_dispatcher.h" |
35 #include "ui/aura/window_tracker.h" | 35 #include "ui/aura/window_tracker.h" |
36 #include "ui/base/ime/dummy_text_input_client.h" | 36 #include "ui/base/ime/dummy_text_input_client.h" |
37 #include "ui/base/ime/input_method.h" | 37 #include "ui/base/ime/input_method.h" |
38 #include "ui/base/ime/text_input_client.h" | 38 #include "ui/base/ime/text_input_client.h" |
39 #include "ui/display/manager/display_manager.h" | 39 #include "ui/display/manager/display_manager.h" |
| 40 #include "ui/display/test/display_manager_test_api.h" |
| 41 #include "ui/events/devices/device_data_manager.h" |
| 42 #include "ui/events/devices/touchscreen_device.h" |
40 #include "ui/events/test/event_generator.h" | 43 #include "ui/events/test/event_generator.h" |
41 #include "ui/events/test/test_event_handler.h" | 44 #include "ui/events/test/test_event_handler.h" |
42 #include "ui/keyboard/keyboard_controller.h" | 45 #include "ui/keyboard/keyboard_controller.h" |
43 #include "ui/keyboard/keyboard_switches.h" | 46 #include "ui/keyboard/keyboard_switches.h" |
44 #include "ui/keyboard/keyboard_ui.h" | 47 #include "ui/keyboard/keyboard_ui.h" |
45 #include "ui/keyboard/keyboard_util.h" | 48 #include "ui/keyboard/keyboard_util.h" |
46 #include "ui/views/controls/menu/menu_controller.h" | 49 #include "ui/views/controls/menu/menu_controller.h" |
47 #include "ui/views/widget/widget.h" | 50 #include "ui/views/widget/widget.h" |
48 #include "ui/views/widget/widget_delegate.h" | 51 #include "ui/views/widget/widget_delegate.h" |
49 | 52 |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 class VirtualKeyboardRootWindowControllerTest | 699 class VirtualKeyboardRootWindowControllerTest |
697 : public RootWindowControllerTest { | 700 : public RootWindowControllerTest { |
698 public: | 701 public: |
699 VirtualKeyboardRootWindowControllerTest() {} | 702 VirtualKeyboardRootWindowControllerTest() {} |
700 ~VirtualKeyboardRootWindowControllerTest() override {} | 703 ~VirtualKeyboardRootWindowControllerTest() override {} |
701 | 704 |
702 void SetUp() override { | 705 void SetUp() override { |
703 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 706 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
704 keyboard::switches::kEnableVirtualKeyboard); | 707 keyboard::switches::kEnableVirtualKeyboard); |
705 test::AshTestBase::SetUp(); | 708 test::AshTestBase::SetUp(); |
706 Shell::GetPrimaryRootWindowController()->ActivateKeyboard( | 709 keyboard::SetTouchKeyboardEnabled(true); |
707 keyboard::KeyboardController::GetInstance()); | 710 Shell::GetInstance()->CreateKeyboard(); |
| 711 } |
| 712 |
| 713 void TearDown() override { |
| 714 keyboard::SetTouchKeyboardEnabled(false); |
| 715 test::AshTestBase::TearDown(); |
708 } | 716 } |
709 | 717 |
710 private: | 718 private: |
711 DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardRootWindowControllerTest); | 719 DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardRootWindowControllerTest); |
712 }; | 720 }; |
713 | 721 |
714 class MockTextInputClient : public ui::DummyTextInputClient { | 722 class MockTextInputClient : public ui::DummyTextInputClient { |
715 public: | 723 public: |
716 MockTextInputClient() : ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT) {} | 724 MockTextInputClient() : ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT) {} |
717 | 725 |
(...skipping 18 matching lines...) Expand all Loading... |
736 if (event->type() == ui::ET_MOUSE_PRESSED) | 744 if (event->type() == ui::ET_MOUSE_PRESSED) |
737 ui::test::TestEventHandler::OnMouseEvent(event); | 745 ui::test::TestEventHandler::OnMouseEvent(event); |
738 event->StopPropagation(); | 746 event->StopPropagation(); |
739 } | 747 } |
740 | 748 |
741 private: | 749 private: |
742 DISALLOW_COPY_AND_ASSIGN(TargetHitTestEventHandler); | 750 DISALLOW_COPY_AND_ASSIGN(TargetHitTestEventHandler); |
743 }; | 751 }; |
744 | 752 |
745 // Test for http://crbug.com/297858. Virtual keyboard container should only show | 753 // Test for http://crbug.com/297858. Virtual keyboard container should only show |
746 // on primary root window. | 754 // on primary root window if no window has touch capability. |
747 TEST_F(VirtualKeyboardRootWindowControllerTest, | 755 TEST_F(VirtualKeyboardRootWindowControllerTest, |
748 VirtualKeyboardOnPrimaryRootWindowOnly) { | 756 VirtualKeyboardOnPrimaryRootWindowDefault) { |
749 if (!SupportsMultipleDisplays()) | 757 if (!SupportsMultipleDisplays()) |
750 return; | 758 return; |
751 | 759 |
752 UpdateDisplay("500x500,500x500"); | 760 UpdateDisplay("500x500,500x500"); |
753 | 761 |
754 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 762 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
755 aura::Window* primary_root_window = Shell::GetPrimaryRootWindow(); | 763 aura::Window* primary_root_window = Shell::GetPrimaryRootWindow(); |
756 aura::Window* secondary_root_window = root_windows[0] == primary_root_window | 764 aura::Window* secondary_root_window = root_windows[0] == primary_root_window |
757 ? root_windows[1] | 765 ? root_windows[1] |
758 : root_windows[0]; | 766 : root_windows[0]; |
759 | 767 |
760 ASSERT_TRUE(Shell::GetContainer(primary_root_window, | 768 ASSERT_TRUE(Shell::GetContainer(primary_root_window, |
761 kShellWindowId_VirtualKeyboardContainer)); | 769 kShellWindowId_VirtualKeyboardContainer)); |
762 ASSERT_FALSE(Shell::GetContainer(secondary_root_window, | 770 ASSERT_FALSE(Shell::GetContainer(secondary_root_window, |
763 kShellWindowId_VirtualKeyboardContainer)); | 771 kShellWindowId_VirtualKeyboardContainer)); |
764 } | 772 } |
765 | 773 |
| 774 // Test for http://crbug.com/303429. Virtual keyboard container should show on |
| 775 // a display which has touch capability. |
| 776 TEST_F(VirtualKeyboardRootWindowControllerTest, |
| 777 VirtualKeyboardOnTouchableDisplayOnly) { |
| 778 if (!SupportsMultipleDisplays()) |
| 779 return; |
| 780 |
| 781 UpdateDisplay("500x500,500x500"); |
| 782 display::Display secondary_display = |
| 783 Shell::GetInstance()->display_manager()->GetSecondaryDisplay(); |
| 784 display::test::DisplayManagerTestApi(Shell::GetInstance()->display_manager()) |
| 785 .SetTouchSupport(secondary_display.id(), |
| 786 display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE); |
| 787 |
| 788 // The primary display doesn't have touch capability and the secondary display |
| 789 // does. |
| 790 ASSERT_NE(display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE, |
| 791 display::Screen::GetScreen()->GetPrimaryDisplay().touch_support()); |
| 792 ASSERT_EQ(display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE, |
| 793 Shell::GetInstance() |
| 794 ->display_manager() |
| 795 ->GetSecondaryDisplay() |
| 796 .touch_support()); |
| 797 |
| 798 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 799 aura::Window* primary_root_window = Shell::GetPrimaryRootWindow(); |
| 800 aura::Window* secondary_root_window = root_windows[0] == primary_root_window |
| 801 ? root_windows[1] |
| 802 : root_windows[0]; |
| 803 |
| 804 keyboard::KeyboardController::GetInstance()->ShowKeyboard(false); |
| 805 ASSERT_FALSE(Shell::GetContainer(primary_root_window, |
| 806 kShellWindowId_VirtualKeyboardContainer)); |
| 807 ASSERT_TRUE(Shell::GetContainer(secondary_root_window, |
| 808 kShellWindowId_VirtualKeyboardContainer)); |
| 809 |
| 810 // Move the focus to the primary display. |
| 811 aura::Window* focusable_window_in_primary_display = |
| 812 CreateTestWindowInShellWithBounds( |
| 813 primary_root_window->GetBoundsInScreen()); |
| 814 ASSERT_EQ(primary_root_window, |
| 815 focusable_window_in_primary_display->GetRootWindow()); |
| 816 focusable_window_in_primary_display->Focus(); |
| 817 ASSERT_TRUE(focusable_window_in_primary_display->HasFocus()); |
| 818 |
| 819 // Virtual keyboard shows up on the secondary display even if a window in the |
| 820 // primary screen has the focus. |
| 821 keyboard::KeyboardController::GetInstance()->ShowKeyboard(false); |
| 822 EXPECT_FALSE(Shell::GetContainer(primary_root_window, |
| 823 kShellWindowId_VirtualKeyboardContainer)); |
| 824 EXPECT_TRUE(Shell::GetContainer(secondary_root_window, |
| 825 kShellWindowId_VirtualKeyboardContainer)); |
| 826 } |
| 827 |
| 828 // Test for http://crbug.com/303429. If both of displays have touch capability, |
| 829 // virtual keyboard follows the input focus. |
| 830 TEST_F(VirtualKeyboardRootWindowControllerTest, FollowInputFocus) { |
| 831 if (!SupportsMultipleDisplays()) |
| 832 return; |
| 833 |
| 834 UpdateDisplay("500x500,500x500"); |
| 835 const int64_t primary_display_id = |
| 836 display::Screen::GetScreen()->GetPrimaryDisplay().id(); |
| 837 display::test::DisplayManagerTestApi(Shell::GetInstance()->display_manager()) |
| 838 .SetTouchSupport(primary_display_id, |
| 839 display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE); |
| 840 const int64_t secondary_display_id = |
| 841 Shell::GetInstance()->display_manager()->GetSecondaryDisplay().id(); |
| 842 display::test::DisplayManagerTestApi(Shell::GetInstance()->display_manager()) |
| 843 .SetTouchSupport(secondary_display_id, |
| 844 display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE); |
| 845 |
| 846 // Both of displays have touch capability. |
| 847 ASSERT_EQ(display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE, |
| 848 display::Screen::GetScreen()->GetPrimaryDisplay().touch_support()); |
| 849 ASSERT_EQ(display::Display::TouchSupport::TOUCH_SUPPORT_AVAILABLE, |
| 850 Shell::GetInstance() |
| 851 ->display_manager() |
| 852 ->GetSecondaryDisplay() |
| 853 .touch_support()); |
| 854 |
| 855 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 856 aura::Window* primary_root_window = Shell::GetPrimaryRootWindow(); |
| 857 aura::Window* secondary_root_window = root_windows[0] == primary_root_window |
| 858 ? root_windows[1] |
| 859 : root_windows[0]; |
| 860 aura::Window* focusable_window_in_primary_display = |
| 861 CreateTestWindowInShellWithBounds( |
| 862 primary_root_window->GetBoundsInScreen()); |
| 863 ASSERT_EQ(primary_root_window, |
| 864 focusable_window_in_primary_display->GetRootWindow()); |
| 865 aura::Window* focusable_window_in_secondary_display = |
| 866 CreateTestWindowInShellWithBounds( |
| 867 secondary_root_window->GetBoundsInScreen()); |
| 868 ASSERT_EQ(secondary_root_window, |
| 869 focusable_window_in_secondary_display->GetRootWindow()); |
| 870 |
| 871 keyboard::KeyboardController::GetInstance()->ShowKeyboard(false); |
| 872 EXPECT_TRUE(Shell::GetContainer(primary_root_window, |
| 873 kShellWindowId_VirtualKeyboardContainer)); |
| 874 EXPECT_FALSE(Shell::GetContainer(secondary_root_window, |
| 875 kShellWindowId_VirtualKeyboardContainer)); |
| 876 |
| 877 // Move the focus to the secondary display. |
| 878 focusable_window_in_secondary_display->Focus(); |
| 879 ASSERT_TRUE(focusable_window_in_secondary_display->HasFocus()); |
| 880 |
| 881 keyboard::KeyboardController::GetInstance()->ShowKeyboard(false); |
| 882 ASSERT_FALSE(Shell::GetContainer(primary_root_window, |
| 883 kShellWindowId_VirtualKeyboardContainer)); |
| 884 ASSERT_TRUE(Shell::GetContainer(secondary_root_window, |
| 885 kShellWindowId_VirtualKeyboardContainer)); |
| 886 |
| 887 // Move back focus to the primary display. |
| 888 focusable_window_in_primary_display->Focus(); |
| 889 ASSERT_TRUE(focusable_window_in_primary_display->HasFocus()); |
| 890 |
| 891 keyboard::KeyboardController::GetInstance()->ShowKeyboard(false); |
| 892 EXPECT_TRUE(Shell::GetContainer(primary_root_window, |
| 893 kShellWindowId_VirtualKeyboardContainer)); |
| 894 EXPECT_FALSE(Shell::GetContainer(secondary_root_window, |
| 895 kShellWindowId_VirtualKeyboardContainer)); |
| 896 } |
| 897 |
| 898 // Test for http://crbug.com/303429. Even if both of display don't have touch |
| 899 // capability, the virtual keyboard shows up on the specified display. |
| 900 TEST_F(VirtualKeyboardRootWindowControllerTest, |
| 901 VirtualKeyboardShowOnSpecifiedDisplay) { |
| 902 if (!SupportsMultipleDisplays()) |
| 903 return; |
| 904 |
| 905 UpdateDisplay("500x500,500x500"); |
| 906 display::Display secondary_display = |
| 907 Shell::GetInstance()->display_manager()->GetSecondaryDisplay(); |
| 908 |
| 909 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 910 aura::Window* primary_root_window = Shell::GetPrimaryRootWindow(); |
| 911 aura::Window* secondary_root_window = root_windows[0] == primary_root_window |
| 912 ? root_windows[1] |
| 913 : root_windows[0]; |
| 914 |
| 915 ASSERT_TRUE(Shell::GetContainer(primary_root_window, |
| 916 kShellWindowId_VirtualKeyboardContainer)); |
| 917 ASSERT_FALSE(Shell::GetContainer(secondary_root_window, |
| 918 kShellWindowId_VirtualKeyboardContainer)); |
| 919 |
| 920 const int64_t secondary_display_id = secondary_display.id(); |
| 921 keyboard::KeyboardController::GetInstance()->ShowKeyboardInDisplay( |
| 922 secondary_display_id); |
| 923 |
| 924 EXPECT_FALSE(Shell::GetContainer(primary_root_window, |
| 925 kShellWindowId_VirtualKeyboardContainer)); |
| 926 EXPECT_TRUE(Shell::GetContainer(secondary_root_window, |
| 927 kShellWindowId_VirtualKeyboardContainer)); |
| 928 } |
| 929 |
766 // Test for http://crbug.com/263599. Virtual keyboard should be able to receive | 930 // Test for http://crbug.com/263599. Virtual keyboard should be able to receive |
767 // events at blocked user session. | 931 // events at blocked user session. |
768 TEST_F(VirtualKeyboardRootWindowControllerTest, | 932 TEST_F(VirtualKeyboardRootWindowControllerTest, |
769 ClickVirtualKeyboardInBlockedWindow) { | 933 ClickVirtualKeyboardInBlockedWindow) { |
770 aura::Window* root_window = Shell::GetPrimaryRootWindow(); | 934 aura::Window* root_window = Shell::GetPrimaryRootWindow(); |
771 aura::Window* keyboard_container = | 935 aura::Window* keyboard_container = |
772 Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); | 936 Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); |
773 ASSERT_TRUE(keyboard_container); | 937 ASSERT_TRUE(keyboard_container); |
774 keyboard_container->Show(); | 938 keyboard_container->Show(); |
775 | 939 |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 keyboard_controller->ui()->GetKeyboardWindow()->SetBounds( | 1195 keyboard_controller->ui()->GetKeyboardWindow()->SetBounds( |
1032 gfx::Rect(0, 400, 800, 200)); | 1196 gfx::Rect(0, 400, 800, 200)); |
1033 EXPECT_EQ("0,400 800x200", keyboard_container->bounds().ToString()); | 1197 EXPECT_EQ("0,400 800x200", keyboard_container->bounds().ToString()); |
1034 | 1198 |
1035 UpdateDisplay("600x800"); | 1199 UpdateDisplay("600x800"); |
1036 EXPECT_EQ("0,600 600x200", keyboard_container->bounds().ToString()); | 1200 EXPECT_EQ("0,600 600x200", keyboard_container->bounds().ToString()); |
1037 } | 1201 } |
1038 | 1202 |
1039 } // namespace test | 1203 } // namespace test |
1040 } // namespace ash | 1204 } // namespace ash |
OLD | NEW |