OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/events/platform/platform_event_builder.h" | |
6 | |
7 #include "testing/gtest/include/gtest/gtest.h" | |
8 #include "ui/events/event.h" | |
9 #include "ui/events/keycodes/dom4/keycode_converter.h" | |
10 #include "ui/events/platform/x11/device_data_manager_x11.h" | |
11 #include "ui/events/platform/x11/touch_factory_x11.h" | |
12 #include "ui/events/test/events_test_utils_x11.h" | |
13 | |
14 namespace ui { | |
15 | |
16 class PlatformEventBuilderXTest : public testing::Test { | |
17 public: | |
18 PlatformEventBuilderXTest() {} | |
19 ~PlatformEventBuilderXTest() override {} | |
20 | |
21 void SetUp() override { | |
22 DeviceDataManagerX11::CreateInstance(); | |
23 ui::TouchFactory::GetInstance()->ResetForTest(); | |
24 } | |
25 | |
26 private: | |
27 DISALLOW_COPY_AND_ASSIGN(PlatformEventBuilderXTest); | |
28 }; | |
29 | |
30 TEST_F(PlatformEventBuilderXTest, GetCharacter) { | |
31 // For X11, test the functions with native_event() as well. crbug.com/107837 | |
32 ScopedXI2Event event; | |
33 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN); | |
34 KeyEvent keyev3 = PlatformEventBuilder::BuildKeyEvent(event); | |
35 EXPECT_EQ(10, keyev3.GetCharacter()); | |
36 | |
37 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE); | |
38 KeyEvent keyev4 = PlatformEventBuilder::BuildKeyEvent(event); | |
39 EXPECT_EQ(13, keyev4.GetCharacter()); | |
40 } | |
41 | |
42 TEST_F(PlatformEventBuilderXTest, NormalizeKeyEventFlags) { | |
43 // Normalize flags when KeyEvent is created from XEvent. | |
44 ScopedXI2Event event; | |
45 { | |
46 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN); | |
47 KeyEvent keyev = PlatformEventBuilder::BuildKeyEvent(event); | |
48 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); | |
49 } | |
50 { | |
51 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN); | |
52 KeyEvent keyev = PlatformEventBuilder::BuildKeyEvent(event); | |
53 EXPECT_EQ(EF_NONE, keyev.flags()); | |
54 } | |
55 { | |
56 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN); | |
57 KeyEvent keyev = PlatformEventBuilder::BuildKeyEvent(event); | |
58 EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); | |
59 } | |
60 { | |
61 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN); | |
62 KeyEvent keyev = PlatformEventBuilder::BuildKeyEvent(event); | |
63 EXPECT_EQ(EF_NONE, keyev.flags()); | |
64 } | |
65 { | |
66 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN); | |
67 KeyEvent keyev = PlatformEventBuilder::BuildKeyEvent(event); | |
68 EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); | |
69 } | |
70 { | |
71 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN); | |
72 KeyEvent keyev = PlatformEventBuilder::BuildKeyEvent(event); | |
73 EXPECT_EQ(EF_NONE, keyev.flags()); | |
74 } | |
75 } | |
76 | |
77 TEST_F(PlatformEventBuilderXTest, KeyEventCode) { | |
78 const char kCodeForSpace[] = "Space"; | |
79 const uint16 kNativeCodeSpace = | |
80 ui::KeycodeConverter::CodeToNativeKeycode(kCodeForSpace); | |
81 | |
82 // KeyEvent converts from the native keycode (XKB) to the code. | |
83 ScopedXI2Event xevent; | |
84 xevent.InitKeyEvent(ET_KEY_PRESSED, VKEY_SPACE, kNativeCodeSpace); | |
85 KeyEvent key = PlatformEventBuilder::BuildKeyEvent(xevent); | |
86 EXPECT_EQ(kCodeForSpace, key.code()); | |
87 } | |
88 | |
89 // TODO(erg): When we bring up mojo on Windows, we'll need to port this test to | |
90 // Windows too. | |
91 TEST_F(PlatformEventBuilderXTest, AutoRepeat) { | |
92 const uint16 kNativeCodeA = ui::KeycodeConverter::CodeToNativeKeycode("KeyA"); | |
93 const uint16 kNativeCodeB = ui::KeycodeConverter::CodeToNativeKeycode("KeyB"); | |
94 #if defined(USE_X11) | |
95 ScopedXI2Event native_event_a_pressed; | |
96 native_event_a_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_A, kNativeCodeA); | |
97 ScopedXI2Event native_event_a_released; | |
98 native_event_a_released.InitKeyEvent(ET_KEY_RELEASED, VKEY_A, kNativeCodeA); | |
99 ScopedXI2Event native_event_b_pressed; | |
100 native_event_b_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_B, kNativeCodeB); | |
101 ScopedXI2Event native_event_a_pressed_nonstandard_state; | |
102 native_event_a_pressed_nonstandard_state.InitKeyEvent(ET_KEY_PRESSED, VKEY_A, | |
103 kNativeCodeA); | |
104 // IBUS-GTK uses the mask (1 << 25) to detect reposted event. | |
105 static_cast<XEvent*>(native_event_a_pressed_nonstandard_state)->xkey.state |= | |
106 1 << 25; | |
107 #endif | |
108 KeyEvent key_a1 = PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
109 EXPECT_FALSE(key_a1.IsRepeat()); | |
110 KeyEvent key_a1_released = | |
111 PlatformEventBuilder::BuildKeyEvent(native_event_a_released); | |
112 EXPECT_FALSE(key_a1_released.IsRepeat()); | |
113 | |
114 KeyEvent key_a2 = PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
115 EXPECT_FALSE(key_a2.IsRepeat()); | |
116 KeyEvent key_a2_repeated = | |
117 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
118 EXPECT_TRUE(key_a2_repeated.IsRepeat()); | |
119 KeyEvent key_a2_released = | |
120 PlatformEventBuilder::BuildKeyEvent(native_event_a_released); | |
121 EXPECT_FALSE(key_a2_released.IsRepeat()); | |
122 | |
123 KeyEvent key_a3 = PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
124 EXPECT_FALSE(key_a3.IsRepeat()); | |
125 KeyEvent key_b = PlatformEventBuilder::BuildKeyEvent(native_event_b_pressed); | |
126 EXPECT_FALSE(key_b.IsRepeat()); | |
127 KeyEvent key_a3_again = | |
128 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
129 EXPECT_FALSE(key_a3_again.IsRepeat()); | |
130 KeyEvent key_a3_repeated = | |
131 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
132 EXPECT_TRUE(key_a3_repeated.IsRepeat()); | |
133 KeyEvent key_a3_repeated2 = | |
134 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
135 EXPECT_TRUE(key_a3_repeated2.IsRepeat()); | |
136 KeyEvent key_a3_released = | |
137 PlatformEventBuilder::BuildKeyEvent(native_event_a_released); | |
138 EXPECT_FALSE(key_a3_released.IsRepeat()); | |
139 | |
140 #if defined(USE_X11) | |
141 KeyEvent key_a4_pressed = | |
142 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); | |
143 EXPECT_FALSE(key_a4_pressed.IsRepeat()); | |
144 | |
145 KeyEvent key_a4_pressed_nonstandard_state = | |
146 PlatformEventBuilder::BuildKeyEvent( | |
147 native_event_a_pressed_nonstandard_state); | |
148 EXPECT_FALSE(key_a4_pressed_nonstandard_state.IsRepeat()); | |
149 #endif | |
150 } | |
151 | |
152 // Tests that an event only increases the click count and gets marked as a | |
153 // double click if a release event was seen for the previous click. This | |
154 // prevents the same PRESSED event from being processed twice: | |
155 // http://crbug.com/389162 | |
156 TEST_F(PlatformEventBuilderXTest, DoubleClickRequiresRelease) { | |
157 const gfx::Point origin1(0, 0); | |
158 const gfx::Point origin2(100, 0); | |
159 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0); | |
160 | |
161 unsigned int device_id = 1; | |
162 std::vector<unsigned int> device_list; | |
163 device_list.push_back(device_id); | |
164 TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | |
165 ScopedXI2Event native_event; | |
166 | |
167 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin1, | |
168 EF_LEFT_MOUSE_BUTTON); | |
169 MouseEvent event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
170 event.set_time_stamp(start); | |
171 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
172 | |
173 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin1, | |
174 EF_LEFT_MOUSE_BUTTON); | |
175 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
176 event.set_time_stamp(start); | |
177 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
178 | |
179 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin2, | |
180 EF_LEFT_MOUSE_BUTTON); | |
181 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
182 event.set_time_stamp(start); | |
183 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
184 | |
185 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_RELEASED, origin2, | |
186 EF_LEFT_MOUSE_BUTTON); | |
187 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
188 event.set_time_stamp(start); | |
189 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
190 | |
191 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin2, | |
192 EF_LEFT_MOUSE_BUTTON); | |
193 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
194 event.set_time_stamp(start); | |
195 EXPECT_EQ(2, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
196 | |
197 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_RELEASED, origin2, | |
198 EF_LEFT_MOUSE_BUTTON); | |
199 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
200 event.set_time_stamp(start); | |
201 EXPECT_EQ(2, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
202 | |
203 PlatformEventBuilder::ResetLastClickForTest(); | |
204 } | |
205 | |
206 // Tests that clicking right and then left clicking does not generate a double | |
207 // click. | |
208 TEST_F(PlatformEventBuilderXTest, SingleClickRightLeft) { | |
209 const gfx::Point origin(0, 0); | |
210 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0); | |
211 | |
212 unsigned int device_id = 1; | |
213 std::vector<unsigned int> device_list; | |
214 device_list.push_back(device_id); | |
215 TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | |
216 ScopedXI2Event native_event; | |
217 | |
218 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin, | |
219 EF_RIGHT_MOUSE_BUTTON); | |
220 MouseEvent event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
221 event.set_time_stamp(start); | |
222 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
223 | |
224 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin, | |
225 EF_LEFT_MOUSE_BUTTON); | |
226 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
227 event.set_time_stamp(start); | |
228 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
229 | |
230 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_RELEASED, origin, | |
231 EF_LEFT_MOUSE_BUTTON); | |
232 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
233 event.set_time_stamp(start); | |
234 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
235 | |
236 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin, | |
237 EF_LEFT_MOUSE_BUTTON); | |
238 event = PlatformEventBuilder::BuildMouseEvent(native_event); | |
239 event.set_time_stamp(start); | |
240 EXPECT_EQ(2, PlatformEventBuilder::GetRepeatCount(native_event, event)); | |
241 PlatformEventBuilder::ResetLastClickForTest(); | |
242 } | |
243 | |
244 } // namespace ui | |
OLD | NEW |