| 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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 257 |
| 258 void SendActivateStickyKeyPattern(StickyKeysHandler* handler, | 258 void SendActivateStickyKeyPattern(StickyKeysHandler* handler, |
| 259 ui::KeyboardCode key_code) { | 259 ui::KeyboardCode key_code) { |
| 260 scoped_ptr<ui::KeyEvent> ev; | 260 scoped_ptr<ui::KeyEvent> ev; |
| 261 ev.reset(GenerateKey(true, key_code)); | 261 ev.reset(GenerateKey(true, key_code)); |
| 262 handler->HandleKeyEvent(ev.get()); | 262 handler->HandleKeyEvent(ev.get()); |
| 263 ev.reset(GenerateKey(false, key_code)); | 263 ev.reset(GenerateKey(false, key_code)); |
| 264 handler->HandleKeyEvent(ev.get()); | 264 handler->HandleKeyEvent(ev.get()); |
| 265 } | 265 } |
| 266 | 266 |
| 267 void SendActivateStickyKeyPattern(aura::WindowTreeHostDelegate* delegate, | 267 void SendActivateStickyKeyPattern(aura::WindowEventDispatcher* dispatcher, |
| 268 ui::KeyboardCode key_code) { | 268 ui::KeyboardCode key_code) { |
| 269 scoped_ptr<ui::KeyEvent> ev; | 269 scoped_ptr<ui::KeyEvent> ev; |
| 270 ev.reset(GenerateKey(true, key_code)); | 270 ev.reset(GenerateKey(true, key_code)); |
| 271 delegate->OnHostKeyEvent(ev.get()); | 271 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(ev.get()); |
| 272 CHECK(!details.dispatcher_destroyed); |
| 272 ev.reset(GenerateKey(false, key_code)); | 273 ev.reset(GenerateKey(false, key_code)); |
| 273 delegate->OnHostKeyEvent(ev.get()); | 274 details = dispatcher->OnEventFromSource(ev.get()); |
| 275 CHECK(!details.dispatcher_destroyed); |
| 274 } | 276 } |
| 275 | 277 |
| 276 aura::Window* target() { return target_; } | 278 aura::Window* target() { return target_; } |
| 277 | 279 |
| 278 private: | 280 private: |
| 279 // Owned by root window of shell, but we can still delete |target_| safely. | 281 // Owned by root window of shell, but we can still delete |target_| safely. |
| 280 aura::Window* target_; | 282 aura::Window* target_; |
| 281 // The root window of |target_|. Not owned. | 283 // The root window of |target_|. Not owned. |
| 282 aura::Window* root_window_; | 284 aura::Window* root_window_; |
| 283 | 285 |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 mev.reset(GenerateSynthesizedMouseEvent(false)); | 787 mev.reset(GenerateSynthesizedMouseEvent(false)); |
| 786 sticky_key.HandleMouseEvent(mev.get()); | 788 sticky_key.HandleMouseEvent(mev.get()); |
| 787 EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); | 789 EXPECT_TRUE(mev->flags() & ui::EF_CONTROL_DOWN); |
| 788 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); | 790 EXPECT_EQ(STICKY_KEY_STATE_DISABLED, sticky_key.current_state()); |
| 789 } | 791 } |
| 790 | 792 |
| 791 TEST_F(StickyKeysTest, KeyEventDispatchImpl) { | 793 TEST_F(StickyKeysTest, KeyEventDispatchImpl) { |
| 792 // Test the actual key event dispatch implementation. | 794 // Test the actual key event dispatch implementation. |
| 793 EventBuffer buffer; | 795 EventBuffer buffer; |
| 794 ScopedVector<ui::Event> events; | 796 ScopedVector<ui::Event> events; |
| 795 aura::WindowTreeHostDelegate* delegate = Shell::GetPrimaryRootWindow() | 797 aura::WindowEventDispatcher* dispatcher = Shell::GetPrimaryRootWindow() |
| 796 ->GetDispatcher()->AsWindowTreeHostDelegate(); | 798 ->GetDispatcher(); |
| 797 Shell::GetInstance()->AddPreTargetHandler(&buffer); | 799 Shell::GetInstance()->AddPreTargetHandler(&buffer); |
| 798 Shell::GetInstance()->sticky_keys_controller()->Enable(true); | 800 Shell::GetInstance()->sticky_keys_controller()->Enable(true); |
| 799 | 801 |
| 800 SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); | 802 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 801 scoped_ptr<ui::KeyEvent> ev; | 803 scoped_ptr<ui::KeyEvent> ev; |
| 802 buffer.PopEvents(&events); | 804 buffer.PopEvents(&events); |
| 803 | 805 |
| 804 // Test key press event is correctly modified and modifier release | 806 // Test key press event is correctly modified and modifier release |
| 805 // event is sent. | 807 // event is sent. |
| 806 ev.reset(GenerateKey(true, ui::VKEY_C)); | 808 ev.reset(GenerateKey(true, ui::VKEY_C)); |
| 807 delegate->OnHostKeyEvent(ev.get()); | 809 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(ev.get()); |
| 808 buffer.PopEvents(&events); | 810 buffer.PopEvents(&events); |
| 809 EXPECT_EQ(2u, events.size()); | 811 EXPECT_EQ(2u, events.size()); |
| 810 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | 812 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| 811 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | 813 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 812 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 814 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 813 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 815 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 814 EXPECT_EQ(ui::VKEY_CONTROL, | 816 EXPECT_EQ(ui::VKEY_CONTROL, |
| 815 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 817 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 816 | 818 |
| 817 // Test key release event is not modified. | 819 // Test key release event is not modified. |
| 818 ev.reset(GenerateKey(false, ui::VKEY_C)); | 820 ev.reset(GenerateKey(false, ui::VKEY_C)); |
| 819 delegate->OnHostKeyEvent(ev.get()); | 821 details = dispatcher->OnEventFromSource(ev.get()); |
| 822 ASSERT_FALSE(details.dispatcher_destroyed); |
| 820 buffer.PopEvents(&events); | 823 buffer.PopEvents(&events); |
| 821 EXPECT_EQ(1u, events.size()); | 824 EXPECT_EQ(1u, events.size()); |
| 822 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); | 825 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); |
| 823 EXPECT_EQ(ui::VKEY_C, | 826 EXPECT_EQ(ui::VKEY_C, |
| 824 static_cast<ui::KeyEvent*>(events[0])->key_code()); | 827 static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 825 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 828 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 826 | 829 |
| 827 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 830 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
| 828 } | 831 } |
| 829 | 832 |
| 830 TEST_F(StickyKeysTest, MouseEventDispatchImpl) { | 833 TEST_F(StickyKeysTest, MouseEventDispatchImpl) { |
| 831 // Test the actual sticky mouse event dispatch implementation. | 834 // Test the actual sticky mouse event dispatch implementation. |
| 832 EventBuffer buffer; | 835 EventBuffer buffer; |
| 833 ScopedVector<ui::Event> events; | 836 ScopedVector<ui::Event> events; |
| 834 aura::WindowTreeHostDelegate* delegate = Shell::GetPrimaryRootWindow() | 837 aura::WindowEventDispatcher* dispatcher = Shell::GetPrimaryRootWindow() |
| 835 ->GetDispatcher()->AsWindowTreeHostDelegate(); | 838 ->GetDispatcher(); |
| 836 Shell::GetInstance()->AddPreTargetHandler(&buffer); | 839 Shell::GetInstance()->AddPreTargetHandler(&buffer); |
| 837 Shell::GetInstance()->sticky_keys_controller()->Enable(true); | 840 Shell::GetInstance()->sticky_keys_controller()->Enable(true); |
| 838 | 841 |
| 839 scoped_ptr<ui::MouseEvent> ev; | 842 scoped_ptr<ui::MouseEvent> ev; |
| 840 SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); | 843 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 841 buffer.PopEvents(&events); | 844 buffer.PopEvents(&events); |
| 842 | 845 |
| 843 // Test mouse press event is correctly modified. | 846 // Test mouse press event is correctly modified. |
| 844 ev.reset(GenerateMouseEvent(true)); | 847 ev.reset(GenerateMouseEvent(true)); |
| 845 delegate->OnHostMouseEvent(ev.get()); | 848 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(ev.get()); |
| 846 buffer.PopEvents(&events); | 849 buffer.PopEvents(&events); |
| 847 EXPECT_EQ(1u, events.size()); | 850 EXPECT_EQ(1u, events.size()); |
| 848 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); | 851 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); |
| 849 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 852 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 850 | 853 |
| 851 // Test mouse release event is correctly modified and modifier release | 854 // Test mouse release event is correctly modified and modifier release |
| 852 // event is sent. | 855 // event is sent. |
| 853 ev.reset(GenerateMouseEvent(false)); | 856 ev.reset(GenerateMouseEvent(false)); |
| 854 delegate->OnHostMouseEvent(ev.get()); | 857 details = dispatcher->OnEventFromSource(ev.get()); |
| 858 ASSERT_FALSE(details.dispatcher_destroyed); |
| 855 buffer.PopEvents(&events); | 859 buffer.PopEvents(&events); |
| 856 EXPECT_EQ(2u, events.size()); | 860 EXPECT_EQ(2u, events.size()); |
| 857 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); | 861 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
| 858 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 862 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 859 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 863 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 860 EXPECT_EQ(ui::VKEY_CONTROL, | 864 EXPECT_EQ(ui::VKEY_CONTROL, |
| 861 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 865 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 862 | 866 |
| 863 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 867 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
| 864 } | 868 } |
| 865 | 869 |
| 866 TEST_F(StickyKeysTest, MouseWheelEventDispatchImpl) { | 870 TEST_F(StickyKeysTest, MouseWheelEventDispatchImpl) { |
| 867 // Test the actual mouse wheel event dispatch implementation. | 871 // Test the actual mouse wheel event dispatch implementation. |
| 868 EventBuffer buffer; | 872 EventBuffer buffer; |
| 869 ScopedVector<ui::Event> events; | 873 ScopedVector<ui::Event> events; |
| 870 aura::WindowTreeHostDelegate* delegate = Shell::GetPrimaryRootWindow() | 874 aura::WindowEventDispatcher* dispatcher = Shell::GetPrimaryRootWindow() |
| 871 ->GetDispatcher()->AsWindowTreeHostDelegate(); | 875 ->GetDispatcher(); |
| 872 Shell::GetInstance()->AddPreTargetHandler(&buffer); | 876 Shell::GetInstance()->AddPreTargetHandler(&buffer); |
| 873 Shell::GetInstance()->sticky_keys_controller()->Enable(true); | 877 Shell::GetInstance()->sticky_keys_controller()->Enable(true); |
| 874 | 878 |
| 875 scoped_ptr<ui::MouseWheelEvent> ev; | 879 scoped_ptr<ui::MouseWheelEvent> ev; |
| 876 SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); | 880 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 877 buffer.PopEvents(&events); | 881 buffer.PopEvents(&events); |
| 878 | 882 |
| 879 // Test positive mouse wheel event is correctly modified and modifier release | 883 // Test positive mouse wheel event is correctly modified and modifier release |
| 880 // event is sent. | 884 // event is sent. |
| 881 ev.reset(GenerateMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta)); | 885 ev.reset(GenerateMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta)); |
| 882 delegate->OnHostMouseEvent(ev.get()); | 886 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(ev.get()); |
| 887 ASSERT_FALSE(details.dispatcher_destroyed); |
| 883 buffer.PopEvents(&events); | 888 buffer.PopEvents(&events); |
| 884 EXPECT_EQ(2u, events.size()); | 889 EXPECT_EQ(2u, events.size()); |
| 885 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | 890 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| 886 EXPECT_EQ(ui::MouseWheelEvent::kWheelDelta, | 891 EXPECT_EQ(ui::MouseWheelEvent::kWheelDelta, |
| 887 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); | 892 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
| 888 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 893 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 889 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 894 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 890 EXPECT_EQ(ui::VKEY_CONTROL, | 895 EXPECT_EQ(ui::VKEY_CONTROL, |
| 891 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 896 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 892 | 897 |
| 893 // Test negative mouse wheel event is correctly modified and modifier release | 898 // Test negative mouse wheel event is correctly modified and modifier release |
| 894 // event is sent. | 899 // event is sent. |
| 895 SendActivateStickyKeyPattern(delegate, ui::VKEY_CONTROL); | 900 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL); |
| 896 buffer.PopEvents(&events); | 901 buffer.PopEvents(&events); |
| 897 | 902 |
| 898 ev.reset(GenerateMouseWheelEvent(-ui::MouseWheelEvent::kWheelDelta)); | 903 ev.reset(GenerateMouseWheelEvent(-ui::MouseWheelEvent::kWheelDelta)); |
| 899 delegate->OnHostMouseEvent(ev.get()); | 904 details = dispatcher->OnEventFromSource(ev.get()); |
| 905 ASSERT_FALSE(details.dispatcher_destroyed); |
| 900 buffer.PopEvents(&events); | 906 buffer.PopEvents(&events); |
| 901 EXPECT_EQ(2u, events.size()); | 907 EXPECT_EQ(2u, events.size()); |
| 902 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | 908 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| 903 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta, | 909 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta, |
| 904 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); | 910 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); |
| 905 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 911 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 906 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 912 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 907 EXPECT_EQ(ui::VKEY_CONTROL, | 913 EXPECT_EQ(ui::VKEY_CONTROL, |
| 908 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 914 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 909 | 915 |
| 910 Shell::GetInstance()->RemovePreTargetHandler(&buffer); | 916 Shell::GetInstance()->RemovePreTargetHandler(&buffer); |
| 911 } | 917 } |
| 912 | 918 |
| 913 } // namespace ash | 919 } // namespace ash |
| OLD | NEW |