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/test/events_test_utils_x11.h" |
| 11 #include "ui/events/x/device_data_manager_x11.h" |
| 12 #include "ui/events/x/touch_factory_x11.h" |
| 13 |
| 14 namespace ui { |
| 15 |
| 16 class PlatformEventBuilderXTest : public testing::Test { |
| 17 public: |
| 18 PlatformEventBuilderXTest() {} |
| 19 virtual ~PlatformEventBuilderXTest() {} |
| 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 #elif defined(OS_WIN) |
| 108 const LPARAM lParam_a = GetLParamFromScanCode(kNativeCodeA); |
| 109 const LPARAM lParam_b = GetLParamFromScanCode(kNativeCodeB); |
| 110 MSG native_event_a_pressed = {NULL, WM_KEYDOWN, VKEY_A, lParam_a}; |
| 111 MSG native_event_a_released = {NULL, WM_KEYUP, VKEY_A, lParam_a}; |
| 112 MSG native_event_b_pressed = {NULL, WM_KEYUP, VKEY_B, lParam_b}; |
| 113 #endif |
| 114 KeyEvent key_a1 = PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 115 EXPECT_FALSE(key_a1.IsRepeat()); |
| 116 KeyEvent key_a1_released = |
| 117 PlatformEventBuilder::BuildKeyEvent(native_event_a_released); |
| 118 EXPECT_FALSE(key_a1_released.IsRepeat()); |
| 119 |
| 120 KeyEvent key_a2 = PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 121 EXPECT_FALSE(key_a2.IsRepeat()); |
| 122 KeyEvent key_a2_repeated = |
| 123 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 124 EXPECT_TRUE(key_a2_repeated.IsRepeat()); |
| 125 KeyEvent key_a2_released = |
| 126 PlatformEventBuilder::BuildKeyEvent(native_event_a_released); |
| 127 EXPECT_FALSE(key_a2_released.IsRepeat()); |
| 128 |
| 129 KeyEvent key_a3 = PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 130 EXPECT_FALSE(key_a3.IsRepeat()); |
| 131 KeyEvent key_b = PlatformEventBuilder::BuildKeyEvent(native_event_b_pressed); |
| 132 EXPECT_FALSE(key_b.IsRepeat()); |
| 133 KeyEvent key_a3_again = |
| 134 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 135 EXPECT_FALSE(key_a3_again.IsRepeat()); |
| 136 KeyEvent key_a3_repeated = |
| 137 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 138 EXPECT_TRUE(key_a3_repeated.IsRepeat()); |
| 139 KeyEvent key_a3_repeated2 = |
| 140 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 141 EXPECT_TRUE(key_a3_repeated2.IsRepeat()); |
| 142 KeyEvent key_a3_released = |
| 143 PlatformEventBuilder::BuildKeyEvent(native_event_a_released); |
| 144 EXPECT_FALSE(key_a3_released.IsRepeat()); |
| 145 |
| 146 #if defined(USE_X11) |
| 147 KeyEvent key_a4_pressed = |
| 148 PlatformEventBuilder::BuildKeyEvent(native_event_a_pressed); |
| 149 EXPECT_FALSE(key_a4_pressed.IsRepeat()); |
| 150 |
| 151 KeyEvent key_a4_pressed_nonstandard_state = |
| 152 PlatformEventBuilder::BuildKeyEvent( |
| 153 native_event_a_pressed_nonstandard_state); |
| 154 EXPECT_FALSE(key_a4_pressed_nonstandard_state.IsRepeat()); |
| 155 #endif |
| 156 } |
| 157 |
| 158 // Tests that an event only increases the click count and gets marked as a |
| 159 // double click if a release event was seen for the previous click. This |
| 160 // prevents the same PRESSED event from being processed twice: |
| 161 // http://crbug.com/389162 |
| 162 TEST_F(PlatformEventBuilderXTest, DoubleClickRequiresRelease) { |
| 163 const gfx::Point origin1(0, 0); |
| 164 const gfx::Point origin2(100, 0); |
| 165 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0); |
| 166 |
| 167 unsigned int device_id = 1; |
| 168 std::vector<unsigned int> device_list; |
| 169 device_list.push_back(device_id); |
| 170 TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
| 171 ScopedXI2Event native_event; |
| 172 |
| 173 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin1, |
| 174 EF_LEFT_MOUSE_BUTTON); |
| 175 MouseEvent 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, origin1, |
| 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_PRESSED, 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_RELEASED, origin2, |
| 192 EF_LEFT_MOUSE_BUTTON); |
| 193 event = PlatformEventBuilder::BuildMouseEvent(native_event); |
| 194 event.set_time_stamp(start); |
| 195 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); |
| 196 |
| 197 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, 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 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_RELEASED, origin2, |
| 204 EF_LEFT_MOUSE_BUTTON); |
| 205 event = PlatformEventBuilder::BuildMouseEvent(native_event); |
| 206 event.set_time_stamp(start); |
| 207 EXPECT_EQ(2, PlatformEventBuilder::GetRepeatCount(native_event, event)); |
| 208 |
| 209 PlatformEventBuilder::ResetLastClickForTest(); |
| 210 } |
| 211 |
| 212 // Tests that clicking right and then left clicking does not generate a double |
| 213 // click. |
| 214 TEST_F(PlatformEventBuilderXTest, SingleClickRightLeft) { |
| 215 const gfx::Point origin(0, 0); |
| 216 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0); |
| 217 |
| 218 unsigned int device_id = 1; |
| 219 std::vector<unsigned int> device_list; |
| 220 device_list.push_back(device_id); |
| 221 TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
| 222 ScopedXI2Event native_event; |
| 223 |
| 224 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin, |
| 225 EF_RIGHT_MOUSE_BUTTON); |
| 226 MouseEvent 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_PRESSED, 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_RELEASED, origin, |
| 237 EF_LEFT_MOUSE_BUTTON); |
| 238 event = PlatformEventBuilder::BuildMouseEvent(native_event); |
| 239 event.set_time_stamp(start); |
| 240 EXPECT_EQ(1, PlatformEventBuilder::GetRepeatCount(native_event, event)); |
| 241 |
| 242 native_event.InitGenericButtonEvent(device_id, ET_MOUSE_PRESSED, origin, |
| 243 EF_LEFT_MOUSE_BUTTON); |
| 244 event = PlatformEventBuilder::BuildMouseEvent(native_event); |
| 245 event.set_time_stamp(start); |
| 246 EXPECT_EQ(2, PlatformEventBuilder::GetRepeatCount(native_event, event)); |
| 247 PlatformEventBuilder::ResetLastClickForTest(); |
| 248 } |
| 249 |
| 250 } // namespace ui |
OLD | NEW |