OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ui/touch_selection/longpress_drag_selector.h" | 5 #include "ui/touch_selection/longpress_drag_selector.h" |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 #include "ui/events/test/motion_event_test_utils.h" | 8 #include "ui/events/test/motion_event_test_utils.h" |
9 | 9 |
10 using ui::test::MockMotionEvent; | 10 using ui::test::MockMotionEvent; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 MockMotionEvent event; | 80 MockMotionEvent event; |
81 | 81 |
82 // Start a touch sequence. | 82 // Start a touch sequence. |
83 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); | 83 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); |
84 EXPECT_FALSE(GetAndResetActiveStateChanged()); | 84 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
85 | 85 |
86 // Activate a longpress-triggered selection. | 86 // Activate a longpress-triggered selection. |
87 gfx::PointF selection_start(0, 10); | 87 gfx::PointF selection_start(0, 10); |
88 gfx::PointF selection_end(10, 10); | 88 gfx::PointF selection_end(10, 10); |
89 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | 89 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); |
90 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 90 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
91 | 91 |
92 // Motion should not be consumed until a selection is detected. | 92 // Motion should not be consumed until a selection is detected. |
93 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 93 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
94 SetSelection(selection_start, selection_end); | 94 SetSelection(selection_start, selection_end); |
95 selector.OnSelectionActivated(); | 95 selector.OnSelectionActivated(); |
| 96 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
96 EXPECT_FALSE(IsDragging()); | 97 EXPECT_FALSE(IsDragging()); |
97 | 98 |
98 // Initiate drag motion. Note that the first move event after activation is | 99 // Initiate drag motion. Note that the first move event after activation is |
99 // used to initialize the drag start anchor. | 100 // used to initialize the drag start anchor. |
100 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 101 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
101 EXPECT_FALSE(IsDragging()); | 102 EXPECT_FALSE(IsDragging()); |
102 | 103 |
103 // The first slop exceeding motion will start the drag. As the motion is | 104 // The first slop exceeding motion will start the drag. As the motion is |
104 // downward, the end selection point should be moved. | 105 // downward, the end selection point should be moved. |
105 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop))); | 106 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop))); |
(...skipping 20 matching lines...) Expand all Loading... |
126 MockMotionEvent event; | 127 MockMotionEvent event; |
127 | 128 |
128 // Start a touch sequence. | 129 // Start a touch sequence. |
129 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); | 130 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); |
130 EXPECT_FALSE(GetAndResetActiveStateChanged()); | 131 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
131 | 132 |
132 // Activate a longpress-triggered selection. | 133 // Activate a longpress-triggered selection. |
133 gfx::PointF selection_start(0, 10); | 134 gfx::PointF selection_start(0, 10); |
134 gfx::PointF selection_end(10, 10); | 135 gfx::PointF selection_end(10, 10); |
135 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | 136 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); |
136 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 137 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
137 SetSelection(selection_start, selection_end); | 138 SetSelection(selection_start, selection_end); |
138 selector.OnSelectionActivated(); | 139 selector.OnSelectionActivated(); |
| 140 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
139 EXPECT_FALSE(IsDragging()); | 141 EXPECT_FALSE(IsDragging()); |
140 | 142 |
141 // Initiate drag motion. | 143 // Initiate drag motion. |
142 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 5, 0))); | 144 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 5, 0))); |
143 EXPECT_FALSE(IsDragging()); | 145 EXPECT_FALSE(IsDragging()); |
144 | 146 |
145 // As the initial motion is leftward, toward the selection start, the | 147 // As the initial motion is leftward, toward the selection start, the |
146 // selection start should be the drag point. | 148 // selection start should be the drag point. |
147 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, -kSlop, 0))); | 149 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, -kSlop, 0))); |
148 EXPECT_TRUE(IsDragging()); | 150 EXPECT_TRUE(IsDragging()); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 } | 243 } |
242 | 244 |
243 TEST_F(LongPressDragSelectorTest, NoSelection) { | 245 TEST_F(LongPressDragSelectorTest, NoSelection) { |
244 LongPressDragSelector selector(this); | 246 LongPressDragSelector selector(this); |
245 MockMotionEvent event; | 247 MockMotionEvent event; |
246 | 248 |
247 // Start a touch sequence. | 249 // Start a touch sequence. |
248 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); | 250 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); |
249 EXPECT_FALSE(GetAndResetActiveStateChanged()); | 251 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
250 | 252 |
251 // Trigger a longpress. This will notify the client that detection is active, | 253 // Trigger a longpress. |
252 // but until there's a longpress no drag selection should occur. | |
253 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | 254 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); |
254 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 255 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
255 EXPECT_FALSE(IsDragging()); | 256 EXPECT_FALSE(IsDragging()); |
256 | 257 |
257 // Touch movement should not initiate selection drag, as there is no active | 258 // Touch movement should not initiate selection drag, as there is no active |
258 // selection. | 259 // selection. |
259 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 260 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
260 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop))); | 261 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop))); |
261 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop * 2))); | 262 EXPECT_FALSE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop * 2))); |
262 EXPECT_FALSE(IsDragging()); | 263 EXPECT_FALSE(IsDragging()); |
263 EXPECT_EQ(gfx::PointF(), DragPosition()); | 264 EXPECT_EQ(gfx::PointF(), DragPosition()); |
264 | 265 |
265 EXPECT_FALSE(selector.WillHandleTouchEvent(event.ReleasePoint())); | 266 EXPECT_FALSE(selector.WillHandleTouchEvent(event.ReleasePoint())); |
266 EXPECT_TRUE(GetAndResetActiveStateChanged()); | |
267 } | 267 } |
268 | 268 |
269 TEST_F(LongPressDragSelectorTest, NoDragMotion) { | 269 TEST_F(LongPressDragSelectorTest, NoDragMotion) { |
270 LongPressDragSelector selector(this); | 270 LongPressDragSelector selector(this); |
271 MockMotionEvent event; | 271 MockMotionEvent event; |
272 | 272 |
273 // Start a touch sequence. | 273 // Start a touch sequence. |
274 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); | 274 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); |
275 EXPECT_FALSE(GetAndResetActiveStateChanged()); | 275 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
276 | 276 |
277 // Activate a longpress-triggered selection. | 277 // Activate a longpress-triggered selection. |
278 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | 278 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); |
279 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 279 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
280 gfx::PointF selection_start(0, 10); | 280 gfx::PointF selection_start(0, 10); |
281 gfx::PointF selection_end(10, 10); | 281 gfx::PointF selection_end(10, 10); |
282 SetSelection(selection_start, selection_end); | 282 SetSelection(selection_start, selection_end); |
283 selector.OnSelectionActivated(); | 283 selector.OnSelectionActivated(); |
| 284 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
284 EXPECT_FALSE(IsDragging()); | 285 EXPECT_FALSE(IsDragging()); |
285 | 286 |
286 // Touch movement within the slop region should not initiate selection drag. | 287 // Touch movement within the slop region should not initiate selection drag. |
287 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 288 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
288 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop / 2))); | 289 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop / 2))); |
289 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, -kSlop / 2))); | 290 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, -kSlop / 2))); |
290 EXPECT_FALSE(IsDragging()); | 291 EXPECT_FALSE(IsDragging()); |
291 EXPECT_EQ(gfx::PointF(), DragPosition()); | 292 EXPECT_EQ(gfx::PointF(), DragPosition()); |
292 | 293 |
293 EXPECT_FALSE(selector.WillHandleTouchEvent(event.ReleasePoint())); | 294 EXPECT_FALSE(selector.WillHandleTouchEvent(event.ReleasePoint())); |
294 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 295 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
295 } | 296 } |
296 | 297 |
297 TEST_F(LongPressDragSelectorTest, SelectionDeactivated) { | 298 TEST_F(LongPressDragSelectorTest, SelectionDeactivated) { |
298 LongPressDragSelector selector(this); | 299 LongPressDragSelector selector(this); |
299 MockMotionEvent event; | 300 MockMotionEvent event; |
300 | 301 |
301 // Start a touch sequence. | 302 // Start a touch sequence. |
302 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); | 303 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); |
303 EXPECT_FALSE(GetAndResetActiveStateChanged()); | 304 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
304 | 305 |
305 // Activate a longpress-triggered selection. | 306 // Activate a longpress-triggered selection. |
306 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | 307 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); |
307 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 308 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
308 gfx::PointF selection_start(0, 10); | 309 gfx::PointF selection_start(0, 10); |
309 gfx::PointF selection_end(10, 10); | 310 gfx::PointF selection_end(10, 10); |
310 SetSelection(selection_start, selection_end); | 311 SetSelection(selection_start, selection_end); |
311 selector.OnSelectionActivated(); | 312 selector.OnSelectionActivated(); |
| 313 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
312 EXPECT_FALSE(IsDragging()); | 314 EXPECT_FALSE(IsDragging()); |
313 | 315 |
314 // Start a drag selection. | 316 // Start a drag selection. |
315 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 317 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
316 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop))); | 318 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop))); |
317 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop * 2))); | 319 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 0, kSlop * 2))); |
318 EXPECT_TRUE(IsDragging()); | 320 EXPECT_TRUE(IsDragging()); |
319 | 321 |
320 // Clearing the selection should force an end to the drag. | 322 // Clearing the selection should force an end to the drag. |
321 selector.OnSelectionDeactivated(); | 323 selector.OnSelectionDeactivated(); |
(...skipping 13 matching lines...) Expand all Loading... |
335 MockMotionEvent event; | 337 MockMotionEvent event; |
336 | 338 |
337 // Start a touch sequence. | 339 // Start a touch sequence. |
338 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); | 340 EXPECT_FALSE(selector.WillHandleTouchEvent(event.PressPoint(0, 0))); |
339 EXPECT_FALSE(GetAndResetActiveStateChanged()); | 341 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
340 | 342 |
341 // Activate a longpress-triggered selection. | 343 // Activate a longpress-triggered selection. |
342 gfx::PointF selection_start(0, 10); | 344 gfx::PointF selection_start(0, 10); |
343 gfx::PointF selection_end(10, 10); | 345 gfx::PointF selection_end(10, 10); |
344 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | 346 selector.OnLongPressEvent(event.GetEventTime(), gfx::PointF()); |
345 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 347 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
346 SetSelection(selection_start, selection_end); | 348 SetSelection(selection_start, selection_end); |
347 selector.OnSelectionActivated(); | 349 selector.OnSelectionActivated(); |
| 350 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
348 EXPECT_FALSE(IsDragging()); | 351 EXPECT_FALSE(IsDragging()); |
349 | 352 |
350 // Initiate drag motion. | 353 // Initiate drag motion. |
351 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 15, 5))); | 354 EXPECT_TRUE(selector.WillHandleTouchEvent(event.MovePoint(0, 15, 5))); |
352 EXPECT_FALSE(IsDragging()); | 355 EXPECT_FALSE(IsDragging()); |
353 | 356 |
354 // As the initial motion exceeds both endpoints, the closer bound should | 357 // As the initial motion exceeds both endpoints, the closer bound should |
355 // be used for dragging, in this case the selection end. | 358 // be used for dragging, in this case the selection end. |
356 EXPECT_TRUE(selector.WillHandleTouchEvent( | 359 EXPECT_TRUE(selector.WillHandleTouchEvent( |
357 event.MovePoint(0, 15.f + kSlop * 2.f, 5.f + kSlop))); | 360 event.MovePoint(0, 15.f + kSlop * 2.f, 5.f + kSlop))); |
358 EXPECT_TRUE(IsDragging()); | 361 EXPECT_TRUE(IsDragging()); |
359 EXPECT_EQ(selection_end, DragPosition()); | 362 EXPECT_EQ(selection_end, DragPosition()); |
360 | 363 |
361 // Release the touch sequence, ending the drag. | 364 // Release the touch sequence, ending the drag. |
362 EXPECT_FALSE(selector.WillHandleTouchEvent(event.ReleasePoint())); | 365 EXPECT_FALSE(selector.WillHandleTouchEvent(event.ReleasePoint())); |
363 EXPECT_FALSE(IsDragging()); | 366 EXPECT_FALSE(IsDragging()); |
364 EXPECT_TRUE(GetAndResetActiveStateChanged()); | 367 EXPECT_TRUE(GetAndResetActiveStateChanged()); |
365 } | 368 } |
366 | 369 |
| 370 TEST_F(LongPressDragSelectorTest, ScrollAfterLongPress) { |
| 371 LongPressDragSelector selector(this); |
| 372 MockMotionEvent event; |
| 373 gfx::PointF touch_point(0, 0); |
| 374 |
| 375 // Start a touch sequence. |
| 376 EXPECT_FALSE(selector.WillHandleTouchEvent( |
| 377 event.PressPoint(touch_point.x(), touch_point.y()))); |
| 378 |
| 379 // Long-press and hold down. |
| 380 selector.OnLongPressEvent(event.GetEventTime(), touch_point); |
| 381 |
| 382 // Scroll the page. This should cancel long-press drag gesture. |
| 383 touch_point.Offset(0, 2 * kSlop); |
| 384 EXPECT_FALSE(selector.WillHandleTouchEvent( |
| 385 event.MovePoint(0, touch_point.x(), touch_point.y()))); |
| 386 selector.OnScrollBeginEvent(); |
| 387 |
| 388 // Now if the selection is activated, because long-press drag gesture was |
| 389 // canceled, active state of the long-press selector should not change. |
| 390 selector.OnSelectionActivated(); |
| 391 EXPECT_FALSE(GetAndResetActiveStateChanged()); |
| 392 |
| 393 // Release the touch sequence. |
| 394 selector.WillHandleTouchEvent(event.ReleasePoint()); |
| 395 } |
| 396 |
367 } // namespace ui | 397 } // namespace ui |
OLD | NEW |