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 "ash/session/session_state_delegate.h" | 7 #include "ash/session/session_state_delegate.h" |
8 #include "ash/shelf/shelf_layout_manager.h" | 8 #include "ash/shelf/shelf_layout_manager.h" |
9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
10 #include "ash/shell_window_ids.h" | 10 #include "ash/shell_window_ids.h" |
11 #include "ash/system/tray/system_tray_delegate.h" | 11 #include "ash/system/tray/system_tray_delegate.h" |
12 #include "ash/test/ash_test_base.h" | 12 #include "ash/test/ash_test_base.h" |
13 #include "ash/wm/system_modal_container_layout_manager.h" | 13 #include "ash/wm/system_modal_container_layout_manager.h" |
14 #include "ash/wm/window_properties.h" | 14 #include "ash/wm/window_properties.h" |
15 #include "ash/wm/window_state.h" | 15 #include "ash/wm/window_state.h" |
16 #include "ash/wm/window_util.h" | 16 #include "ash/wm/window_util.h" |
17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
18 #include "base/memory/scoped_ptr.h" | |
18 #include "ui/aura/client/focus_change_observer.h" | 19 #include "ui/aura/client/focus_change_observer.h" |
19 #include "ui/aura/client/focus_client.h" | 20 #include "ui/aura/client/focus_client.h" |
20 #include "ui/aura/client/window_tree_client.h" | 21 #include "ui/aura/client/window_tree_client.h" |
21 #include "ui/aura/env.h" | 22 #include "ui/aura/env.h" |
22 #include "ui/aura/test/test_window_delegate.h" | 23 #include "ui/aura/test/test_window_delegate.h" |
23 #include "ui/aura/test/test_windows.h" | 24 #include "ui/aura/test/test_windows.h" |
24 #include "ui/aura/window.h" | 25 #include "ui/aura/window.h" |
25 #include "ui/aura/window_event_dispatcher.h" | 26 #include "ui/aura/window_event_dispatcher.h" |
26 #include "ui/aura/window_tracker.h" | 27 #include "ui/aura/window_tracker.h" |
27 #include "ui/base/ime/dummy_text_input_client.h" | 28 #include "ui/base/ime/dummy_text_input_client.h" |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
640 const gfx::Rect& visible_rect() const { | 641 const gfx::Rect& visible_rect() const { |
641 return visible_rect_; | 642 return visible_rect_; |
642 } | 643 } |
643 | 644 |
644 private: | 645 private: |
645 gfx::Rect visible_rect_; | 646 gfx::Rect visible_rect_; |
646 | 647 |
647 DISALLOW_COPY_AND_ASSIGN(MockTextInputClient); | 648 DISALLOW_COPY_AND_ASSIGN(MockTextInputClient); |
648 }; | 649 }; |
649 | 650 |
651 class TargetHitTestEventHandler : public ui::test::TestEventHandler { | |
652 public: | |
653 TargetHitTestEventHandler() {} | |
654 | |
655 // ui::test::TestEventHandler overrides. | |
656 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { | |
657 if (event->type() == ui::ET_MOUSE_PRESSED) | |
658 ui::test::TestEventHandler::OnMouseEvent(event); | |
659 event->StopPropagation(); | |
660 } | |
661 | |
662 private: | |
663 DISALLOW_COPY_AND_ASSIGN(TargetHitTestEventHandler); | |
664 }; | |
665 | |
650 // Test for http://crbug.com/297858. Virtual keyboard container should only show | 666 // Test for http://crbug.com/297858. Virtual keyboard container should only show |
651 // on primary root window. | 667 // on primary root window. |
652 TEST_F(VirtualKeyboardRootWindowControllerTest, | 668 TEST_F(VirtualKeyboardRootWindowControllerTest, |
653 VirtualKeyboardOnPrimaryRootWindowOnly) { | 669 VirtualKeyboardOnPrimaryRootWindowOnly) { |
654 if (!SupportsMultipleDisplays()) | 670 if (!SupportsMultipleDisplays()) |
655 return; | 671 return; |
656 | 672 |
657 UpdateDisplay("500x500,500x500"); | 673 UpdateDisplay("500x500,500x500"); |
658 | 674 |
659 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 675 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
834 text_input_client.visible_rect().height()); | 850 text_input_client.visible_rect().height()); |
835 | 851 |
836 if (switches::IsTextInputFocusManagerEnabled()) { | 852 if (switches::IsTextInputFocusManagerEnabled()) { |
837 ui::TextInputFocusManager::GetInstance()->BlurTextInputClient( | 853 ui::TextInputFocusManager::GetInstance()->BlurTextInputClient( |
838 &text_input_client); | 854 &text_input_client); |
839 } else { | 855 } else { |
840 input_method->SetFocusedTextInputClient(NULL); | 856 input_method->SetFocusedTextInputClient(NULL); |
841 } | 857 } |
842 } | 858 } |
843 | 859 |
860 // Tests that the virtual keyboard does not block context menus. The virtual | |
861 // keyboard should appear in front of most content, but not context menus. See | |
862 // crbug/377180. | |
863 TEST_F(VirtualKeyboardRootWindowControllerTest, ZOrderTest) { | |
864 UpdateDisplay("800x600"); | |
865 keyboard::KeyboardController* keyboard_controller = | |
866 keyboard::KeyboardController::GetInstance(); | |
867 keyboard::KeyboardControllerProxy* proxy = keyboard_controller->proxy(); | |
868 | |
869 aura::Window* root_window = Shell::GetPrimaryRootWindow(); | |
870 aura::Window* keyboard_container = | |
871 Shell::GetContainer(root_window, kShellWindowId_VirtualKeyboardContainer); | |
872 ASSERT_TRUE(keyboard_container); | |
873 keyboard_container->Show(); | |
874 | |
875 const int keyboard_height = 200; | |
876 aura::Window* keyboard_window = proxy->GetKeyboardWindow(); | |
877 keyboard_container->AddChild(keyboard_window); | |
878 keyboard_window->set_owned_by_parent(false); | |
879 gfx::Rect keyboard_bounds = keyboard::KeyboardBoundsFromWindowBounds( | |
880 keyboard_container->bounds(), keyboard_height); | |
881 keyboard_window->SetBounds(keyboard_bounds); | |
882 keyboard_window->Show(); | |
883 | |
884 ui::test::EventGenerator generator(root_window); | |
885 | |
886 // Cover the screen with two windows: a normal window on the left side and a | |
887 // context menu on the right side. When the virtual keyboard is displayed it | |
888 // partially occludes the normal window, but not the context menu. Compute | |
889 // positions for generating synthetic click events to perform hit tests, | |
890 // ensuring the correct window layering. 'top' is above the VK, whereas | |
891 // 'bottom' lies within the VK. 'left' is centered in the normal window, and | |
892 // 'right' is centered in the context menu. | |
James Cook
2014/09/15 17:45:20
Very helpful, thanks!
| |
893 int window_height = keyboard_bounds.bottom(); | |
894 int window_width = keyboard_bounds.width() / 2; | |
895 int left = window_width / 2; | |
896 int right = 3 * window_width / 2; | |
897 int top = keyboard_bounds.y() / 2; | |
898 int bottom = window_height - keyboard_height / 2; | |
899 | |
900 // Normal window is partially occluded by the virtual keyboard. | |
901 aura::test::TestWindowDelegate delegate; | |
902 scoped_ptr<aura::Window> normal(CreateTestWindowInShellWithDelegateAndType( | |
903 &delegate, | |
904 ui::wm::WINDOW_TYPE_NORMAL, | |
905 0, | |
906 gfx::Rect(0, 0, window_width, window_height))); | |
907 normal->set_owned_by_parent(false); | |
908 normal->Show(); | |
909 TargetHitTestEventHandler normal_handler; | |
910 normal->AddPreTargetHandler(&normal_handler); | |
911 | |
912 // Test that only the click on the top portion of the window is picked up. The | |
913 // click on the bottom hits the virtual keyboard instead. | |
914 generator.MoveMouseTo(left, top); | |
915 generator.ClickLeftButton(); | |
916 EXPECT_EQ(1, normal_handler.num_mouse_events()); | |
917 generator.MoveMouseTo(left, bottom); | |
918 generator.ClickLeftButton(); | |
919 EXPECT_EQ(1, normal_handler.num_mouse_events()); | |
920 | |
921 // Menu overlaps virtual keyboard. | |
922 aura::test::TestWindowDelegate delegate2; | |
923 scoped_ptr<aura::Window> menu(CreateTestWindowInShellWithDelegateAndType( | |
924 &delegate2, | |
925 ui::wm::WINDOW_TYPE_MENU, | |
926 0, | |
927 gfx::Rect(window_width, 0, window_width, window_height))); | |
928 menu->set_owned_by_parent(false); | |
929 menu->Show(); | |
930 TargetHitTestEventHandler menu_handler; | |
931 menu->AddPreTargetHandler(&menu_handler); | |
932 | |
933 // Test that both clicks register. | |
934 generator.MoveMouseTo(right, top); | |
935 generator.ClickLeftButton(); | |
936 EXPECT_EQ(1, menu_handler.num_mouse_events()); | |
937 generator.MoveMouseTo(right, bottom); | |
938 generator.ClickLeftButton(); | |
939 EXPECT_EQ(2, menu_handler.num_mouse_events()); | |
940 | |
941 // Cleanup to ensure that the test windows are destroyed before their | |
942 // delegates. | |
943 normal.reset(); | |
944 menu.reset(); | |
James Cook
2014/09/15 17:45:20
You don't need these, they clean up themselves and
kevers
2014/09/15 18:13:04
Without the explicit resets, the test crashes. My
James Cook
2014/09/15 20:00:05
Ah. I should have read the comments in more detail
| |
945 } | |
946 | |
844 } // namespace test | 947 } // namespace test |
845 } // namespace ash | 948 } // namespace ash |
OLD | NEW |