Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(481)

Side by Side Diff: chrome/browser/ui/views/ash/key_rewriter_unittest.cc

Issue 9963027: ash: Remap Command on Apple keyboards to Control [2/2] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: apply my own review feedback from http://codereview.chromium.org/9854025/ Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/views/ash/key_rewriter.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "chrome/browser/ui/views/ash/key_rewriter.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/aura/event.h"
9
10 #if defined(OS_CHROMEOS)
11 #include <X11/keysym.h>
12 #include <X11/Xlib.h>
13
14 #include "ui/base/x/x11_util.h"
15
16 namespace {
17
18 void InitXKeyEvent(ui::KeyboardCode ui_keycode,
19 int ui_flags,
20 unsigned int x_keycode,
21 unsigned int x_state,
22 XEvent* event) {
23 ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED,
24 ui_keycode,
25 ui_flags,
26 event);
27 event->xkey.keycode = x_keycode;
28 event->xkey.state = x_state;
29 }
30
31 } // namespace
32 #endif
33
34 TEST(KeyRewriterTest, TestGetDeviceType) {
35 // This is the typical string which an Apple keyboard sends.
36 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
37 KeyRewriter::GetDeviceType("Apple Inc. Apple Keyboard"));
38
39 // Other cases we accept.
40 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
41 KeyRewriter::GetDeviceType("Apple Keyboard"));
42 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
43 KeyRewriter::GetDeviceType("apple keyboard"));
44 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
45 KeyRewriter::GetDeviceType("apple keyboard."));
46 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
47 KeyRewriter::GetDeviceType("apple.keyboard."));
48 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
49 KeyRewriter::GetDeviceType(".apple.keyboard."));
50
51 // Dell, Microsoft, Logitech, ... should be recognized as a kDeviceUnknown.
52 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
53 KeyRewriter::GetDeviceType("Dell Dell USB Entry Keyboard"));
54 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
55 KeyRewriter::GetDeviceType("Microsoft Natural Ergonomic Keyboard"));
56 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
57 KeyRewriter::GetDeviceType("CHESEN USB Keyboard"));
58
59 // Some corner cases.
60 EXPECT_EQ(KeyRewriter::kDeviceUnknown, KeyRewriter::GetDeviceType(""));
61 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
62 KeyRewriter::GetDeviceType("."));
63 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
64 KeyRewriter::GetDeviceType(". "));
65 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
66 KeyRewriter::GetDeviceType(" ."));
67 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
68 KeyRewriter::GetDeviceType("not-an-apple keyboard"));
69 }
70
71 TEST(KeyRewriterTest, TestDeviceAddedOrRemoved) {
72 KeyRewriter rewriter;
73 EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty());
74 EXPECT_EQ(KeyRewriter::kDeviceUnknown,
75 rewriter.DeviceAddedForTesting(0, "PC Keyboard"));
76 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size());
77 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
78 rewriter.DeviceAddedForTesting(1, "Apple Keyboard"));
79 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size());
80 // Try to reuse the first ID.
81 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
82 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"));
83 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size());
84 }
85
86 #if defined(OS_CHROMEOS)
87 TEST(KeyRewriterTest, TestRewriteCommandToControl) {
88 XEvent xev;
89
90 const unsigned int kKeycodeA =
91 XKeysymToKeycode(ui::GetXDisplay(), XK_a);
92 const unsigned int kKeycodeSuperL =
93 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_L);
94 const unsigned int kKeycodeSuperR =
95 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_R);
96 const unsigned int kKeycodeControlL =
97 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_L);
98 const unsigned int kKeycodeControlR =
99 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_R);
100
101 // First, test with a PC keyboard.
102 KeyRewriter rewriter;
103 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
104 rewriter.set_last_device_id_for_testing(0);
105 {
106 // XK_a, Alt modifier.
107 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev);
108 aura::KeyEvent keyevent(&xev, false /* is_char */);
109 rewriter.RewriteCommandToControlForTesting(&keyevent);
110 EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
111 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
112 const XKeyEvent& xkey = keyevent.native_event()->xkey;
113 EXPECT_EQ(kKeycodeA, xkey.keycode);
114 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
115 }
116 {
117 // XK_a, Win modifier.
118 InitXKeyEvent(ui::VKEY_A, 0, kKeycodeA, Mod4Mask, &xev);
119 aura::KeyEvent keyevent(&xev, false /* is_char */);
120 rewriter.RewriteCommandToControlForTesting(&keyevent);
121 EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
122 EXPECT_EQ(0, keyevent.flags());
123 const XKeyEvent& xkey = keyevent.native_event()->xkey;
124 EXPECT_EQ(kKeycodeA, xkey.keycode);
125 EXPECT_EQ(static_cast<unsigned int>(Mod4Mask), xkey.state);
126 }
127 {
128 // XK_a, Alt+Win modifier.
129 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN,
130 kKeycodeA, Mod1Mask | Mod4Mask, &xev);
131 aura::KeyEvent keyevent(&xev, false /* is_char */);
132 rewriter.RewriteCommandToControlForTesting(&keyevent);
133 EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
134 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
135 const XKeyEvent& xkey = keyevent.native_event()->xkey;
136 EXPECT_EQ(kKeycodeA, xkey.keycode);
137 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod4Mask), xkey.state);
138 }
139 {
140 // XK_Super_L (left Windows key), Alt modifier.
141 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN,
142 kKeycodeSuperL, Mod1Mask, &xev);
143 aura::KeyEvent keyevent(&xev, false /* is_char */);
144 rewriter.RewriteCommandToControlForTesting(&keyevent);
145 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code());
146 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
147 const XKeyEvent& xkey = keyevent.native_event()->xkey;
148 EXPECT_EQ(kKeycodeSuperL, xkey.keycode);
149 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
150 }
151 {
152 // XK_Super_R (right Windows key), Alt modifier.
153 InitXKeyEvent(ui::VKEY_RWIN, ui::EF_ALT_DOWN,
154 kKeycodeSuperR, Mod1Mask, &xev);
155 aura::KeyEvent keyevent(&xev, false /* is_char */);
156 rewriter.RewriteCommandToControlForTesting(&keyevent);
157 EXPECT_EQ(ui::VKEY_RWIN, keyevent.key_code());
158 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
159 const XKeyEvent& xkey = keyevent.native_event()->xkey;
160 EXPECT_EQ(kKeycodeSuperR, xkey.keycode);
161 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
162 }
163
164 // An Apple keyboard reuse the ID, zero.
165 rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
166 rewriter.set_last_device_id_for_testing(0);
167 {
168 // XK_a, Alt modifier.
169 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev);
170 aura::KeyEvent keyevent(&xev, false /* is_char */);
171 rewriter.RewriteCommandToControlForTesting(&keyevent);
172 EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
173 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
174 const XKeyEvent& xkey = keyevent.native_event()->xkey;
175 EXPECT_EQ(kKeycodeA, xkey.keycode);
176 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
177 }
178 {
179 // XK_a, Win modifier.
180 InitXKeyEvent(ui::VKEY_A, 0, kKeycodeA, Mod4Mask, &xev);
181 aura::KeyEvent keyevent(&xev, false /* is_char */);
182 rewriter.RewriteCommandToControlForTesting(&keyevent);
183 EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
184 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags());
185 const XKeyEvent& xkey = keyevent.native_event()->xkey;
186 EXPECT_EQ(kKeycodeA, xkey.keycode);
187 EXPECT_EQ(static_cast<unsigned int>(ControlMask), xkey.state);
188 }
189 {
190 // XK_a, Alt+Win modifier.
191 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN,
192 kKeycodeA, Mod1Mask | Mod4Mask, &xev);
193 aura::KeyEvent keyevent(&xev, false /* is_char */);
194 rewriter.RewriteCommandToControlForTesting(&keyevent);
195 EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
196 EXPECT_EQ(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, keyevent.flags());
197 const XKeyEvent& xkey = keyevent.native_event()->xkey;
198 EXPECT_EQ(kKeycodeA, xkey.keycode);
199 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | ControlMask), xkey.state);
200 }
201 {
202 // XK_Super_L (left Windows key), Alt modifier.
203 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN,
204 kKeycodeSuperL, Mod1Mask, &xev);
205 aura::KeyEvent keyevent(&xev, false /* is_char */);
206 rewriter.RewriteCommandToControlForTesting(&keyevent);
207 EXPECT_EQ(ui::VKEY_LCONTROL, keyevent.key_code());
208 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
209 const XKeyEvent& xkey = keyevent.native_event()->xkey;
210 EXPECT_EQ(kKeycodeControlL, xkey.keycode);
211 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
212 }
213 {
214 // XK_Super_R (right Windows key), Alt modifier.
215 InitXKeyEvent(ui::VKEY_RWIN, ui::EF_ALT_DOWN,
216 kKeycodeSuperR, Mod1Mask, &xev);
217 aura::KeyEvent keyevent(&xev, false /* is_char */);
218 rewriter.RewriteCommandToControlForTesting(&keyevent);
219 EXPECT_EQ(ui::VKEY_RCONTROL, keyevent.key_code());
220 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
221 const XKeyEvent& xkey = keyevent.native_event()->xkey;
222 EXPECT_EQ(kKeycodeControlR, xkey.keycode);
223 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
224 }
225 }
226 #endif // OS_CHROMEOS
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/ash/key_rewriter.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698