| 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 |