Chromium Code Reviews| Index: content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| index 3c8c5a284b5f242daac2a713939359a59015d668..9feda71c7e4c273d417d7c512d33cc92e08b28a7 100644 |
| --- a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| +++ b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| @@ -63,6 +63,13 @@ NSEvent* BuildFakeKeyEvent(NSUInteger key_code, |
| keyCode:key_code]; |
| } |
| +NSString* CurrentKeyboardLayoutName() { |
| + TISInputSourceRef source = TISCopyCurrentKeyboardInputSource(); |
|
tapted
2016/02/23 23:55:52
it looks like this `Copy` is leaked
|
| + return |
| + [NSString stringWithFormat:@"%@", TISGetInputSourceProperty( |
|
tapted
2016/02/23 23:55:52
optional: it looks like TISGetInputSourceProperty
|
| + source, kTISPropertyLocalizedName)]; |
| +} |
| + |
| } // namespace |
| // Test that arrow keys don't have numpad modifier set. |
| @@ -112,7 +119,10 @@ TEST(WebInputEventBuilderMacTest, ControlSequence) { |
| EXPECT_EQ(ui::VKEY_OEM_4, web_event.windowsKeyCode); |
| EXPECT_EQ(ui::DomCode::BRACKET_LEFT, |
| static_cast<ui::DomCode>(web_event.domCode)); |
| - EXPECT_EQ(ui::DomKey::FromCharacter(0x1b), web_event.domKey); |
| + // Additional tests for US layout |
|
tapted
2016/02/23 23:55:52
nit: full stop after comments -- more below
|
| + if ([CurrentKeyboardLayoutName() isEqualToString:@"U.S."]) { |
| + EXPECT_EQ(ui::DomKey::FromCharacter('['), web_event.domKey); |
| + } |
| } |
| // Test that numpad keys get mapped correctly. |
| @@ -246,3 +256,112 @@ TEST(WebInputEventBuilderMacTest, SystemKeyEvents) { |
| webEvent = WebKeyboardEventBuilder::Build(macEvent); |
| EXPECT_TRUE(webEvent.isSystemKey); |
| } |
| + |
| +// Test conversion from key combination with Control to DomKey. |
| +// TODO(chongz): Move DomKey tests for all platforms into one place. |
| +// http://crbug.com/587589 |
| +TEST(WebInputEventBuilderMacTest, DomKeyWithControlKey) { |
| + // This test case only works for U.S. layout. |
| + 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
|
| + return; |
| + |
| + struct DomKeyTestCase { |
| + int mac_key_code; |
| + unichar character; |
| + unichar shift_character; |
| + } table[] = { |
| + {kVK_ANSI_0, '0', ')'}, {kVK_ANSI_1, '1', '!'}, {kVK_ANSI_2, '2', '@'}, |
| + {kVK_ANSI_3, '3', '#'}, {kVK_ANSI_4, '4', '$'}, {kVK_ANSI_5, '5', '%'}, |
| + {kVK_ANSI_6, '6', '^'}, {kVK_ANSI_7, '7', '&'}, {kVK_ANSI_8, '8', '*'}, |
| + {kVK_ANSI_9, '9', '('}, {kVK_ANSI_A, 'a', 'A'}, {kVK_ANSI_B, 'b', 'B'}, |
| + {kVK_ANSI_C, 'c', 'C'}, {kVK_ANSI_D, 'd', 'D'}, {kVK_ANSI_E, 'e', 'E'}, |
| + {kVK_ANSI_F, 'f', 'F'}, {kVK_ANSI_G, 'g', 'G'}, {kVK_ANSI_H, 'h', 'H'}, |
| + {kVK_ANSI_I, 'i', 'I'}, {kVK_ANSI_J, 'j', 'J'}, {kVK_ANSI_K, 'k', 'K'}, |
| + {kVK_ANSI_L, 'l', 'L'}, {kVK_ANSI_M, 'm', 'M'}, {kVK_ANSI_N, 'n', 'N'}, |
| + {kVK_ANSI_O, 'o', 'O'}, {kVK_ANSI_P, 'p', 'P'}, {kVK_ANSI_Q, 'q', 'Q'}, |
| + {kVK_ANSI_R, 'r', 'R'}, {kVK_ANSI_S, 's', 'S'}, {kVK_ANSI_T, 't', 'T'}, |
| + {kVK_ANSI_U, 'u', 'U'}, {kVK_ANSI_V, 'v', 'V'}, {kVK_ANSI_W, 'w', 'W'}, |
| + {kVK_ANSI_X, 'x', 'X'}, {kVK_ANSI_Y, 'y', 'Y'}, {kVK_ANSI_Z, 'z', 'Z'}}; |
| + |
| + for (size_t i = 0; i < arraysize(table); ++i) { |
|
tapted
2016/02/23 23:55:52
I think `for (const DomKeyTestCase& entry : table)
|
| + // Tests ctrl_dom_key |
| + NSEvent* mac_event = BuildFakeKeyEvent( |
| + table[i].mac_key_code, table[i].character, NSControlKeyMask, NSKeyDown); |
| + WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(ui::DomKey::FromCharacter(table[i].character), web_event.domKey); |
| + // Tests ctrl_shift_dom_key |
| + mac_event = |
| + BuildFakeKeyEvent(table[i].mac_key_code, table[i].shift_character, |
| + NSControlKeyMask | NSShiftKeyMask, NSKeyDown); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(ui::DomKey::FromCharacter(table[i].shift_character), |
| + web_event.domKey); |
| + } |
| +} |
| + |
| +TEST(WebInputEventBuilderMacTest, DomKeyWithNonPrintableCharacter) { |
| + struct DomKeyTestCase { |
| + int mac_key_code; |
| + unichar character; |
| + ui::DomKey dom_key; |
| + } table[] = { |
| + {kVK_Return, kReturnCharCode, ui::DomKey::ENTER}, |
| + {kVK_Tab, kTabCharCode, ui::DomKey::TAB}, |
| + {kVK_Delete, kBackspaceCharCode, ui::DomKey::BACKSPACE}, |
| + {kVK_Escape, kEscapeCharCode, ui::DomKey::ESCAPE}, |
| + {kVK_Command, 0, ui::DomKey::META}, |
| + {kVK_Shift, 0, ui::DomKey::SHIFT}, |
| + {kVK_RightShift, 0, ui::DomKey::SHIFT}, |
| + {kVK_CapsLock, 0, ui::DomKey::CAPS_LOCK}, |
| + {kVK_Option, 0, ui::DomKey::ALT}, |
| + {kVK_RightOption, 0, ui::DomKey::ALT}, |
| + {kVK_Control, 0, ui::DomKey::CONTROL}, |
| + {kVK_RightControl, 0, ui::DomKey::CONTROL}, |
| + {kVK_Function, 0, ui::DomKey::FN}, |
| + {kVK_VolumeUp, 0, ui::DomKey::AUDIO_VOLUME_UP}, |
| + {kVK_VolumeDown, 0, ui::DomKey::AUDIO_VOLUME_DOWN}, |
| + {kVK_Mute, 0, ui::DomKey::AUDIO_VOLUME_MUTE}, |
| + {kVK_F1, NSF1FunctionKey, ui::DomKey::F1}, |
| + {kVK_F2, NSF2FunctionKey, ui::DomKey::F2}, |
| + {kVK_F3, NSF3FunctionKey, ui::DomKey::F3}, |
| + {kVK_F4, NSF4FunctionKey, ui::DomKey::F4}, |
| + {kVK_F5, NSF5FunctionKey, ui::DomKey::F5}, |
| + {kVK_F6, NSF6FunctionKey, ui::DomKey::F6}, |
| + {kVK_F7, NSF7FunctionKey, ui::DomKey::F7}, |
| + {kVK_F8, NSF8FunctionKey, ui::DomKey::F8}, |
| + {kVK_F9, NSF9FunctionKey, ui::DomKey::F9}, |
| + {kVK_F10, NSF10FunctionKey, ui::DomKey::F10}, |
| + {kVK_F11, NSF11FunctionKey, ui::DomKey::F11}, |
| + {kVK_F12, NSF12FunctionKey, ui::DomKey::F12}, |
| + {kVK_F13, NSF13FunctionKey, ui::DomKey::F13}, |
| + {kVK_F14, NSF14FunctionKey, ui::DomKey::F14}, |
| + {kVK_F15, NSF15FunctionKey, ui::DomKey::F15}, |
| + {kVK_F16, NSF16FunctionKey, ui::DomKey::F16}, |
| + {kVK_F17, NSF17FunctionKey, ui::DomKey::F17}, |
| + {kVK_F18, NSF18FunctionKey, ui::DomKey::F18}, |
| + {kVK_F19, NSF19FunctionKey, ui::DomKey::F19}, |
| + {kVK_F20, NSF20FunctionKey, ui::DomKey::F20}, |
| + {kVK_Help, kHelpCharCode, ui::DomKey::HELP}, |
| + {kVK_Home, NSHomeFunctionKey, ui::DomKey::HOME}, |
| + {kVK_PageUp, NSPageUpFunctionKey, ui::DomKey::PAGE_UP}, |
| + {kVK_ForwardDelete, NSDeleteFunctionKey, ui::DomKey::DEL}, |
| + {kVK_End, NSEndFunctionKey, ui::DomKey::END}, |
| + {kVK_PageDown, NSPageDownFunctionKey, ui::DomKey::PAGE_DOWN}, |
| + {kVK_LeftArrow, NSLeftArrowFunctionKey, ui::DomKey::ARROW_LEFT}, |
| + {kVK_RightArrow, NSRightArrowFunctionKey, ui::DomKey::ARROW_RIGHT}, |
| + {kVK_DownArrow, NSDownArrowFunctionKey, ui::DomKey::ARROW_DOWN}, |
| + {kVK_UpArrow, NSUpArrowFunctionKey, ui::DomKey::ARROW_UP}}; |
| + |
| + for (size_t i = 0; i < arraysize(table); ++i) { |
| + // Tests non-printable key |
| + NSEvent* mac_event = BuildFakeKeyEvent(table[i].mac_key_code, |
| + table[i].character, 0, NSKeyDown); |
| + WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(table[i].dom_key, web_event.domKey); |
| + // Tests non-printable key with Shift |
| + mac_event = BuildFakeKeyEvent(table[i].mac_key_code, table[i].character, |
| + NSShiftKeyMask, NSKeyDown); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(table[i].dom_key, web_event.domKey); |
| + } |
| +} |