Chromium Code Reviews| Index: chrome/browser/chromeos/events/event_rewriter_unittest.cc |
| diff --git a/chrome/browser/chromeos/events/event_rewriter_unittest.cc b/chrome/browser/chromeos/events/event_rewriter_unittest.cc |
| index 95f66893fcc6e2efc03b05637e3833364515af51..43159fb765845b74adf4014a649100161ec4e4e8 100644 |
| --- a/chrome/browser/chromeos/events/event_rewriter_unittest.cc |
| +++ b/chrome/browser/chromeos/events/event_rewriter_unittest.cc |
| @@ -4,15 +4,10 @@ |
| #include "chrome/browser/chromeos/events/event_rewriter.h" |
| -#include <X11/keysym.h> |
| -#include <X11/XF86keysym.h> |
| -#include <X11/Xlib.h> |
| -#undef Bool |
| -#undef None |
| -#undef RootWindow |
| - |
| #include <vector> |
| +#include "ash/shell.h" |
| +#include "ash/sticky_keys/sticky_keys_controller.h" |
| #include "ash/test/ash_test_base.h" |
| #include "ash/wm/window_state.h" |
| #include "base/basictypes.h" |
| @@ -32,12 +27,21 @@ |
| #include "ui/aura/window.h" |
| #include "ui/events/event.h" |
| #include "ui/events/event_rewriter.h" |
| +#include "ui/events/test/test_event_processor.h" |
| + |
| +#if defined(USE_X11) |
| +#include <X11/keysym.h> |
| + |
| #include "ui/events/test/events_test_utils_x11.h" |
| #include "ui/events/x/touch_factory_x11.h" |
| #include "ui/gfx/x/x11_types.h" |
| +#endif |
| namespace { |
| +// The device id of the test touchpad device. |
| +const unsigned int kTouchPadDeviceId = 1; |
| + |
| std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, |
| int ui_flags, |
| ui::EventType ui_type) { |
| @@ -142,8 +146,7 @@ namespace chromeos { |
| class EventRewriterTest : public ash::test::AshTestBase { |
| public: |
| EventRewriterTest() |
| - : display_(gfx::GetXDisplay()), |
| - mock_user_manager_(new chromeos::MockUserManager), |
| + : mock_user_manager_(new chromeos::MockUserManager), |
| user_manager_enabler_(mock_user_manager_), |
| input_method_manager_mock_(NULL) {} |
| virtual ~EventRewriterTest() {} |
| @@ -177,7 +180,6 @@ class EventRewriterTest : public ash::test::AshTestBase { |
| return flags; |
| } |
| - Display* display_; |
| chromeos::MockUserManager* mock_user_manager_; // Not owned. |
| chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
| chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
| @@ -186,7 +188,7 @@ class EventRewriterTest : public ash::test::AshTestBase { |
| TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
| // First, test with a PC keyboard. |
| TestingPrefServiceSyncable prefs; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| rewriter.set_last_device_id_for_testing(0); |
| rewriter.set_pref_service_for_testing(&prefs); |
| @@ -267,7 +269,7 @@ TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { |
| control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kAltKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| rewriter.set_last_device_id_for_testing(0); |
| @@ -307,7 +309,7 @@ TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { |
| void EventRewriterTest::TestRewriteNumPadKeys() { |
| TestingPrefServiceSyncable prefs; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase tests[] = { |
| @@ -449,7 +451,7 @@ TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) { |
| // Tests if the rewriter can handle a Command + Num Pad event. |
| void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { |
| TestingPrefServiceSyncable prefs; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
| rewriter.set_last_device_id_for_testing(0); |
| rewriter.set_pref_service_for_testing(&prefs); |
| @@ -491,7 +493,7 @@ TEST_F(EventRewriterTest, |
| TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { |
| TestingPrefServiceSyncable prefs; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase tests[] = { |
| @@ -534,7 +536,7 @@ TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { |
| TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { |
| TestingPrefServiceSyncable prefs; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase tests[] = { |
| @@ -577,7 +579,7 @@ TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { |
| control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kVoidKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase disabled_modifier_tests[] = { |
| @@ -652,7 +654,7 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { |
| search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| search.SetValue(chromeos::input_method::kControlKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase s_tests[] = { |
| @@ -716,7 +718,7 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { |
| search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| search.SetValue(chromeos::input_method::kEscapeKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. |
| @@ -738,7 +740,7 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { |
| search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| search.SetValue(chromeos::input_method::kAltKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase s2a_tests[] = { |
| @@ -815,7 +817,7 @@ TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { |
| search.SetValue(chromeos::input_method::kCapsLockKey); |
| chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
| @@ -885,7 +887,7 @@ TEST_F(EventRewriterTest, TestRewriteCapsLock) { |
| chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
| @@ -904,7 +906,7 @@ TEST_F(EventRewriterTest, TestRewriteDiamondKey) { |
| chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| @@ -937,7 +939,7 @@ TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { |
| chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| @@ -989,7 +991,7 @@ TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { |
| control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kControlKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase tests[] = { |
| @@ -1025,7 +1027,7 @@ TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { |
| control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kControlKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| input_method_manager_mock_->set_mod3_used(true); |
| @@ -1042,7 +1044,7 @@ TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { |
| TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { |
| TestingPrefServiceSyncable prefs; |
| chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| rewriter.set_last_device_id_for_testing(0); |
| rewriter.set_pref_service_for_testing(&prefs); |
| @@ -1151,7 +1153,7 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { |
| TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { |
| TestingPrefServiceSyncable prefs; |
| chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| KeyTestCase tests[] = { |
| @@ -1407,7 +1409,7 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { |
| search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| search.SetValue(chromeos::input_method::kControlKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| @@ -1434,6 +1436,8 @@ TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { |
| } |
| TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { |
| +#if defined(USE_X11) |
| + // TODO(kpschoedel): pending alternative to xevent.xany.send_event |
| // Remap Control to Alt. |
| TestingPrefServiceSyncable prefs; |
| chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| @@ -1441,7 +1445,7 @@ TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { |
| control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kAltKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| // Send left control press. |
| @@ -1460,6 +1464,7 @@ TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { |
| rewriter.RewriteEvent(keyevent, &new_event)); |
| EXPECT_FALSE(new_event); |
| } |
| +#endif |
| } |
| TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
| @@ -1470,7 +1475,7 @@ TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
| control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kAltKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(0); |
|
Daniel Erat
2014/06/05 23:16:10
nit: s/0/NULL/
kpschoedel
2014/06/06 17:53:23
Done.
|
| rewriter.set_pref_service_for_testing(&prefs); |
| const int kTouchId = 2; |
| @@ -1487,6 +1492,64 @@ TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
| new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); |
| } |
| +// Keeps a buffer of handled events. |
| +class EventBuffer : public ui::test::TestEventProcessor { |
| + public: |
| + EventBuffer() {} |
| + virtual ~EventBuffer() {} |
| + |
| + void PopEvents(ScopedVector<ui::Event>* events) { |
| + events->clear(); |
| + events->swap(events_); |
| + } |
| + |
| + private: |
| + // ui::EventProcessor overrides: |
| + virtual ui::EventDispatchDetails OnEventFromSource( |
| + ui::Event* event) OVERRIDE { |
| + if (event->IsKeyEvent()) { |
| + events_.push_back(new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event))); |
| + } else if (event->IsMouseWheelEvent()) { |
| + events_.push_back( |
| + new ui::MouseWheelEvent(*static_cast<ui::MouseWheelEvent*>(event))); |
| + } else if (event->IsMouseEvent()) { |
| + events_.push_back( |
| + new ui::MouseEvent(*static_cast<ui::MouseEvent*>(event))); |
| + } |
| + return ui::EventDispatchDetails(); |
| + } |
| + |
| + ScopedVector<ui::Event> events_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(EventBuffer); |
| +}; |
| + |
| +// Trivial EventSource that does nothing but send events. |
| +class TestEventSource : public ui::EventSource { |
| + public: |
| + explicit TestEventSource(ui::EventProcessor* processor) |
| + : processor_(processor) {} |
| + virtual ui::EventProcessor* GetEventProcessor() OVERRIDE { |
| + return processor_; |
| + } |
| + ui::EventDispatchDetails Send(ui::Event* event) { |
| + ui::EventDispatchDetails details = SendEventToProcessor(event); |
|
Daniel Erat
2014/06/05 23:16:10
return the details directly
kpschoedel
2014/06/06 17:53:23
Done (used to have debug logging in there).
|
| + return details; |
| + } |
| + |
| + void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { |
| + ui::KeyEvent press(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE, false); |
| + ui::EventDispatchDetails details = Send(&press); |
| + CHECK(!details.dispatcher_destroyed); |
| + ui::KeyEvent release(ui::ET_KEY_RELEASED, key_code, ui::EF_NONE, false); |
| + details = Send(&release); |
| + CHECK(!details.dispatcher_destroyed); |
| + } |
| + |
| + private: |
| + ui::EventProcessor* processor_; |
| +}; |
| + |
| // Tests of event rewriting that depend on the Ash window manager. |
| class EventRewriterAshTest : public ash::test::AshTestBase { |
| public: |
| @@ -1500,12 +1563,23 @@ class EventRewriterAshTest : public ash::test::AshTestBase { |
| return rewriter_->RewriteEvent(event, rewritten_event); |
| } |
| + EventRewriter* rewriter() const { return rewriter_.get(); } |
| + |
| + ash::StickyKeysController* sticky_keys_controller() const { |
| + return sticky_keys_controller_; |
| + } |
| + |
| protected: |
| virtual void SetUp() OVERRIDE { |
| AshTestBase::SetUp(); |
| - rewriter_.reset(new EventRewriter()); |
| + sticky_keys_controller_ = |
| + ash::Shell::GetInstance()->sticky_keys_controller(); |
| + rewriter_.reset(new EventRewriter(sticky_keys_controller_)); |
| chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
| rewriter_->set_pref_service_for_testing(&prefs_); |
| +#if defined(USE_X11) |
| + ui::SetUpTouchPadForTest(kTouchPadDeviceId); |
| +#endif |
| } |
| virtual void TearDown() OVERRIDE { |
| @@ -1520,6 +1594,7 @@ class EventRewriterAshTest : public ash::test::AshTestBase { |
| chromeos::MockUserManager* mock_user_manager_; // Not owned. |
| chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
| + ash::StickyKeysController* sticky_keys_controller_; |
| DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
| }; |
| @@ -1577,7 +1652,7 @@ TEST_F(EventRewriterTest, TestRewrittenModifierClick) { |
| control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| control.SetValue(chromeos::input_method::kAltKey); |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| // Check that Control + Left Button is converted (via Alt + Left Button) |
| @@ -1599,12 +1674,15 @@ TEST_F(EventRewriterTest, TestRewrittenModifierClick) { |
| TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
| +#if defined(USE_X11) |
| + // TODO(kpschoedel): pending changes for crbug.com/360377 |
| + // to |chromeos::EventRewriter::RewriteLocatedEvent() |
| std::vector<unsigned int> device_list; |
| device_list.push_back(10); |
| device_list.push_back(11); |
| ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
| TestingPrefServiceSyncable prefs; |
| - EventRewriter rewriter; |
| + EventRewriter rewriter(NULL); |
| rewriter.set_pref_service_for_testing(&prefs); |
| const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; |
| { |
| @@ -1670,6 +1748,132 @@ TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
| int flags = RewriteMouseEvent(&rewriter, release); |
| EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
| } |
| +#endif |
| +} |
| + |
| +TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { |
| + // Test the actual key event dispatch implementation. |
| + EventBuffer buffer; |
| + TestEventSource source(&buffer); |
| + source.AddEventRewriter(rewriter()); |
| + sticky_keys_controller()->Enable(true); |
| + ScopedVector<ui::Event> events; |
| + |
| + source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(1u, events.size()); |
| + EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| + EXPECT_EQ(ui::VKEY_CONTROL, |
| + static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| + |
| + // Test key press event is correctly modified and modifier release |
| + // event is sent. |
| + ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE, false); |
| + ui::EventDispatchDetails details = source.Send(&press); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(2u, events.size()); |
| + EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| + EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| + EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| + EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| + EXPECT_EQ(ui::VKEY_CONTROL, |
| + static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| + |
| + // Test key release event is not modified. |
| + ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE, false); |
| + details = source.Send(&release); |
| + ASSERT_FALSE(details.dispatcher_destroyed); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(1u, events.size()); |
| + EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); |
| + EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| + EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| +} |
| + |
| +TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { |
| + EventBuffer buffer; |
| + TestEventSource source(&buffer); |
| + source.AddEventRewriter(rewriter()); |
| + sticky_keys_controller()->Enable(true); |
| + ScopedVector<ui::Event> events; |
| + |
| + source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| + buffer.PopEvents(&events); |
| + |
| + // Test mouse press event is correctly modified. |
| + gfx::Point location(0, 0); |
| + ui::MouseEvent press(ui::ET_MOUSE_PRESSED, |
| + location, |
| + location, |
| + ui::EF_LEFT_MOUSE_BUTTON, |
| + ui::EF_LEFT_MOUSE_BUTTON); |
| + ui::EventDispatchDetails details = source.Send(&press); |
| + ASSERT_FALSE(details.dispatcher_destroyed); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(1u, events.size()); |
| + EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); |
| + EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| + |
| + // Test mouse release event is correctly modified and modifier release |
| + // event is sent. The mouse event should have the correct DIP location. |
| + ui::MouseEvent release(ui::ET_MOUSE_RELEASED, |
| + location, |
| + location, |
| + ui::EF_LEFT_MOUSE_BUTTON, |
| + ui::EF_LEFT_MOUSE_BUTTON); |
| + details = source.Send(&release); |
| + ASSERT_FALSE(details.dispatcher_destroyed); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(2u, events.size()); |
| + EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
| + EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| + EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| + EXPECT_EQ(ui::VKEY_CONTROL, |
| + static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| +} |
| + |
| +TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { |
| + EventBuffer buffer; |
| + TestEventSource source(&buffer); |
| + source.AddEventRewriter(rewriter()); |
| + sticky_keys_controller()->Enable(true); |
| + ScopedVector<ui::Event> events; |
| + |
| + // Test positive mouse wheel event is correctly modified and modifier release |
| + // event is sent. |
| + source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| + buffer.PopEvents(&events); |
| + gfx::Point location(0, 0); |
| + ui::MouseEvent mev(ui::ET_MOUSEWHEEL, |
| + location, |
| + location, |
| + ui::EF_LEFT_MOUSE_BUTTON, |
| + ui::EF_LEFT_MOUSE_BUTTON); |
| + ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta); |
| + ui::EventDispatchDetails details = source.Send(&positive); |
| + ASSERT_FALSE(details.dispatcher_destroyed); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(2u, events.size()); |
| + EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| + EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| + EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| + EXPECT_EQ(ui::VKEY_CONTROL, |
| + static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| + |
| + // Test negative mouse wheel event is correctly modified and modifier release |
| + // event is sent. |
| + source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| + buffer.PopEvents(&events); |
| + ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); |
| + details = source.Send(&negative); |
| + ASSERT_FALSE(details.dispatcher_destroyed); |
| + buffer.PopEvents(&events); |
| + EXPECT_EQ(2u, events.size()); |
| + EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| + EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| + EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| + EXPECT_EQ(ui::VKEY_CONTROL, |
| + static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| } |
| } // namespace chromeos |