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

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

Issue 229053002: Revert of Fix sticky keys crash when handling synthetic events without a native event. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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* 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
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
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
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
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
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
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