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

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: Fix Ctrl/Ctrl+Shift to pass garykac's keyboard tester 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 modifierFlags:modifier_flags 56 modifierFlags:modifier_flags
57 timestamp:0.0 57 timestamp:0.0
58 windowNumber:0 58 windowNumber:0
59 context:nil 59 context:nil
60 characters:string 60 characters:string
61 charactersIgnoringModifiers:string 61 charactersIgnoringModifiers:string
62 isARepeat:NO 62 isARepeat:NO
63 keyCode:key_code]; 63 keyCode:key_code];
64 } 64 }
65 65
66 NSString* CurrentKeyboardLayoutName() {
67 TISInputSourceRef source = TISCopyCurrentKeyboardInputSource();
tapted 2016/02/23 23:55:52 it looks like this `Copy` is leaked
68 return
69 [NSString stringWithFormat:@"%@", TISGetInputSourceProperty(
tapted 2016/02/23 23:55:52 optional: it looks like TISGetInputSourceProperty
70 source, kTISPropertyLocalizedName)];
71 }
72
66 } // namespace 73 } // namespace
67 74
68 // Test that arrow keys don't have numpad modifier set. 75 // Test that arrow keys don't have numpad modifier set.
69 TEST(WebInputEventBuilderMacTest, ArrowKeyNumPad) { 76 TEST(WebInputEventBuilderMacTest, ArrowKeyNumPad) {
70 // Left 77 // Left
71 NSEvent* mac_event = BuildFakeKeyEvent(0x7B, NSLeftArrowFunctionKey, 78 NSEvent* mac_event = BuildFakeKeyEvent(0x7B, NSLeftArrowFunctionKey,
72 NSNumericPadKeyMask, NSKeyDown); 79 NSNumericPadKeyMask, NSKeyDown);
73 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); 80 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
74 EXPECT_EQ(0, web_event.modifiers); 81 EXPECT_EQ(0, web_event.modifiers);
75 EXPECT_EQ(ui::DomCode::ARROW_LEFT, 82 EXPECT_EQ(ui::DomCode::ARROW_LEFT,
(...skipping 29 matching lines...) Expand all
105 112
106 // Test that control sequence generate the correct vkey code. 113 // Test that control sequence generate the correct vkey code.
107 TEST(WebInputEventBuilderMacTest, ControlSequence) { 114 TEST(WebInputEventBuilderMacTest, ControlSequence) {
108 // Ctrl-[ generates escape. 115 // Ctrl-[ generates escape.
109 NSEvent* mac_event = 116 NSEvent* mac_event =
110 BuildFakeKeyEvent(0x21, 0x1b, NSControlKeyMask, NSKeyDown); 117 BuildFakeKeyEvent(0x21, 0x1b, NSControlKeyMask, NSKeyDown);
111 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); 118 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
112 EXPECT_EQ(ui::VKEY_OEM_4, web_event.windowsKeyCode); 119 EXPECT_EQ(ui::VKEY_OEM_4, web_event.windowsKeyCode);
113 EXPECT_EQ(ui::DomCode::BRACKET_LEFT, 120 EXPECT_EQ(ui::DomCode::BRACKET_LEFT,
114 static_cast<ui::DomCode>(web_event.domCode)); 121 static_cast<ui::DomCode>(web_event.domCode));
115 EXPECT_EQ(ui::DomKey::FromCharacter(0x1b), web_event.domKey); 122 // Additional tests for US layout
tapted 2016/02/23 23:55:52 nit: full stop after comments -- more below
123 if ([CurrentKeyboardLayoutName() isEqualToString:@"U.S."]) {
124 EXPECT_EQ(ui::DomKey::FromCharacter('['), web_event.domKey);
125 }
116 } 126 }
117 127
118 // Test that numpad keys get mapped correctly. 128 // Test that numpad keys get mapped correctly.
119 TEST(WebInputEventBuilderMacTest, NumPadMapping) { 129 TEST(WebInputEventBuilderMacTest, NumPadMapping) {
120 KeyMappingEntry table[] = { 130 KeyMappingEntry table[] = {
121 {65, '.', ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, 131 {65, '.', ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL,
122 ui::DomKey::FromCharacter('.')}, 132 ui::DomKey::FromCharacter('.')},
123 {67, '*', ui::VKEY_MULTIPLY, ui::DomCode::NUMPAD_MULTIPLY, 133 {67, '*', ui::VKEY_MULTIPLY, ui::DomCode::NUMPAD_MULTIPLY,
124 ui::DomKey::FromCharacter('*')}, 134 ui::DomKey::FromCharacter('*')},
125 {69, '+', ui::VKEY_ADD, ui::DomCode::NUMPAD_ADD, 135 {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); 249 webEvent = WebKeyboardEventBuilder::Build(macEvent);
240 EXPECT_TRUE(webEvent.isSystemKey); 250 EXPECT_TRUE(webEvent.isSystemKey);
241 251
242 // Cmd + <some other modifier> + <any letter other then B and I> should be 252 // Cmd + <some other modifier> + <any letter other then B and I> should be
243 // treated as system event. 253 // treated as system event.
244 macEvent = BuildFakeKeyEvent(kVK_ANSI_S, 'S', 254 macEvent = BuildFakeKeyEvent(kVK_ANSI_S, 'S',
245 NSCommandKeyMask | NSShiftKeyMask, NSKeyDown); 255 NSCommandKeyMask | NSShiftKeyMask, NSKeyDown);
246 webEvent = WebKeyboardEventBuilder::Build(macEvent); 256 webEvent = WebKeyboardEventBuilder::Build(macEvent);
247 EXPECT_TRUE(webEvent.isSystemKey); 257 EXPECT_TRUE(webEvent.isSystemKey);
248 } 258 }
259
260 // Test conversion from key combination with Control to DomKey.
261 // TODO(chongz): Move DomKey tests for all platforms into one place.
262 // http://crbug.com/587589
263 TEST(WebInputEventBuilderMacTest, DomKeyWithControlKey) {
264 // This test case only works for U.S. layout.
265 if (![CurrentKeyboardLayoutName() isEqualToString:@"U.S."])
chongz 2016/02/22 20:17:18 This test case won't work on other keyboard layout
tapted 2016/02/23 23:55:52 I think it would be better simply to fail the test
266 return;
267
268 struct DomKeyTestCase {
269 int mac_key_code;
270 unichar character;
271 unichar shift_character;
272 } table[] = {
273 {kVK_ANSI_0, '0', ')'}, {kVK_ANSI_1, '1', '!'}, {kVK_ANSI_2, '2', '@'},
274 {kVK_ANSI_3, '3', '#'}, {kVK_ANSI_4, '4', '$'}, {kVK_ANSI_5, '5', '%'},
275 {kVK_ANSI_6, '6', '^'}, {kVK_ANSI_7, '7', '&'}, {kVK_ANSI_8, '8', '*'},
276 {kVK_ANSI_9, '9', '('}, {kVK_ANSI_A, 'a', 'A'}, {kVK_ANSI_B, 'b', 'B'},
277 {kVK_ANSI_C, 'c', 'C'}, {kVK_ANSI_D, 'd', 'D'}, {kVK_ANSI_E, 'e', 'E'},
278 {kVK_ANSI_F, 'f', 'F'}, {kVK_ANSI_G, 'g', 'G'}, {kVK_ANSI_H, 'h', 'H'},
279 {kVK_ANSI_I, 'i', 'I'}, {kVK_ANSI_J, 'j', 'J'}, {kVK_ANSI_K, 'k', 'K'},
280 {kVK_ANSI_L, 'l', 'L'}, {kVK_ANSI_M, 'm', 'M'}, {kVK_ANSI_N, 'n', 'N'},
281 {kVK_ANSI_O, 'o', 'O'}, {kVK_ANSI_P, 'p', 'P'}, {kVK_ANSI_Q, 'q', 'Q'},
282 {kVK_ANSI_R, 'r', 'R'}, {kVK_ANSI_S, 's', 'S'}, {kVK_ANSI_T, 't', 'T'},
283 {kVK_ANSI_U, 'u', 'U'}, {kVK_ANSI_V, 'v', 'V'}, {kVK_ANSI_W, 'w', 'W'},
284 {kVK_ANSI_X, 'x', 'X'}, {kVK_ANSI_Y, 'y', 'Y'}, {kVK_ANSI_Z, 'z', 'Z'}};
285
286 for (size_t i = 0; i < arraysize(table); ++i) {
tapted 2016/02/23 23:55:52 I think `for (const DomKeyTestCase& entry : table)
287 // Tests ctrl_dom_key
288 NSEvent* mac_event = BuildFakeKeyEvent(
289 table[i].mac_key_code, table[i].character, NSControlKeyMask, NSKeyDown);
290 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
291 EXPECT_EQ(ui::DomKey::FromCharacter(table[i].character), web_event.domKey);
292 // Tests ctrl_shift_dom_key
293 mac_event =
294 BuildFakeKeyEvent(table[i].mac_key_code, table[i].shift_character,
295 NSControlKeyMask | NSShiftKeyMask, NSKeyDown);
296 web_event = WebKeyboardEventBuilder::Build(mac_event);
297 EXPECT_EQ(ui::DomKey::FromCharacter(table[i].shift_character),
298 web_event.domKey);
299 }
300 }
301
302 TEST(WebInputEventBuilderMacTest, DomKeyWithNonPrintableCharacter) {
303 struct DomKeyTestCase {
304 int mac_key_code;
305 unichar character;
306 ui::DomKey dom_key;
307 } table[] = {
308 {kVK_Return, kReturnCharCode, ui::DomKey::ENTER},
309 {kVK_Tab, kTabCharCode, ui::DomKey::TAB},
310 {kVK_Delete, kBackspaceCharCode, ui::DomKey::BACKSPACE},
311 {kVK_Escape, kEscapeCharCode, ui::DomKey::ESCAPE},
312 {kVK_Command, 0, ui::DomKey::META},
313 {kVK_Shift, 0, ui::DomKey::SHIFT},
314 {kVK_RightShift, 0, ui::DomKey::SHIFT},
315 {kVK_CapsLock, 0, ui::DomKey::CAPS_LOCK},
316 {kVK_Option, 0, ui::DomKey::ALT},
317 {kVK_RightOption, 0, ui::DomKey::ALT},
318 {kVK_Control, 0, ui::DomKey::CONTROL},
319 {kVK_RightControl, 0, ui::DomKey::CONTROL},
320 {kVK_Function, 0, ui::DomKey::FN},
321 {kVK_VolumeUp, 0, ui::DomKey::AUDIO_VOLUME_UP},
322 {kVK_VolumeDown, 0, ui::DomKey::AUDIO_VOLUME_DOWN},
323 {kVK_Mute, 0, ui::DomKey::AUDIO_VOLUME_MUTE},
324 {kVK_F1, NSF1FunctionKey, ui::DomKey::F1},
325 {kVK_F2, NSF2FunctionKey, ui::DomKey::F2},
326 {kVK_F3, NSF3FunctionKey, ui::DomKey::F3},
327 {kVK_F4, NSF4FunctionKey, ui::DomKey::F4},
328 {kVK_F5, NSF5FunctionKey, ui::DomKey::F5},
329 {kVK_F6, NSF6FunctionKey, ui::DomKey::F6},
330 {kVK_F7, NSF7FunctionKey, ui::DomKey::F7},
331 {kVK_F8, NSF8FunctionKey, ui::DomKey::F8},
332 {kVK_F9, NSF9FunctionKey, ui::DomKey::F9},
333 {kVK_F10, NSF10FunctionKey, ui::DomKey::F10},
334 {kVK_F11, NSF11FunctionKey, ui::DomKey::F11},
335 {kVK_F12, NSF12FunctionKey, ui::DomKey::F12},
336 {kVK_F13, NSF13FunctionKey, ui::DomKey::F13},
337 {kVK_F14, NSF14FunctionKey, ui::DomKey::F14},
338 {kVK_F15, NSF15FunctionKey, ui::DomKey::F15},
339 {kVK_F16, NSF16FunctionKey, ui::DomKey::F16},
340 {kVK_F17, NSF17FunctionKey, ui::DomKey::F17},
341 {kVK_F18, NSF18FunctionKey, ui::DomKey::F18},
342 {kVK_F19, NSF19FunctionKey, ui::DomKey::F19},
343 {kVK_F20, NSF20FunctionKey, ui::DomKey::F20},
344 {kVK_Help, kHelpCharCode, ui::DomKey::HELP},
345 {kVK_Home, NSHomeFunctionKey, ui::DomKey::HOME},
346 {kVK_PageUp, NSPageUpFunctionKey, ui::DomKey::PAGE_UP},
347 {kVK_ForwardDelete, NSDeleteFunctionKey, ui::DomKey::DEL},
348 {kVK_End, NSEndFunctionKey, ui::DomKey::END},
349 {kVK_PageDown, NSPageDownFunctionKey, ui::DomKey::PAGE_DOWN},
350 {kVK_LeftArrow, NSLeftArrowFunctionKey, ui::DomKey::ARROW_LEFT},
351 {kVK_RightArrow, NSRightArrowFunctionKey, ui::DomKey::ARROW_RIGHT},
352 {kVK_DownArrow, NSDownArrowFunctionKey, ui::DomKey::ARROW_DOWN},
353 {kVK_UpArrow, NSUpArrowFunctionKey, ui::DomKey::ARROW_UP}};
354
355 for (size_t i = 0; i < arraysize(table); ++i) {
356 // Tests non-printable key
357 NSEvent* mac_event = BuildFakeKeyEvent(table[i].mac_key_code,
358 table[i].character, 0, NSKeyDown);
359 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event);
360 EXPECT_EQ(table[i].dom_key, web_event.domKey);
361 // Tests non-printable key with Shift
362 mac_event = BuildFakeKeyEvent(table[i].mac_key_code, table[i].character,
363 NSShiftKeyMask, NSKeyDown);
364 web_event = WebKeyboardEventBuilder::Build(mac_event);
365 EXPECT_EQ(table[i].dom_key, web_event.domKey);
366 }
367 }
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