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 |