| 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 |