Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: ash/sticky_keys/sticky_keys_unittest.cc

Issue 227113009: Fix sticky keys crash when handling synthetic events without a native event. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: got reverted for a clang compile warning Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/sticky_keys/sticky_keys_controller.cc ('k') | ui/events/event.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 details = dispatcher->OnEventFromSource(kev.get());
858 ASSERT_FALSE(details.dispatcher_destroyed);
859 buffer.PopEvents(&events);
860 EXPECT_EQ(2u, events.size());
861 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
862 EXPECT_EQ(ui::VKEY_K, static_cast<ui::KeyEvent*>(events[0])->key_code());
863 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
864 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
865 EXPECT_EQ(ui::VKEY_CONTROL,
866 static_cast<ui::KeyEvent*>(events[1])->key_code());
867
840 Shell::GetInstance()->RemovePreTargetHandler(&buffer); 868 Shell::GetInstance()->RemovePreTargetHandler(&buffer);
841 } 869 }
842 870
843 class StickyKeysMouseDispatchTest 871 class StickyKeysMouseDispatchTest
844 : public StickyKeysTest, 872 : public StickyKeysTest,
845 public ::testing::WithParamInterface<int> { 873 public ::testing::WithParamInterface<int> {
846 }; 874 };
847 875
848 TEST_P(StickyKeysMouseDispatchTest, MouseEventDispatchImpl) { 876 TEST_P(StickyKeysMouseDispatchTest, MouseEventDispatchImpl) {
849 int scale_factor = GetParam(); 877 int scale_factor = GetParam();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 buffer.PopEvents(&events); 911 buffer.PopEvents(&events);
884 EXPECT_EQ(2u, events.size()); 912 EXPECT_EQ(2u, events.size());
885 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); 913 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
886 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); 914 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
887 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); 915 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
888 EXPECT_EQ(dip_location.ToString(), 916 EXPECT_EQ(dip_location.ToString(),
889 static_cast<ui::MouseEvent*>(events[0])->location().ToString()); 917 static_cast<ui::MouseEvent*>(events[0])->location().ToString());
890 EXPECT_EQ(ui::VKEY_CONTROL, 918 EXPECT_EQ(ui::VKEY_CONTROL,
891 static_cast<ui::KeyEvent*>(events[1])->key_code()); 919 static_cast<ui::KeyEvent*>(events[1])->key_code());
892 920
921 // Test synthesized mouse events are dispatched correctly.
922 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL);
923 buffer.PopEvents(&events);
924 ev.reset(GenerateSynthesizedMouseClickEvent(false, physical_location));
925 details = dispatcher->OnEventFromSource(ev.get());
926 ASSERT_FALSE(details.dispatcher_destroyed);
927 buffer.PopEvents(&events);
928 EXPECT_EQ(2u, events.size());
929 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
930 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
931 EXPECT_EQ(dip_location.ToString(),
932 static_cast<ui::MouseEvent*>(events[0])->location().ToString());
933 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
934 EXPECT_EQ(ui::VKEY_CONTROL,
935 static_cast<ui::KeyEvent*>(events[1])->key_code());
936
893 Shell::GetInstance()->RemovePreTargetHandler(&buffer); 937 Shell::GetInstance()->RemovePreTargetHandler(&buffer);
894 } 938 }
895 939
896 TEST_P(StickyKeysMouseDispatchTest, MouseWheelEventDispatchImpl) { 940 TEST_P(StickyKeysMouseDispatchTest, MouseWheelEventDispatchImpl) {
897 int scale_factor = GetParam(); 941 int scale_factor = GetParam();
898 std::ostringstream display_specs; 942 std::ostringstream display_specs;
899 display_specs << "1280x1024*" << scale_factor; 943 display_specs << "1280x1024*" << scale_factor;
900 UpdateDisplay(display_specs.str()); 944 UpdateDisplay(display_specs.str());
901 945
902 // Test the actual mouse wheel event dispatch implementation. 946 // Test the actual mouse wheel event dispatch implementation.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 buffer.PopEvents(&events); 981 buffer.PopEvents(&events);
938 EXPECT_EQ(2u, events.size()); 982 EXPECT_EQ(2u, events.size());
939 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); 983 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
940 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta / scale_factor, 984 EXPECT_EQ(-ui::MouseWheelEvent::kWheelDelta / scale_factor,
941 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset()); 985 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset());
942 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); 986 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
943 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); 987 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
944 EXPECT_EQ(ui::VKEY_CONTROL, 988 EXPECT_EQ(ui::VKEY_CONTROL,
945 static_cast<ui::KeyEvent*>(events[1])->key_code()); 989 static_cast<ui::KeyEvent*>(events[1])->key_code());
946 990
991 // Test synthesized mouse wheel events are dispatched correctly.
992 SendActivateStickyKeyPattern(dispatcher, ui::VKEY_CONTROL);
993 buffer.PopEvents(&events);
994 ev.reset(
995 GenerateSynthesizedMouseWheelEvent(ui::MouseWheelEvent::kWheelDelta));
996 details = dispatcher->OnEventFromSource(ev.get());
997 ASSERT_FALSE(details.dispatcher_destroyed);
998 buffer.PopEvents(&events);
999 EXPECT_EQ(2u, events.size());
1000 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
1001 EXPECT_EQ(ui::MouseWheelEvent::kWheelDelta / scale_factor,
1002 static_cast<ui::MouseWheelEvent*>(events[0])->y_offset());
1003 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1004 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1005 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
1006 EXPECT_EQ(ui::VKEY_CONTROL,
1007 static_cast<ui::KeyEvent*>(events[1])->key_code());
1008
947 Shell::GetInstance()->RemovePreTargetHandler(&buffer); 1009 Shell::GetInstance()->RemovePreTargetHandler(&buffer);
948 } 1010 }
949 1011
950 INSTANTIATE_TEST_CASE_P(DPIScaleFactors, 1012 INSTANTIATE_TEST_CASE_P(DPIScaleFactors,
951 StickyKeysMouseDispatchTest, 1013 StickyKeysMouseDispatchTest,
952 ::testing::Values(1, 2)); 1014 ::testing::Values(1, 2));
953 1015
954 } // namespace ash 1016 } // namespace ash
OLDNEW
« no previous file with comments | « ash/sticky_keys/sticky_keys_controller.cc ('k') | ui/events/event.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698