| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/ui/ash/event_rewriter.h" | 5 #include "chrome/browser/chromeos/event_rewriter.h" |
| 6 | 6 |
| 7 #include <X11/keysym.h> |
| 8 #include <X11/XF86keysym.h> |
| 9 #include <X11/Xlib.h> |
| 10 #undef Bool |
| 11 #undef None |
| 12 #undef RootWindow |
| 13 |
| 14 #include "ash/test/ash_test_base.h" |
| 15 #include "ash/wm/window_state.h" |
| 7 #include "base/basictypes.h" | 16 #include "base/basictypes.h" |
| 8 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 9 #include "base/prefs/pref_member.h" | 18 #include "base/prefs/pref_member.h" |
| 10 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
| 11 #include "chrome/common/pref_names.h" | |
| 12 #include "chrome/test/base/testing_pref_service_syncable.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 #include "ui/events/event.h" | |
| 15 | |
| 16 #if defined(OS_CHROMEOS) | |
| 17 #include <X11/keysym.h> | |
| 18 #include <X11/XF86keysym.h> | |
| 19 #include <X11/Xlib.h> | |
| 20 | |
| 21 #include "ash/test/ash_test_base.h" | |
| 22 #include "ash/wm/window_state.h" | |
| 23 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" | 20 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
| 24 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" | 21 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
| 25 #include "chrome/browser/chromeos/login/mock_user_manager.h" | 22 #include "chrome/browser/chromeos/login/mock_user_manager.h" |
| 26 #include "chrome/browser/chromeos/login/user_manager.h" | 23 #include "chrome/browser/chromeos/login/user_manager.h" |
| 27 #include "chrome/browser/chromeos/preferences.h" | 24 #include "chrome/browser/chromeos/preferences.h" |
| 25 #include "chrome/common/pref_names.h" |
| 26 #include "chrome/test/base/testing_pref_service_syncable.h" |
| 28 #include "chromeos/chromeos_switches.h" | 27 #include "chromeos/chromeos_switches.h" |
| 29 #include "chromeos/ime/fake_xkeyboard.h" | 28 #include "chromeos/ime/fake_xkeyboard.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" |
| 30 #include "ui/aura/window.h" | 30 #include "ui/aura/window.h" |
| 31 #include "ui/events/event.h" |
| 31 #include "ui/events/test/events_test_utils_x11.h" | 32 #include "ui/events/test/events_test_utils_x11.h" |
| 32 #include "ui/events/x/touch_factory_x11.h" | 33 #include "ui/events/x/touch_factory_x11.h" |
| 33 #include "ui/gfx/x/x11_types.h" | 34 #include "ui/gfx/x/x11_types.h" |
| 34 | 35 |
| 35 namespace { | 36 namespace { |
| 36 | 37 |
| 37 std::string GetRewrittenEventAsString(EventRewriter* rewriter, | 38 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, |
| 38 ui::KeyboardCode ui_keycode, | 39 ui::KeyboardCode ui_keycode, |
| 39 int ui_flags, | 40 int ui_flags, |
| 40 ui::EventType ui_type, | 41 ui::EventType ui_type, |
| 41 KeyCode x_keycode, | 42 KeyCode x_keycode, |
| 42 unsigned int x_state) { | 43 unsigned int x_state) { |
| 43 ui::ScopedXI2Event xev; | 44 ui::ScopedXI2Event xev; |
| 44 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); | 45 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); |
| 45 XEvent* xevent = xev; | 46 XEvent* xevent = xev; |
| 46 xevent->xkey.keycode = x_keycode; | 47 xevent->xkey.keycode = x_keycode; |
| 47 xevent->xkey.state = x_state; | 48 xevent->xkey.state = x_state; |
| 48 ui::KeyEvent keyevent(xev, false /* is_char */); | 49 rewriter->RewriteForTesting(xevent); |
| 49 rewriter->RewriteForTesting(&keyevent); | 50 ui::KeyEvent keyevent(xevent, false /* is_char */); |
| 50 return base::StringPrintf( | 51 return base::StringPrintf( |
| 51 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", | 52 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", |
| 52 keyevent.key_code(), keyevent.flags(), keyevent.type(), | 53 keyevent.key_code(), keyevent.flags(), keyevent.type(), |
| 53 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); | 54 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); |
| 54 } | 55 } |
| 55 | 56 |
| 56 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, | 57 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, |
| 57 int ui_flags, | 58 int ui_flags, |
| 58 ui::EventType ui_type, | 59 ui::EventType ui_type, |
| 59 KeyCode x_keycode, | 60 KeyCode x_keycode, |
| 60 unsigned int x_state, | 61 unsigned int x_state, |
| 61 int x_type) { | 62 int x_type) { |
| 62 return base::StringPrintf( | 63 return base::StringPrintf( |
| 63 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", | 64 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", |
| 64 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); | 65 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); |
| 65 } | 66 } |
| 66 | 67 |
| 67 } // namespace | 68 } // namespace |
| 68 | 69 |
| 69 class EventRewriterTest : public testing::Test { | 70 namespace chromeos { |
| 71 |
| 72 class EventRewriterTest : public ash::test::AshTestBase { |
| 70 public: | 73 public: |
| 71 EventRewriterTest() | 74 EventRewriterTest() |
| 72 : display_(gfx::GetXDisplay()), | 75 : display_(gfx::GetXDisplay()), |
| 73 keycode_a_(XKeysymToKeycode(display_, XK_a)), | 76 keycode_a_(XKeysymToKeycode(display_, XK_a)), |
| 74 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)), | 77 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)), |
| 75 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)), | 78 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)), |
| 76 keycode_b_(XKeysymToKeycode(display_, XK_B)), | 79 keycode_b_(XKeysymToKeycode(display_, XK_B)), |
| 77 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)), | 80 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)), |
| 78 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)), | 81 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)), |
| 79 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)), | 82 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)), |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 virtual ~EventRewriterTest() {} | 168 virtual ~EventRewriterTest() {} |
| 166 | 169 |
| 167 virtual void SetUp() { | 170 virtual void SetUp() { |
| 168 // Mocking user manager because the real one needs to be called on UI thread | 171 // Mocking user manager because the real one needs to be called on UI thread |
| 169 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) | 172 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) |
| 170 .WillRepeatedly(testing::Return(false)); | 173 .WillRepeatedly(testing::Return(false)); |
| 171 input_method_manager_mock_ = | 174 input_method_manager_mock_ = |
| 172 new chromeos::input_method::MockInputMethodManager; | 175 new chromeos::input_method::MockInputMethodManager; |
| 173 chromeos::input_method::InitializeForTesting( | 176 chromeos::input_method::InitializeForTesting( |
| 174 input_method_manager_mock_); // pass ownership | 177 input_method_manager_mock_); // pass ownership |
| 178 |
| 179 AshTestBase::SetUp(); |
| 175 } | 180 } |
| 176 | 181 |
| 177 virtual void TearDown() { | 182 virtual void TearDown() { |
| 183 AshTestBase::TearDown(); |
| 178 // Shutdown() deletes the IME mock object. | 184 // Shutdown() deletes the IME mock object. |
| 179 chromeos::input_method::Shutdown(); | 185 chromeos::input_method::Shutdown(); |
| 180 } | 186 } |
| 181 | 187 |
| 182 protected: | 188 protected: |
| 183 void TestRewriteNumPadKeys(); | 189 void TestRewriteNumPadKeys(); |
| 184 void TestRewriteNumPadKeysOnAppleKeyboard(); | 190 void TestRewriteNumPadKeysOnAppleKeyboard(); |
| 185 | 191 |
| 186 void RewriteLocatedEvent(EventRewriter* rewriter, | 192 void RewriteMouseEvent(EventRewriter* rewriter, |
| 187 ui::LocatedEvent* event) { | 193 ui::MouseEvent* event) { |
| 188 rewriter->RewriteLocatedEvent(event); | 194 XEvent* xevent = event->native_event(); |
| 195 rewriter->RewriteLocatedEvent(xevent); |
| 196 *event = ui::MouseEvent(xevent); |
| 189 } | 197 } |
| 190 | 198 |
| 191 Display* display_; | 199 Display* display_; |
| 192 const KeyCode keycode_a_; | 200 const KeyCode keycode_a_; |
| 193 const KeyCode keycode_alt_l_; | 201 const KeyCode keycode_alt_l_; |
| 194 const KeyCode keycode_alt_r_; | 202 const KeyCode keycode_alt_r_; |
| 195 const KeyCode keycode_b_; | 203 const KeyCode keycode_b_; |
| 196 const KeyCode keycode_caps_lock_; | 204 const KeyCode keycode_caps_lock_; |
| 197 const KeyCode keycode_control_l_; | 205 const KeyCode keycode_control_l_; |
| 198 const KeyCode keycode_control_r_; | 206 const KeyCode keycode_control_r_; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 const KeyCode keycode_0_; | 279 const KeyCode keycode_0_; |
| 272 const KeyCode keycode_minus_; | 280 const KeyCode keycode_minus_; |
| 273 const KeyCode keycode_equal_; | 281 const KeyCode keycode_equal_; |
| 274 const KeyCode keycode_period_; | 282 const KeyCode keycode_period_; |
| 275 const KeyCode keycode_insert_; | 283 const KeyCode keycode_insert_; |
| 276 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 284 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
| 277 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 285 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
| 278 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; | 286 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
| 279 }; | 287 }; |
| 280 | 288 |
| 281 #else | |
| 282 class EventRewriterTest : public testing::Test { | |
| 283 public: | |
| 284 EventRewriterTest() {} | |
| 285 virtual ~EventRewriterTest() {} | |
| 286 }; | |
| 287 #endif | |
| 288 | |
| 289 TEST_F(EventRewriterTest, TestGetDeviceType) { | 289 TEST_F(EventRewriterTest, TestGetDeviceType) { |
| 290 // This is the typical string which an Apple keyboard sends. | 290 // This is the typical string which an Apple keyboard sends. |
| 291 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 291 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
| 292 EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); | 292 EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); |
| 293 | 293 |
| 294 // Other cases we accept. | 294 // Other cases we accept. |
| 295 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 295 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
| 296 EventRewriter::GetDeviceType("Apple Keyboard")); | 296 EventRewriter::GetDeviceType("Apple Keyboard")); |
| 297 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 297 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
| 298 EventRewriter::GetDeviceType("apple keyboard")); | 298 EventRewriter::GetDeviceType("apple keyboard")); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); | 332 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); |
| 333 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 333 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
| 334 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); | 334 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); |
| 335 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); | 335 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); |
| 336 // Try to reuse the first ID. | 336 // Try to reuse the first ID. |
| 337 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 337 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
| 338 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); | 338 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); |
| 339 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); | 339 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); |
| 340 } | 340 } |
| 341 | 341 |
| 342 #if defined(OS_CHROMEOS) | |
| 343 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { | 342 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
| 344 // First, test with a PC keyboard. | 343 // First, test with a PC keyboard. |
| 345 TestingPrefServiceSyncable prefs; | 344 TestingPrefServiceSyncable prefs; |
| 346 EventRewriter rewriter; | 345 EventRewriter rewriter; |
| 347 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 346 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| 348 rewriter.set_last_device_id_for_testing(0); | 347 rewriter.set_last_device_id_for_testing(0); |
| 349 rewriter.set_pref_service_for_testing(&prefs); | 348 rewriter.set_pref_service_for_testing(&prefs); |
| 350 | 349 |
| 351 // XK_a, Alt modifier. | 350 // XK_a, Alt modifier. |
| 352 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, | 351 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| (...skipping 1865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2218 ui::VKEY_F9, keycode_f9_, 0, 0 }, | 2217 ui::VKEY_F9, keycode_f9_, 0, 0 }, |
| 2219 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0, | 2218 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0, |
| 2220 ui::VKEY_F10, keycode_f10_, 0, 0 }, | 2219 ui::VKEY_F10, keycode_f10_, 0, 0 }, |
| 2221 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0, | 2220 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0, |
| 2222 ui::VKEY_F11, keycode_f11_, 0, 0 }, | 2221 ui::VKEY_F11, keycode_f11_, 0, 0 }, |
| 2223 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0, | 2222 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0, |
| 2224 ui::VKEY_F12, keycode_f12_, 0, 0 }, | 2223 ui::VKEY_F12, keycode_f12_, 0, 0 }, |
| 2225 }; | 2224 }; |
| 2226 | 2225 |
| 2227 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 2226 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
| 2227 // XKeysymToKeycode returns zero for unknown keys. So ignore those. |
| 2228 if (tests[i].output_native == 0) |
| 2229 continue; |
| 2228 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, | 2230 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, |
| 2229 tests[i].output_mods, | 2231 tests[i].output_mods, |
| 2230 ui::ET_KEY_PRESSED, | 2232 ui::ET_KEY_PRESSED, |
| 2231 tests[i].output_native, | 2233 tests[i].output_native, |
| 2232 tests[i].output_native_mods, | 2234 tests[i].output_native_mods, |
| 2233 KeyPress), | 2235 KeyPress), |
| 2234 GetRewrittenEventAsString(&rewriter, | 2236 GetRewrittenEventAsString(&rewriter, |
| 2235 tests[i].input, | 2237 tests[i].input, |
| 2236 tests[i].input_mods, | 2238 tests[i].input_mods, |
| 2237 ui::ET_KEY_PRESSED, | 2239 ui::ET_KEY_PRESSED, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2299 rewriter.set_pref_service_for_testing(&prefs); | 2301 rewriter.set_pref_service_for_testing(&prefs); |
| 2300 | 2302 |
| 2301 // Send left control press. | 2303 // Send left control press. |
| 2302 std::string rewritten_event; | 2304 std::string rewritten_event; |
| 2303 { | 2305 { |
| 2304 ui::ScopedXI2Event xev; | 2306 ui::ScopedXI2Event xev; |
| 2305 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 2307 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
| 2306 XEvent* xevent = xev; | 2308 XEvent* xevent = xev; |
| 2307 xevent->xkey.keycode = keycode_control_l_; | 2309 xevent->xkey.keycode = keycode_control_l_; |
| 2308 xevent->xkey.send_event = True; // XSendEvent() always does this. | 2310 xevent->xkey.send_event = True; // XSendEvent() always does this. |
| 2311 rewriter.RewriteForTesting(xevent); |
| 2309 ui::KeyEvent keyevent(xev, false /* is_char */); | 2312 ui::KeyEvent keyevent(xev, false /* is_char */); |
| 2310 rewriter.RewriteForTesting(&keyevent); | |
| 2311 rewritten_event = base::StringPrintf( | 2313 rewritten_event = base::StringPrintf( |
| 2312 "ui_keycode=%d ui_flags=%d ui_type=%d " | 2314 "ui_keycode=%d ui_flags=%d ui_type=%d " |
| 2313 "x_keycode=%u x_state=%u x_type=%d", | 2315 "x_keycode=%u x_state=%u x_type=%d", |
| 2314 keyevent.key_code(), keyevent.flags(), keyevent.type(), | 2316 keyevent.key_code(), keyevent.flags(), keyevent.type(), |
| 2315 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); | 2317 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); |
| 2316 } | 2318 } |
| 2317 | 2319 |
| 2318 // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event | 2320 // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event |
| 2319 // flag in the event is True. | 2321 // flag in the event is True. |
| 2320 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, | 2322 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 2321 ui::EF_CONTROL_DOWN, | 2323 ui::EF_CONTROL_DOWN, |
| 2322 ui::ET_KEY_PRESSED, | 2324 ui::ET_KEY_PRESSED, |
| 2323 keycode_control_l_, | 2325 keycode_control_l_, |
| 2324 0U, | 2326 0U, |
| 2325 KeyPress), | 2327 KeyPress), |
| 2326 rewritten_event); | 2328 rewritten_event); |
| 2327 } | 2329 } |
| 2328 | 2330 |
| 2329 // Tests of event rewriting that depend on the Ash window manager. | 2331 // Tests of event rewriting that depend on the Ash window manager. |
| 2330 class EventRewriterAshTest : public ash::test::AshTestBase { | 2332 class EventRewriterAshTest : public ash::test::AshTestBase { |
| 2331 public: | 2333 public: |
| 2332 EventRewriterAshTest() { | 2334 EventRewriterAshTest() { |
| 2333 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); | 2335 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
| 2334 rewriter_.set_pref_service_for_testing(&prefs_); | 2336 rewriter_.set_pref_service_for_testing(&prefs_); |
| 2335 } | 2337 } |
| 2336 virtual ~EventRewriterAshTest() {} | 2338 virtual ~EventRewriterAshTest() {} |
| 2337 | 2339 |
| 2338 bool RewriteFunctionKeys(ui::KeyEvent* event) { | 2340 bool RewriteFunctionKeys(XEvent* event) { |
| 2339 return rewriter_.RewriteFunctionKeys(event); | 2341 return rewriter_.RewriteFunctionKeys(event); |
| 2340 } | 2342 } |
| 2341 | 2343 |
| 2342 protected: | 2344 protected: |
| 2343 TestingPrefServiceSyncable prefs_; | 2345 TestingPrefServiceSyncable prefs_; |
| 2344 | 2346 |
| 2345 private: | 2347 private: |
| 2346 EventRewriter rewriter_; | 2348 EventRewriter rewriter_; |
| 2347 | 2349 |
| 2348 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); | 2350 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
| 2349 }; | 2351 }; |
| 2350 | 2352 |
| 2351 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { | 2353 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { |
| 2352 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); | 2354 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
| 2353 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); | 2355 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
| 2354 window_state->Activate(); | 2356 window_state->Activate(); |
| 2355 | 2357 |
| 2356 // Create a simulated keypress of F1 targetted at the window. | 2358 // Create a simulated keypress of F1 targetted at the window. |
| 2357 ui::ScopedXI2Event xev_f1; | 2359 ui::ScopedXI2Event xev_f1; |
| 2358 KeyCode keycode_f1 = XKeysymToKeycode(gfx::GetXDisplay(), XK_F1); | 2360 KeyCode keycode_f1 = XKeysymToKeycode(gfx::GetXDisplay(), XK_F1); |
| 2359 xev_f1.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0); | 2361 xev_f1.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0); |
| 2360 XEvent* xevent = xev_f1; | 2362 XEvent* xevent = xev_f1; |
| 2361 xevent->xkey.keycode = keycode_f1; | 2363 xevent->xkey.keycode = keycode_f1; |
| 2362 ui::KeyEvent press_f1(xev_f1, false); | |
| 2363 ui::Event::DispatcherApi dispatch_helper(&press_f1); | |
| 2364 dispatch_helper.set_target(window.get()); | |
| 2365 | 2364 |
| 2366 // Simulate an apps v2 window that has requested top row keys as function | 2365 // Simulate an apps v2 window that has requested top row keys as function |
| 2367 // keys. The event should not be rewritten. | 2366 // keys. The event should not be rewritten. |
| 2368 window_state->set_top_row_keys_are_function_keys(true); | 2367 window_state->set_top_row_keys_are_function_keys(true); |
| 2369 ASSERT_FALSE(RewriteFunctionKeys(&press_f1)); | 2368 ASSERT_FALSE(RewriteFunctionKeys(xevent)); |
| 2369 ui::KeyEvent press_f1(xev_f1, false); |
| 2370 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); | 2370 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); |
| 2371 | 2371 |
| 2372 // The event should also not be rewritten if the send-function-keys pref is | 2372 // The event should also not be rewritten if the send-function-keys pref is |
| 2373 // additionally set, for both apps v2 and regular windows. | 2373 // additionally set, for both apps v2 and regular windows. |
| 2374 BooleanPrefMember send_function_keys_pref; | 2374 BooleanPrefMember send_function_keys_pref; |
| 2375 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); | 2375 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); |
| 2376 send_function_keys_pref.SetValue(true); | 2376 send_function_keys_pref.SetValue(true); |
| 2377 ASSERT_FALSE(RewriteFunctionKeys(&press_f1)); | 2377 ASSERT_FALSE(RewriteFunctionKeys(xevent)); |
| 2378 press_f1 = ui::KeyEvent(xev_f1, false); |
| 2378 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); | 2379 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); |
| 2379 window_state->set_top_row_keys_are_function_keys(false); | 2380 window_state->set_top_row_keys_are_function_keys(false); |
| 2380 ASSERT_FALSE(RewriteFunctionKeys(&press_f1)); | 2381 ASSERT_FALSE(RewriteFunctionKeys(xevent)); |
| 2382 press_f1 = ui::KeyEvent(xev_f1, false); |
| 2381 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); | 2383 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); |
| 2382 | 2384 |
| 2383 // If the pref isn't set when an event is sent to a regular window, F1 is | 2385 // If the pref isn't set when an event is sent to a regular window, F1 is |
| 2384 // rewritten to the back key. | 2386 // rewritten to the back key. |
| 2385 send_function_keys_pref.SetValue(false); | 2387 send_function_keys_pref.SetValue(false); |
| 2386 ASSERT_TRUE(RewriteFunctionKeys(&press_f1)); | 2388 ASSERT_TRUE(RewriteFunctionKeys(xevent)); |
| 2389 press_f1 = ui::KeyEvent(xev_f1, false); |
| 2387 ASSERT_EQ(ui::VKEY_BROWSER_BACK, press_f1.key_code()); | 2390 ASSERT_EQ(ui::VKEY_BROWSER_BACK, press_f1.key_code()); |
| 2388 } | 2391 } |
| 2389 | 2392 |
| 2390 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { | 2393 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
| 2391 std::vector<unsigned int> device_list; | 2394 std::vector<unsigned int> device_list; |
| 2392 device_list.push_back(10); | 2395 device_list.push_back(10); |
| 2393 device_list.push_back(11); | 2396 device_list.push_back(11); |
| 2394 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 2397 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
| 2395 TestingPrefServiceSyncable prefs; | 2398 TestingPrefServiceSyncable prefs; |
| 2396 EventRewriter rewriter; | 2399 EventRewriter rewriter; |
| 2397 rewriter.set_pref_service_for_testing(&prefs); | 2400 rewriter.set_pref_service_for_testing(&prefs); |
| 2398 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; | 2401 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; |
| 2399 { | 2402 { |
| 2400 ui::ScopedXI2Event xev; | 2403 ui::ScopedXI2Event xev; |
| 2401 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_PRESSED, kLeftAndAltFlag); | 2404 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_PRESSED, kLeftAndAltFlag); |
| 2402 ui::MouseEvent press(xev); | 2405 ui::MouseEvent press(xev); |
| 2403 // Sanity check. | 2406 // Sanity check. |
| 2404 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 2407 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
| 2405 EXPECT_EQ(kLeftAndAltFlag, press.flags()); | 2408 EXPECT_EQ(kLeftAndAltFlag, press.flags()); |
| 2406 | 2409 |
| 2407 RewriteLocatedEvent(&rewriter, &press); | 2410 RewriteMouseEvent(&rewriter, &press); |
| 2408 | 2411 |
| 2409 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & press.flags()); | 2412 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & press.flags()); |
| 2410 } | 2413 } |
| 2411 { | 2414 { |
| 2412 ui::ScopedXI2Event xev; | 2415 ui::ScopedXI2Event xev; |
| 2413 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); | 2416 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); |
| 2414 ui::MouseEvent release(xev); | 2417 ui::MouseEvent release(xev); |
| 2415 RewriteLocatedEvent(&rewriter, &release); | 2418 RewriteMouseEvent(&rewriter, &release); |
| 2416 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); | 2419 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); |
| 2417 } | 2420 } |
| 2418 | 2421 |
| 2419 // No ALT in frst click. | 2422 // No ALT in frst click. |
| 2420 { | 2423 { |
| 2421 ui::ScopedXI2Event xev; | 2424 ui::ScopedXI2Event xev; |
| 2422 xev.InitGenericButtonEvent( | 2425 xev.InitGenericButtonEvent( |
| 2423 10, ui::ET_MOUSE_PRESSED, ui::EF_LEFT_MOUSE_BUTTON); | 2426 10, ui::ET_MOUSE_PRESSED, ui::EF_LEFT_MOUSE_BUTTON); |
| 2424 ui::MouseEvent press(xev); | 2427 ui::MouseEvent press(xev); |
| 2425 RewriteLocatedEvent(&rewriter, &press); | 2428 RewriteMouseEvent(&rewriter, &press); |
| 2426 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & press.flags()); | 2429 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & press.flags()); |
| 2427 } | 2430 } |
| 2428 { | 2431 { |
| 2429 ui::ScopedXI2Event xev; | 2432 ui::ScopedXI2Event xev; |
| 2430 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); | 2433 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); |
| 2431 ui::MouseEvent release(xev); | 2434 ui::MouseEvent release(xev); |
| 2432 RewriteLocatedEvent(&rewriter, &release); | 2435 RewriteMouseEvent(&rewriter, &release); |
| 2433 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & | 2436 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & |
| 2434 release.flags()); | 2437 release.flags()); |
| 2435 } | 2438 } |
| 2436 | 2439 |
| 2437 // ALT on different device. | 2440 // ALT on different device. |
| 2438 { | 2441 { |
| 2439 ui::ScopedXI2Event xev; | 2442 ui::ScopedXI2Event xev; |
| 2440 xev.InitGenericButtonEvent(11, ui::ET_MOUSE_PRESSED, kLeftAndAltFlag); | 2443 xev.InitGenericButtonEvent(11, ui::ET_MOUSE_PRESSED, kLeftAndAltFlag); |
| 2441 ui::MouseEvent press(xev); | 2444 ui::MouseEvent press(xev); |
| 2442 RewriteLocatedEvent(&rewriter, &press); | 2445 RewriteMouseEvent(&rewriter, &press); |
| 2443 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & press.flags()); | 2446 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & press.flags()); |
| 2444 } | 2447 } |
| 2445 { | 2448 { |
| 2446 ui::ScopedXI2Event xev; | 2449 ui::ScopedXI2Event xev; |
| 2447 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); | 2450 xev.InitGenericButtonEvent(10, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); |
| 2448 ui::MouseEvent release(xev); | 2451 ui::MouseEvent release(xev); |
| 2449 RewriteLocatedEvent(&rewriter, &release); | 2452 RewriteMouseEvent(&rewriter, &release); |
| 2450 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & | 2453 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & |
| 2451 release.flags()); | 2454 release.flags()); |
| 2452 } | 2455 } |
| 2453 { | 2456 { |
| 2454 ui::ScopedXI2Event xev; | 2457 ui::ScopedXI2Event xev; |
| 2455 xev.InitGenericButtonEvent(11, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); | 2458 xev.InitGenericButtonEvent(11, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); |
| 2456 ui::MouseEvent release(xev); | 2459 ui::MouseEvent release(xev); |
| 2457 RewriteLocatedEvent(&rewriter, &release); | 2460 RewriteMouseEvent(&rewriter, &release); |
| 2458 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); | 2461 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); |
| 2459 } | 2462 } |
| 2460 } | 2463 } |
| 2461 | 2464 |
| 2462 #endif // OS_CHROMEOS | 2465 } // namespace chromeos |
| OLD | NEW |