OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/web_input_event_aura.h" | 5 #include "content/browser/renderer_host/web_input_event_aura.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "ui/events/event.h" | 9 #include "ui/events/event.h" |
10 #include "ui/events/event_utils.h" | 10 #include "ui/events/event_utils.h" |
11 #include "ui/events/keycodes/dom3/dom_code.h" | 11 #include "ui/events/keycodes/dom3/dom_code.h" |
12 #include "ui/events/keycodes/dom3/dom_key.h" | 12 #include "ui/events/keycodes/dom3/dom_key.h" |
13 #include "ui/events/keycodes/dom4/keycode_converter.h" | 13 #include "ui/events/keycodes/dom4/keycode_converter.h" |
14 | 14 |
15 #if defined(USE_X11) | 15 #if defined(USE_X11) |
16 #include <X11/keysym.h> | 16 #include <X11/keysym.h> |
17 #include <X11/Xlib.h> | 17 #include <X11/Xlib.h> |
18 #include "ui/events/test/events_test_utils_x11.h" | 18 #include "ui/events/test/events_test_utils_x11.h" |
19 #include "ui/gfx/x/x11_types.h" | 19 #include "ui/gfx/x/x11_types.h" |
20 #endif | 20 #endif |
21 | 21 |
22 namespace content { | 22 namespace content { |
23 | 23 |
24 // Checks that MakeWebKeyboardEvent makes a DOM3 spec compliant key event. | 24 // Checks that MakeWebKeyboardEvent makes a DOM3 spec compliant key event. |
25 // crbug.com/127142 | 25 // crbug.com/127142 |
26 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEvent) { | 26 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEvent) { |
27 { | |
28 // Press Ctrl. | |
29 ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, | |
30 ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN); | |
31 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | |
32 // However, modifier bit for Control in |webkit_event| should be set. | |
33 EXPECT_EQ(blink::WebInputEvent::ControlKey | blink::WebInputEvent::IsLeft, | |
34 webkit_event.modifiers); | |
35 } | |
36 { | |
37 // Release Ctrl. | |
38 ui::KeyEvent event(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, | |
39 ui::DomCode::CONTROL_LEFT, ui::EF_NONE); | |
40 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | |
41 // However, modifier bit for Control in |webkit_event| shouldn't be set. | |
42 EXPECT_EQ(blink::WebInputEvent::IsLeft, webkit_event.modifiers); | |
43 } | |
44 #if defined(USE_X11) | 27 #if defined(USE_X11) |
45 const int kLocationModifiers = | |
46 blink::WebInputEvent::IsLeft | blink::WebInputEvent::IsRight; | |
47 ui::ScopedXI2Event xev; | 28 ui::ScopedXI2Event xev; |
48 { | 29 { |
49 // Press Ctrl. | 30 // Press Ctrl. |
50 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 31 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
51 ui::KeyEvent event(xev); | 32 ui::KeyEvent event(xev); |
52 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 33 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
53 // However, modifier bit for Control in |webkit_event| should be set. | 34 // However, modifier bit for Control in |webkit_event| should be set. |
54 EXPECT_EQ(blink::WebInputEvent::ControlKey, | 35 EXPECT_EQ(webkit_event.modifiers, blink::WebInputEvent::ControlKey); |
55 webkit_event.modifiers & ~kLocationModifiers); | |
56 } | 36 } |
57 { | 37 { |
58 // Release Ctrl. | 38 // Release Ctrl. |
59 xev.InitKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ControlMask); | 39 xev.InitKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ControlMask); |
60 ui::KeyEvent event(xev); | 40 ui::KeyEvent event(xev); |
61 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 41 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
62 // However, modifier bit for Control in |webkit_event| shouldn't be set. | 42 // However, modifier bit for Control in |webkit_event| shouldn't be set. |
63 EXPECT_EQ(0, webkit_event.modifiers & ~kLocationModifiers); | 43 EXPECT_EQ(webkit_event.modifiers, 0); |
64 } | 44 } |
65 #endif | 45 #endif |
66 } | 46 } |
67 | 47 |
68 // Checks that MakeWebKeyboardEvent returns a correct windowsKeyCode. | 48 // Checks that MakeWebKeyboardEvent returns a correct windowsKeyCode. |
69 #if defined(OS_CHROMEOS) || defined(THREAD_SANITIZER) | 49 #if defined(OS_CHROMEOS) || defined(THREAD_SANITIZER) |
70 // Fails on Chrome OS and under ThreadSanitizer on Linux, see | 50 // Fails on Chrome OS and under ThreadSanitizer on Linux, see |
71 // https://crbug.com/449103. | 51 // https://crbug.com/449103. |
72 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ | 52 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ |
73 DISABLED_TestMakeWebKeyboardEventWindowsKeyCode | 53 DISABLED_TestMakeWebKeyboardEventWindowsKeyCode |
74 #else | 54 #else |
75 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ | 55 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ |
76 TestMakeWebKeyboardEventWindowsKeyCode | 56 TestMakeWebKeyboardEventWindowsKeyCode |
77 #endif | 57 #endif |
78 TEST(WebInputEventAuraTest, MAYBE_TestMakeWebKeyboardEventWindowsKeyCode) { | 58 TEST(WebInputEventAuraTest, MAYBE_TestMakeWebKeyboardEventWindowsKeyCode) { |
79 #if defined(USE_X11) | 59 #if defined(USE_X11) |
80 ui::ScopedXI2Event xev; | 60 ui::ScopedXI2Event xev; |
81 { | 61 { |
82 // Press left Ctrl. | 62 // Press left Ctrl. |
83 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 63 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
84 XEvent* xevent = xev; | 64 XEvent* xevent = xev; |
85 xevent->xkey.keycode = | 65 xevent->xkey.keycode = ui::KeycodeConverter::DomCodeToNativeKeycode( |
86 ui::KeycodeConverter::DomCodeToNativeKeycode(ui::DomCode::CONTROL_LEFT); | 66 ui::DomCode::CONTROL_LEFT); |
87 ui::KeyEvent event(xev); | 67 ui::KeyEvent event(xev); |
88 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 68 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
89 // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. | 69 // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. |
90 EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); | 70 EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); |
91 } | 71 } |
92 { | 72 { |
93 // Press right Ctrl. | 73 // Press right Ctrl. |
94 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 74 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
95 XEvent* xevent = xev; | 75 XEvent* xevent = xev; |
96 xevent->xkey.keycode = ui::KeycodeConverter::DomCodeToNativeKeycode( | 76 xevent->xkey.keycode = ui::KeycodeConverter::DomCodeToNativeKeycode( |
(...skipping 22 matching lines...) Expand all Loading... |
119 // Press right Ctrl. | 99 // Press right Ctrl. |
120 ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, | 100 ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, |
121 ui::DomCode::CONTROL_RIGHT, ui::EF_CONTROL_DOWN, | 101 ui::DomCode::CONTROL_RIGHT, ui::EF_CONTROL_DOWN, |
122 ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); | 102 ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); |
123 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 103 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
124 // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. | 104 // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. |
125 EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); | 105 EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); |
126 } | 106 } |
127 } | 107 } |
128 | 108 |
129 // Checks that MakeWebKeyboardEvent fills a correct keypad modifier. | 109 // Checks that MakeWebKeyboardEvent fills a correct keypard modifier. |
130 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEventKeyPadKeyCode) { | 110 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEventKeyPadKeyCode) { |
131 #if defined(USE_X11) | 111 #if defined(USE_X11) |
132 #define XK(x) XK_##x | |
133 #else | |
134 #define XK(x) 0 | |
135 #endif | |
136 struct TestCase { | 112 struct TestCase { |
137 ui::DomCode dom_code; // The physical key (location). | |
138 ui::KeyboardCode ui_keycode; // The virtual key code. | 113 ui::KeyboardCode ui_keycode; // The virtual key code. |
139 uint32 x_keysym; // The X11 keysym. | 114 uint32 x_keycode; // The platform key code. |
140 bool expected_result; // true if the event has "isKeyPad" modifier. | 115 bool expected_result; // true if the event has "isKeyPad" modifier. |
141 } kTesCases[] = { | 116 } kTesCases[] = { |
142 {ui::DomCode::DIGIT0, ui::VKEY_0, XK(0), false}, | 117 {ui::VKEY_0, XK_0, false}, |
143 {ui::DomCode::DIGIT1, ui::VKEY_1, XK(1), false}, | 118 {ui::VKEY_1, XK_1, false}, |
144 {ui::DomCode::DIGIT2, ui::VKEY_2, XK(2), false}, | 119 {ui::VKEY_2, XK_2, false}, |
145 {ui::DomCode::DIGIT3, ui::VKEY_3, XK(3), false}, | 120 {ui::VKEY_3, XK_3, false}, |
146 {ui::DomCode::DIGIT4, ui::VKEY_4, XK(4), false}, | 121 {ui::VKEY_4, XK_4, false}, |
147 {ui::DomCode::DIGIT5, ui::VKEY_5, XK(5), false}, | 122 {ui::VKEY_5, XK_5, false}, |
148 {ui::DomCode::DIGIT6, ui::VKEY_6, XK(6), false}, | 123 {ui::VKEY_6, XK_6, false}, |
149 {ui::DomCode::DIGIT7, ui::VKEY_7, XK(7), false}, | 124 {ui::VKEY_7, XK_7, false}, |
150 {ui::DomCode::DIGIT8, ui::VKEY_8, XK(8), false}, | 125 {ui::VKEY_8, XK_8, false}, |
151 {ui::DomCode::DIGIT9, ui::VKEY_9, XK(9), false}, | 126 {ui::VKEY_9, XK_9, false}, |
152 | 127 |
153 {ui::DomCode::NUMPAD0, ui::VKEY_NUMPAD0, XK(KP_0), true}, | 128 {ui::VKEY_NUMPAD0, XK_KP_0, true}, |
154 {ui::DomCode::NUMPAD1, ui::VKEY_NUMPAD1, XK(KP_1), true}, | 129 {ui::VKEY_NUMPAD1, XK_KP_1, true}, |
155 {ui::DomCode::NUMPAD2, ui::VKEY_NUMPAD2, XK(KP_2), true}, | 130 {ui::VKEY_NUMPAD2, XK_KP_2, true}, |
156 {ui::DomCode::NUMPAD3, ui::VKEY_NUMPAD3, XK(KP_3), true}, | 131 {ui::VKEY_NUMPAD3, XK_KP_3, true}, |
157 {ui::DomCode::NUMPAD4, ui::VKEY_NUMPAD4, XK(KP_4), true}, | 132 {ui::VKEY_NUMPAD4, XK_KP_4, true}, |
158 {ui::DomCode::NUMPAD5, ui::VKEY_NUMPAD5, XK(KP_5), true}, | 133 {ui::VKEY_NUMPAD5, XK_KP_5, true}, |
159 {ui::DomCode::NUMPAD6, ui::VKEY_NUMPAD6, XK(KP_6), true}, | 134 {ui::VKEY_NUMPAD6, XK_KP_6, true}, |
160 {ui::DomCode::NUMPAD7, ui::VKEY_NUMPAD7, XK(KP_7), true}, | 135 {ui::VKEY_NUMPAD7, XK_KP_7, true}, |
161 {ui::DomCode::NUMPAD8, ui::VKEY_NUMPAD8, XK(KP_8), true}, | 136 {ui::VKEY_NUMPAD8, XK_KP_8, true}, |
162 {ui::DomCode::NUMPAD9, ui::VKEY_NUMPAD9, XK(KP_9), true}, | 137 {ui::VKEY_NUMPAD9, XK_KP_9, true}, |
163 | 138 |
164 {ui::DomCode::NUMPAD_MULTIPLY, ui::VKEY_MULTIPLY, XK(KP_Multiply), true}, | 139 {ui::VKEY_MULTIPLY, XK_KP_Multiply, true}, |
165 {ui::DomCode::NUMPAD_SUBTRACT, ui::VKEY_SUBTRACT, XK(KP_Subtract), true}, | 140 {ui::VKEY_SUBTRACT, XK_KP_Subtract, true}, |
166 {ui::DomCode::NUMPAD_ADD, ui::VKEY_ADD, XK(KP_Add), true}, | 141 {ui::VKEY_ADD, XK_KP_Add, true}, |
167 {ui::DomCode::NUMPAD_DIVIDE, ui::VKEY_DIVIDE, XK(KP_Divide), true}, | 142 {ui::VKEY_DIVIDE, XK_KP_Divide, true}, |
168 {ui::DomCode::NUMPAD_DECIMAL, ui::VKEY_DECIMAL, XK(KP_Decimal), true}, | 143 {ui::VKEY_DECIMAL, XK_KP_Decimal, true}, |
169 {ui::DomCode::NUMPAD_DECIMAL, ui::VKEY_DELETE, XK(KP_Delete), true}, | 144 {ui::VKEY_DELETE, XK_KP_Delete, true}, |
170 {ui::DomCode::NUMPAD0, ui::VKEY_INSERT, XK(KP_Insert), true}, | 145 {ui::VKEY_INSERT, XK_KP_Insert, true}, |
171 {ui::DomCode::NUMPAD1, ui::VKEY_END, XK(KP_End), true}, | 146 {ui::VKEY_END, XK_KP_End, true}, |
172 {ui::DomCode::NUMPAD2, ui::VKEY_DOWN, XK(KP_Down), true}, | 147 {ui::VKEY_DOWN, XK_KP_Down, true}, |
173 {ui::DomCode::NUMPAD3, ui::VKEY_NEXT, XK(KP_Page_Down), true}, | 148 {ui::VKEY_NEXT, XK_KP_Page_Down, true}, |
174 {ui::DomCode::NUMPAD4, ui::VKEY_LEFT, XK(KP_Left), true}, | 149 {ui::VKEY_LEFT, XK_KP_Left, true}, |
175 {ui::DomCode::NUMPAD5, ui::VKEY_CLEAR, XK(KP_Begin), true}, | 150 {ui::VKEY_CLEAR, XK_KP_Begin, true}, |
176 {ui::DomCode::NUMPAD6, ui::VKEY_RIGHT, XK(KP_Right), true}, | 151 {ui::VKEY_RIGHT, XK_KP_Right, true}, |
177 {ui::DomCode::NUMPAD7, ui::VKEY_HOME, XK(KP_Home), true}, | 152 {ui::VKEY_HOME, XK_KP_Home, true}, |
178 {ui::DomCode::NUMPAD8, ui::VKEY_UP, XK(KP_Up), true}, | 153 {ui::VKEY_UP, XK_KP_Up, true}, |
179 {ui::DomCode::NUMPAD9, ui::VKEY_PRIOR, XK(KP_Page_Up), true}, | 154 {ui::VKEY_PRIOR, XK_KP_Page_Up, true}, |
180 }; | 155 }; |
181 for (const auto& test_case : kTesCases) { | |
182 ui::KeyEvent event(ui::ET_KEY_PRESSED, test_case.ui_keycode, | |
183 test_case.dom_code, ui::EF_NONE); | |
184 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | |
185 EXPECT_EQ(test_case.expected_result, | |
186 (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) | |
187 << "Failed in " | |
188 << "{dom_code:" | |
189 << ui::KeycodeConverter::DomCodeToCodeString(test_case.dom_code) | |
190 << ", ui_keycode:" << test_case.ui_keycode | |
191 << "}, expect: " << test_case.expected_result; | |
192 } | |
193 #if defined(USE_X11) | |
194 ui::ScopedXI2Event xev; | 156 ui::ScopedXI2Event xev; |
195 for (size_t i = 0; i < arraysize(kTesCases); ++i) { | 157 for (size_t i = 0; i < arraysize(kTesCases); ++i) { |
196 const TestCase& test_case = kTesCases[i]; | 158 const TestCase& test_case = kTesCases[i]; |
197 | 159 |
198 xev.InitKeyEvent(ui::ET_KEY_PRESSED, test_case.ui_keycode, ui::EF_NONE); | 160 xev.InitKeyEvent(ui::ET_KEY_PRESSED, test_case.ui_keycode, 0); |
199 XEvent* xevent = xev; | 161 XEvent* xevent = xev; |
200 xevent->xkey.keycode = | 162 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), |
201 XKeysymToKeycode(gfx::GetXDisplay(), test_case.x_keysym); | 163 test_case.x_keycode); |
202 ui::KeyEvent event(xev); | 164 ui::KeyEvent event(xev); |
203 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 165 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
204 EXPECT_EQ(test_case.expected_result, | 166 EXPECT_EQ(test_case.expected_result, |
205 (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) | 167 (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) |
206 << "Failed in " << i << "th test case: " | 168 << "Failed in " << i << "th test case: " |
207 << "{dom_code:" | 169 << "{ui_keycode:" << test_case.ui_keycode |
208 << ui::KeycodeConverter::DomCodeToCodeString(test_case.dom_code) | 170 << ", x_keycode:" << test_case.x_keycode |
209 << ", ui_keycode:" << test_case.ui_keycode | |
210 << ", x_keysym:" << test_case.x_keysym | |
211 << "}, expect: " << test_case.expected_result; | 171 << "}, expect: " << test_case.expected_result; |
212 } | 172 } |
213 #endif | 173 #endif |
214 } | 174 } |
215 | 175 |
216 } // namespace content | 176 } // namespace content |
OLD | NEW |