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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 } | |
| OLD | NEW |