Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: content/browser/renderer_host/input/touch_selection_controller_unittest.cc

Issue 657803002: Update touch selection to only modify one selection point at a time. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/browser/renderer_host/input/touch_selection_controller.h" 5 #include "content/browser/renderer_host/input/touch_selection_controller.h"
6 6
7 #include "testing/gtest/include/gtest/gtest.h" 7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/events/test/motion_event_test_utils.h" 8 #include "ui/events/test/motion_event_test_utils.h"
9 9
10 using ui::test::MockMotionEvent; 10 using ui::test::MockMotionEvent;
(...skipping 24 matching lines...) Expand all
35 35
36 } // namespace 36 } // namespace
37 37
38 class TouchSelectionControllerTest : public testing::Test, 38 class TouchSelectionControllerTest : public testing::Test,
39 public TouchSelectionControllerClient { 39 public TouchSelectionControllerClient {
40 public: 40 public:
41 TouchSelectionControllerTest() 41 TouchSelectionControllerTest()
42 : last_event_(SELECTION_CLEARED), 42 : last_event_(SELECTION_CLEARED),
43 caret_moved_(false), 43 caret_moved_(false),
44 selection_moved_(false), 44 selection_moved_(false),
45 selection_points_swapped_(false),
45 needs_animate_(false), 46 needs_animate_(false),
46 animation_enabled_(true), 47 animation_enabled_(true),
47 dragging_enabled_(false) {} 48 dragging_enabled_(false) {}
48 49
49 ~TouchSelectionControllerTest() override {} 50 ~TouchSelectionControllerTest() override {}
50 51
51 // testing::Test implementation. 52 // testing::Test implementation.
52 void SetUp() override { 53 void SetUp() override {
53 controller_.reset(new TouchSelectionController( 54 controller_.reset(new TouchSelectionController(
54 this, 55 this,
55 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), 56 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs),
56 kDefaulTapSlop)); 57 kDefaulTapSlop));
57 } 58 }
58 59
59 void TearDown() override { controller_.reset(); } 60 void TearDown() override { controller_.reset(); }
60 61
61 // TouchSelectionControllerClient implementation. 62 // TouchSelectionControllerClient implementation.
62 63
63 bool SupportsAnimation() const override { return animation_enabled_; } 64 bool SupportsAnimation() const override { return animation_enabled_; }
64 65
65 void SetNeedsAnimate() override { needs_animate_ = true; } 66 void SetNeedsAnimate() override { needs_animate_ = true; }
66 67
67 void MoveCaret(const gfx::PointF& position) override { 68 void MoveCaret(const gfx::PointF& position) override {
68 caret_moved_ = true; 69 caret_moved_ = true;
69 caret_position_ = position; 70 caret_position_ = position;
70 } 71 }
71 72
72 void SelectBetweenCoordinates(const gfx::PointF& start, 73 void SelectBetweenCoordinates(const gfx::PointF& base,
73 const gfx::PointF& end) override { 74 const gfx::PointF& extent) override {
75 if (base == selection_end_ && extent == selection_start_)
76 selection_points_swapped_ = true;
77
78 selection_start_ = base;
79 selection_end_ = extent;
80 }
81
82 virtual void MoveRangeSelectionExtent(const gfx::PointF& extent) override {
74 selection_moved_ = true; 83 selection_moved_ = true;
75 selection_start_ = start; 84 selection_end_ = extent;
76 selection_end_ = end;
77 } 85 }
78 86
79 void OnSelectionEvent(SelectionEventType event, 87 void OnSelectionEvent(SelectionEventType event,
80 const gfx::PointF& end_position) override { 88 const gfx::PointF& end_position) override {
81 last_event_ = event; 89 last_event_ = event;
82 last_event_start_ = end_position; 90 last_event_start_ = end_position;
83 } 91 }
84 92
85 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { 93 scoped_ptr<TouchHandleDrawable> CreateDrawable() override {
86 return scoped_ptr<TouchHandleDrawable>( 94 return scoped_ptr<TouchHandleDrawable>(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 caret_moved_ = false; 149 caret_moved_ = false;
142 return moved; 150 return moved;
143 } 151 }
144 152
145 bool GetAndResetSelectionMoved() { 153 bool GetAndResetSelectionMoved() {
146 bool moved = selection_moved_; 154 bool moved = selection_moved_;
147 selection_moved_ = false; 155 selection_moved_ = false;
148 return moved; 156 return moved;
149 } 157 }
150 158
159 bool GetAndResetSelectionPointsSwapped() {
160 bool swapped = selection_points_swapped_;
161 selection_points_swapped_ = false;
162 return swapped;
163 }
164
151 const gfx::PointF& GetLastCaretPosition() const { return caret_position_; } 165 const gfx::PointF& GetLastCaretPosition() const { return caret_position_; }
152 const gfx::PointF& GetLastSelectionStart() const { return selection_start_; } 166 const gfx::PointF& GetLastSelectionStart() const { return selection_start_; }
153 const gfx::PointF& GetLastSelectionEnd() const { return selection_end_; } 167 const gfx::PointF& GetLastSelectionEnd() const { return selection_end_; }
154 SelectionEventType GetLastEventType() const { return last_event_; } 168 SelectionEventType GetLastEventType() const { return last_event_; }
155 const gfx::PointF& GetLastEventAnchor() const { return last_event_start_; } 169 const gfx::PointF& GetLastEventAnchor() const { return last_event_start_; }
156 170
157 TouchSelectionController& controller() { return *controller_; } 171 TouchSelectionController& controller() { return *controller_; }
158 172
159 private: 173 private:
160 gfx::PointF last_event_start_; 174 gfx::PointF last_event_start_;
161 gfx::PointF caret_position_; 175 gfx::PointF caret_position_;
162 gfx::PointF selection_start_; 176 gfx::PointF selection_start_;
163 gfx::PointF selection_end_; 177 gfx::PointF selection_end_;
164 SelectionEventType last_event_; 178 SelectionEventType last_event_;
165 bool caret_moved_; 179 bool caret_moved_;
166 bool selection_moved_; 180 bool selection_moved_;
181 bool selection_points_swapped_;
167 bool needs_animate_; 182 bool needs_animate_;
168 bool animation_enabled_; 183 bool animation_enabled_;
169 bool dragging_enabled_; 184 bool dragging_enabled_;
170 scoped_ptr<TouchSelectionController> controller_; 185 scoped_ptr<TouchSelectionController> controller_;
171 }; 186 };
172 187
173 TEST_F(TouchSelectionControllerTest, InsertionBasic) { 188 TEST_F(TouchSelectionControllerTest, InsertionBasic) {
174 gfx::RectF insertion_rect(5, 5, 0, 10); 189 gfx::RectF insertion_rect(5, 5, 0, 10);
175 bool visible = true; 190 bool visible = true;
176 191
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); 610 EXPECT_EQ(fixed_offset, GetLastSelectionStart());
596 EXPECT_EQ(end_offset - gfx::Vector2dF(touch_down_x, 0), 611 EXPECT_EQ(end_offset - gfx::Vector2dF(touch_down_x, 0),
597 GetLastSelectionEnd()); 612 GetLastSelectionEnd());
598 613
599 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 614 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
600 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 615 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
601 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 616 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType());
602 EXPECT_FALSE(GetAndResetSelectionMoved()); 617 EXPECT_FALSE(GetAndResetSelectionMoved());
603 } 618 }
604 619
620 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) {
621 base::TimeTicks event_time = base::TimeTicks::Now();
622 controller().OnLongPressEvent();
623
624 float line_height = 10.f;
625 gfx::RectF start_rect(50, line_height, 0, line_height);
626 gfx::RectF end_rect(100, line_height, 0, line_height);
627 bool visible = true;
628 ChangeSelection(start_rect, visible, end_rect, visible);
629 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType());
630 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
631
632 SetDraggingEnabled(true);
633
634 // Move the extent, not triggering a swap of points.
635 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time,
636 end_rect.x(), end_rect.bottom());
637 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
638 EXPECT_FALSE(GetAndResetSelectionMoved());
639 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
640
641 gfx::PointF base_offset = start_rect.CenterPoint();
642 gfx::PointF extent_offset = end_rect.CenterPoint();
643 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
644 end_rect.x(), end_rect.bottom() + 5);
645 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
646 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType());
647 EXPECT_TRUE(GetAndResetSelectionMoved());
648 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
649 EXPECT_EQ(base_offset, GetLastSelectionStart());
650 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
651
652 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
653 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
654 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType());
655 EXPECT_FALSE(GetAndResetSelectionMoved());
656
657 end_rect += gfx::Vector2dF(0, 5);
658 ChangeSelection(start_rect, visible, end_rect, visible);
659
660 // Move the base, triggering a swap of points.
661 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time,
662 start_rect.x(), start_rect.bottom());
663 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
664 EXPECT_FALSE(GetAndResetSelectionMoved());
665 EXPECT_TRUE(GetAndResetSelectionPointsSwapped());
666
667 base_offset = end_rect.CenterPoint();
668 extent_offset = start_rect.CenterPoint();
669 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
670 start_rect.x(), start_rect.bottom() + 5);
671 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
672 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType());
673 EXPECT_TRUE(GetAndResetSelectionMoved());
674 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
675 EXPECT_EQ(base_offset, GetLastSelectionStart());
676 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
677
678 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
679 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
680 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType());
681 EXPECT_FALSE(GetAndResetSelectionMoved());
682
683 start_rect += gfx::Vector2dF(0, 5);
684 ChangeSelection(start_rect, visible, end_rect, visible);
685
686 // Move the same point again, not triggering a swap of points.
687 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time,
688 start_rect.x(), start_rect.bottom());
689 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
690 EXPECT_FALSE(GetAndResetSelectionMoved());
691 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
692
693 base_offset = end_rect.CenterPoint();
694 extent_offset = start_rect.CenterPoint();
695 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
696 start_rect.x(), start_rect.bottom() + 5);
697 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
698 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType());
699 EXPECT_TRUE(GetAndResetSelectionMoved());
700 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
701 EXPECT_EQ(base_offset, GetLastSelectionStart());
702 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
703
704 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
705 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
706 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType());
707 EXPECT_FALSE(GetAndResetSelectionMoved());
708
709 start_rect += gfx::Vector2dF(0, 5);
710 ChangeSelection(start_rect, visible, end_rect, visible);
711
712 // Move the base, triggering a swap of points.
713 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time,
714 end_rect.x(), end_rect.bottom());
715 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
716 EXPECT_FALSE(GetAndResetSelectionMoved());
717 EXPECT_TRUE(GetAndResetSelectionPointsSwapped());
718
719 base_offset = start_rect.CenterPoint();
720 extent_offset = end_rect.CenterPoint();
721 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
722 end_rect.x(), end_rect.bottom() + 5);
723 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
724 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType());
725 EXPECT_TRUE(GetAndResetSelectionMoved());
726 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
727 EXPECT_EQ(base_offset, GetLastSelectionStart());
728 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
729
730 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
731 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
732 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType());
733 EXPECT_FALSE(GetAndResetSelectionMoved());
734 }
735
605 TEST_F(TouchSelectionControllerTest, Animation) { 736 TEST_F(TouchSelectionControllerTest, Animation) {
606 controller().OnTapEvent(); 737 controller().OnTapEvent();
607 controller().OnSelectionEditable(true); 738 controller().OnSelectionEditable(true);
608 739
609 gfx::RectF insertion_rect(5, 5, 0, 10); 740 gfx::RectF insertion_rect(5, 5, 0, 10);
610 741
611 bool visible = true; 742 bool visible = true;
612 ChangeInsertion(insertion_rect, visible); 743 ChangeInsertion(insertion_rect, visible);
613 EXPECT_FALSE(GetAndResetNeedsAnimate()); 744 EXPECT_FALSE(GetAndResetNeedsAnimate());
614 745
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 801 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType());
671 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 802 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
672 803
673 controller().OnTapEvent(); 804 controller().OnTapEvent();
674 ClearSelection(); 805 ClearSelection();
675 EXPECT_EQ(SELECTION_CLEARED, GetLastEventType()); 806 EXPECT_EQ(SELECTION_CLEARED, GetLastEventType());
676 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 807 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
677 } 808 }
678 809
679 } // namespace content 810 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698