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 "ash/sticky_keys/sticky_keys_controller.h" | 5 #include "ash/sticky_keys/sticky_keys_controller.h" |
6 | 6 |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 #undef None | 8 #undef None |
9 #undef Bool | 9 #undef Bool |
10 #undef RootWindow | 10 #undef RootWindow |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 bool is_key_press, ui::KeyboardCode code) { | 238 bool is_key_press, ui::KeyboardCode code) { |
239 ui::KeyEvent* event = new ui::KeyEvent( | 239 ui::KeyEvent* event = new ui::KeyEvent( |
240 is_key_press ? ui::ET_KEY_PRESSED : ui::ET_MOUSE_RELEASED, | 240 is_key_press ? ui::ET_KEY_PRESSED : ui::ET_MOUSE_RELEASED, |
241 code, 0, true); | 241 code, 0, true); |
242 ui::Event::DispatcherApi dispatcher(event); | 242 ui::Event::DispatcherApi dispatcher(event); |
243 dispatcher.set_target(target_); | 243 dispatcher.set_target(target_); |
244 return event; | 244 return event; |
245 } | 245 } |
246 | 246 |
247 // Creates a synthesized MouseEvent that is not backed by a native event. | 247 // Creates a synthesized MouseEvent that is not backed by a native event. |
248 ui::MouseEvent* GenerateSynthesizedMouseEvent(bool is_button_press) { | 248 ui::MouseEvent* GenerateSynthesizedMouseEventAt(ui::EventType event_type, |
249 ui::MouseEvent* event = new ui::MouseEvent( | 249 const gfx::Point& location) { |
250 is_button_press ? ui::ET_MOUSE_PRESSED : ui::ET_MOUSE_RELEASED, | 250 ui::MouseEvent* event = new ui::MouseEvent(event_type, |
251 gfx::Point(0, 0), | 251 location, |
252 gfx::Point(0, 0), | 252 location, |
253 ui::EF_LEFT_MOUSE_BUTTON, | 253 ui::EF_LEFT_MOUSE_BUTTON, |
254 ui::EF_LEFT_MOUSE_BUTTON); | 254 ui::EF_LEFT_MOUSE_BUTTON); |
255 ui::Event::DispatcherApi dispatcher(event); | 255 ui::Event::DispatcherApi dispatcher(event); |
256 dispatcher.set_target(target_); | 256 dispatcher.set_target(target_); |
257 return event; | 257 return event; |
258 } | 258 } |
259 | 259 |
| 260 // Creates a synthesized mouse press or release event. |
| 261 ui::MouseEvent* GenerateSynthesizedMouseClickEvent( |
| 262 bool is_button_press, |
| 263 const gfx::Point& location) { |
| 264 return GenerateSynthesizedMouseEventAt( |
| 265 is_button_press ? ui::ET_MOUSE_PRESSED : ui::ET_MOUSE_RELEASED, |
| 266 location); |
| 267 } |
| 268 |
260 // Creates a synthesized ET_MOUSE_MOVED event. | 269 // Creates a synthesized ET_MOUSE_MOVED event. |
261 ui::MouseEvent* GenerateSynthesizedMouseEvent(int x, int y) { | 270 ui::MouseEvent* GenerateSynthesizedMouseMoveEvent( |
262 ui::MouseEvent* event = new ui::MouseEvent( | 271 const gfx::Point& location) { |
263 ui::ET_MOUSE_MOVED, | 272 return GenerateSynthesizedMouseEventAt(ui::ET_MOUSE_MOVED, location); |
264 gfx::Point(x, y), | 273 } |
265 gfx::Point(x, y), | 274 |
266 ui::EF_LEFT_MOUSE_BUTTON, | 275 // Creates a synthesized MouseWHeel event. |
267 ui::EF_LEFT_MOUSE_BUTTON); | 276 ui::MouseWheelEvent* GenerateSynthesizedMouseWheelEvent(int wheel_delta) { |
| 277 scoped_ptr<ui::MouseEvent> mev( |
| 278 GenerateSynthesizedMouseEventAt(ui::ET_MOUSEWHEEL, gfx::Point(0, 0))); |
| 279 ui::MouseWheelEvent* event = new ui::MouseWheelEvent(*mev, 0, wheel_delta); |
268 ui::Event::DispatcherApi dispatcher(event); | 280 ui::Event::DispatcherApi dispatcher(event); |
269 dispatcher.set_target(target_); | 281 dispatcher.set_target(target_); |
270 return event; | 282 return event; |
271 } | 283 } |
272 | 284 |
273 void SendActivateStickyKeyPattern(StickyKeysHandler* handler, | 285 void SendActivateStickyKeyPattern(StickyKeysHandler* handler, |
274 ui::KeyboardCode key_code) { | 286 ui::KeyboardCode key_code) { |
275 scoped_ptr<ui::KeyEvent> ev; | 287 scoped_ptr<ui::KeyEvent> ev; |
276 ev.reset(GenerateKey(true, key_code)); | 288 ev.reset(GenerateKey(true, key_code)); |
277 handler->HandleKeyEvent(ev.get()); | 289 handler->HandleKeyEvent(ev.get()); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 scoped_ptr<ui::MouseEvent> mev; | 496 scoped_ptr<ui::MouseEvent> mev; |
485 MockStickyKeysHandlerDelegate* mock_delegate = | 497 MockStickyKeysHandlerDelegate* mock_delegate = |
486 new MockStickyKeysHandlerDelegate(this); | 498 new MockStickyKeysHandlerDelegate(this); |
487 StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); | 499 StickyKeysHandler sticky_key(ui::EF_CONTROL_DOWN, mock_delegate); |
488 | 500 |
489 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); | 501 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); |
490 | 502 |
491 // Press ctrl and handle mouse move events. | 503 // Press ctrl and handle mouse move events. |
492 kev.reset(GenerateKey(true, ui::VKEY_CONTROL)); | 504 kev.reset(GenerateKey(true, ui::VKEY_CONTROL)); |
493 sticky_key.HandleKeyEvent(kev.get()); | 505 sticky_key.HandleKeyEvent(kev.get()); |
494 mev.reset(GenerateSynthesizedMouseEvent(0, 0)); | 506 mev.reset(GenerateSynthesizedMouseMoveEvent(gfx::Point(0, 0))); |
495 sticky_key.HandleMouseEvent(mev.get()); | 507 sticky_key.HandleMouseEvent(mev.get()); |
496 mev.reset(GenerateSynthesizedMouseEvent(100, 100)); | 508 mev.reset(GenerateSynthesizedMouseMoveEvent(gfx::Point(100, 100))); |
497 sticky_key.HandleMouseEvent(mev.get()); | 509 sticky_key.HandleMouseEvent(mev.get()); |
498 | 510 |
499 // Sticky keys should be enabled afterwards. | 511 // Sticky keys should be enabled afterwards. |
500 kev.reset(GenerateKey(false, ui::VKEY_CONTROL)); | 512 kev.reset(GenerateKey(false, ui::VKEY_CONTROL)); |
501 sticky_key.HandleKeyEvent(kev.get()); | 513 sticky_key.HandleKeyEvent(kev.get()); |
502 EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state()); | 514 EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state()); |
503 } | 515 } |
504 | 516 |
505 TEST_F(StickyKeysTest, NormalModifiedScrollTest) { | 517 TEST_F(StickyKeysTest, NormalModifiedScrollTest) { |
506 scoped_ptr<ui::KeyEvent> kev; | 518 scoped_ptr<ui::KeyEvent> kev; |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 kev.reset(GenerateSynthesizedKeyEvent(false, ui::VKEY_K)); | 794 kev.reset(GenerateSynthesizedKeyEvent(false, ui::VKEY_K)); |
783 sticky_key.HandleKeyEvent(kev.get()); | 795 sticky_key.HandleKeyEvent(kev.get()); |
784 EXPECT_FALSE(kev->flags() & ui::EF_CONTROL_DOWN); | 796 EXPECT_FALSE(kev->flags() & ui::EF_CONTROL_DOWN); |
785 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); | 797 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); |
786 | 798 |
787 // Test non-native mouse events. | 799 // Test non-native mouse events. |
788 SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); | 800 SendActivateStickyKeyPattern(&sticky_key, ui::VKEY_CONTROL); |
789 EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state()); | 801 EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state()); |
790 | 802 |
791 scoped_ptr<ui::MouseEvent> mev; | 803 scoped_ptr<ui::MouseEvent> mev; |
792 mev.reset(GenerateSynthesizedMouseEvent(true)); | 804 mev.reset(GenerateSynthesizedMouseClickEvent(true, gfx::Point(0, 0))); |
793 sticky_key.HandleMouseEvent(mev.get()); | 805 sticky_key.HandleMouseEvent(mev.get()); |
794 EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); | 806 EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); |
795 EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state()); | 807 EXPECT_EQ(STICKY_KEY_STATE_ENABLED, sticky_key.current_state()); |
796 | 808 |
797 mev.reset(GenerateSynthesizedMouseEvent(false)); | 809 mev.reset(GenerateSynthesizedMouseClickEvent(false, gfx::Point(0, 0))); |
798 sticky_key.HandleMouseEvent(mev.get()); | 810 sticky_key.HandleMouseEvent(mev.get()); |
799 EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); | 811 EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); |
800 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); | 812 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); |
801 } | 813 } |
802 | 814 |
803 TEST_F(StickyKeysTest, KeyEventDispatchImpl) { | 815 TEST_F(StickyKeysTest, KeyEventDispatchImpl) { |
804 // Test the actual key event dispatch implementation. | 816 // Test the actual key event dispatch implementation. |
805 EventBuffer buffer; | 817 EventBuffer buffer; |
806 ScopedVector<ui::Event> events; | 818 ScopedVector<ui::Event> events; |
807 ui::EventProcessor* dispatcher = | 819 ui::EventProcessor* dispatcher = |
(...skipping 22 matching lines...) Expand all Loading... |
830 ev.reset(GenerateKey(false, ui::VKEY_C)); | 842 ev.reset(GenerateKey(false, ui::VKEY_C)); |
831 details = dispatcher->OnEventFromSource(ev.get()); | 843 details = dispatcher->OnEventFromSource(ev.get()); |
832 ASSERT_FALSE(details.dispatcher_destroyed); | 844 ASSERT_FALSE(details.dispatcher_destroyed); |
833 buffer.PopEvents(&events); | 845 buffer.PopEvents(&events); |
834 EXPECT_EQ(1u, events.size()); | 846 EXPECT_EQ(1u, events.size()); |
835 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); | 847 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); |
836 EXPECT_EQ(ui::VKEY_C, | 848 EXPECT_EQ(ui::VKEY_C, |
837 static_cast<ui::KeyEvent*>(events[0])->key_code()); | 849 static_cast<ui::KeyEvent*>(events[0])->key_code()); |
838 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 850 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
839 | 851 |
| 852 // Test that synthesized key events are dispatched correctly. |
| 853 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 854 buffer.PopEvents(&events); |
| 855 scoped_ptr<ui::KeyEvent> kev; |
| 856 kev.reset(GenerateSynthesizedKeyEvent(true, ui::VKEY_K)); |
| 857 details = dispatcher->OnEventFromSource(kev.get()); |
| 858 ASSERT_FALSE(details.dispatcher_destroyed); |
| 859 buffer.PopEvents(&events); |
| 860 EXPECT_EQ(2u, events.size()); |
| 861 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| 862 EXPECT_EQ(ui::VKEY_K, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 863 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 864 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 865 EXPECT_EQ(ui::VKEY_CONTROL, |
| 866 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 867 |
840 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 868 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
841 } | 869 } |
842 | 870 |
843 class StickyKeysMouseDispatchTest | 871 class StickyKeysMouseDispatchTest |
844 : public StickyKeysTest, | 872 : public StickyKeysTest, |
845 public ::testing::WithParamInterface<int> { | 873 public ::testing::WithParamInterface<int> { |
846 }; | 874 }; |
847 | 875 |
848 TEST_P(StickyKeysMouseDispatchTest, MouseEventDispatchImpl) { | 876 TEST_P(StickyKeysMouseDispatchTest, MouseEventDispatchImpl) { |
849 int scale_factor = GetParam(); | 877 int scale_factor = GetParam(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 buffer.PopEvents(&events); | 911 buffer.PopEvents(&events); |
884 EXPECT_EQ(2u, events.size()); | 912 EXPECT_EQ(2u, events.size()); |
885 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); | 913 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
886 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 914 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
887 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 915 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
888 EXPECT_EQ(dip_location.ToString(), | 916 EXPECT_EQ(dip_location.ToString(), |
889 static_cast<ui::MouseEvent*>(events[0])->location().ToString()); | 917 static_cast<ui::MouseEvent*>(events[0])->location().ToString()); |
890 EXPECT_EQ(ui::VKEY_CONTROL, | 918 EXPECT_EQ(ui::VKEY_CONTROL, |
891 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 919 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
892 | 920 |
| 921 // Test synthesized mouse events are dispatched correctly. |
| 922 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 923 buffer.PopEvents(&events); |
| 924 ev.reset(GenerateSynthesizedMouseClickEvent(false, physical_location)); |
| 925 details = dispatcher->OnEventFromSource(ev.get()); |
| 926 ASSERT_FALSE(details.dispatcher_destroyed); |
| 927 buffer.PopEvents(&events); |
| 928 EXPECT_EQ(2u, events.size()); |
| 929 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
| 930 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 931 EXPECT_EQ(dip_location.ToString(), |
| 932 static_cast<ui::MouseEvent*>(events[0])->location().ToString()); |
| 933 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 934 EXPECT_EQ(ui::VKEY_CONTROL, |
| 935 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 936 |
893 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 937 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
894 } | 938 } |
895 | 939 |
896 TEST_P(StickyKeysMouseDispatchTest, MouseWheelEventDispatchImpl) { | 940 TEST_P(StickyKeysMouseDispatchTest, MouseWheelEventDispatchImpl) { |
897 int scale_factor = GetParam(); | 941 int scale_factor = GetParam(); |
898 std::ostringstream display_specs; | 942 std::ostringstream display_specs; |
899 display_specs << "1280x1024*" << scale_factor; | 943 display_specs << "1280x1024*" << scale_factor; |
900 UpdateDisplay(display_specs.str()); | 944 UpdateDisplay(display_specs.str()); |
901 | 945 |
902 // Test the actual mouse wheel event dispatch implementation. | 946 // Test the actual mouse wheel event dispatch implementation. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 buffer.PopEvents(&events); | 981 buffer.PopEvents(&events); |
938 EXPECT_EQ(2u, events.size()); | 982 EXPECT_EQ(2u, events.size()); |
939 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | 983 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
940 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta / scale_factor, | 984 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta / scale_factor, |
941 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); | 985 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
942 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 986 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
943 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 987 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
944 EXPECT_EQ(ui::VKEY_CONTROL, | 988 EXPECT_EQ(ui::VKEY_CONTROL, |
945 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 989 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
946 | 990 |
| 991 // Test synthesized mouse wheel events are dispatched correctly. |
| 992 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 993 buffer.PopEvents(&events); |
| 994 ev.reset( |
| 995 GenerateSynthesizedMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta)); |
| 996 details = dispatcher->OnEventFromSource(ev.get()); |
| 997 ASSERT_FALSE(details.dispatcher_destroyed); |
| 998 buffer.PopEvents(&events); |
| 999 EXPECT_EQ(2u, events.size()); |
| 1000 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| 1001 EXPECT_EQ(ui::MouseWheelEvent::kWheelDelta / scale_factor, |
| 1002 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
| 1003 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1004 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1005 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 1006 EXPECT_EQ(ui::VKEY_CONTROL, |
| 1007 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 1008 |
947 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 1009 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
948 } | 1010 } |
949 | 1011 |
950 INSTANTIATE_TEST_CASE_P(DPIScaleFactors, | 1012 INSTANTIATE_TEST_CASE_P(DPIScaleFactors, |
951 StickyKeysMouseDispatchTest, | 1013 StickyKeysMouseDispatchTest, |
952 ::testing::Values(1, 2)); | 1014 ::testing::Values(1, 2)); |
953 | 1015 |
954 } // namespace ash | 1016 } // namespace ash |
OLD | NEW |