Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } | |
| OLD | NEW |