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

Side by Side Diff: content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm

Issue 1706683002: [Mac] Produce correct DomKey when Ctrl/Shift/Command is down (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tapted's review, add test Alt and Ctrl Alt Created 4 years, 10 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "content/browser/renderer_host/input/web_input_event_builders_mac.h" 5 #include "content/browser/renderer_host/input/web_input_event_builders_mac.h"
6 6
7 #include <Carbon/Carbon.h> 7 #include <Carbon/Carbon.h>
8 #import <Cocoa/Cocoa.h> 8 #import <Cocoa/Cocoa.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 10
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 105
106 // Test that control sequence generate the correct vkey code. 106 // Test that control sequence generate the correct vkey code.
107 TEST(WebInputEventBuilderMacTest, ControlSequence) { 107 TEST(WebInputEventBuilderMacTest, ControlSequence) {
108 // Ctrl-[ generates escape. 108 // Ctrl-[ generates escape.
109 NSEvent* mac_event = 109 NSEvent* mac_event =
110 BuildFakeKeyEvent(0x21, 0x1b, NSControlKeyMask, NSKeyDown); 110 BuildFakeKeyEvent(0x21, 0x1b, NSControlKeyMask, NSKeyDown);
111 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); 111 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
112 EXPECT_EQ(ui::VKEY_OEM_4, web_event.windowsKeyCode); 112 EXPECT_EQ(ui::VKEY_OEM_4, web_event.windowsKeyCode);
113 EXPECT_EQ(ui::DomCode::BRACKET_LEFT, 113 EXPECT_EQ(ui::DomCode::BRACKET_LEFT,
114 static_cast<ui::DomCode>(web_event.domCode)); 114 static_cast<ui::DomCode>(web_event.domCode));
115 EXPECT_EQ(ui::DomKey::FromCharacter(0x1b), web_event.domKey); 115 // Will only pass on US layout.
116 EXPECT_EQ(ui::DomKey::FromCharacter('['), web_event.domKey);
116 } 117 }
117 118
118 // Test that numpad keys get mapped correctly. 119 // Test that numpad keys get mapped correctly.
119 TEST(WebInputEventBuilderMacTest, NumPadMapping) { 120 TEST(WebInputEventBuilderMacTest, NumPadMapping) {
120 KeyMappingEntry table[] = { 121 KeyMappingEntry table[] = {
121 {65, '.', ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, 122 {65, '.', ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL,
122 ui::DomKey::FromCharacter('.')}, 123 ui::DomKey::FromCharacter('.')},
123 {67, '*', ui::VKEY_MULTIPLY, ui::DomCode::NUMPAD_MULTIPLY, 124 {67, '*', ui::VKEY_MULTIPLY, ui::DomCode::NUMPAD_MULTIPLY,
124 ui::DomKey::FromCharacter('*')}, 125 ui::DomKey::FromCharacter('*')},
125 {69, '+', ui::VKEY_ADD, ui::DomCode::NUMPAD_ADD, 126 {69, '+', ui::VKEY_ADD, ui::DomCode::NUMPAD_ADD,
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 webEvent = WebKeyboardEventBuilder::Build(macEvent); 240 webEvent = WebKeyboardEventBuilder::Build(macEvent);
240 EXPECT_TRUE(webEvent.isSystemKey); 241 EXPECT_TRUE(webEvent.isSystemKey);
241 242
242 // Cmd + <some other modifier> + <any letter other then B and I> should be 243 // Cmd + <some other modifier> + <any letter other then B and I> should be
243 // treated as system event. 244 // treated as system event.
244 macEvent = BuildFakeKeyEvent(kVK_ANSI_S, 'S', 245 macEvent = BuildFakeKeyEvent(kVK_ANSI_S, 'S',
245 NSCommandKeyMask | NSShiftKeyMask, NSKeyDown); 246 NSCommandKeyMask | NSShiftKeyMask, NSKeyDown);
246 webEvent = WebKeyboardEventBuilder::Build(macEvent); 247 webEvent = WebKeyboardEventBuilder::Build(macEvent);
247 EXPECT_TRUE(webEvent.isSystemKey); 248 EXPECT_TRUE(webEvent.isSystemKey);
248 } 249 }
250
251 // Test conversion from key combination with Control to DomKey.
252 // TODO(chongz): Move DomKey tests for all platforms into one place.
253 // http://crbug.com/587589
254 // This test case only works for U.S. layout.
255 TEST(WebInputEventBuilderMacTest, DomKeyCtrlShift) {
256 struct DomKeyTestCase {
257 int mac_key_code;
258 unichar character;
259 unichar shift_character;
260 } table[] = {
261 {kVK_ANSI_0, '0', ')'}, {kVK_ANSI_1, '1', '!'}, {kVK_ANSI_2, '2', '@'},
262 {kVK_ANSI_3, '3', '#'}, {kVK_ANSI_4, '4', '$'}, {kVK_ANSI_5, '5', '%'},
263 {kVK_ANSI_6, '6', '^'}, {kVK_ANSI_7, '7', '&'}, {kVK_ANSI_8, '8', '*'},
264 {kVK_ANSI_9, '9', '('}, {kVK_ANSI_A, 'a', 'A'}, {kVK_ANSI_B, 'b', 'B'},
265 {kVK_ANSI_C, 'c', 'C'}, {kVK_ANSI_D, 'd', 'D'}, {kVK_ANSI_E, 'e', 'E'},
266 {kVK_ANSI_F, 'f', 'F'}, {kVK_ANSI_G, 'g', 'G'}, {kVK_ANSI_H, 'h', 'H'},
267 {kVK_ANSI_I, 'i', 'I'}, {kVK_ANSI_J, 'j', 'J'}, {kVK_ANSI_K, 'k', 'K'},
268 {kVK_ANSI_L, 'l', 'L'}, {kVK_ANSI_M, 'm', 'M'}, {kVK_ANSI_N, 'n', 'N'},
269 {kVK_ANSI_O, 'o', 'O'}, {kVK_ANSI_P, 'p', 'P'}, {kVK_ANSI_Q, 'q', 'Q'},
270 {kVK_ANSI_R, 'r', 'R'}, {kVK_ANSI_S, 's', 'S'}, {kVK_ANSI_T, 't', 'T'},
271 {kVK_ANSI_U, 'u', 'U'}, {kVK_ANSI_V, 'v', 'V'}, {kVK_ANSI_W, 'w', 'W'},
272 {kVK_ANSI_X, 'x', 'X'}, {kVK_ANSI_Y, 'y', 'Y'}, {kVK_ANSI_Z, 'z', 'Z'}};
273
274 for (const DomKeyTestCase& entry : table) {
275 // Tests ctrl_dom_key
tdresser 2016/02/24 17:12:08 Add period.
276 NSEvent* mac_event = BuildFakeKeyEvent(entry.mac_key_code, entry.character,
277 NSControlKeyMask, NSKeyDown);
278 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
279 EXPECT_EQ(ui::DomKey::FromCharacter(entry.character), web_event.domKey);
280 // Tests ctrl_shift_dom_key
tdresser 2016/02/24 17:12:08 period
281 mac_event = BuildFakeKeyEvent(entry.mac_key_code, entry.shift_character,
282 NSControlKeyMask | NSShiftKeyMask, NSKeyDown);
283 web_event = WebKeyboardEventBuilder::Build(mac_event);
284 EXPECT_EQ(ui::DomKey::FromCharacter(entry.shift_character),
285 web_event.domKey);
286 }
287 }
288
289 // This test case only works for U.S. layout.
290 TEST(WebInputEventBuilderMacTest, DomKeyCtrlAlt) {
291 struct DomKeyTestCase {
292 int mac_key_code;
293 unichar alt_character;
294 unichar ctrl_alt_character;
295 } table[] = {{kVK_ANSI_0, u"º"[0], u"0"[0]}, {kVK_ANSI_1, u"¡"[0], u"1"[0]},
296 {kVK_ANSI_2, u"™"[0], u"2"[0]}, {kVK_ANSI_3, u"£"[0], u"3"[0]},
297 {kVK_ANSI_4, u"¢"[0], u"4"[0]}, {kVK_ANSI_5, u"∞"[0], u"5"[0]},
298 {kVK_ANSI_6, u"§"[0], u"6"[0]}, {kVK_ANSI_7, u"¶"[0], u"7"[0]},
299 {kVK_ANSI_8, u"•"[0], u"8"[0]}, {kVK_ANSI_9, u"ª"[0], u"9"[0]},
300 {kVK_ANSI_A, u"å"[0], u"å"[0]}, {kVK_ANSI_B, u"∫"[0], u"∫"[0]},
301 {kVK_ANSI_C, u"ç"[0], u"ç"[0]}, {kVK_ANSI_D, u"∂"[0], u"∂"[0]},
302 {kVK_ANSI_E, u"´"[0], u"´"[0]}, {kVK_ANSI_F, u"ƒ"[0], u"ƒ"[0]},
303 {kVK_ANSI_G, u"©"[0], u"©"[0]}, {kVK_ANSI_H, u"˙"[0], u"˙"[0]},
304 {kVK_ANSI_I, u"ˆ"[0], u"ˆ"[0]}, {kVK_ANSI_J, u"∆"[0], u"∆"[0]},
305 {kVK_ANSI_K, u"˚"[0], u"˚"[0]}, {kVK_ANSI_L, u"¬"[0], u"¬"[0]},
306 {kVK_ANSI_M, u"µ"[0], u"µ"[0]}, {kVK_ANSI_N, u"˜"[0], u"˜"[0]},
307 {kVK_ANSI_O, u"ø"[0], u"ø"[0]}, {kVK_ANSI_P, u"π"[0], u"π"[0]},
308 {kVK_ANSI_Q, u"œ"[0], u"œ"[0]}, {kVK_ANSI_R, u"®"[0], u"®"[0]},
309 {kVK_ANSI_S, u"ß"[0], u"ß"[0]}, {kVK_ANSI_T, u"†"[0], u"†"[0]},
310 {kVK_ANSI_U, u"¨"[0], u"¨"[0]}, {kVK_ANSI_V, u"√"[0], u"√"[0]},
311 {kVK_ANSI_W, u"∑"[0], u"∑"[0]}, {kVK_ANSI_X, u"≈"[0], u"≈"[0]},
312 {kVK_ANSI_Y, u"¥"[0], u"¥"[0]}, {kVK_ANSI_Z, u"Ω"[0], u"Ω"[0]}};
313
314 for (const DomKeyTestCase& entry : table) {
315 // Tests alt_dom_key
316 NSEvent* mac_event = BuildFakeKeyEvent(
317 entry.mac_key_code, entry.alt_character, NSAlternateKeyMask, NSKeyDown);
318 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
319 EXPECT_EQ(ui::DomKey::FromCharacter(entry.alt_character), web_event.domKey)
320 << "a " << entry.alt_character;
321 // Tests ctrl_alt_dom_key
322 mac_event = BuildFakeKeyEvent(entry.mac_key_code, entry.ctrl_alt_character,
323 NSAlternateKeyMask, NSKeyDown);
324 web_event = WebKeyboardEventBuilder::Build(mac_event);
325 EXPECT_EQ(ui::DomKey::FromCharacter(entry.ctrl_alt_character),
326 web_event.domKey)
327 << "a_c " << entry.ctrl_alt_character;
328 }
329 }
330
331 TEST(WebInputEventBuilderMacTest, DomKeyNonPrintable) {
332 struct DomKeyTestCase {
333 int mac_key_code;
334 unichar character;
335 ui::DomKey dom_key;
336 } table[] = {
337 {kVK_Return, kReturnCharCode, ui::DomKey::ENTER},
338 {kVK_Tab, kTabCharCode, ui::DomKey::TAB},
339 {kVK_Delete, kBackspaceCharCode, ui::DomKey::BACKSPACE},
340 {kVK_Escape, kEscapeCharCode, ui::DomKey::ESCAPE},
341 {kVK_F1, NSF1FunctionKey, ui::DomKey::F1},
342 {kVK_F2, NSF2FunctionKey, ui::DomKey::F2},
343 {kVK_F3, NSF3FunctionKey, ui::DomKey::F3},
344 {kVK_F4, NSF4FunctionKey, ui::DomKey::F4},
345 {kVK_F5, NSF5FunctionKey, ui::DomKey::F5},
346 {kVK_F6, NSF6FunctionKey, ui::DomKey::F6},
347 {kVK_F7, NSF7FunctionKey, ui::DomKey::F7},
348 {kVK_F8, NSF8FunctionKey, ui::DomKey::F8},
349 {kVK_F9, NSF9FunctionKey, ui::DomKey::F9},
350 {kVK_F10, NSF10FunctionKey, ui::DomKey::F10},
351 {kVK_F11, NSF11FunctionKey, ui::DomKey::F11},
352 {kVK_F12, NSF12FunctionKey, ui::DomKey::F12},
353 {kVK_F13, NSF13FunctionKey, ui::DomKey::F13},
354 {kVK_F14, NSF14FunctionKey, ui::DomKey::F14},
355 {kVK_F15, NSF15FunctionKey, ui::DomKey::F15},
356 {kVK_F16, NSF16FunctionKey, ui::DomKey::F16},
357 {kVK_F17, NSF17FunctionKey, ui::DomKey::F17},
358 {kVK_F18, NSF18FunctionKey, ui::DomKey::F18},
359 {kVK_F19, NSF19FunctionKey, ui::DomKey::F19},
360 {kVK_F20, NSF20FunctionKey, ui::DomKey::F20},
361 {kVK_Help, kHelpCharCode, ui::DomKey::HELP},
362 {kVK_Home, NSHomeFunctionKey, ui::DomKey::HOME},
363 {kVK_PageUp, NSPageUpFunctionKey, ui::DomKey::PAGE_UP},
364 {kVK_ForwardDelete, NSDeleteFunctionKey, ui::DomKey::DEL},
365 {kVK_End, NSEndFunctionKey, ui::DomKey::END},
366 {kVK_PageDown, NSPageDownFunctionKey, ui::DomKey::PAGE_DOWN},
367 {kVK_LeftArrow, NSLeftArrowFunctionKey, ui::DomKey::ARROW_LEFT},
368 {kVK_RightArrow, NSRightArrowFunctionKey, ui::DomKey::ARROW_RIGHT},
369 {kVK_DownArrow, NSDownArrowFunctionKey, ui::DomKey::ARROW_DOWN},
370 {kVK_UpArrow, NSUpArrowFunctionKey, ui::DomKey::ARROW_UP}};
371
372 for (const DomKeyTestCase& entry : table) {
373 // Tests non-printable key
374 NSEvent* mac_event =
375 BuildFakeKeyEvent(entry.mac_key_code, entry.character, 0, NSKeyDown);
376 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
377 EXPECT_EQ(entry.dom_key, web_event.domKey) << entry.mac_key_code;
378 // Tests non-printable key with Shift
379 mac_event = BuildFakeKeyEvent(entry.mac_key_code, entry.character,
380 NSShiftKeyMask, NSKeyDown);
381 web_event = WebKeyboardEventBuilder::Build(mac_event);
382 EXPECT_EQ(entry.dom_key, web_event.domKey) << "s " << entry.mac_key_code;
383 }
384 }
385
386 TEST(WebInputEventBuilderMacTest, DomKeyFlagsChanged) {
387 struct DomKeyTestCase {
388 int mac_key_code;
389 ui::DomKey dom_key;
390 } table[] = {{kVK_Command, ui::DomKey::META},
391 {kVK_Shift, ui::DomKey::SHIFT},
392 {kVK_RightShift, ui::DomKey::SHIFT},
393 {kVK_CapsLock, ui::DomKey::CAPS_LOCK},
394 {kVK_Option, ui::DomKey::ALT},
395 {kVK_RightOption, ui::DomKey::ALT},
396 {kVK_Control, ui::DomKey::CONTROL},
397 {kVK_RightControl, ui::DomKey::CONTROL},
398 {kVK_Function, ui::DomKey::FN}};
399
400 for (const DomKeyTestCase& entry : table) {
401 NSEvent* mac_event =
402 BuildFakeKeyEvent(entry.mac_key_code, 0, 0, NSFlagsChanged);
403 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
404 EXPECT_EQ(entry.dom_key, web_event.domKey) << entry.mac_key_code;
405 }
406 }
OLDNEW
« no previous file with comments | « no previous file | ui/events/keycodes/keyboard_code_conversion_mac.mm » ('j') | ui/events/keycodes/keyboard_code_conversion_mac.mm » ('J')

Powered by Google App Engine
This is Rietveld 408576698