Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/ash/event_rewriter.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
| 9 #include "chrome/browser/api/prefs/pref_member.h" | 9 #include "chrome/browser/api/prefs/pref_member.h" |
| 10 #include "chrome/common/pref_names.h" | 10 #include "chrome/common/pref_names.h" |
| 11 #include "chrome/test/base/testing_pref_service.h" | 11 #include "chrome/test/base/testing_pref_service.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "ui/base/events/event.h" | 13 #include "ui/base/events/event.h" |
| 14 | 14 |
| 15 #if defined(OS_CHROMEOS) | 15 #if defined(OS_CHROMEOS) |
| 16 #include <X11/keysym.h> | 16 #include <X11/keysym.h> |
| 17 #include <X11/XF86keysym.h> | |
| 17 #include <X11/Xlib.h> | 18 #include <X11/Xlib.h> |
| 18 | 19 |
| 19 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" | 20 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
| 20 #include "chrome/browser/chromeos/input_method/mock_xkeyboard.h" | 21 #include "chrome/browser/chromeos/input_method/mock_xkeyboard.h" |
| 21 #include "chrome/browser/chromeos/login/mock_user_manager.h" | 22 #include "chrome/browser/chromeos/login/mock_user_manager.h" |
| 22 #include "chrome/browser/chromeos/preferences.h" | 23 #include "chrome/browser/chromeos/preferences.h" |
| 23 #include "ui/base/x/x11_util.h" | 24 #include "ui/base/x/x11_util.h" |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| 26 | 27 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)), | 105 keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)), |
| 105 keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)), | 106 keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)), |
| 106 keycode_delete_(XKeysymToKeycode(display_, XK_Delete)), | 107 keycode_delete_(XKeysymToKeycode(display_, XK_Delete)), |
| 107 keycode_backspace_(XKeysymToKeycode(display_, XK_BackSpace)), | 108 keycode_backspace_(XKeysymToKeycode(display_, XK_BackSpace)), |
| 108 keycode_up_(XKeysymToKeycode(display_, XK_Up)), | 109 keycode_up_(XKeysymToKeycode(display_, XK_Up)), |
| 109 keycode_down_(XKeysymToKeycode(display_, XK_Down)), | 110 keycode_down_(XKeysymToKeycode(display_, XK_Down)), |
| 110 keycode_prior_(XKeysymToKeycode(display_, XK_Prior)), | 111 keycode_prior_(XKeysymToKeycode(display_, XK_Prior)), |
| 111 keycode_next_(XKeysymToKeycode(display_, XK_Next)), | 112 keycode_next_(XKeysymToKeycode(display_, XK_Next)), |
| 112 keycode_home_(XKeysymToKeycode(display_, XK_Home)), | 113 keycode_home_(XKeysymToKeycode(display_, XK_Home)), |
| 113 keycode_end_(XKeysymToKeycode(display_, XK_End)), | 114 keycode_end_(XKeysymToKeycode(display_, XK_End)), |
| 115 keycode_launch7_(XKeysymToKeycode(display_, XF86XK_Launch7)), | |
| 114 input_method_manager_mock_(NULL) { | 116 input_method_manager_mock_(NULL) { |
| 115 } | 117 } |
| 116 virtual ~EventRewriterTest() {} | 118 virtual ~EventRewriterTest() {} |
| 117 | 119 |
| 118 virtual void SetUp() { | 120 virtual void SetUp() { |
| 119 // Mocking user manager because the real one needs to be called on UI thread | 121 // Mocking user manager because the real one needs to be called on UI thread |
| 120 EXPECT_CALL(*user_manager_mock_.user_manager(), IsLoggedInAsGuest()) | 122 EXPECT_CALL(*user_manager_mock_.user_manager(), IsLoggedInAsGuest()) |
| 121 .WillRepeatedly(testing::Return(false)); | 123 .WillRepeatedly(testing::Return(false)); |
| 122 input_method_manager_mock_ = | 124 input_method_manager_mock_ = |
| 123 new chromeos::input_method::MockInputMethodManager; | 125 new chromeos::input_method::MockInputMethodManager; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 const KeyCode keycode_super_r_; | 169 const KeyCode keycode_super_r_; |
| 168 const KeyCode keycode_void_symbol_; | 170 const KeyCode keycode_void_symbol_; |
| 169 const KeyCode keycode_delete_; | 171 const KeyCode keycode_delete_; |
| 170 const KeyCode keycode_backspace_; | 172 const KeyCode keycode_backspace_; |
| 171 const KeyCode keycode_up_; | 173 const KeyCode keycode_up_; |
| 172 const KeyCode keycode_down_; | 174 const KeyCode keycode_down_; |
| 173 const KeyCode keycode_prior_; | 175 const KeyCode keycode_prior_; |
| 174 const KeyCode keycode_next_; | 176 const KeyCode keycode_next_; |
| 175 const KeyCode keycode_home_; | 177 const KeyCode keycode_home_; |
| 176 const KeyCode keycode_end_; | 178 const KeyCode keycode_end_; |
| 179 const KeyCode keycode_launch7_; // F16 | |
| 177 chromeos::ScopedMockUserManagerEnabler user_manager_mock_; | 180 chromeos::ScopedMockUserManagerEnabler user_manager_mock_; |
| 178 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; | 181 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
| 179 }; | 182 }; |
| 180 | 183 |
| 181 } // namespace | 184 } // namespace |
| 182 #else | 185 #else |
| 183 class EventRewriterTest : public testing::Test { | 186 class EventRewriterTest : public testing::Test { |
| 184 public: | 187 public: |
| 185 EventRewriterTest() {} | 188 EventRewriterTest() {} |
| 186 virtual ~EventRewriterTest() {} | 189 virtual ~EventRewriterTest() {} |
| (...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1471 KeyRelease), | 1474 KeyRelease), |
| 1472 GetRewrittenEventAsString(&rewriter, | 1475 GetRewrittenEventAsString(&rewriter, |
| 1473 ui::VKEY_CAPITAL, | 1476 ui::VKEY_CAPITAL, |
| 1474 ui::EF_CAPS_LOCK_DOWN, | 1477 ui::EF_CAPS_LOCK_DOWN, |
| 1475 ui::ET_KEY_RELEASED, | 1478 ui::ET_KEY_RELEASED, |
| 1476 keycode_caps_lock_, | 1479 keycode_caps_lock_, |
| 1477 LockMask)); | 1480 LockMask)); |
| 1478 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | 1481 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); |
| 1479 } | 1482 } |
| 1480 | 1483 |
| 1481 TEST_F(EventRewriterTest, TestRewriteFn) { | 1484 TEST_F(EventRewriterTest, DISABLED_TestRewriteCapsLock) { |
| 1485 // It seems that the X server running on build servers is too old and does not | |
| 1486 // support F16 (i.e. 'XKeysymToKeycode(display_, XF86XK_Launch7)' call). | |
| 1487 // TODO(yusukes): Reenable the test once build servers are upgraded. | |
|
Daniel Erat
2012/10/30 18:16:34
nit: mind filing a bug to track this, if you haven
Yusuke Sato
2012/10/30 19:11:33
Done: http://code.google.com/p/chromium/issues/det
| |
| 1488 | |
| 1482 TestingPrefService prefs; | 1489 TestingPrefService prefs; |
| 1490 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 1491 | |
| 1492 chromeos::input_method::MockXKeyboard xkeyboard; | |
| 1493 EventRewriter rewriter; | |
| 1494 rewriter.set_pref_service_for_testing(&prefs); | |
| 1495 rewriter.set_xkeyboard_for_testing(&xkeyboard); | |
| 1496 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | |
| 1497 | |
| 1498 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. | |
| 1499 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | |
| 1500 ui::EF_CAPS_LOCK_DOWN, | |
| 1501 ui::ET_KEY_PRESSED, | |
| 1502 keycode_caps_lock_, | |
| 1503 0U, | |
| 1504 KeyPress), | |
| 1505 GetRewrittenEventAsString(&rewriter, | |
| 1506 ui::VKEY_F16, | |
| 1507 0, | |
| 1508 ui::ET_KEY_PRESSED, | |
| 1509 keycode_launch7_, | |
| 1510 0U)); | |
| 1511 | |
| 1512 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); | |
| 1513 } | |
| 1514 | |
| 1515 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { | |
| 1516 TestingPrefService prefs; | |
| 1517 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 1518 IntegerPrefMember control; | |
| 1519 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs, NULL); | |
| 1520 control.SetValue(chromeos::input_method::kControlKey); | |
| 1521 | |
| 1483 EventRewriter rewriter; | 1522 EventRewriter rewriter; |
| 1484 rewriter.set_pref_service_for_testing(&prefs); | 1523 rewriter.set_pref_service_for_testing(&prefs); |
| 1485 | 1524 |
| 1486 // Press F15+a. Confirm that Mod3Mask is rewritten to ControlMask. | 1525 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. |
| 1487 // On Chrome OS, F15 works as a modifier (Mod3). http://crosbug/p/14339 | 1526 // On Chrome OS, CapsLock works as a Mod3 modifier. |
| 1488 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, | 1527 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 1489 ui::EF_CONTROL_DOWN, | 1528 ui::EF_CONTROL_DOWN, |
| 1490 ui::ET_KEY_PRESSED, | 1529 ui::ET_KEY_PRESSED, |
| 1491 keycode_a_, | 1530 keycode_a_, |
| 1492 ControlMask, | 1531 ControlMask, |
| 1493 KeyPress), | 1532 KeyPress), |
| 1494 GetRewrittenEventAsString(&rewriter, | 1533 GetRewrittenEventAsString(&rewriter, |
| 1495 ui::VKEY_A, | 1534 ui::VKEY_A, |
| 1496 0, | 1535 0, |
| 1497 ui::ET_KEY_PRESSED, | 1536 ui::ET_KEY_PRESSED, |
| 1498 keycode_a_, | 1537 keycode_a_, |
| 1499 Mod3Mask)); | 1538 Mod3Mask)); |
| 1500 | 1539 |
| 1501 // Press Control+F15+a. Confirm that Mod3Mask is rewritten to ControlMask. | 1540 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask |
| 1502 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, | 1541 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 1503 ui::EF_CONTROL_DOWN, | 1542 ui::EF_CONTROL_DOWN, |
| 1504 ui::ET_KEY_PRESSED, | 1543 ui::ET_KEY_PRESSED, |
| 1505 keycode_a_, | 1544 keycode_a_, |
| 1506 ControlMask, | 1545 ControlMask, |
| 1507 KeyPress), | 1546 KeyPress), |
| 1508 GetRewrittenEventAsString(&rewriter, | 1547 GetRewrittenEventAsString(&rewriter, |
| 1509 ui::VKEY_A, | 1548 ui::VKEY_A, |
| 1510 ui::EF_CONTROL_DOWN, | 1549 ui::EF_CONTROL_DOWN, |
| 1511 ui::ET_KEY_PRESSED, | 1550 ui::ET_KEY_PRESSED, |
| 1512 keycode_a_, | 1551 keycode_a_, |
| 1513 Mod3Mask | ControlMask)); | 1552 Mod3Mask | ControlMask)); |
| 1514 | 1553 |
| 1515 // Press Alt+F15+a. Confirm that Mod3Mask is rewritten to ControlMask. | 1554 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. |
| 1516 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, | 1555 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 1517 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, | 1556 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, |
| 1518 ui::ET_KEY_PRESSED, | 1557 ui::ET_KEY_PRESSED, |
| 1519 keycode_a_, | 1558 keycode_a_, |
| 1520 Mod1Mask | ControlMask, | 1559 Mod1Mask | ControlMask, |
| 1521 KeyPress), | 1560 KeyPress), |
| 1522 GetRewrittenEventAsString(&rewriter, | 1561 GetRewrittenEventAsString(&rewriter, |
| 1523 ui::VKEY_A, | 1562 ui::VKEY_A, |
| 1524 ui::EF_ALT_DOWN, | 1563 ui::EF_ALT_DOWN, |
| 1525 ui::ET_KEY_PRESSED, | 1564 ui::ET_KEY_PRESSED, |
| 1526 keycode_a_, | 1565 keycode_a_, |
| 1527 Mod1Mask | Mod3Mask)); | 1566 Mod1Mask | Mod3Mask)); |
| 1528 } | 1567 } |
| 1529 | 1568 |
| 1530 TEST_F(EventRewriterTest, TestRewriteFnMod3InUse) { | 1569 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { |
| 1570 // Remap CapsLock to Control. | |
| 1531 TestingPrefService prefs; | 1571 TestingPrefService prefs; |
| 1572 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 1573 IntegerPrefMember control; | |
| 1574 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs, NULL); | |
| 1575 control.SetValue(chromeos::input_method::kControlKey); | |
| 1576 | |
| 1532 EventRewriter rewriter; | 1577 EventRewriter rewriter; |
| 1533 rewriter.set_pref_service_for_testing(&prefs); | 1578 rewriter.set_pref_service_for_testing(&prefs); |
| 1534 input_method_manager_mock_->SetCurrentInputMethodId("xkb:de:neo:ger"); | 1579 input_method_manager_mock_->SetCurrentInputMethodId("xkb:de:neo:ger"); |
| 1535 | 1580 |
| 1536 // Press F15+a. Confirm that Mod3Mask is NOT rewritten to ControlMask when | 1581 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask |
| 1537 // Mod3Mask is already in use by the current XKB layout. | 1582 // when Mod3Mask is already in use by the current XKB layout. |
| 1538 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, | 1583 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 1539 0, | 1584 0, |
| 1540 ui::ET_KEY_PRESSED, | 1585 ui::ET_KEY_PRESSED, |
| 1541 keycode_a_, | 1586 keycode_a_, |
| 1542 Mod3Mask, | 1587 Mod3Mask, |
| 1543 KeyPress), | 1588 KeyPress), |
| 1544 GetRewrittenEventAsString(&rewriter, | 1589 GetRewrittenEventAsString(&rewriter, |
| 1545 ui::VKEY_A, | 1590 ui::VKEY_A, |
| 1546 0, | 1591 0, |
| 1547 ui::ET_KEY_PRESSED, | 1592 ui::ET_KEY_PRESSED, |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1727 // flag in the event is True. | 1772 // flag in the event is True. |
| 1728 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, | 1773 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1729 ui::EF_CONTROL_DOWN, | 1774 ui::EF_CONTROL_DOWN, |
| 1730 ui::ET_KEY_PRESSED, | 1775 ui::ET_KEY_PRESSED, |
| 1731 keycode_control_l_, | 1776 keycode_control_l_, |
| 1732 0U, | 1777 0U, |
| 1733 KeyPress), | 1778 KeyPress), |
| 1734 rewritten_event); | 1779 rewritten_event); |
| 1735 } | 1780 } |
| 1736 #endif // OS_CHROMEOS | 1781 #endif // OS_CHROMEOS |
| OLD | NEW |