| 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 start_bound.set_type(SelectionBound::LEFT); | 140 start_bound.set_type(SelectionBound::LEFT); |
| 140 end_bound.set_type(SelectionBound::RIGHT); | 141 end_bound.set_type(SelectionBound::RIGHT); |
| 141 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 142 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
| 142 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 143 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
| 143 start_bound.set_visible(start_visible); | 144 start_bound.set_visible(start_visible); |
| 144 end_bound.set_visible(end_visible); | 145 end_bound.set_visible(end_visible); |
| 145 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 146 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
| 146 } | 147 } |
| 147 | 148 |
| 148 void Animate() { | 149 void Animate() { |
| 149 base::TimeTicks now = base::TimeTicks::Now(); | 150 TimeTicks now = TimeTicks::Now(); |
| 150 while (needs_animate_) { | 151 while (needs_animate_) { |
| 151 needs_animate_ = controller_->Animate(now); | 152 needs_animate_ = controller_->Animate(now); |
| 152 now += base::TimeDelta::FromMilliseconds(16); | 153 now += base::TimeDelta::FromMilliseconds(16); |
| 153 } | 154 } |
| 154 } | 155 } |
| 155 | 156 |
| 156 bool GetAndResetNeedsAnimate() { | 157 bool GetAndResetNeedsAnimate() { |
| 157 bool needs_animate = needs_animate_; | 158 bool needs_animate = needs_animate_; |
| 158 Animate(); | 159 Animate(); |
| 159 return needs_animate; | 160 return needs_animate; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 ChangeInsertion(insertion_rect, visible); | 275 ChangeInsertion(insertion_rect, visible); |
| 275 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 276 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 276 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 277 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 277 | 278 |
| 278 // Reset the selection. | 279 // Reset the selection. |
| 279 controller().HideAndDisallowShowingAutomatically(); | 280 controller().HideAndDisallowShowingAutomatically(); |
| 280 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 281 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 281 | 282 |
| 282 // Long-pressing should show the handle even if the editable region is empty. | 283 // Long-pressing should show the handle even if the editable region is empty. |
| 283 insertion_rect.Offset(2, -2); | 284 insertion_rect.Offset(2, -2); |
| 284 controller().OnLongPressEvent(); | 285 controller().OnLongPressEvent(TimeTicks::Now(), insertion_rect.bottom_left()); |
| 285 controller().OnSelectionEmpty(true); | 286 controller().OnSelectionEmpty(true); |
| 286 ChangeInsertion(insertion_rect, visible); | 287 ChangeInsertion(insertion_rect, visible); |
| 287 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 288 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 288 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 289 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 289 | 290 |
| 290 // Single Tap on an empty edit field should clear insertion handle. | 291 // Single Tap on an empty edit field should clear insertion handle. |
| 291 controller().OnTapEvent(); | 292 controller().OnTapEvent(); |
| 292 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 293 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 293 } | 294 } |
| 294 | 295 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 | 333 |
| 333 // If the user taps the *same* position as the cursor at the end of the text | 334 // If the user taps the *same* position as the cursor at the end of the text |
| 334 // entry, the handle should appear. | 335 // entry, the handle should appear. |
| 335 controller().OnTapEvent(); | 336 controller().OnTapEvent(); |
| 336 ChangeInsertion(insertion_rect, visible); | 337 ChangeInsertion(insertion_rect, visible); |
| 337 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 338 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 338 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 339 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 339 } | 340 } |
| 340 | 341 |
| 341 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 342 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
| 342 controller().OnLongPressEvent(); | 343 controller().OnLongPressEvent(TimeTicks::Now(), gfx::PointF()); |
| 343 controller().OnSelectionEditable(true); | 344 controller().OnSelectionEditable(true); |
| 344 | 345 |
| 345 gfx::RectF start_rect(5, 5, 0, 10); | 346 gfx::RectF start_rect(5, 5, 0, 10); |
| 346 gfx::RectF end_rect(50, 5, 0, 10); | 347 gfx::RectF end_rect(50, 5, 0, 10); |
| 347 bool visible = true; | 348 bool visible = true; |
| 348 | 349 |
| 349 ChangeInsertion(start_rect, visible); | 350 ChangeInsertion(start_rect, visible); |
| 350 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 351 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 351 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 352 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 352 | 353 |
| 353 ChangeSelection(start_rect, visible, end_rect, visible); | 354 ChangeSelection(start_rect, visible, end_rect, visible); |
| 354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 355 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 355 SELECTION_SHOWN)); | 356 SELECTION_SHOWN)); |
| 356 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 357 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 357 | 358 |
| 358 ChangeInsertion(end_rect, visible); | 359 ChangeInsertion(end_rect, visible); |
| 359 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 360 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, |
| 360 INSERTION_SHOWN)); | 361 INSERTION_SHOWN)); |
| 361 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 362 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 362 | 363 |
| 364 /* |
| 363 controller().HideAndDisallowShowingAutomatically(); | 365 controller().HideAndDisallowShowingAutomatically(); |
| 364 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 365 | 367 |
| 366 controller().OnTapEvent(); | 368 controller().OnTapEvent(); |
| 367 ChangeInsertion(end_rect, visible); | 369 ChangeInsertion(end_rect, visible); |
| 368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 370 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 369 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 371 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart());*/ |
| 370 } | 372 } |
| 371 | 373 |
| 372 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 374 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
| 373 base::TimeTicks event_time = base::TimeTicks::Now(); | 375 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 374 controller().OnTapEvent(); | 376 controller().OnTapEvent(); |
| 375 controller().OnSelectionEditable(true); | 377 controller().OnSelectionEditable(true); |
| 376 | 378 |
| 377 // The touch sequence should not be handled if insertion is not active. | 379 // The touch sequence should not be handled if insertion is not active. |
| 378 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 380 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 379 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 381 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 518 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 517 INSERTION_DRAG_STOPPED)); | 519 INSERTION_DRAG_STOPPED)); |
| 518 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 520 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 519 | 521 |
| 520 anchor_rect.Offset(5, 15); | 522 anchor_rect.Offset(5, 15); |
| 521 ChangeInsertion(anchor_rect, visible); | 523 ChangeInsertion(anchor_rect, visible); |
| 522 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 524 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 523 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 525 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 524 | 526 |
| 525 // Pressing shouldn't reset the active insertion point. | 527 // Pressing shouldn't reset the active insertion point. |
| 526 controller().OnLongPressEvent(); | 528 controller().OnLongPressEvent(TimeTicks::Now(), gfx::PointF()); |
| 527 controller().OnSelectionEmpty(true); | 529 controller().OnSelectionEmpty(true); |
| 528 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 530 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 529 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 531 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 532 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 531 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 533 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 532 | 534 |
| 533 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 535 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 534 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 536 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 535 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 537 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 536 INSERTION_DRAG_STOPPED)); | 538 INSERTION_DRAG_STOPPED)); |
| 537 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 539 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 538 } | 540 } |
| 539 | 541 |
| 540 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 542 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 541 gfx::RectF start_rect(5, 5, 0, 10); | 543 gfx::RectF start_rect(5, 5, 0, 10); |
| 542 gfx::RectF end_rect(50, 5, 0, 10); | 544 gfx::RectF end_rect(50, 5, 0, 10); |
| 543 bool visible = true; | 545 bool visible = true; |
| 544 | 546 |
| 545 // Selection events are ignored until automatic showing is enabled. | 547 // Selection events are ignored until automatic showing is enabled. |
| 546 ChangeSelection(start_rect, visible, end_rect, visible); | 548 ChangeSelection(start_rect, visible, end_rect, visible); |
| 547 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 549 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 548 | 550 |
| 549 controller().OnLongPressEvent(); | 551 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 550 ChangeSelection(start_rect, visible, end_rect, visible); | 552 ChangeSelection(start_rect, visible, end_rect, visible); |
| 551 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 553 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 552 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 554 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 553 | 555 |
| 554 start_rect.Offset(1, 0); | 556 start_rect.Offset(1, 0); |
| 555 ChangeSelection(start_rect, visible, end_rect, visible); | 557 ChangeSelection(start_rect, visible, end_rect, visible); |
| 556 // Selection movement does not currently trigger a separate event. | 558 // Selection movement does not currently trigger a separate event. |
| 557 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 559 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 558 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 560 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 559 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 561 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 560 | 562 |
| 561 ClearSelection(); | 563 ClearSelection(); |
| 562 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 564 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 563 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 565 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 564 } | 566 } |
| 565 | 567 |
| 566 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 568 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 567 gfx::RectF start_rect(5, 5, 0, 10); | 569 gfx::RectF start_rect(5, 5, 0, 10); |
| 568 gfx::RectF end_rect(50, 5, 0, 10); | 570 gfx::RectF end_rect(50, 5, 0, 10); |
| 569 bool visible = true; | 571 bool visible = true; |
| 570 | 572 |
| 571 controller().OnLongPressEvent(); | 573 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 572 ChangeSelection(start_rect, visible, end_rect, visible); | 574 ChangeSelection(start_rect, visible, end_rect, visible); |
| 573 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 575 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 574 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 576 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 575 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 577 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 576 | 578 |
| 577 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 579 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
| 578 // event notification. | 580 // event notification. |
| 579 start_rect.Offset(10, 10); | 581 start_rect.Offset(10, 10); |
| 580 controller().OnLongPressEvent(); | 582 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 581 ChangeSelection(start_rect, visible, end_rect, visible); | 583 ChangeSelection(start_rect, visible, end_rect, visible); |
| 582 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 584 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 583 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 585 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 584 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 586 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 585 } | 587 } |
| 586 | 588 |
| 587 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 589 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 588 base::TimeTicks event_time = base::TimeTicks::Now(); | 590 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 589 controller().OnLongPressEvent(); | 591 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 590 | 592 |
| 591 // The touch sequence should not be handled if selection is not active. | 593 // The touch sequence should not be handled if selection is not active. |
| 592 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 594 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 593 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 595 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 594 | 596 |
| 595 float line_height = 10.f; | 597 float line_height = 10.f; |
| 596 gfx::RectF start_rect(0, 0, 0, line_height); | 598 gfx::RectF start_rect(0, 0, 0, line_height); |
| 597 gfx::RectF end_rect(50, 0, 0, line_height); | 599 gfx::RectF end_rect(50, 0, 0, line_height); |
| 598 bool visible = true; | 600 bool visible = true; |
| 599 ChangeSelection(start_rect, visible, end_rect, visible); | 601 ChangeSelection(start_rect, visible, end_rect, visible); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 639 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 638 EXPECT_FALSE(GetAndResetSelectionMoved()); | 640 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 639 | 641 |
| 640 // Once the drag is complete, no more touch events should be consumed until | 642 // Once the drag is complete, no more touch events should be consumed until |
| 641 // the next ACTION_DOWN. | 643 // the next ACTION_DOWN. |
| 642 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 644 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 643 } | 645 } |
| 644 | 646 |
| 645 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 647 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 646 base::TimeTicks event_time = base::TimeTicks::Now(); | 648 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 647 controller().OnLongPressEvent(); | 649 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 648 | 650 |
| 649 float line_height = 10.f; | 651 float line_height = 10.f; |
| 650 gfx::RectF start_rect(0, 0, 0, line_height); | 652 gfx::RectF start_rect(0, 0, 0, line_height); |
| 651 gfx::RectF end_rect(50, 0, 0, line_height); | 653 gfx::RectF end_rect(50, 0, 0, line_height); |
| 652 bool visible = true; | 654 bool visible = true; |
| 653 ChangeSelection(start_rect, visible, end_rect, visible); | 655 ChangeSelection(start_rect, visible, end_rect, visible); |
| 654 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 656 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 655 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 657 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 656 | 658 |
| 657 // The ACTION_DOWN should lock to the closest handle. | 659 // The ACTION_DOWN should lock to the closest handle. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 675 GetLastSelectionEnd()); | 677 GetLastSelectionEnd()); |
| 676 | 678 |
| 677 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 679 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 678 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 680 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 679 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 681 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 680 EXPECT_FALSE(GetAndResetSelectionMoved()); | 682 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 681 } | 683 } |
| 682 | 684 |
| 683 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 685 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 684 base::TimeTicks event_time = base::TimeTicks::Now(); | 686 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 685 controller().OnLongPressEvent(); | 687 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 686 | 688 |
| 687 float line_height = 10.f; | 689 float line_height = 10.f; |
| 688 gfx::RectF start_rect(50, line_height, 0, line_height); | 690 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 689 gfx::RectF end_rect(100, line_height, 0, line_height); | 691 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 690 bool visible = true; | 692 bool visible = true; |
| 691 ChangeSelection(start_rect, visible, end_rect, visible); | 693 ChangeSelection(start_rect, visible, end_rect, visible); |
| 692 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 694 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 693 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 695 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 694 | 696 |
| 695 SetDraggingEnabled(true); | 697 SetDraggingEnabled(true); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 796 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
| 795 | 797 |
| 796 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 798 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 797 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 799 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 798 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 800 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 799 EXPECT_FALSE(GetAndResetSelectionMoved()); | 801 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 800 } | 802 } |
| 801 | 803 |
| 802 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 804 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
| 803 base::TimeTicks event_time = base::TimeTicks::Now(); | 805 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 804 controller().OnLongPressEvent(); | 806 controller().OnLongPressEvent(event_time, gfx::PointF()); |
| 805 | 807 |
| 806 float small_line_height = 1.f; | 808 float small_line_height = 1.f; |
| 807 float large_line_height = 50.f; | 809 float large_line_height = 50.f; |
| 808 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 810 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 809 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 811 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 810 bool visible = true; | 812 bool visible = true; |
| 811 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 813 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
| 812 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 814 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 813 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 815 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
| 814 | 816 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 | 889 |
| 888 controller().SetTemporarilyHidden(false); | 890 controller().SetTemporarilyHidden(false); |
| 889 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 891 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 890 } | 892 } |
| 891 | 893 |
| 892 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 894 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 893 gfx::RectF start_rect(5, 5, 0, 10); | 895 gfx::RectF start_rect(5, 5, 0, 10); |
| 894 gfx::RectF end_rect(50, 5, 0, 10); | 896 gfx::RectF end_rect(50, 5, 0, 10); |
| 895 bool visible = true; | 897 bool visible = true; |
| 896 | 898 |
| 897 controller().OnLongPressEvent(); | 899 controller().OnLongPressEvent(TimeTicks::Now(), start_rect.bottom_left()); |
| 898 ChangeSelection(start_rect, visible, end_rect, visible); | 900 ChangeSelection(start_rect, visible, end_rect, visible); |
| 899 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 901 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 900 | 902 |
| 901 // Selection should not be cleared if the selection bounds have not changed. | 903 // Selection should not be cleared if the selection bounds have not changed. |
| 902 controller().OnTapEvent(); | 904 controller().OnTapEvent(); |
| 903 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 905 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 904 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 906 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 905 | 907 |
| 906 controller().OnTapEvent(); | 908 controller().OnTapEvent(); |
| 907 ClearSelection(); | 909 ClearSelection(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 controller().OnSelectionEmpty(false); | 941 controller().OnSelectionEmpty(false); |
| 940 controller().HideAndDisallowShowingAutomatically(); | 942 controller().HideAndDisallowShowingAutomatically(); |
| 941 gfx::RectF insertion_rect(5, 5, 0, 10); | 943 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 942 ChangeInsertion(insertion_rect, visible); | 944 ChangeInsertion(insertion_rect, visible); |
| 943 controller().AllowShowingFromCurrentSelection(); | 945 controller().AllowShowingFromCurrentSelection(); |
| 944 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 946 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 945 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 947 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 946 } | 948 } |
| 947 | 949 |
| 948 } // namespace ui | 950 } // namespace ui |
| OLD | NEW |