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" |
(...skipping 25 matching lines...) Expand all Loading... |
36 } | 36 } |
37 | 37 |
38 private: | 38 private: |
39 bool* intersects_rect_; | 39 bool* intersects_rect_; |
40 | 40 |
41 DISALLOW_COPY_AND_ASSIGN(MockTouchHandleDrawable); | 41 DISALLOW_COPY_AND_ASSIGN(MockTouchHandleDrawable); |
42 }; | 42 }; |
43 | 43 |
44 } // namespace | 44 } // namespace |
45 | 45 |
| 46 class TouchSelectionControllerTestApi { |
| 47 public: |
| 48 explicit TouchSelectionControllerTestApi(TouchSelectionController* controller) |
| 49 : controller_(controller) {} |
| 50 ~TouchSelectionControllerTestApi() {} |
| 51 |
| 52 bool GetStartVisible() const { return controller_->GetStartVisible(); } |
| 53 bool GetEndVisible() const { return controller_->GetEndVisible(); } |
| 54 |
| 55 private: |
| 56 TouchSelectionController* controller_; |
| 57 |
| 58 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTestApi); |
| 59 }; |
| 60 |
46 class TouchSelectionControllerTest : public testing::Test, | 61 class TouchSelectionControllerTest : public testing::Test, |
47 public TouchSelectionControllerClient { | 62 public TouchSelectionControllerClient { |
48 public: | 63 public: |
49 TouchSelectionControllerTest() | 64 TouchSelectionControllerTest() |
50 : caret_moved_(false), | 65 : caret_moved_(false), |
51 selection_moved_(false), | 66 selection_moved_(false), |
52 selection_points_swapped_(false), | 67 selection_points_swapped_(false), |
53 needs_animate_(false), | 68 needs_animate_(false), |
54 animation_enabled_(true), | 69 animation_enabled_(true), |
55 dragging_enabled_(false) {} | 70 dragging_enabled_(false) {} |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 start_bound.set_type(SelectionBound::LEFT); | 157 start_bound.set_type(SelectionBound::LEFT); |
143 end_bound.set_type(SelectionBound::RIGHT); | 158 end_bound.set_type(SelectionBound::RIGHT); |
144 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 159 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
145 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 160 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
146 start_bound.set_visible(start_visible); | 161 start_bound.set_visible(start_visible); |
147 end_bound.set_visible(end_visible); | 162 end_bound.set_visible(end_visible); |
148 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 163 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
149 } | 164 } |
150 | 165 |
151 void OnLongPressEvent() { | 166 void OnLongPressEvent() { |
152 ASSERT_FALSE(controller().WillHandleLongPressEvent(kIgnoredPoint)); | 167 ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(), |
| 168 kIgnoredPoint)); |
153 } | 169 } |
154 | 170 |
155 void OnTapEvent() { | 171 void OnTapEvent() { |
156 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint)); | 172 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint)); |
157 } | 173 } |
158 | 174 |
159 void Animate() { | 175 void Animate() { |
160 base::TimeTicks now = base::TimeTicks::Now(); | 176 base::TimeTicks now = base::TimeTicks::Now(); |
161 while (needs_animate_) { | 177 while (needs_animate_) { |
162 needs_animate_ = controller_->Animate(now); | 178 needs_animate_ = controller_->Animate(now); |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 | 886 |
871 // If the client doesn't support animation, no animation should be triggered. | 887 // If the client doesn't support animation, no animation should be triggered. |
872 SetAnimationEnabled(false); | 888 SetAnimationEnabled(false); |
873 OnTapEvent(); | 889 OnTapEvent(); |
874 visible = true; | 890 visible = true; |
875 ChangeInsertion(insertion_rect, visible); | 891 ChangeInsertion(insertion_rect, visible); |
876 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 892 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
877 } | 893 } |
878 | 894 |
879 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 895 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 896 TouchSelectionControllerTestApi test_controller(&controller()); |
| 897 |
880 OnTapEvent(); | 898 OnTapEvent(); |
881 controller().OnSelectionEditable(true); | 899 controller().OnSelectionEditable(true); |
882 | 900 |
883 gfx::RectF insertion_rect(5, 5, 0, 10); | 901 gfx::RectF insertion_rect(5, 5, 0, 10); |
884 | 902 |
885 bool visible = true; | 903 bool visible = true; |
886 ChangeInsertion(insertion_rect, visible); | 904 ChangeInsertion(insertion_rect, visible); |
887 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 905 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 906 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 907 EXPECT_TRUE(test_controller.GetEndVisible()); |
888 | 908 |
889 controller().SetTemporarilyHidden(true); | 909 controller().SetTemporarilyHidden(true); |
890 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 910 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 911 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 912 EXPECT_FALSE(test_controller.GetEndVisible()); |
891 | 913 |
892 visible = false; | 914 visible = false; |
893 ChangeInsertion(insertion_rect, visible); | 915 ChangeInsertion(insertion_rect, visible); |
894 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 916 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 917 EXPECT_FALSE(test_controller.GetStartVisible()); |
895 | 918 |
896 visible = true; | 919 visible = true; |
897 ChangeInsertion(insertion_rect, visible); | 920 ChangeInsertion(insertion_rect, visible); |
898 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 921 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 922 EXPECT_FALSE(test_controller.GetStartVisible()); |
899 | 923 |
900 controller().SetTemporarilyHidden(false); | 924 controller().SetTemporarilyHidden(false); |
901 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 925 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 926 EXPECT_TRUE(test_controller.GetStartVisible()); |
902 } | 927 } |
903 | 928 |
904 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 929 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
905 gfx::RectF start_rect(5, 5, 0, 10); | 930 gfx::RectF start_rect(5, 5, 0, 10); |
906 gfx::RectF end_rect(50, 5, 0, 10); | 931 gfx::RectF end_rect(50, 5, 0, 10); |
907 bool visible = true; | 932 bool visible = true; |
908 | 933 |
909 OnLongPressEvent(); | 934 OnLongPressEvent(); |
910 ChangeSelection(start_rect, visible, end_rect, visible); | 935 ChangeSelection(start_rect, visible, end_rect, visible); |
911 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 936 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1010 gfx::RectF start_rect(5, 5, 0, 10); | 1035 gfx::RectF start_rect(5, 5, 0, 10); |
1011 gfx::RectF end_rect(50, 5, 0, 10); | 1036 gfx::RectF end_rect(50, 5, 0, 10); |
1012 gfx::PointF inner_point(25, 10); | 1037 gfx::PointF inner_point(25, 10); |
1013 gfx::PointF outer_point(100, 100); | 1038 gfx::PointF outer_point(100, 100); |
1014 | 1039 |
1015 // Establish a selection without handles from 5 to 50 with height 10. | 1040 // Establish a selection without handles from 5 to 50 with height 10. |
1016 ChangeSelection(start_rect, visible, end_rect, visible); | 1041 ChangeSelection(start_rect, visible, end_rect, visible); |
1017 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1042 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1018 | 1043 |
1019 // A point outside the rect should not be handled. | 1044 // A point outside the rect should not be handled. |
1020 EXPECT_FALSE(controller().WillHandleLongPressEvent(outer_point)); | 1045 EXPECT_FALSE( |
| 1046 controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point)); |
1021 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1047 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
1022 | 1048 |
1023 // A point inside the rect should be handled. | 1049 // A point inside the rect should be handled. |
1024 EXPECT_TRUE(controller().WillHandleLongPressEvent(inner_point)); | 1050 EXPECT_TRUE( |
| 1051 controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point)); |
1025 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 1052 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
1026 } | 1053 } |
1027 | 1054 |
| 1055 TEST_F(TouchSelectionControllerTest, LongPressDrag) { |
| 1056 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1057 |
| 1058 gfx::RectF start_rect(-50, 0, 0, 10); |
| 1059 gfx::RectF end_rect(50, 0, 0, 10); |
| 1060 bool visible = true; |
| 1061 |
| 1062 // Start a touch sequence. |
| 1063 MockMotionEvent event; |
| 1064 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1065 |
| 1066 // Activate a longpress-triggered selection. |
| 1067 OnLongPressEvent(); |
| 1068 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1069 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 1070 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1071 |
| 1072 // The handles should remain invisible while the touch release and longpress |
| 1073 // drag gesture are pending. |
| 1074 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1075 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1076 |
| 1077 // The selection coordinates should reflect the drag movement. |
| 1078 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 1079 gfx::PointF end_offset = end_rect.CenterPoint(); |
| 1080 EXPECT_TRUE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
| 1081 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1082 |
| 1083 EXPECT_TRUE( |
| 1084 controller().WillHandleTouchEvent(event.MovePoint(0, 0, kDefaulTapSlop))); |
| 1085 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
| 1086 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); |
| 1087 EXPECT_EQ(end_offset, GetLastSelectionEnd()); |
| 1088 |
| 1089 // Movement after the start of drag will be relative to the moved endpoint. |
| 1090 EXPECT_TRUE(controller().WillHandleTouchEvent( |
| 1091 event.MovePoint(0, 0, 2 * kDefaulTapSlop))); |
| 1092 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 1093 EXPECT_EQ(end_offset + gfx::Vector2dF(0, kDefaulTapSlop), |
| 1094 GetLastSelectionEnd()); |
| 1095 |
| 1096 EXPECT_TRUE(controller().WillHandleTouchEvent( |
| 1097 event.MovePoint(0, kDefaulTapSlop, 2 * kDefaulTapSlop))); |
| 1098 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 1099 EXPECT_EQ(end_offset + gfx::Vector2dF(kDefaulTapSlop, kDefaulTapSlop), |
| 1100 GetLastSelectionEnd()); |
| 1101 |
| 1102 EXPECT_TRUE(controller().WillHandleTouchEvent( |
| 1103 event.MovePoint(0, 2 * kDefaulTapSlop, 2 * kDefaulTapSlop))); |
| 1104 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 1105 EXPECT_EQ(end_offset + gfx::Vector2dF(2 * kDefaulTapSlop, kDefaulTapSlop), |
| 1106 GetLastSelectionEnd()); |
| 1107 |
| 1108 // The handles should still be hidden. |
| 1109 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1110 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1111 |
| 1112 // Releasing the touch sequence should end the drag and show the handles. |
| 1113 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
| 1114 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 1115 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1116 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1117 } |
| 1118 |
| 1119 TEST_F(TouchSelectionControllerTest, LongPressNoDrag) { |
| 1120 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1121 |
| 1122 gfx::RectF start_rect(-50, 0, 0, 10); |
| 1123 gfx::RectF end_rect(50, 0, 0, 10); |
| 1124 bool visible = true; |
| 1125 |
| 1126 // Start a touch sequence. |
| 1127 MockMotionEvent event; |
| 1128 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1129 |
| 1130 // Activate a longpress-triggered selection. |
| 1131 OnLongPressEvent(); |
| 1132 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1133 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 1134 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1135 |
| 1136 // The handles should remain invisible while the touch release and longpress |
| 1137 // drag gesture are pending. |
| 1138 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1139 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1140 |
| 1141 // If no drag movement occurs, the handles should reappear after the touch |
| 1142 // is released. |
| 1143 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
| 1144 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1145 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1146 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1147 } |
| 1148 |
1028 } // namespace ui | 1149 } // namespace ui |
OLD | NEW |