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 |