OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | |
Alexei Svitkine (slow)
2015/09/14 17:14:43
No (c)
dtapuska
2015/09/14 18:31:21
Done.
| |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #import <Cocoa/Cocoa.h> | |
6 #include <gtest/gtest.h> | |
Alexei Svitkine (slow)
2015/09/14 17:14:43
Can this be #include "testing/gtest/include/gtest/
dtapuska
2015/09/14 18:31:21
Done.
| |
7 | |
8 #include "content/browser/renderer_host/input/web_input_event_builders_mac.h" | |
Alexei Svitkine (slow)
2015/09/14 17:14:43
This should be the first include.
dtapuska
2015/09/14 18:31:21
Done.
| |
9 #include "ui/events/keycodes/keyboard_codes.h" | |
10 | |
11 using blink::WebKeyboardEvent; | |
12 using blink::WebInputEvent; | |
13 using content::WebKeyboardEventBuilder; | |
14 | |
15 namespace { | |
16 | |
17 struct KeyMappingEntry { | |
18 int mac_key_code; | |
19 unichar character; | |
20 int windows_key_code; | |
21 }; | |
22 | |
23 struct ModifierKey { | |
24 int mac_key_code; | |
25 int left_or_right_mask; | |
26 int non_specific_mask; | |
27 }; | |
28 | |
29 // Modifier keys, grouped into left/right pairs. | |
30 const ModifierKey kModifierKeys[] = { | |
31 {56, 1 << 1, NSShiftKeyMask}, // Left Shift | |
32 {60, 1 << 2, NSShiftKeyMask}, // Right Shift | |
33 {55, 1 << 3, NSCommandKeyMask}, // Left Command | |
34 {54, 1 << 4, NSCommandKeyMask}, // Right Command | |
35 {58, 1 << 5, NSAlternateKeyMask}, // Left Alt | |
36 {61, 1 << 6, NSAlternateKeyMask}, // Right Alt | |
37 {59, 1 << 0, NSControlKeyMask}, // Left Control | |
38 {62, 1 << 13, NSControlKeyMask}, // Right Control | |
39 }; | |
40 | |
41 NSEvent* BuildFakeKeyEvent(NSUInteger key_code, | |
42 unichar character, | |
43 NSUInteger modifier_flags, | |
44 NSEventType event_type) { | |
45 NSString* string = [NSString stringWithCharacters:&character length:1]; | |
46 return [NSEvent keyEventWithType:event_type | |
47 location:NSZeroPoint | |
48 modifierFlags:modifier_flags | |
49 timestamp:0.0 | |
50 windowNumber:0 | |
51 context:nil | |
52 characters:string | |
53 charactersIgnoringModifiers:string | |
54 isARepeat:NO | |
55 keyCode:key_code]; | |
56 } | |
57 | |
58 } // namespace | |
59 | |
60 // Test that arrow keys don't have numpad modifier set. | |
61 TEST(WebInputEventBuilderMacTest, ArrowKeyNumPad) { | |
62 // Left | |
63 NSEvent* mac_event = BuildFakeKeyEvent(0x7B, NSLeftArrowFunctionKey, | |
64 NSNumericPadKeyMask, NSKeyDown); | |
65 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); | |
66 EXPECT_EQ(0, web_event.modifiers); | |
67 | |
68 // Right | |
69 mac_event = BuildFakeKeyEvent(0x7C, NSRightArrowFunctionKey, | |
70 NSNumericPadKeyMask, NSKeyDown); | |
71 web_event = WebKeyboardEventBuilder::Build(mac_event); | |
72 EXPECT_EQ(0, web_event.modifiers); | |
73 | |
74 // Down | |
75 mac_event = BuildFakeKeyEvent(0x7D, NSDownArrowFunctionKey, | |
76 NSNumericPadKeyMask, NSKeyDown); | |
77 web_event = WebKeyboardEventBuilder::Build(mac_event); | |
78 EXPECT_EQ(0, web_event.modifiers); | |
79 | |
80 // Up | |
81 mac_event = BuildFakeKeyEvent(0x7E, NSUpArrowFunctionKey, NSNumericPadKeyMask, | |
82 NSKeyDown); | |
83 web_event = WebKeyboardEventBuilder::Build(mac_event); | |
84 EXPECT_EQ(0, web_event.modifiers); | |
85 } | |
86 | |
87 // Test that numpad keys get mapped correctly. | |
88 TEST(WebInputEventBuilderMacTest, NumPadMapping) { | |
89 KeyMappingEntry table[] = { | |
90 {65, '.', ui::VKEY_DECIMAL}, | |
91 {67, '*', ui::VKEY_MULTIPLY}, | |
92 {69, '+', ui::VKEY_ADD}, | |
93 {71, NSClearLineFunctionKey, ui::VKEY_CLEAR}, | |
94 {75, '/', ui::VKEY_DIVIDE}, | |
95 {76, 3, ui::VKEY_RETURN}, | |
96 {78, '-', ui::VKEY_SUBTRACT}, | |
97 {81, '=', ui::VKEY_OEM_PLUS}, | |
98 {82, '0', ui::VKEY_0}, | |
99 {83, '1', ui::VKEY_1}, | |
100 {84, '2', ui::VKEY_2}, | |
101 {85, '3', ui::VKEY_3}, | |
102 {86, '4', ui::VKEY_4}, | |
103 {87, '5', ui::VKEY_5}, | |
104 {88, '6', ui::VKEY_6}, | |
105 {89, '7', ui::VKEY_7}, | |
106 {91, '8', ui::VKEY_8}, | |
107 {92, '9', ui::VKEY_9}, | |
108 }; | |
109 | |
110 for (size_t i = 0; i < arraysize(table); ++i) { | |
111 NSEvent* mac_event = BuildFakeKeyEvent(table[i].mac_key_code, | |
112 table[i].character, 0, NSKeyDown); | |
113 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); | |
114 EXPECT_EQ(table[i].windows_key_code, web_event.windowsKeyCode); | |
115 } | |
116 } | |
117 | |
118 // Test that left- and right-hand modifier keys are interpreted correctly when | |
119 // pressed simultaneously. | |
120 TEST(WebInputEventFactoryTestMac, SimultaneousModifierKeys) { | |
121 for (size_t i = 0; i < arraysize(kModifierKeys) / 2; ++i) { | |
122 const ModifierKey& left = kModifierKeys[2 * i]; | |
123 const ModifierKey& right = kModifierKeys[2 * i + 1]; | |
124 // Press the left key. | |
125 NSEvent* mac_event = BuildFakeKeyEvent( | |
126 left.mac_key_code, 0, left.left_or_right_mask | left.non_specific_mask, | |
127 NSFlagsChanged); | |
128 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); | |
129 EXPECT_EQ(WebInputEvent::RawKeyDown, web_event.type); | |
130 // Press the right key | |
131 mac_event = | |
132 BuildFakeKeyEvent(right.mac_key_code, 0, | |
133 left.left_or_right_mask | right.left_or_right_mask | | |
134 left.non_specific_mask, | |
135 NSFlagsChanged); | |
136 web_event = WebKeyboardEventBuilder::Build(mac_event); | |
137 EXPECT_EQ(WebInputEvent::RawKeyDown, web_event.type); | |
138 // Release the right key | |
139 mac_event = BuildFakeKeyEvent( | |
140 right.mac_key_code, 0, left.left_or_right_mask | left.non_specific_mask, | |
141 NSFlagsChanged); | |
142 // Release the left key | |
143 mac_event = BuildFakeKeyEvent(left.mac_key_code, 0, 0, NSFlagsChanged); | |
144 web_event = WebKeyboardEventBuilder::Build(mac_event); | |
145 EXPECT_EQ(WebInputEvent::KeyUp, web_event.type); | |
146 } | |
147 } | |
148 | |
149 // Test that individual modifier keys are still reported correctly, even if the | |
150 // undocumented left- or right-hand flags are not set. | |
151 TEST(WebInputEventBuilderMacTest, MissingUndocumentedModifierFlags) { | |
152 for (size_t i = 0; i < arraysize(kModifierKeys); ++i) { | |
153 const ModifierKey& key = kModifierKeys[i]; | |
154 NSEvent* mac_event = BuildFakeKeyEvent( | |
155 key.mac_key_code, 0, key.non_specific_mask, NSFlagsChanged); | |
156 WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); | |
157 EXPECT_EQ(WebInputEvent::RawKeyDown, web_event.type); | |
158 mac_event = BuildFakeKeyEvent(key.mac_key_code, 0, 0, NSFlagsChanged); | |
159 web_event = WebKeyboardEventBuilder::Build(mac_event); | |
160 EXPECT_EQ(WebInputEvent::KeyUp, web_event.type); | |
161 } | |
162 } | |
OLD | NEW |