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/touch_selection_controller.h" | 5 #include "ui/touch_selection/touch_selection_controller.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 start_bound.set_type(gfx::SelectionBound::LEFT); | 138 start_bound.set_type(gfx::SelectionBound::LEFT); |
139 end_bound.set_type(gfx::SelectionBound::RIGHT); | 139 end_bound.set_type(gfx::SelectionBound::RIGHT); |
140 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 140 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
141 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 141 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
142 start_bound.set_visible(start_visible); | 142 start_bound.set_visible(start_visible); |
143 end_bound.set_visible(end_visible); | 143 end_bound.set_visible(end_visible); |
144 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 144 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
145 } | 145 } |
146 | 146 |
147 void OnLongPressEvent() { | 147 void OnLongPressEvent() { |
148 ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(), | 148 controller().WillHandleLongPressEvent(base::TimeTicks(), |
149 kIgnoredPoint)); | 149 kIgnoredPoint); |
150 } | 150 } |
151 | 151 |
152 void OnTapEvent() { | 152 void OnTapEvent() { |
153 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 1)); | 153 controller().WillHandleTapEvent(kIgnoredPoint, 1); |
154 } | 154 } |
155 | 155 |
156 void OnDoubleTapEvent() { | 156 void OnDoubleTapEvent() { |
157 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 2)); | 157 controller().WillHandleTapEvent(kIgnoredPoint, 2); |
158 } | 158 } |
159 | 159 |
160 void Animate() { | 160 void Animate() { |
161 base::TimeTicks now = base::TimeTicks::Now(); | 161 base::TimeTicks now = base::TimeTicks::Now(); |
162 while (needs_animate_) { | 162 while (needs_animate_) { |
163 needs_animate_ = controller_->Animate(now); | 163 needs_animate_ = controller_->Animate(now); |
164 now += base::TimeDelta::FromMilliseconds(16); | 164 now += base::TimeDelta::FromMilliseconds(16); |
165 } | 165 } |
166 } | 166 } |
167 | 167 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 bool dragging_enabled_; | 233 bool dragging_enabled_; |
234 std::unique_ptr<TouchSelectionController> controller_; | 234 std::unique_ptr<TouchSelectionController> controller_; |
235 | 235 |
236 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); | 236 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); |
237 }; | 237 }; |
238 | 238 |
239 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 239 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
240 gfx::RectF insertion_rect(5, 5, 0, 10); | 240 gfx::RectF insertion_rect(5, 5, 0, 10); |
241 bool visible = true; | 241 bool visible = true; |
242 | 242 |
243 // Insertion handles are not shown until automatic showing is enabled. | |
244 ChangeInsertion(insertion_rect, visible); | |
245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
246 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
247 OnTapEvent(); | 243 OnTapEvent(); |
248 | |
249 // Insertion handles are not shown until the selection region is | |
250 // marked editable. | |
251 ChangeInsertion(insertion_rect, visible); | |
252 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
253 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
254 | |
255 OnTapEvent(); | |
256 controller().OnSelectionEditable(true); | |
257 ChangeInsertion(insertion_rect, visible); | 244 ChangeInsertion(insertion_rect, visible); |
258 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | 245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); |
259 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 246 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
260 | 247 |
261 insertion_rect.Offset(1, 0); | 248 insertion_rect.Offset(1, 0); |
262 ChangeInsertion(insertion_rect, visible); | 249 ChangeInsertion(insertion_rect, visible); |
263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 250 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
264 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 251 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
265 | 252 |
266 insertion_rect.Offset(0, 1); | 253 insertion_rect.Offset(0, 1); |
267 ChangeInsertion(insertion_rect, visible); | 254 ChangeInsertion(insertion_rect, visible); |
268 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
269 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 256 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
270 | 257 |
271 ClearInsertion(); | 258 ClearInsertion(); |
272 EXPECT_THAT(GetAndResetEvents(), | 259 EXPECT_THAT(GetAndResetEvents(), |
273 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED)); | 260 ElementsAre(INSERTION_HANDLE_CLEARED)); |
274 } | |
275 | |
276 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | |
277 gfx::RectF insertion_rect(5, 5, 0, 10); | |
278 bool visible = true; | |
279 OnTapEvent(); | |
280 controller().OnSelectionEditable(true); | |
281 | |
282 ChangeInsertion(insertion_rect, visible); | |
283 EXPECT_THAT(GetAndResetEvents(), | |
284 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
285 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
286 | |
287 controller().OnSelectionEditable(false); | |
288 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
289 } | |
290 | |
291 TEST_F(TouchSelectionControllerTest, InsertionEmptyEditable) { | |
292 gfx::RectF insertion_rect(5, 5, 0, 10); | |
293 bool visible = true; | |
294 controller().OnSelectionEditable(true); | |
295 | |
296 // Taps on an empty editable region should be ignored | |
297 OnTapEvent(); | |
298 controller().OnSelectionEmpty(true); | |
299 ChangeInsertion(insertion_rect, visible); | |
300 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
301 | |
302 // Once the region becomes non-empty, taps should show the insertion handle. | |
303 OnTapEvent(); | |
304 controller().OnSelectionEmpty(false); | |
305 ChangeInsertion(insertion_rect, visible); | |
306 EXPECT_THAT(GetAndResetEvents(), | |
307 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
308 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
309 | |
310 // Reset the selection. | |
311 controller().HideAndDisallowShowingAutomatically(); | |
312 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
313 | |
314 // Long-pressing should show the handle even if the editable region is empty. | |
315 insertion_rect.Offset(2, -2); | |
316 OnLongPressEvent(); | |
317 controller().OnSelectionEmpty(true); | |
318 ChangeInsertion(insertion_rect, visible); | |
319 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | |
320 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
321 | |
322 // Single Tap on an empty edit field should clear insertion handle. | |
323 OnTapEvent(); | |
324 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
325 } | |
326 | |
327 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | |
328 gfx::RectF insertion_rect(5, 5, 0, 10); | |
329 bool visible = true; | |
330 | |
331 // Simulate the user tapping an empty text field. | |
332 OnTapEvent(); | |
333 controller().OnSelectionEditable(true); | |
334 controller().OnSelectionEmpty(true); | |
335 ChangeInsertion(insertion_rect, visible); | |
336 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
337 | |
338 // Simulate the cursor moving while a user is typing. | |
339 insertion_rect.Offset(10, 0); | |
340 controller().OnSelectionEmpty(false); | |
341 ChangeInsertion(insertion_rect, visible); | |
342 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
343 | |
344 // If the user taps the *same* position as the cursor at the end of the text | |
345 // entry, the handle should appear. | |
346 OnTapEvent(); | |
347 ChangeInsertion(insertion_rect, visible); | |
348 EXPECT_THAT(GetAndResetEvents(), | |
349 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
350 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
351 } | 261 } |
352 | 262 |
353 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 263 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
354 OnLongPressEvent(); | 264 OnLongPressEvent(); |
355 controller().OnSelectionEditable(true); | |
356 | 265 |
357 gfx::RectF start_rect(5, 5, 0, 10); | 266 gfx::RectF start_rect(5, 5, 0, 10); |
358 gfx::RectF end_rect(50, 5, 0, 10); | 267 gfx::RectF end_rect(50, 5, 0, 10); |
359 bool visible = true; | 268 bool visible = true; |
360 | 269 |
361 ChangeInsertion(start_rect, visible); | 270 ChangeInsertion(start_rect, visible); |
362 EXPECT_THAT(GetAndResetEvents(), | 271 EXPECT_THAT(GetAndResetEvents(), |
363 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 272 ElementsAre(INSERTION_HANDLE_SHOWN)); |
364 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 273 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
365 | 274 |
366 ChangeSelection(start_rect, visible, end_rect, visible); | 275 ChangeSelection(start_rect, visible, end_rect, visible); |
367 EXPECT_THAT(GetAndResetEvents(), | 276 EXPECT_THAT(GetAndResetEvents(), |
368 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 277 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
369 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 278 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
370 | 279 |
371 ChangeInsertion(end_rect, visible); | 280 ChangeInsertion(end_rect, visible); |
372 EXPECT_THAT(GetAndResetEvents(), | 281 EXPECT_THAT(GetAndResetEvents(), |
373 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); | 282 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); |
374 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 283 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
375 | 284 |
376 controller().HideAndDisallowShowingAutomatically(); | 285 controller().HideAndDisallowShowingAutomatically(); |
377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | 286 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); |
378 | 287 |
379 OnTapEvent(); | 288 OnTapEvent(); |
380 ChangeInsertion(end_rect, visible); | 289 ChangeInsertion(end_rect, visible); |
381 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | 290 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); |
382 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 291 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
383 } | 292 } |
384 | 293 |
385 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 294 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
386 base::TimeTicks event_time = base::TimeTicks::Now(); | 295 base::TimeTicks event_time = base::TimeTicks::Now(); |
387 OnTapEvent(); | 296 OnTapEvent(); |
388 controller().OnSelectionEditable(true); | |
389 | 297 |
390 // The touch sequence should not be handled if insertion is not active. | 298 // The touch sequence should not be handled if insertion is not active. |
391 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 299 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
392 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 300 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
393 | 301 |
394 float line_height = 10.f; | 302 float line_height = 10.f; |
395 gfx::RectF start_rect(10, 0, 0, line_height); | 303 gfx::RectF start_rect(10, 0, 0, line_height); |
396 bool visible = true; | 304 bool visible = true; |
397 ChangeInsertion(start_rect, visible); | 305 ChangeInsertion(start_rect, visible); |
398 EXPECT_THAT(GetAndResetEvents(), | 306 EXPECT_THAT(GetAndResetEvents(), |
399 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 307 ElementsAre(INSERTION_HANDLE_SHOWN)); |
400 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 308 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
401 | 309 |
402 // The touch sequence should be handled only if the drawable reports a hit. | 310 // The touch sequence should be handled only if the drawable reports a hit. |
403 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 311 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
404 SetDraggingEnabled(true); | 312 SetDraggingEnabled(true); |
405 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 313 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
406 EXPECT_FALSE(GetAndResetCaretMoved()); | 314 EXPECT_FALSE(GetAndResetCaretMoved()); |
407 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 315 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
408 | 316 |
409 // The MoveCaret() result should reflect the movement. | 317 // The MoveCaret() result should reflect the movement. |
(...skipping 22 matching lines...) Expand all Loading... |
432 // Following ACTION_DOWN should not be consumed if it does not start handle | 340 // Following ACTION_DOWN should not be consumed if it does not start handle |
433 // dragging. | 341 // dragging. |
434 SetDraggingEnabled(false); | 342 SetDraggingEnabled(false); |
435 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); | 343 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); |
436 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 344 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
437 } | 345 } |
438 | 346 |
439 TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) { | 347 TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) { |
440 base::TimeTicks event_time = base::TimeTicks::Now(); | 348 base::TimeTicks event_time = base::TimeTicks::Now(); |
441 OnTapEvent(); | 349 OnTapEvent(); |
442 controller().OnSelectionEditable(true); | |
443 | 350 |
444 float line_height = 10.f; | 351 float line_height = 10.f; |
445 gfx::RectF start_rect(10, 0, 0, line_height); | 352 gfx::RectF start_rect(10, 0, 0, line_height); |
446 bool visible = true; | 353 bool visible = true; |
447 ChangeInsertion(start_rect, visible); | 354 ChangeInsertion(start_rect, visible); |
448 EXPECT_THAT(GetAndResetEvents(), | 355 EXPECT_THAT(GetAndResetEvents(), |
449 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 356 ElementsAre(INSERTION_HANDLE_SHOWN)); |
450 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 357 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
451 | 358 |
452 // Enable dragging so that the following ACTION_DOWN starts handle dragging. | 359 // Enable dragging so that the following ACTION_DOWN starts handle dragging. |
453 SetDraggingEnabled(true); | 360 SetDraggingEnabled(true); |
454 | 361 |
455 // Touch down to start dragging. | 362 // Touch down to start dragging. |
456 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 363 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
457 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 364 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
458 EXPECT_FALSE(GetAndResetCaretMoved()); | 365 EXPECT_FALSE(GetAndResetCaretMoved()); |
459 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
(...skipping 27 matching lines...) Expand all Loading... |
487 // Following ACTION_DOWN should not be consumed if it does not start handle | 394 // Following ACTION_DOWN should not be consumed if it does not start handle |
488 // dragging. | 395 // dragging. |
489 SetDraggingEnabled(false); | 396 SetDraggingEnabled(false); |
490 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); | 397 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); |
491 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 398 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
492 } | 399 } |
493 | 400 |
494 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 401 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
495 base::TimeTicks event_time = base::TimeTicks::Now(); | 402 base::TimeTicks event_time = base::TimeTicks::Now(); |
496 OnTapEvent(); | 403 OnTapEvent(); |
497 controller().OnSelectionEditable(true); | |
498 SetDraggingEnabled(true); | 404 SetDraggingEnabled(true); |
499 | 405 |
500 gfx::RectF start_rect(10, 0, 0, 10); | 406 gfx::RectF start_rect(10, 0, 0, 10); |
501 bool visible = true; | 407 bool visible = true; |
502 ChangeInsertion(start_rect, visible); | 408 ChangeInsertion(start_rect, visible); |
503 EXPECT_THAT(GetAndResetEvents(), | 409 EXPECT_THAT(GetAndResetEvents(), |
504 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 410 ElementsAre(INSERTION_HANDLE_SHOWN)); |
505 | 411 |
506 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 412 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
507 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 413 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
508 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 414 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
509 | 415 |
510 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 416 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
511 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 417 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
512 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 418 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
513 INSERTION_HANDLE_DRAG_STOPPED)); | 419 INSERTION_HANDLE_DRAG_STOPPED)); |
514 | 420 |
515 // Reset the insertion. | 421 // Reset the insertion. |
516 ClearInsertion(); | 422 ClearInsertion(); |
517 OnTapEvent(); | 423 OnTapEvent(); |
518 ChangeInsertion(start_rect, visible); | 424 ChangeInsertion(start_rect, visible); |
519 EXPECT_THAT(GetAndResetEvents(), | 425 EXPECT_THAT(GetAndResetEvents(), |
520 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 426 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
521 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
522 | 427 |
523 // No tap should be signalled if the time between DOWN and UP was too long. | 428 // No tap should be signalled if the time between DOWN and UP was too long. |
524 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 429 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
525 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 430 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
526 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 431 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
527 event_time + base::TimeDelta::FromSeconds(1), | 432 event_time + base::TimeDelta::FromSeconds(1), |
528 0, | 433 0, |
529 0); | 434 0); |
530 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
531 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 436 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
532 INSERTION_HANDLE_DRAG_STOPPED)); | 437 INSERTION_HANDLE_DRAG_STOPPED)); |
533 | 438 |
534 // Reset the insertion. | 439 // Reset the insertion. |
535 ClearInsertion(); | 440 ClearInsertion(); |
536 OnTapEvent(); | 441 OnTapEvent(); |
537 ChangeInsertion(start_rect, visible); | 442 ChangeInsertion(start_rect, visible); |
538 EXPECT_THAT(GetAndResetEvents(), | 443 EXPECT_THAT(GetAndResetEvents(), |
539 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 444 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
540 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
541 | 445 |
542 // No tap should be signalled if the drag was too long. | 446 // No tap should be signalled if the drag was too long. |
543 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 447 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
544 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 448 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
545 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 449 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
546 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 450 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
547 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 451 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
548 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 452 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
549 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 453 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
550 INSERTION_HANDLE_DRAG_STOPPED)); | 454 INSERTION_HANDLE_DRAG_STOPPED)); |
551 | 455 |
552 // Reset the insertion. | 456 // Reset the insertion. |
553 ClearInsertion(); | 457 ClearInsertion(); |
554 OnTapEvent(); | 458 OnTapEvent(); |
555 ChangeInsertion(start_rect, visible); | 459 ChangeInsertion(start_rect, visible); |
556 EXPECT_THAT(GetAndResetEvents(), | 460 EXPECT_THAT(GetAndResetEvents(), |
557 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 461 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
558 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
559 | 462 |
560 // No tap should be signalled if the touch sequence is cancelled. | 463 // No tap should be signalled if the touch sequence is cancelled. |
561 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 464 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
562 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 465 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
563 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 466 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
564 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 467 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 468 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
566 INSERTION_HANDLE_DRAG_STOPPED)); | 469 INSERTION_HANDLE_DRAG_STOPPED)); |
567 } | 470 } |
568 | 471 |
569 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 472 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
570 base::TimeTicks event_time = base::TimeTicks::Now(); | 473 base::TimeTicks event_time = base::TimeTicks::Now(); |
571 OnTapEvent(); | 474 OnTapEvent(); |
572 controller().OnSelectionEditable(true); | |
573 SetDraggingEnabled(true); | 475 SetDraggingEnabled(true); |
574 | 476 |
575 gfx::RectF anchor_rect(10, 0, 0, 10); | 477 gfx::RectF anchor_rect(10, 0, 0, 10); |
576 bool visible = true; | 478 bool visible = true; |
577 ChangeInsertion(anchor_rect, visible); | 479 ChangeInsertion(anchor_rect, visible); |
578 EXPECT_THAT(GetAndResetEvents(), | 480 EXPECT_THAT(GetAndResetEvents(), |
579 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 481 ElementsAre(INSERTION_HANDLE_SHOWN)); |
580 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 482 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
581 | 483 |
582 // Tapping again shouldn't reset the active insertion point. | 484 // Tapping again shouldn't reset the active insertion point. |
583 OnTapEvent(); | 485 OnTapEvent(); |
584 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 486 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
585 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
586 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 488 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
587 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 489 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
588 | 490 |
589 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 491 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
590 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 492 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
591 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 493 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
592 INSERTION_HANDLE_DRAG_STOPPED)); | 494 INSERTION_HANDLE_DRAG_STOPPED)); |
593 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 495 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
594 | 496 |
595 anchor_rect.Offset(5, 15); | 497 anchor_rect.Offset(5, 15); |
596 ChangeInsertion(anchor_rect, visible); | 498 ChangeInsertion(anchor_rect, visible); |
597 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 499 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
598 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 500 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
599 | 501 |
600 // Pressing shouldn't reset the active insertion point. | 502 // Pressing shouldn't reset the active insertion point. |
601 OnLongPressEvent(); | 503 OnLongPressEvent(); |
602 controller().OnSelectionEmpty(true); | |
603 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 504 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
604 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 505 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
605 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 506 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
606 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 507 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
607 | 508 |
608 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 509 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
609 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
610 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 511 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
611 INSERTION_HANDLE_DRAG_STOPPED)); | 512 INSERTION_HANDLE_DRAG_STOPPED)); |
612 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 513 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
613 } | 514 } |
614 | 515 |
615 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 516 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
616 gfx::RectF start_rect(5, 5, 0, 10); | 517 gfx::RectF start_rect(5, 5, 0, 10); |
617 gfx::RectF end_rect(50, 5, 0, 10); | 518 gfx::RectF end_rect(50, 5, 0, 10); |
618 bool visible = true; | 519 bool visible = true; |
619 | 520 |
620 // Selection events are ignored until automatic showing is enabled. | |
621 ChangeSelection(start_rect, visible, end_rect, visible); | |
622 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
623 | |
624 OnLongPressEvent(); | 521 OnLongPressEvent(); |
625 ChangeSelection(start_rect, visible, end_rect, visible); | 522 ChangeSelection(start_rect, visible, end_rect, visible); |
626 EXPECT_THAT(GetAndResetEvents(), | 523 EXPECT_THAT(GetAndResetEvents(), |
627 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 524 ElementsAre(SELECTION_HANDLES_SHOWN)); |
628 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 525 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
629 | 526 |
630 start_rect.Offset(1, 0); | 527 start_rect.Offset(1, 0); |
631 ChangeSelection(start_rect, visible, end_rect, visible); | 528 ChangeSelection(start_rect, visible, end_rect, visible); |
632 // Selection movement does not currently trigger a separate event. | 529 // Selection movement does not currently trigger a separate event. |
633 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
634 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 531 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
635 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 532 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
636 | 533 |
637 ClearSelection(); | 534 ClearSelection(); |
638 EXPECT_THAT(GetAndResetEvents(), | 535 EXPECT_THAT(GetAndResetEvents(), |
639 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 536 ElementsAre(SELECTION_HANDLES_CLEARED)); |
640 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
641 } | 537 } |
642 | 538 |
643 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { | 539 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { |
644 gfx::RectF start_rect(5, 5, 0, 10); | 540 gfx::RectF start_rect(5, 5, 0, 10); |
645 gfx::RectF end_rect(50, 5, 0, 10); | 541 gfx::RectF end_rect(50, 5, 0, 10); |
646 bool visible = true; | 542 bool visible = true; |
647 | 543 |
648 OnDoubleTapEvent(); | 544 OnDoubleTapEvent(); |
649 ChangeSelection(start_rect, visible, end_rect, visible); | 545 ChangeSelection(start_rect, visible, end_rect, visible); |
650 EXPECT_THAT(GetAndResetEvents(), | 546 EXPECT_THAT(GetAndResetEvents(), |
651 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 547 ElementsAre(SELECTION_HANDLES_SHOWN)); |
652 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 548 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
653 } | 549 } |
654 | 550 |
655 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { | 551 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { |
656 gfx::RectF start_rect(5, 5, 0, 10); | 552 gfx::RectF start_rect(5, 5, 0, 10); |
657 gfx::RectF end_rect(50, 5, 0, 10); | 553 gfx::RectF end_rect(50, 5, 0, 10); |
658 bool visible = true; | 554 bool visible = true; |
659 | 555 |
660 controller().OnSelectionEditable(true); | |
661 | |
662 // If the user double tap selects text in an editable region, the first tap | 556 // If the user double tap selects text in an editable region, the first tap |
663 // will register insertion and the second tap selection. | 557 // will register insertion and the second tap selection. |
664 OnTapEvent(); | 558 OnTapEvent(); |
665 ChangeInsertion(start_rect, visible); | 559 ChangeInsertion(start_rect, visible); |
666 EXPECT_THAT(GetAndResetEvents(), | 560 EXPECT_THAT(GetAndResetEvents(), |
667 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 561 ElementsAre(INSERTION_HANDLE_SHOWN)); |
668 | 562 |
669 OnDoubleTapEvent(); | 563 OnDoubleTapEvent(); |
670 ChangeSelection(start_rect, visible, end_rect, visible); | 564 ChangeSelection(start_rect, visible, end_rect, visible); |
671 EXPECT_THAT(GetAndResetEvents(), | 565 EXPECT_THAT(GetAndResetEvents(), |
672 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 566 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
673 } | 567 } |
674 | 568 |
675 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { | 569 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { |
676 gfx::RectF start_rect(5, 5, 0, 10); | 570 gfx::RectF start_rect(5, 5, 0, 10); |
677 gfx::RectF end_rect(50, 5, 0, 10); | 571 gfx::RectF end_rect(50, 5, 0, 10); |
678 bool visible = true; | 572 bool visible = true; |
679 | 573 |
680 OnLongPressEvent(); | 574 OnLongPressEvent(); |
681 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 575 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
682 | 576 |
683 // There may be several empty updates after a longpress due to the | 577 // There may be several empty updates after a longpress due to the |
684 // asynchronous response. These empty updates should not prevent the selection | 578 // asynchronous response. These empty updates should not prevent the selection |
685 // handles from (eventually) activating. | 579 // handles from (eventually) activating. |
686 ClearSelection(); | 580 ClearSelection(); |
687 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 581 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
688 | 582 |
689 ClearSelection(); | 583 ClearSelection(); |
690 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 584 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
691 | 585 |
692 ChangeSelection(start_rect, visible, end_rect, visible); | 586 ChangeSelection(start_rect, visible, end_rect, visible); |
693 EXPECT_THAT(GetAndResetEvents(), | 587 EXPECT_THAT(GetAndResetEvents(), |
694 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 588 ElementsAre(SELECTION_HANDLES_SHOWN)); |
695 } | 589 } |
696 | 590 |
697 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 591 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
698 gfx::RectF start_rect(5, 5, 0, 10); | 592 gfx::RectF start_rect(5, 5, 0, 10); |
699 gfx::RectF end_rect(50, 5, 0, 10); | 593 gfx::RectF end_rect(50, 5, 0, 10); |
700 bool visible = true; | 594 bool visible = true; |
701 | 595 |
702 OnLongPressEvent(); | 596 OnLongPressEvent(); |
703 ChangeSelection(start_rect, visible, end_rect, visible); | 597 ChangeSelection(start_rect, visible, end_rect, visible); |
704 EXPECT_THAT(GetAndResetEvents(), | 598 EXPECT_THAT(GetAndResetEvents(), |
705 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 599 ElementsAre(SELECTION_HANDLES_SHOWN)); |
706 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 600 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
707 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 601 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
708 | 602 |
709 // A long press triggering a new selection should re-send the | 603 // A long press triggering a new selection should re-send the |
710 // SELECTION_HANDLES_SHOWN | 604 // SELECTION_HANDLES_SHOWN |
711 // event notification. | 605 // event notification. |
712 start_rect.Offset(10, 10); | 606 start_rect.Offset(10, 10); |
713 OnLongPressEvent(); | 607 OnLongPressEvent(); |
714 ChangeSelection(start_rect, visible, end_rect, visible); | 608 ChangeSelection(start_rect, visible, end_rect, visible); |
715 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | 609 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); |
716 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 610 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
717 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 611 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
718 } | 612 } |
719 | 613 |
720 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 614 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
721 base::TimeTicks event_time = base::TimeTicks::Now(); | 615 base::TimeTicks event_time = base::TimeTicks::Now(); |
722 OnLongPressEvent(); | 616 OnLongPressEvent(); |
723 | 617 |
724 // The touch sequence should not be handled if selection is not active. | 618 // The touch sequence should not be handled if selection is not active. |
725 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 619 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
726 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 620 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
727 | 621 |
728 float line_height = 10.f; | 622 float line_height = 10.f; |
729 gfx::RectF start_rect(0, 0, 0, line_height); | 623 gfx::RectF start_rect(0, 0, 0, line_height); |
730 gfx::RectF end_rect(50, 0, 0, line_height); | 624 gfx::RectF end_rect(50, 0, 0, line_height); |
731 bool visible = true; | 625 bool visible = true; |
732 ChangeSelection(start_rect, visible, end_rect, visible); | 626 ChangeSelection(start_rect, visible, end_rect, visible); |
733 EXPECT_THAT(GetAndResetEvents(), | 627 EXPECT_THAT(GetAndResetEvents(), |
734 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 628 ElementsAre(SELECTION_HANDLES_SHOWN)); |
735 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 629 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
736 | 630 |
737 // The touch sequence should be handled only if the drawable reports a hit. | 631 // The touch sequence should be handled only if the drawable reports a hit. |
738 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 632 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
739 SetDraggingEnabled(true); | 633 SetDraggingEnabled(true); |
740 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 634 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
741 EXPECT_FALSE(GetAndResetSelectionMoved()); | 635 EXPECT_FALSE(GetAndResetSelectionMoved()); |
742 | 636 |
743 // The SelectBetweenCoordinates() result should reflect the movement. Note | 637 // The SelectBetweenCoordinates() result should reflect the movement. Note |
744 // that the start coordinate will always reflect the "fixed" handle's | 638 // that the start coordinate will always reflect the "fixed" handle's |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 675 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
782 base::TimeTicks event_time = base::TimeTicks::Now(); | 676 base::TimeTicks event_time = base::TimeTicks::Now(); |
783 OnLongPressEvent(); | 677 OnLongPressEvent(); |
784 | 678 |
785 float line_height = 10.f; | 679 float line_height = 10.f; |
786 gfx::RectF start_rect(0, 0, 0, line_height); | 680 gfx::RectF start_rect(0, 0, 0, line_height); |
787 gfx::RectF end_rect(50, 0, 0, line_height); | 681 gfx::RectF end_rect(50, 0, 0, line_height); |
788 bool visible = true; | 682 bool visible = true; |
789 ChangeSelection(start_rect, visible, end_rect, visible); | 683 ChangeSelection(start_rect, visible, end_rect, visible); |
790 EXPECT_THAT(GetAndResetEvents(), | 684 EXPECT_THAT(GetAndResetEvents(), |
791 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 685 ElementsAre(SELECTION_HANDLES_SHOWN)); |
792 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 686 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
793 | 687 |
794 // The ACTION_DOWN should lock to the closest handle. | 688 // The ACTION_DOWN should lock to the closest handle. |
795 gfx::PointF end_offset = end_rect.CenterPoint(); | 689 gfx::PointF end_offset = end_rect.CenterPoint(); |
796 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 690 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
797 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 691 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
798 MockMotionEvent event( | 692 MockMotionEvent event( |
799 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 693 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); |
800 SetDraggingEnabled(true); | 694 SetDraggingEnabled(true); |
801 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 695 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
(...skipping 18 matching lines...) Expand all Loading... |
820 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 714 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
821 base::TimeTicks event_time = base::TimeTicks::Now(); | 715 base::TimeTicks event_time = base::TimeTicks::Now(); |
822 OnLongPressEvent(); | 716 OnLongPressEvent(); |
823 | 717 |
824 float line_height = 10.f; | 718 float line_height = 10.f; |
825 gfx::RectF start_rect(50, line_height, 0, line_height); | 719 gfx::RectF start_rect(50, line_height, 0, line_height); |
826 gfx::RectF end_rect(100, line_height, 0, line_height); | 720 gfx::RectF end_rect(100, line_height, 0, line_height); |
827 bool visible = true; | 721 bool visible = true; |
828 ChangeSelection(start_rect, visible, end_rect, visible); | 722 ChangeSelection(start_rect, visible, end_rect, visible); |
829 EXPECT_THAT(GetAndResetEvents(), | 723 EXPECT_THAT(GetAndResetEvents(), |
830 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 724 ElementsAre(SELECTION_HANDLES_SHOWN)); |
831 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 725 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
832 | 726 |
833 SetDraggingEnabled(true); | 727 SetDraggingEnabled(true); |
834 | 728 |
835 // Move the extent, not triggering a swap of points. | 729 // Move the extent, not triggering a swap of points. |
836 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 730 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
837 end_rect.x(), end_rect.bottom()); | 731 end_rect.x(), end_rect.bottom()); |
838 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 732 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
839 EXPECT_FALSE(GetAndResetSelectionMoved()); | 733 EXPECT_FALSE(GetAndResetSelectionMoved()); |
840 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 734 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 base::TimeTicks event_time = base::TimeTicks::Now(); | 835 base::TimeTicks event_time = base::TimeTicks::Now(); |
942 OnLongPressEvent(); | 836 OnLongPressEvent(); |
943 | 837 |
944 float small_line_height = 1.f; | 838 float small_line_height = 1.f; |
945 float large_line_height = 50.f; | 839 float large_line_height = 50.f; |
946 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 840 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
947 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 841 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
948 bool visible = true; | 842 bool visible = true; |
949 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 843 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
950 EXPECT_THAT(GetAndResetEvents(), | 844 EXPECT_THAT(GetAndResetEvents(), |
951 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 845 ElementsAre(SELECTION_HANDLES_SHOWN)); |
952 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 846 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
953 | 847 |
954 // Start dragging the handle on the small line. | 848 // Start dragging the handle on the small line. |
955 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 849 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
956 small_line_rect.x(), small_line_rect.y()); | 850 small_line_rect.x(), small_line_rect.y()); |
957 SetDraggingEnabled(true); | 851 SetDraggingEnabled(true); |
958 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 852 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
959 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); | 853 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
960 // The drag coordinate for large lines should be capped to a reasonable | 854 // The drag coordinate for large lines should be capped to a reasonable |
961 // offset, allowing seamless transition to neighboring lines with different | 855 // offset, allowing seamless transition to neighboring lines with different |
962 // sizes. The drag coordinate for small lines should have an offset | 856 // sizes. The drag coordinate for small lines should have an offset |
963 // commensurate with the small line size. | 857 // commensurate with the small line size. |
964 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), | 858 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), |
965 GetLastSelectionStart()); | 859 GetLastSelectionStart()); |
966 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 860 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
967 | 861 |
968 small_line_rect += gfx::Vector2dF(25.f, 0); | 862 small_line_rect += gfx::Vector2dF(25.f, 0); |
969 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 863 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
970 small_line_rect.x(), small_line_rect.y()); | 864 small_line_rect.x(), small_line_rect.y()); |
971 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 865 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
972 EXPECT_TRUE(GetAndResetSelectionMoved()); | 866 EXPECT_TRUE(GetAndResetSelectionMoved()); |
973 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 867 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
974 } | 868 } |
975 | 869 |
976 TEST_F(TouchSelectionControllerTest, Animation) { | 870 TEST_F(TouchSelectionControllerTest, Animation) { |
977 OnTapEvent(); | 871 OnTapEvent(); |
978 controller().OnSelectionEditable(true); | |
979 | 872 |
980 gfx::RectF insertion_rect(5, 5, 0, 10); | 873 gfx::RectF insertion_rect(5, 5, 0, 10); |
981 | 874 |
982 bool visible = true; | 875 bool visible = true; |
983 ChangeInsertion(insertion_rect, visible); | 876 ChangeInsertion(insertion_rect, visible); |
984 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 877 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
985 | 878 |
986 visible = false; | 879 visible = false; |
987 ChangeInsertion(insertion_rect, visible); | 880 ChangeInsertion(insertion_rect, visible); |
988 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 881 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
(...skipping 11 matching lines...) Expand all Loading... |
1000 OnTapEvent(); | 893 OnTapEvent(); |
1001 visible = true; | 894 visible = true; |
1002 ChangeInsertion(insertion_rect, visible); | 895 ChangeInsertion(insertion_rect, visible); |
1003 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 896 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
1004 } | 897 } |
1005 | 898 |
1006 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 899 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
1007 TouchSelectionControllerTestApi test_controller(&controller()); | 900 TouchSelectionControllerTestApi test_controller(&controller()); |
1008 | 901 |
1009 OnTapEvent(); | 902 OnTapEvent(); |
1010 controller().OnSelectionEditable(true); | |
1011 | 903 |
1012 gfx::RectF insertion_rect(5, 5, 0, 10); | 904 gfx::RectF insertion_rect(5, 5, 0, 10); |
1013 | 905 |
1014 bool visible = true; | 906 bool visible = true; |
1015 ChangeInsertion(insertion_rect, visible); | 907 ChangeInsertion(insertion_rect, visible); |
1016 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 908 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
1017 EXPECT_TRUE(test_controller.GetStartVisible()); | 909 EXPECT_TRUE(test_controller.GetStartVisible()); |
1018 EXPECT_TRUE(test_controller.GetEndVisible()); | 910 EXPECT_TRUE(test_controller.GetEndVisible()); |
1019 | 911 |
1020 controller().SetTemporarilyHidden(true); | 912 controller().SetTemporarilyHidden(true); |
(...skipping 17 matching lines...) Expand all Loading... |
1038 } | 930 } |
1039 | 931 |
1040 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 932 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
1041 gfx::RectF start_rect(5, 5, 0, 10); | 933 gfx::RectF start_rect(5, 5, 0, 10); |
1042 gfx::RectF end_rect(50, 5, 0, 10); | 934 gfx::RectF end_rect(50, 5, 0, 10); |
1043 bool visible = true; | 935 bool visible = true; |
1044 | 936 |
1045 OnLongPressEvent(); | 937 OnLongPressEvent(); |
1046 ChangeSelection(start_rect, visible, end_rect, visible); | 938 ChangeSelection(start_rect, visible, end_rect, visible); |
1047 EXPECT_THAT(GetAndResetEvents(), | 939 EXPECT_THAT(GetAndResetEvents(), |
1048 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 940 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1049 | 941 |
1050 // Selection should not be cleared if the selection bounds have not changed. | 942 // Selection should not be cleared if the selection bounds have not changed. |
1051 OnTapEvent(); | 943 OnTapEvent(); |
1052 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 944 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1053 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 945 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1054 | 946 |
1055 OnTapEvent(); | 947 OnTapEvent(); |
1056 ClearSelection(); | 948 ClearSelection(); |
1057 EXPECT_THAT(GetAndResetEvents(), | 949 EXPECT_THAT(GetAndResetEvents(), |
1058 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 950 ElementsAre(SELECTION_HANDLES_CLEARED)); |
1059 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
1060 } | |
1061 | |
1062 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | |
1063 gfx::RectF start_rect(5, 5, 0, 10); | |
1064 gfx::RectF end_rect(50, 5, 0, 10); | |
1065 bool visible = true; | |
1066 | |
1067 // Tap-triggered selections should not be allowed. | |
1068 OnLongPressEvent(); | |
1069 OnTapEvent(); | |
1070 ChangeSelection(start_rect, visible, end_rect, visible); | |
1071 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1072 | |
1073 // Subsequent longpress selections will be allowed. | |
1074 OnLongPressEvent(); | |
1075 ChangeSelection(start_rect, visible, end_rect, visible); | |
1076 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
1077 | |
1078 // Tapping again shouldn't have any effect on subsequent selection events. | |
1079 OnTapEvent(); | |
1080 end_rect.Offset(10, 10); | |
1081 ChangeSelection(start_rect, visible, end_rect, visible); | |
1082 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | |
1083 ClearSelection(); | |
1084 EXPECT_THAT(GetAndResetEvents(), | |
1085 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
1086 } | |
1087 | |
1088 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | |
1089 gfx::RectF start_rect(5, 5, 0, 10); | |
1090 gfx::RectF end_rect(50, 5, 0, 10); | |
1091 bool visible = true; | |
1092 | |
1093 // The selection should not be activated, as it wasn't yet allowed. | |
1094 ChangeSelection(start_rect, visible, end_rect, visible); | |
1095 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
1096 | |
1097 // A longpress should have no immediate effect. | |
1098 OnLongPressEvent(); | |
1099 | |
1100 // Now explicitly allow showing from the previously supplied bounds. | |
1101 controller().AllowShowingFromCurrentSelection(); | |
1102 EXPECT_THAT(GetAndResetEvents(), | |
1103 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | |
1104 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
1105 | |
1106 // Repeated calls to show from the current selection should be ignored. | |
1107 controller().AllowShowingFromCurrentSelection(); | |
1108 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1109 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
1110 | |
1111 // Trying to show from an empty selection will have no result. | |
1112 ClearSelection(); | |
1113 EXPECT_THAT(GetAndResetEvents(), | |
1114 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
1115 controller().AllowShowingFromCurrentSelection(); | |
1116 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1117 | |
1118 // Showing the insertion handle should also be supported. | |
1119 controller().OnSelectionEditable(true); | |
1120 controller().OnSelectionEmpty(false); | |
1121 controller().HideAndDisallowShowingAutomatically(); | |
1122 gfx::RectF insertion_rect(5, 5, 0, 10); | |
1123 ChangeInsertion(insertion_rect, visible); | |
1124 controller().AllowShowingFromCurrentSelection(); | |
1125 EXPECT_THAT(GetAndResetEvents(), | |
1126 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
1127 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
1128 } | |
1129 | |
1130 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { | |
1131 bool visible = false; | |
1132 gfx::RectF start_rect(5, 5, 0, 10); | |
1133 gfx::RectF end_rect(50, 5, 0, 10); | |
1134 gfx::PointF inner_point(25, 10); | |
1135 gfx::PointF outer_point(100, 100); | |
1136 | |
1137 // Establish a selection without handles from 5 to 50 with height 10. | |
1138 ChangeSelection(start_rect, visible, end_rect, visible); | |
1139 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1140 | |
1141 // A point outside the rect should not be handled. | |
1142 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point, 1)); | |
1143 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1144 | |
1145 // A point inside the rect should be handled. | |
1146 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point, 1)); | |
1147 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
1148 } | |
1149 | |
1150 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { | |
1151 bool visible = false; | |
1152 gfx::RectF start_rect(5, 5, 0, 10); | |
1153 gfx::RectF end_rect(50, 5, 0, 10); | |
1154 gfx::PointF inner_point(25, 10); | |
1155 gfx::PointF outer_point(100, 100); | |
1156 | |
1157 // Establish a selection without handles from 5 to 50 with height 10. | |
1158 ChangeSelection(start_rect, visible, end_rect, visible); | |
1159 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1160 | |
1161 // A point outside the rect should not be handled. | |
1162 EXPECT_FALSE( | |
1163 controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point)); | |
1164 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1165 | |
1166 // A point inside the rect should be handled. | |
1167 EXPECT_TRUE( | |
1168 controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point)); | |
1169 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
1170 } | 951 } |
1171 | 952 |
1172 TEST_F(TouchSelectionControllerTest, LongPressDrag) { | 953 TEST_F(TouchSelectionControllerTest, LongPressDrag) { |
1173 EnableLongPressDragSelection(); | 954 EnableLongPressDragSelection(); |
1174 TouchSelectionControllerTestApi test_controller(&controller()); | 955 TouchSelectionControllerTestApi test_controller(&controller()); |
1175 | 956 |
1176 gfx::RectF start_rect(-50, 0, 0, 10); | 957 gfx::RectF start_rect(-50, 0, 0, 10); |
1177 gfx::RectF end_rect(50, 0, 0, 10); | 958 gfx::RectF end_rect(50, 0, 0, 10); |
1178 bool visible = true; | 959 bool visible = true; |
1179 | 960 |
1180 // Start a touch sequence. | 961 // Start a touch sequence. |
1181 MockMotionEvent event; | 962 MockMotionEvent event; |
1182 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 963 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
1183 | 964 |
1184 // Activate a longpress-triggered selection. | 965 // Activate a longpress-triggered selection. |
1185 OnLongPressEvent(); | 966 OnLongPressEvent(); |
1186 ChangeSelection(start_rect, visible, end_rect, visible); | 967 ChangeSelection(start_rect, visible, end_rect, visible); |
1187 EXPECT_THAT(GetAndResetEvents(), | 968 EXPECT_THAT(GetAndResetEvents(), |
1188 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 969 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1189 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 970 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1190 | 971 |
1191 // The handles should remain invisible while the touch release and longpress | 972 // The handles should remain invisible while the touch release and longpress |
1192 // drag gesture are pending. | 973 // drag gesture are pending. |
1193 EXPECT_FALSE(test_controller.GetStartVisible()); | 974 EXPECT_FALSE(test_controller.GetStartVisible()); |
1194 EXPECT_FALSE(test_controller.GetEndVisible()); | 975 EXPECT_FALSE(test_controller.GetEndVisible()); |
1195 | 976 |
1196 // The selection coordinates should reflect the drag movement. | 977 // The selection coordinates should reflect the drag movement. |
1197 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 978 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
1198 gfx::PointF end_offset = end_rect.CenterPoint(); | 979 gfx::PointF end_offset = end_rect.CenterPoint(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 bool visible = true; | 1025 bool visible = true; |
1245 | 1026 |
1246 // Start a touch sequence. | 1027 // Start a touch sequence. |
1247 MockMotionEvent event; | 1028 MockMotionEvent event; |
1248 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 1029 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
1249 | 1030 |
1250 // Activate a longpress-triggered selection. | 1031 // Activate a longpress-triggered selection. |
1251 OnLongPressEvent(); | 1032 OnLongPressEvent(); |
1252 ChangeSelection(start_rect, visible, end_rect, visible); | 1033 ChangeSelection(start_rect, visible, end_rect, visible); |
1253 EXPECT_THAT(GetAndResetEvents(), | 1034 EXPECT_THAT(GetAndResetEvents(), |
1254 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1035 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1255 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1036 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1256 | 1037 |
1257 // The handles should remain invisible while the touch release and longpress | 1038 // The handles should remain invisible while the touch release and longpress |
1258 // drag gesture are pending. | 1039 // drag gesture are pending. |
1259 EXPECT_FALSE(test_controller.GetStartVisible()); | 1040 EXPECT_FALSE(test_controller.GetStartVisible()); |
1260 EXPECT_FALSE(test_controller.GetEndVisible()); | 1041 EXPECT_FALSE(test_controller.GetEndVisible()); |
1261 | 1042 |
1262 // If no drag movement occurs, the handles should reappear after the touch | 1043 // If no drag movement occurs, the handles should reappear after the touch |
1263 // is released. | 1044 // is released. |
1264 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 1045 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
(...skipping 11 matching lines...) Expand all Loading... |
1276 bool visible = true; | 1057 bool visible = true; |
1277 | 1058 |
1278 // Start a touch sequence. | 1059 // Start a touch sequence. |
1279 MockMotionEvent event; | 1060 MockMotionEvent event; |
1280 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 1061 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
1281 | 1062 |
1282 // Activate a longpress-triggered selection. | 1063 // Activate a longpress-triggered selection. |
1283 OnLongPressEvent(); | 1064 OnLongPressEvent(); |
1284 ChangeSelection(start_rect, visible, end_rect, visible); | 1065 ChangeSelection(start_rect, visible, end_rect, visible); |
1285 EXPECT_THAT(GetAndResetEvents(), | 1066 EXPECT_THAT(GetAndResetEvents(), |
1286 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1067 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1287 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1068 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1288 EXPECT_TRUE(test_controller.GetStartVisible()); | 1069 EXPECT_TRUE(test_controller.GetStartVisible()); |
1289 EXPECT_TRUE(test_controller.GetEndVisible()); | 1070 EXPECT_TRUE(test_controller.GetEndVisible()); |
1290 | 1071 |
1291 // Subsequent motion of the same touch sequence after longpress shouldn't | 1072 // Subsequent motion of the same touch sequence after longpress shouldn't |
1292 // trigger drag selection. | 1073 // trigger drag selection. |
1293 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 1074 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
1294 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1075 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1295 | 1076 |
1296 EXPECT_FALSE(controller().WillHandleTouchEvent( | 1077 EXPECT_FALSE(controller().WillHandleTouchEvent( |
1297 event.MovePoint(0, 0, kDefaulTapSlop * 10))); | 1078 event.MovePoint(0, 0, kDefaulTapSlop * 10))); |
1298 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1079 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1299 | 1080 |
1300 // Releasing the touch sequence should have no effect. | 1081 // Releasing the touch sequence should have no effect. |
1301 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 1082 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
1302 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1083 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1303 EXPECT_TRUE(test_controller.GetStartVisible()); | 1084 EXPECT_TRUE(test_controller.GetStartVisible()); |
1304 EXPECT_TRUE(test_controller.GetEndVisible()); | 1085 EXPECT_TRUE(test_controller.GetEndVisible()); |
1305 } | 1086 } |
1306 | 1087 |
1307 // When there is a selection on the page and long-press drag is performed | |
1308 // somewhere that has nothing to select, long-press drag selector should not get | |
1309 // activated so the page can scroll. | |
1310 TEST_F(TouchSelectionControllerTest, LongPressDragScroll) { | |
1311 EnableLongPressDragSelection(); | |
1312 TouchSelectionControllerTestApi test_controller(&controller()); | |
1313 | |
1314 gfx::RectF start_rect(10, 0, 0, 10); | |
1315 gfx::RectF end_rect(20, 0, 0, 10); | |
1316 gfx::PointF touch_point(0, 0); | |
1317 bool visible = true; | |
1318 MockMotionEvent event; | |
1319 | |
1320 // Pre-select something. | |
1321 ChangeSelection(start_rect, visible, end_rect, visible); | |
1322 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
1323 | |
1324 // Start the touch sequence and perform the long-press out of the existing | |
1325 // selection. | |
1326 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
1327 event.PressPoint(touch_point.x(), touch_point.y()))); | |
1328 OnLongPressEvent(); | |
1329 | |
1330 // Drag down. Selection controller should not consume the touch-move event. | |
1331 touch_point.Offset(0, 2 * kDefaulTapSlop); | |
1332 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
1333 event.MovePoint(0, touch_point.x(), touch_point.y()))); | |
1334 | |
1335 // Begin page scroll and update the selection. Selection handles should not be | |
1336 // shown which means long-press drag selector is not activated. | |
1337 controller().OnScrollBeginEvent(); | |
1338 start_rect.Offset(0, 2 * kDefaulTapSlop); | |
1339 end_rect.Offset(0, 2 * kDefaulTapSlop); | |
1340 ChangeSelection(start_rect, visible, end_rect, visible); | |
1341 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1342 | |
1343 // Release the touch sequence. | |
1344 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | |
1345 } | |
1346 | |
1347 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { | 1088 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { |
1348 gfx::RectF start_rect(5, 5, 0, 10); | 1089 gfx::RectF start_rect(5, 5, 0, 10); |
1349 gfx::RectF end_rect(50, 5, 0, 10); | 1090 gfx::RectF end_rect(50, 5, 0, 10); |
1350 bool visible = true; | 1091 bool visible = true; |
1351 | 1092 |
1352 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1093 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
1353 | 1094 |
1354 OnLongPressEvent(); | 1095 OnLongPressEvent(); |
1355 ChangeSelection(start_rect, visible, end_rect, visible); | 1096 ChangeSelection(start_rect, visible, end_rect, visible); |
1356 ASSERT_THAT(GetAndResetEvents(), | 1097 ASSERT_THAT(GetAndResetEvents(), |
1357 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1098 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1358 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); | 1099 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); |
1359 | 1100 |
1360 // The result of |GetRectBetweenBounds| should be available within the | 1101 // The result of |GetRectBetweenBounds| should be available within the |
1361 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. | 1102 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. |
1362 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1103 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
1363 | 1104 |
1364 start_rect.Offset(1, 0); | 1105 start_rect.Offset(1, 0); |
1365 ChangeSelection(start_rect, visible, end_rect, visible); | 1106 ChangeSelection(start_rect, visible, end_rect, visible); |
1366 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1107 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
1367 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1108 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
(...skipping 12 matching lines...) Expand all Loading... |
1380 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1121 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
1381 | 1122 |
1382 // If both bounds are visible, the full bounding rect should be returned. | 1123 // If both bounds are visible, the full bounding rect should be returned. |
1383 ChangeSelection(start_rect, false, end_rect, false); | 1124 ChangeSelection(start_rect, false, end_rect, false); |
1384 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1125 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
1385 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1126 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
1386 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1127 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
1387 | 1128 |
1388 ClearSelection(); | 1129 ClearSelection(); |
1389 ASSERT_THAT(GetAndResetEvents(), | 1130 ASSERT_THAT(GetAndResetEvents(), |
1390 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 1131 ElementsAre(SELECTION_HANDLES_CLEARED)); |
1391 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1132 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
1392 } | 1133 } |
1393 | 1134 |
1394 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { | 1135 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { |
1395 TouchSelectionControllerTestApi test_controller(&controller()); | 1136 TouchSelectionControllerTestApi test_controller(&controller()); |
1396 base::TimeTicks event_time = base::TimeTicks::Now(); | 1137 base::TimeTicks event_time = base::TimeTicks::Now(); |
1397 OnLongPressEvent(); | 1138 OnLongPressEvent(); |
1398 | 1139 |
1399 float line_height = 10.f; | 1140 float line_height = 10.f; |
1400 gfx::RectF start_rect(50, line_height, 0, line_height); | 1141 gfx::RectF start_rect(50, line_height, 0, line_height); |
1401 gfx::RectF end_rect(100, line_height, 0, line_height); | 1142 gfx::RectF end_rect(100, line_height, 0, line_height); |
1402 bool visible = true; | 1143 bool visible = true; |
1403 ChangeSelection(start_rect, visible, end_rect, visible); | 1144 ChangeSelection(start_rect, visible, end_rect, visible); |
1404 EXPECT_THAT(GetAndResetEvents(), | 1145 EXPECT_THAT(GetAndResetEvents(), |
1405 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1146 ElementsAre(SELECTION_HANDLES_SHOWN)); |
1406 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1147 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
1407 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1148 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
1408 TouchHandleOrientation::LEFT); | 1149 TouchHandleOrientation::LEFT); |
1409 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1150 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
1410 TouchHandleOrientation::RIGHT); | 1151 TouchHandleOrientation::RIGHT); |
1411 | 1152 |
1412 SetDraggingEnabled(true); | 1153 SetDraggingEnabled(true); |
1413 | 1154 |
1414 // Simulate moving the base, not triggering a swap of points. | 1155 // Simulate moving the base, not triggering a swap of points. |
1415 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 1156 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 offset_rect.x(), offset_rect.bottom()); | 1244 offset_rect.x(), offset_rect.bottom()); |
1504 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 1245 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
1505 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); | 1246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
1506 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1247 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
1507 TouchHandleOrientation::LEFT); | 1248 TouchHandleOrientation::LEFT); |
1508 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1249 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
1509 TouchHandleOrientation::RIGHT); | 1250 TouchHandleOrientation::RIGHT); |
1510 } | 1251 } |
1511 | 1252 |
1512 } // namespace ui | 1253 } // namespace ui |
OLD | NEW |