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