Index: trunk/src/chrome/browser/chromeos/events/event_rewriter_unittest.cc |
=================================================================== |
--- trunk/src/chrome/browser/chromeos/events/event_rewriter_unittest.cc (revision 278418) |
+++ trunk/src/chrome/browser/chromeos/events/event_rewriter_unittest.cc (working copy) |
@@ -4,11 +4,15 @@ |
#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/sticky_keys/sticky_keys_overlay.h" |
#include "ash/test/ash_test_base.h" |
#include "ash/wm/window_state.h" |
#include "base/basictypes.h" |
@@ -26,24 +30,14 @@ |
#include "chromeos/ime/fake_ime_keyboard.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/aura/window.h" |
-#include "ui/aura/window_tree_host.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) { |
@@ -198,7 +192,8 @@ |
class EventRewriterTest : public ash::test::AshTestBase { |
public: |
EventRewriterTest() |
- : mock_user_manager_(new chromeos::MockUserManager), |
+ : display_(gfx::GetXDisplay()), |
+ mock_user_manager_(new chromeos::MockUserManager), |
user_manager_enabler_(mock_user_manager_), |
input_method_manager_mock_(NULL) {} |
virtual ~EventRewriterTest() {} |
@@ -232,6 +227,7 @@ |
return flags; |
} |
+ Display* display_; |
chromeos::MockUserManager* mock_user_manager_; // Not owned. |
chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
@@ -240,7 +236,7 @@ |
TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
// First, test with a PC keyboard. |
TestingPrefServiceSyncable prefs; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
rewriter.set_last_device_id_for_testing(0); |
rewriter.set_pref_service_for_testing(&prefs); |
@@ -321,7 +317,7 @@ |
control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kAltKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
rewriter.set_last_device_id_for_testing(0); |
@@ -361,7 +357,7 @@ |
void EventRewriterTest::TestRewriteNumPadKeys() { |
TestingPrefServiceSyncable prefs; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase tests[] = { |
@@ -503,7 +499,7 @@ |
// Tests if the rewriter can handle a Command + Num Pad event. |
void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { |
TestingPrefServiceSyncable prefs; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
rewriter.set_last_device_id_for_testing(0); |
rewriter.set_pref_service_for_testing(&prefs); |
@@ -545,7 +541,7 @@ |
TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { |
TestingPrefServiceSyncable prefs; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase tests[] = { |
@@ -588,7 +584,7 @@ |
TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { |
TestingPrefServiceSyncable prefs; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase tests[] = { |
@@ -631,7 +627,7 @@ |
control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kVoidKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase disabled_modifier_tests[] = { |
@@ -706,7 +702,7 @@ |
search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
search.SetValue(chromeos::input_method::kControlKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase s_tests[] = { |
@@ -770,7 +766,7 @@ |
search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
search.SetValue(chromeos::input_method::kEscapeKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. |
@@ -792,7 +788,7 @@ |
search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
search.SetValue(chromeos::input_method::kAltKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase s2a_tests[] = { |
@@ -869,7 +865,7 @@ |
search.SetValue(chromeos::input_method::kCapsLockKey); |
chromeos::input_method::FakeImeKeyboard ime_keyboard; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
@@ -939,7 +935,7 @@ |
chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
chromeos::input_method::FakeImeKeyboard ime_keyboard; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
@@ -958,7 +954,7 @@ |
chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
chromeos::input_method::FakeImeKeyboard ime_keyboard; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
@@ -991,7 +987,7 @@ |
chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
chromeos::input_method::FakeImeKeyboard ime_keyboard; |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
@@ -1043,7 +1039,7 @@ |
control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kControlKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
KeyTestCase tests[] = { |
@@ -1079,7 +1075,7 @@ |
control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kControlKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
input_method_manager_mock_->set_mod3_used(true); |
@@ -1096,7 +1092,7 @@ |
TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { |
TestingPrefServiceSyncable prefs; |
chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
rewriter.set_last_device_id_for_testing(0); |
rewriter.set_pref_service_for_testing(&prefs); |
@@ -1205,7 +1201,7 @@ |
TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { |
TestingPrefServiceSyncable prefs; |
chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
FunctionKeyTestCase tests[] = { |
@@ -1533,7 +1529,7 @@ |
search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
search.SetValue(chromeos::input_method::kControlKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
@@ -1560,8 +1556,6 @@ |
} |
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()); |
@@ -1569,7 +1563,7 @@ |
control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kAltKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
// Send left control press. |
@@ -1588,7 +1582,6 @@ |
rewriter.RewriteEvent(keyevent, &new_event)); |
EXPECT_FALSE(new_event); |
} |
-#endif |
} |
TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
@@ -1599,7 +1592,7 @@ |
control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kAltKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
const int kTouchId = 2; |
@@ -1616,60 +1609,11 @@ |
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) { |
- return SendEventToProcessor(event); |
- } |
- |
- private: |
- ui::EventProcessor* processor_; |
-}; |
- |
// Tests of event rewriting that depend on the Ash window manager. |
class EventRewriterAshTest : public ash::test::AshTestBase { |
public: |
EventRewriterAshTest() |
- : source_(&buffer_), |
- mock_user_manager_(new chromeos::MockUserManager), |
+ : mock_user_manager_(new chromeos::MockUserManager), |
user_manager_enabler_(mock_user_manager_) {} |
virtual ~EventRewriterAshTest() {} |
@@ -1678,40 +1622,12 @@ |
return rewriter_->RewriteEvent(event, rewritten_event); |
} |
- ui::EventDispatchDetails Send(ui::Event* event) { |
- return source_.Send(event); |
- } |
- |
- void SendKeyEvent(ui::EventType type, ui::KeyboardCode key_code) { |
- ui::KeyEvent press(type, key_code, ui::EF_NONE, false); |
- ui::EventDispatchDetails details = Send(&press); |
- CHECK(!details.dispatcher_destroyed); |
- } |
- |
- void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { |
- SendKeyEvent(ui::ET_KEY_PRESSED, key_code); |
- SendKeyEvent(ui::ET_KEY_RELEASED, key_code); |
- } |
- |
protected: |
- TestingPrefServiceSyncable* prefs() { return &prefs_; } |
- |
- void PopEvents(ScopedVector<ui::Event>* events) { |
- buffer_.PopEvents(events); |
- } |
- |
virtual void SetUp() OVERRIDE { |
AshTestBase::SetUp(); |
- sticky_keys_controller_ = |
- ash::Shell::GetInstance()->sticky_keys_controller(); |
- rewriter_.reset(new EventRewriter(sticky_keys_controller_)); |
+ rewriter_.reset(new EventRewriter()); |
chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
rewriter_->set_pref_service_for_testing(&prefs_); |
-#if defined(USE_X11) |
- ui::SetUpTouchPadForTest(kTouchPadDeviceId); |
-#endif |
- source_.AddEventRewriter(rewriter_.get()); |
- sticky_keys_controller_->Enable(true); |
} |
virtual void TearDown() OVERRIDE { |
@@ -1719,18 +1635,13 @@ |
AshTestBase::TearDown(); |
} |
- protected: |
- ash::StickyKeysController* sticky_keys_controller_; |
+ TestingPrefServiceSyncable prefs_; |
private: |
scoped_ptr<EventRewriter> rewriter_; |
- EventBuffer buffer_; |
- TestEventSource source_; |
- |
chromeos::MockUserManager* mock_user_manager_; // Not owned. |
chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
- TestingPrefServiceSyncable prefs_; |
DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
}; |
@@ -1739,7 +1650,6 @@ |
scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
window_state->Activate(); |
- ScopedVector<ui::Event> events; |
// Create a simulated keypress of F1 targetted at the window. |
ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false); |
@@ -1747,38 +1657,34 @@ |
// Simulate an apps v2 window that has requested top row keys as function |
// keys. The event should not be rewritten. |
window_state->set_top_row_keys_are_function_keys(true); |
- ui::EventDispatchDetails details = Send(&press_f1); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- PopEvents(&events); |
- EXPECT_EQ(1u, events.size()); |
+ scoped_ptr<ui::Event> rewritten_event; |
+ ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event)); |
+ ASSERT_FALSE(rewritten_event); |
EXPECT_EQ( |
GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), |
- GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); |
+ GetKeyEventAsString(press_f1)); |
// The event should also not be rewritten if the send-function-keys pref is |
// additionally set, for both apps v2 and regular windows. |
BooleanPrefMember send_function_keys_pref; |
- send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs()); |
+ send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); |
send_function_keys_pref.SetValue(true); |
window_state->set_top_row_keys_are_function_keys(false); |
- details = Send(&press_f1); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- PopEvents(&events); |
- EXPECT_EQ(1u, events.size()); |
+ ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event)); |
+ ASSERT_FALSE(rewritten_event); |
EXPECT_EQ( |
GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), |
- GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); |
+ GetKeyEventAsString(press_f1)); |
// If the pref isn't set when an event is sent to a regular window, F1 is |
// rewritten to the back key. |
send_function_keys_pref.SetValue(false); |
- details = Send(&press_f1); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- PopEvents(&events); |
- EXPECT_EQ(1u, events.size()); |
+ ASSERT_TRUE(RewriteFunctionKeys(press_f1, &rewritten_event)); |
+ ASSERT_TRUE(rewritten_event); |
EXPECT_EQ(GetExpectedResultAsString( |
ui::VKEY_BROWSER_BACK, ui::EF_NONE, ui::ET_KEY_PRESSED), |
- GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); |
+ GetKeyEventAsString( |
+ *static_cast<const ui::KeyEvent*>(rewritten_event.get()))); |
} |
TEST_F(EventRewriterTest, TestRewrittenModifierClick) { |
@@ -1793,7 +1699,7 @@ |
control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
control.SetValue(chromeos::input_method::kAltKey); |
- EventRewriter rewriter(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
// Check that Control + Left Button is converted (via Alt + Left Button) |
@@ -1815,15 +1721,12 @@ |
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(NULL); |
+ EventRewriter rewriter; |
rewriter.set_pref_service_for_testing(&prefs); |
const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; |
{ |
@@ -1889,299 +1792,6 @@ |
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. |
- ScopedVector<ui::Event> events; |
- |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- 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 = Send(&press); |
- 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 = Send(&release); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- 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) { |
- ScopedVector<ui::Event> events; |
- |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- 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 = Send(&press); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- 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 = Send(&release); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- 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) { |
- ScopedVector<ui::Event> events; |
- |
- // Test positive mouse wheel event is correctly modified and modifier release |
- // event is sent. |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- 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 = Send(&positive); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- 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. |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- PopEvents(&events); |
- ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); |
- details = Send(&negative); |
- ASSERT_FALSE(details.dispatcher_destroyed); |
- 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()); |
-} |
- |
-class StickyKeysOverlayTest : public EventRewriterAshTest { |
- public: |
- StickyKeysOverlayTest() : overlay_(NULL) {} |
- |
- virtual ~StickyKeysOverlayTest() {} |
- |
- virtual void SetUp() OVERRIDE { |
- EventRewriterAshTest::SetUp(); |
- overlay_ = sticky_keys_controller_->GetOverlayForTest(); |
- ASSERT_TRUE(overlay_); |
- } |
- |
- ash::StickyKeysOverlay* overlay_; |
-}; |
- |
-TEST_F(StickyKeysOverlayTest, OneModifierEnabled) { |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- |
- // Pressing modifier key should show overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- |
- // Pressing a normal key should hide overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_T); |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
-} |
- |
-TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- |
- // Pressing two modifiers should show overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_SHIFT); |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- |
- // Pressing a normal key should hide overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_N); |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
-} |
- |
-TEST_F(StickyKeysOverlayTest, LockedModifier) { |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
- |
- // Pressing a modifier key twice should lock modifier and show overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_LMENU); |
- SendActivateStickyKeyPattern(ui::VKEY_LMENU); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, |
- overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
- |
- // Pressing a normal key should not hide overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_D); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, |
- overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
-} |
- |
-TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- |
- // Pressing a modifier key twice should lock modifier and show overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- |
- // Pressing another modifier key should still show overlay. |
- SendActivateStickyKeyPattern(ui::VKEY_SHIFT); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- |
- // Pressing a normal key should not hide overlay but disable normal modifier. |
- SendActivateStickyKeyPattern(ui::VKEY_D); |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
-} |
- |
-TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
- |
- // Enable modifiers. |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- SendActivateStickyKeyPattern(ui::VKEY_SHIFT); |
- SendActivateStickyKeyPattern(ui::VKEY_SHIFT); |
- SendActivateStickyKeyPattern(ui::VKEY_LMENU); |
- |
- EXPECT_TRUE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, |
- overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
- |
- // Disable modifiers and overlay should be hidden. |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
- SendActivateStickyKeyPattern(ui::VKEY_SHIFT); |
- SendActivateStickyKeyPattern(ui::VKEY_LMENU); |
- SendActivateStickyKeyPattern(ui::VKEY_LMENU); |
- |
- EXPECT_FALSE(overlay_->is_visible()); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
- EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, |
- overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
-} |
- |
-TEST_F(StickyKeysOverlayTest, ModifierVisibility) { |
- // All but AltGr and Mod3 should initially be visible. |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN)); |
- EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
- EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
- |
- // Turn all modifiers on. |
- sticky_keys_controller_->SetModifiersEnabled(true, true); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
- |
- // Turn off Mod3. |
- sticky_keys_controller_->SetModifiersEnabled(false, true); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
- EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
- |
- // Turn off AltGr. |
- sticky_keys_controller_->SetModifiersEnabled(true, false); |
- EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
- EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
- |
- // Turn off AltGr and Mod3. |
- sticky_keys_controller_->SetModifiersEnabled(false, false); |
- EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
- EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
-} |
- |
} // namespace chromeos |