Chromium Code Reviews| 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 "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "ui/events/test/motion_event_test_utils.h" | 11 #include "ui/events/test/motion_event_test_utils.h" |
| 12 | 12 |
| 13 using base::TimeTicks; | |
| 13 using testing::ElementsAre; | 14 using testing::ElementsAre; |
| 14 using testing::IsEmpty; | 15 using testing::IsEmpty; |
| 15 using ui::test::MockMotionEvent; | 16 using ui::test::MockMotionEvent; |
| 16 | 17 |
| 17 namespace ui { | 18 namespace ui { |
| 18 namespace { | 19 namespace { |
| 19 | 20 |
| 20 const int kDefaultTapTimeoutMs = 200; | 21 const int kDefaultTapTimeoutMs = 200; |
| 21 const float kDefaulTapSlop = 10.f; | 22 const float kDefaulTapSlop = 10.f; |
| 22 | 23 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 start_bound.set_type(SelectionBound::LEFT); | 142 start_bound.set_type(SelectionBound::LEFT); |
| 142 end_bound.set_type(SelectionBound::RIGHT); | 143 end_bound.set_type(SelectionBound::RIGHT); |
| 143 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 144 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
| 144 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 145 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
| 145 start_bound.set_visible(start_visible); | 146 start_bound.set_visible(start_visible); |
| 146 end_bound.set_visible(end_visible); | 147 end_bound.set_visible(end_visible); |
| 147 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 148 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
| 148 } | 149 } |
| 149 | 150 |
| 150 void Animate() { | 151 void Animate() { |
| 151 base::TimeTicks now = base::TimeTicks::Now(); | 152 TimeTicks now = TimeTicks::Now(); |
| 152 while (needs_animate_) { | 153 while (needs_animate_) { |
| 153 needs_animate_ = controller_->Animate(now); | 154 needs_animate_ = controller_->Animate(now); |
| 154 now += base::TimeDelta::FromMilliseconds(16); | 155 now += base::TimeDelta::FromMilliseconds(16); |
| 155 } | 156 } |
| 156 } | 157 } |
| 157 | 158 |
| 158 bool GetAndResetNeedsAnimate() { | 159 bool GetAndResetNeedsAnimate() { |
| 159 bool needs_animate = needs_animate_; | 160 bool needs_animate = needs_animate_; |
| 160 Animate(); | 161 Animate(); |
| 161 return needs_animate; | 162 return needs_animate; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 ChangeInsertion(insertion_rect, visible); | 279 ChangeInsertion(insertion_rect, visible); |
| 279 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 280 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 280 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 281 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 281 | 282 |
| 282 // Reset the selection. | 283 // Reset the selection. |
| 283 controller().HideAndDisallowShowingAutomatically(); | 284 controller().HideAndDisallowShowingAutomatically(); |
| 284 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 285 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 285 | 286 |
| 286 // Long-pressing should show the handle even if the editable region is empty. | 287 // Long-pressing should show the handle even if the editable region is empty. |
| 287 insertion_rect.Offset(2, -2); | 288 insertion_rect.Offset(2, -2); |
| 288 controller().OnLongPressEvent(); | 289 controller().OnLongPressEvent(TimeTicks::Now(), insertion_rect.bottom_left()); |
| 289 controller().OnSelectionEmpty(true); | 290 controller().OnSelectionEmpty(true); |
| 290 ChangeInsertion(insertion_rect, visible); | 291 ChangeInsertion(insertion_rect, visible); |
| 291 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 292 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 292 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 293 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 293 | 294 |
| 294 // Single Tap on an empty edit field should clear insertion handle. | 295 // Single Tap on an empty edit field should clear insertion handle. |
| 295 controller().OnTapEvent(); | 296 controller().OnTapEvent(); |
| 296 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 297 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 297 } | 298 } |
| 298 | 299 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 | 337 |
| 337 // If the user taps the *same* position as the cursor at the end of the text | 338 // If the user taps the *same* position as the cursor at the end of the text |
| 338 // entry, the handle should appear. | 339 // entry, the handle should appear. |
| 339 controller().OnTapEvent(); | 340 controller().OnTapEvent(); |
| 340 ChangeInsertion(insertion_rect, visible); | 341 ChangeInsertion(insertion_rect, visible); |
| 341 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 342 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 342 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 343 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 343 } | 344 } |
| 344 | 345 |
| 345 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 346 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
| 346 controller().OnLongPressEvent(); | 347 controller().OnLongPressEvent(TimeTicks::Now(), gfx::PointF()); |
| 347 controller().OnSelectionEditable(true); | 348 controller().OnSelectionEditable(true); |
| 348 | 349 |
| 349 gfx::RectF start_rect(5, 5, 0, 10); | 350 gfx::RectF start_rect(5, 5, 0, 10); |
| 350 gfx::RectF end_rect(50, 5, 0, 10); | 351 gfx::RectF end_rect(50, 5, 0, 10); |
| 351 bool visible = true; | 352 bool visible = true; |
| 352 | 353 |
| 353 ChangeInsertion(start_rect, visible); | 354 ChangeInsertion(start_rect, visible); |
| 354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 355 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 355 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 356 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 356 | 357 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 519 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 520 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 520 INSERTION_DRAG_STOPPED)); | 521 INSERTION_DRAG_STOPPED)); |
| 521 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 522 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 522 | 523 |
| 523 anchor_rect.Offset(5, 15); | 524 anchor_rect.Offset(5, 15); |
| 524 ChangeInsertion(anchor_rect, visible); | 525 ChangeInsertion(anchor_rect, visible); |
| 525 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 526 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 526 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 527 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 527 | 528 |
| 528 // Pressing shouldn't reset the active insertion point. | 529 // Pressing shouldn't reset the active insertion point. |
| 529 controller().OnLongPressEvent(); | 530 controller().OnLongPressEvent(TimeTicks::Now(), gfx::PointF()); |
| 530 controller().OnSelectionEmpty(true); | 531 controller().OnSelectionEmpty(true); |
| 531 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 532 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 532 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 533 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 533 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 534 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 534 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 535 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 535 | 536 |
| 536 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 537 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 537 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 538 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 538 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 539 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 539 INSERTION_DRAG_STOPPED)); | 540 INSERTION_DRAG_STOPPED)); |
| 540 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 541 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 541 } | 542 } |
| 542 | 543 |
| 543 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 544 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 544 gfx::RectF start_rect(5, 5, 0, 10); | 545 gfx::RectF start_rect(5, 5, 0, 10); |
| 545 gfx::RectF end_rect(50, 5, 0, 10); | 546 gfx::RectF end_rect(50, 5, 0, 10); |
| 546 bool visible = true; | 547 bool visible = true; |
| 547 | 548 |
| 548 // Selection events are ignored until automatic showing is enabled. | 549 // Selection events are ignored until automatic showing is enabled. |
| 549 ChangeSelection(start_rect, visible, end_rect, visible); | 550 ChangeSelection(start_rect, visible, end_rect, visible); |
| 550 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 551 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 551 | 552 |
| 552 controller().OnLongPressEvent(); | 553 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 553 ChangeSelection(start_rect, visible, end_rect, visible); | 554 ChangeSelection(start_rect, visible, end_rect, visible); |
| 554 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 555 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 555 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 556 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 556 | 557 |
| 557 start_rect.Offset(1, 0); | 558 start_rect.Offset(1, 0); |
| 558 ChangeSelection(start_rect, visible, end_rect, visible); | 559 ChangeSelection(start_rect, visible, end_rect, visible); |
| 559 // Selection movement does not currently trigger a separate event. | 560 // Selection movement does not currently trigger a separate event. |
| 560 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 561 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 561 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 562 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 562 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 563 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 563 | 564 |
| 564 ClearSelection(); | 565 ClearSelection(); |
| 565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 566 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 566 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 567 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 567 } | 568 } |
| 568 | 569 |
| 569 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 570 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 570 gfx::RectF start_rect(5, 5, 0, 10); | 571 gfx::RectF start_rect(5, 5, 0, 10); |
| 571 gfx::RectF end_rect(50, 5, 0, 10); | 572 gfx::RectF end_rect(50, 5, 0, 10); |
| 572 bool visible = true; | 573 bool visible = true; |
| 573 | 574 |
| 574 controller().OnLongPressEvent(); | 575 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 575 ChangeSelection(start_rect, visible, end_rect, visible); | 576 ChangeSelection(start_rect, visible, end_rect, visible); |
| 576 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 577 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 577 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 578 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 578 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 579 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 579 | 580 |
| 580 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 581 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
| 581 // event notification. | 582 // event notification. |
| 582 start_rect.Offset(10, 10); | 583 start_rect.Offset(10, 10); |
| 583 controller().OnLongPressEvent(); | 584 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 584 ChangeSelection(start_rect, visible, end_rect, visible); | 585 ChangeSelection(start_rect, visible, end_rect, visible); |
| 585 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 586 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 586 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 587 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 587 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 588 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 588 } | 589 } |
| 589 | 590 |
| 590 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 591 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 591 base::TimeTicks event_time = base::TimeTicks::Now(); | 592 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 592 controller().OnLongPressEvent(); | 593 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 593 | 594 |
| 594 // The touch sequence should not be handled if selection is not active. | 595 // The touch sequence should not be handled if selection is not active. |
| 595 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 596 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 596 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 597 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 597 | 598 |
| 598 float line_height = 10.f; | 599 float line_height = 10.f; |
| 599 gfx::RectF start_rect(0, 0, 0, line_height); | 600 gfx::RectF start_rect(0, 0, 0, line_height); |
| 600 gfx::RectF end_rect(50, 0, 0, line_height); | 601 gfx::RectF end_rect(50, 0, 0, line_height); |
| 601 bool visible = true; | 602 bool visible = true; |
| 602 ChangeSelection(start_rect, visible, end_rect, visible); | 603 ChangeSelection(start_rect, visible, end_rect, visible); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 640 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 641 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 641 EXPECT_FALSE(GetAndResetSelectionMoved()); | 642 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 642 | 643 |
| 643 // Once the drag is complete, no more touch events should be consumed until | 644 // Once the drag is complete, no more touch events should be consumed until |
| 644 // the next ACTION_DOWN. | 645 // the next ACTION_DOWN. |
| 645 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 646 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 646 } | 647 } |
| 647 | 648 |
| 648 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 649 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 649 base::TimeTicks event_time = base::TimeTicks::Now(); | 650 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 650 controller().OnLongPressEvent(); | 651 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 651 | 652 |
| 652 float line_height = 10.f; | 653 float line_height = 10.f; |
| 653 gfx::RectF start_rect(0, 0, 0, line_height); | 654 gfx::RectF start_rect(0, 0, 0, line_height); |
| 654 gfx::RectF end_rect(50, 0, 0, line_height); | 655 gfx::RectF end_rect(50, 0, 0, line_height); |
| 655 bool visible = true; | 656 bool visible = true; |
| 656 ChangeSelection(start_rect, visible, end_rect, visible); | 657 ChangeSelection(start_rect, visible, end_rect, visible); |
| 657 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 658 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 658 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 659 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 659 | 660 |
| 660 // The ACTION_DOWN should lock to the closest handle. | 661 // The ACTION_DOWN should lock to the closest handle. |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 678 GetLastSelectionEnd()); | 679 GetLastSelectionEnd()); |
| 679 | 680 |
| 680 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 681 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 681 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 682 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 682 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 683 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 683 EXPECT_FALSE(GetAndResetSelectionMoved()); | 684 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 684 } | 685 } |
| 685 | 686 |
| 686 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 687 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 687 base::TimeTicks event_time = base::TimeTicks::Now(); | 688 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 688 controller().OnLongPressEvent(); | 689 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 689 | 690 |
| 690 float line_height = 10.f; | 691 float line_height = 10.f; |
| 691 gfx::RectF start_rect(50, line_height, 0, line_height); | 692 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 692 gfx::RectF end_rect(100, line_height, 0, line_height); | 693 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 693 bool visible = true; | 694 bool visible = true; |
| 694 ChangeSelection(start_rect, visible, end_rect, visible); | 695 ChangeSelection(start_rect, visible, end_rect, visible); |
| 695 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 696 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 696 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 697 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 697 | 698 |
| 698 SetDraggingEnabled(true); | 699 SetDraggingEnabled(true); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 797 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 798 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
| 798 | 799 |
| 799 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 800 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 800 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 801 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 801 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 802 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 802 EXPECT_FALSE(GetAndResetSelectionMoved()); | 803 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 803 } | 804 } |
| 804 | 805 |
| 805 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 806 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
| 806 base::TimeTicks event_time = base::TimeTicks::Now(); | 807 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 807 controller().OnLongPressEvent(); | 808 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 808 | 809 |
| 809 float small_line_height = 1.f; | 810 float small_line_height = 1.f; |
| 810 float large_line_height = 50.f; | 811 float large_line_height = 50.f; |
| 811 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 812 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 812 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 813 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 813 bool visible = true; | 814 bool visible = true; |
| 814 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 815 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
| 815 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 816 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 816 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 817 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
| 817 | 818 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 869 | 870 |
| 870 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 871 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 871 controller().OnTapEvent(); | 872 controller().OnTapEvent(); |
| 872 controller().OnSelectionEditable(true); | 873 controller().OnSelectionEditable(true); |
| 873 | 874 |
| 874 gfx::RectF insertion_rect(5, 5, 0, 10); | 875 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 875 | 876 |
| 876 bool visible = true; | 877 bool visible = true; |
| 877 ChangeInsertion(insertion_rect, visible); | 878 ChangeInsertion(insertion_rect, visible); |
| 878 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 879 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 880 EXPECT_TRUE(controller().GetStartVisibleForTesting()); | |
| 881 EXPECT_TRUE(controller().GetEndVisibleForTesting()); | |
| 879 | 882 |
| 880 controller().SetTemporarilyHidden(true); | 883 controller().SetTemporarilyHidden(true); |
| 881 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 884 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 885 EXPECT_FALSE(controller().GetStartVisibleForTesting()); | |
| 886 EXPECT_FALSE(controller().GetEndVisibleForTesting()); | |
| 882 | 887 |
| 883 visible = false; | 888 visible = false; |
| 884 ChangeInsertion(insertion_rect, visible); | 889 ChangeInsertion(insertion_rect, visible); |
| 885 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 890 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 891 EXPECT_FALSE(controller().GetStartVisibleForTesting()); | |
| 886 | 892 |
| 887 visible = true; | 893 visible = true; |
| 888 ChangeInsertion(insertion_rect, visible); | 894 ChangeInsertion(insertion_rect, visible); |
| 889 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 895 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 896 EXPECT_FALSE(controller().GetStartVisibleForTesting()); | |
| 890 | 897 |
| 891 controller().SetTemporarilyHidden(false); | 898 controller().SetTemporarilyHidden(false); |
| 892 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 899 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 900 EXPECT_TRUE(controller().GetStartVisibleForTesting()); | |
| 893 } | 901 } |
| 894 | 902 |
| 895 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 903 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 896 gfx::RectF start_rect(5, 5, 0, 10); | 904 gfx::RectF start_rect(5, 5, 0, 10); |
| 897 gfx::RectF end_rect(50, 5, 0, 10); | 905 gfx::RectF end_rect(50, 5, 0, 10); |
| 898 bool visible = true; | 906 bool visible = true; |
| 899 | 907 |
| 900 controller().OnLongPressEvent(); | 908 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 901 ChangeSelection(start_rect, visible, end_rect, visible); | 909 ChangeSelection(start_rect, visible, end_rect, visible); |
| 902 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 910 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 903 | 911 |
| 904 // Selection should not be cleared if the selection bounds have not changed. | 912 // Selection should not be cleared if the selection bounds have not changed. |
| 905 controller().OnTapEvent(); | 913 controller().OnTapEvent(); |
| 906 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 914 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 907 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 915 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 908 | 916 |
| 909 controller().OnTapEvent(); | 917 controller().OnTapEvent(); |
| 910 ClearSelection(); | 918 ClearSelection(); |
| 911 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 919 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 912 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 920 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 913 } | 921 } |
| 914 | 922 |
| 915 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | 923 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { |
| 916 gfx::RectF start_rect(5, 5, 0, 10); | 924 gfx::RectF start_rect(5, 5, 0, 10); |
| 917 gfx::RectF end_rect(50, 5, 0, 10); | 925 gfx::RectF end_rect(50, 5, 0, 10); |
| 918 bool visible = true; | 926 bool visible = true; |
| 919 | 927 |
| 920 // Tap-triggered selections should not be allowed. | 928 // Tap-triggered selections should not be allowed. |
| 921 controller().OnLongPressEvent(); | 929 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 922 controller().OnTapEvent(); | 930 controller().OnTapEvent(); |
| 923 ChangeSelection(start_rect, visible, end_rect, visible); | 931 ChangeSelection(start_rect, visible, end_rect, visible); |
| 924 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 932 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 925 | 933 |
| 926 // Subsequent longpress selections will be allowed. | 934 // Subsequent longpress selections will be allowed. |
| 927 controller().OnLongPressEvent(); | 935 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 928 ChangeSelection(start_rect, visible, end_rect, visible); | 936 ChangeSelection(start_rect, visible, end_rect, visible); |
| 929 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 937 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 930 | 938 |
| 931 // Tapping again shouldn't have any effect on subsequent selection events. | 939 // Tapping again shouldn't have any effect on subsequent selection events. |
| 932 controller().OnTapEvent(); | 940 controller().OnTapEvent(); |
| 933 end_rect.Offset(10, 10); | 941 end_rect.Offset(10, 10); |
| 934 ChangeSelection(start_rect, visible, end_rect, visible); | 942 ChangeSelection(start_rect, visible, end_rect, visible); |
| 935 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 943 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 936 ClearSelection(); | 944 ClearSelection(); |
| 937 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 945 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 938 } | 946 } |
| 939 | 947 |
| 940 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 948 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
| 941 gfx::RectF start_rect(5, 5, 0, 10); | 949 gfx::RectF start_rect(5, 5, 0, 10); |
| 942 gfx::RectF end_rect(50, 5, 0, 10); | 950 gfx::RectF end_rect(50, 5, 0, 10); |
| 943 bool visible = true; | 951 bool visible = true; |
| 944 | 952 |
| 945 // The selection should not be activated, as it wasn't yet allowed. | 953 // The selection should not be activated, as it wasn't yet allowed. |
| 946 ChangeSelection(start_rect, visible, end_rect, visible); | 954 ChangeSelection(start_rect, visible, end_rect, visible); |
| 947 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 955 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 948 | 956 |
| 949 // A longpress should have no immediate effect. | 957 // A longpress should have no immediate effect. |
| 950 controller().OnLongPressEvent(); | 958 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 951 | 959 |
| 952 // Now explicitly allow showing from the previously supplied bounds. | 960 // Now explicitly allow showing from the previously supplied bounds. |
| 953 controller().AllowShowingFromCurrentSelection(); | 961 controller().AllowShowingFromCurrentSelection(); |
| 954 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 962 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 955 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 963 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 956 | 964 |
| 957 // Repeated calls to show from the current selection should be ignored. | 965 // Repeated calls to show from the current selection should be ignored. |
| 958 controller().AllowShowingFromCurrentSelection(); | 966 controller().AllowShowingFromCurrentSelection(); |
| 959 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 967 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 960 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 968 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 961 | 969 |
| 962 // Trying to show from an empty selection will have no result. | 970 // Trying to show from an empty selection will have no result. |
| 963 ClearSelection(); | 971 ClearSelection(); |
| 964 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 972 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 965 controller().AllowShowingFromCurrentSelection(); | 973 controller().AllowShowingFromCurrentSelection(); |
| 966 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 974 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 967 | 975 |
| 968 // Showing the insertion handle should also be supported. | 976 // Showing the insertion handle should also be supported. |
| 969 controller().OnSelectionEditable(true); | 977 controller().OnSelectionEditable(true); |
| 970 controller().OnSelectionEmpty(false); | 978 controller().OnSelectionEmpty(false); |
| 971 controller().HideAndDisallowShowingAutomatically(); | 979 controller().HideAndDisallowShowingAutomatically(); |
| 972 gfx::RectF insertion_rect(5, 5, 0, 10); | 980 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 973 ChangeInsertion(insertion_rect, visible); | 981 ChangeInsertion(insertion_rect, visible); |
| 974 controller().AllowShowingFromCurrentSelection(); | 982 controller().AllowShowingFromCurrentSelection(); |
| 975 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 983 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 976 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 984 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 977 } | 985 } |
| 978 | 986 |
| 987 TEST_F(TouchSelectionControllerTest, LongPressDrag) { | |
|
mfomitchev
2015/05/13 20:52:25
Can we also add a test that the handles reappear i
jdduke (slow)
2015/05/14 18:29:27
Done.
| |
| 988 gfx::RectF start_rect(-50, 0, 0, 10); | |
| 989 gfx::RectF end_rect(50, 0, 0, 10); | |
| 990 bool visible = true; | |
| 991 | |
| 992 // Start a touch sequence. | |
| 993 MockMotionEvent event; | |
| 994 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | |
| 995 | |
| 996 // Activate a longpress-triggered selection. | |
| 997 controller().OnLongPressEvent(event.GetEventTime(), gfx::PointF()); | |
| 998 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 999 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | |
| 1000 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
| 1001 | |
| 1002 // The handles should remain invisible while the touch release and longpress | |
| 1003 // drag gesture are pending. | |
| 1004 EXPECT_FALSE(controller().GetStartVisibleForTesting()); | |
| 1005 EXPECT_FALSE(controller().GetEndVisibleForTesting()); | |
| 1006 | |
| 1007 // The selection coordinates should reflect the drag movement. | |
| 1008 gfx::PointF fixed_offset = start_rect.CenterPoint(); | |
| 1009 gfx::PointF end_offset = end_rect.CenterPoint(); | |
| 1010 EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | |
| 1011 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1012 | |
| 1013 EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 10))); | |
|
mfomitchev
2015/05/13 20:52:25
Can we use kDefaulTapSlop instead of ints here?
jdduke (slow)
2015/05/14 18:29:27
Done.
| |
| 1014 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | |
| 1015 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); | |
| 1016 EXPECT_EQ(end_offset, GetLastSelectionEnd()); | |
| 1017 | |
| 1018 // Movement after the start of drag will be relative to the moved endpoint. | |
| 1019 EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 20))); | |
| 1020 EXPECT_TRUE(GetAndResetSelectionMoved()); | |
| 1021 EXPECT_EQ(end_offset + gfx::Vector2dF(0, 10), GetLastSelectionEnd()); | |
| 1022 | |
| 1023 EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 10, 20))); | |
| 1024 EXPECT_TRUE(GetAndResetSelectionMoved()); | |
| 1025 EXPECT_EQ(end_offset + gfx::Vector2dF(10, 10), GetLastSelectionEnd()); | |
| 1026 | |
| 1027 EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 20, 20))); | |
| 1028 EXPECT_TRUE(GetAndResetSelectionMoved()); | |
| 1029 EXPECT_EQ(end_offset + gfx::Vector2dF(20, 10), GetLastSelectionEnd()); | |
| 1030 | |
| 1031 // The handles should still be hidden. | |
| 1032 EXPECT_FALSE(controller().GetStartVisibleForTesting()); | |
| 1033 EXPECT_FALSE(controller().GetEndVisibleForTesting()); | |
| 1034 | |
| 1035 // Releasing the touch sequence should end the drag and show the handles. | |
| 1036 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | |
| 1037 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | |
| 1038 EXPECT_TRUE(controller().GetStartVisibleForTesting()); | |
| 1039 EXPECT_TRUE(controller().GetEndVisibleForTesting()); | |
| 1040 } | |
| 1041 | |
| 979 } // namespace ui | 1042 } // namespace ui |
| OLD | NEW |