| 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 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 |
| 840 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 867 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
| 841 } | 868 } |
| 842 | 869 |
| 843 class StickyKeysMouseDispatchTest | 870 class StickyKeysMouseDispatchTest |
| 844 : public StickyKeysTest, | 871 : public StickyKeysTest, |
| 845 public ::testing::WithParamInterface<int> { | 872 public ::testing::WithParamInterface<int> { |
| 846 }; | 873 }; |
| 847 | 874 |
| 848 TEST_P(StickyKeysMouseDispatchTest, MouseEventDispatchImpl) { | 875 TEST_P(StickyKeysMouseDispatchTest, MouseEventDispatchImpl) { |
| 849 int scale_factor = GetParam(); | 876 int scale_factor = GetParam(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 buffer.PopEvents(&events); | 910 buffer.PopEvents(&events); |
| 884 EXPECT_EQ(2u, events.size()); | 911 EXPECT_EQ(2u, events.size()); |
| 885 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); | 912 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
| 886 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 913 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 887 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 914 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 888 EXPECT_EQ(dip_location.ToString(), | 915 EXPECT_EQ(dip_location.ToString(), |
| 889 static_cast<ui::MouseEvent*>(events[0])->location().ToString()); | 916 static_cast<ui::MouseEvent*>(events[0])->location().ToString()); |
| 890 EXPECT_EQ(ui::VKEY_CONTROL, | 917 EXPECT_EQ(ui::VKEY_CONTROL, |
| 891 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 918 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 892 | 919 |
| 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 |
| 893 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 935 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
| 894 } | 936 } |
| 895 | 937 |
| 896 TEST_P(StickyKeysMouseDispatchTest, MouseWheelEventDispatchImpl) { | 938 TEST_P(StickyKeysMouseDispatchTest, MouseWheelEventDispatchImpl) { |
| 897 int scale_factor = GetParam(); | 939 int scale_factor = GetParam(); |
| 898 std::ostringstream display_specs; | 940 std::ostringstream display_specs; |
| 899 display_specs << "1280x1024*" << scale_factor; | 941 display_specs << "1280x1024*" << scale_factor; |
| 900 UpdateDisplay(display_specs.str()); | 942 UpdateDisplay(display_specs.str()); |
| 901 | 943 |
| 902 // Test the actual mouse wheel event dispatch implementation. | 944 // 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); | 979 buffer.PopEvents(&events); |
| 938 EXPECT_EQ(2u, events.size()); | 980 EXPECT_EQ(2u, events.size()); |
| 939 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | 981 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| 940 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta / scale_factor, | 982 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta / scale_factor, |
| 941 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); | 983 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
| 942 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 984 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 943 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 985 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 944 EXPECT_EQ(ui::VKEY_CONTROL, | 986 EXPECT_EQ(ui::VKEY_CONTROL, |
| 945 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 987 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 946 | 988 |
| 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 |
| 947 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 1006 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
| 948 } | 1007 } |
| 949 | 1008 |
| 950 INSTANTIATE_TEST_CASE_P(DPIScaleFactors, | 1009 INSTANTIATE_TEST_CASE_P(DPIScaleFactors, |
| 951 StickyKeysMouseDispatchTest, | 1010 StickyKeysMouseDispatchTest, |
| 952 ::testing::Values(1, 2)); | 1011 ::testing::Values(1, 2)); |
| 953 | 1012 |
| 954 } // namespace ash | 1013 } // namespace ash |
| OLD | NEW |