| 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 18 matching lines...) Expand all Loading... |
| 29 void SetOrientation(TouchHandleOrientation orientation) override {} | 29 void SetOrientation(TouchHandleOrientation orientation) override {} |
| 30 void SetAlpha(float alpha) override {} | 30 void SetAlpha(float alpha) override {} |
| 31 void SetFocus(const gfx::PointF& position) override {} | 31 void SetFocus(const gfx::PointF& position) override {} |
| 32 gfx::RectF GetVisibleBounds() const override { | 32 gfx::RectF GetVisibleBounds() const override { |
| 33 return *intersects_rect_ ? gfx::RectF(-1000, -1000, 2000, 2000) | 33 return *intersects_rect_ ? gfx::RectF(-1000, -1000, 2000, 2000) |
| 34 : gfx::RectF(-1000, -1000, 0, 0); | 34 : gfx::RectF(-1000, -1000, 0, 0); |
| 35 } | 35 } |
| 36 | 36 |
| 37 private: | 37 private: |
| 38 bool* intersects_rect_; | 38 bool* intersects_rect_; |
| 39 |
| 40 DISALLOW_COPY_AND_ASSIGN(MockTouchHandleDrawable); |
| 39 }; | 41 }; |
| 40 | 42 |
| 41 } // namespace | 43 class MockTouchSelectionController : public TouchSelectionController, |
| 42 | |
| 43 class TouchSelectionControllerTest : public testing::Test, | |
| 44 public TouchSelectionControllerClient { | 44 public TouchSelectionControllerClient { |
| 45 public: | 45 public: |
| 46 TouchSelectionControllerTest() | 46 explicit MockTouchSelectionController(bool show_on_tap_for_empty_editable) |
| 47 : caret_moved_(false), | 47 : TouchSelectionController( |
| 48 this, |
| 49 base::TimeDelta::FromMicroseconds(kDefaultTapTimeoutMs), |
| 50 kDefaulTapSlop, |
| 51 show_on_tap_for_empty_editable), |
| 52 animation_enabled_(true), |
| 53 dragging_enabled_(false), |
| 54 needs_animate_(false), |
| 55 caret_moved_(false), |
| 48 selection_moved_(false), | 56 selection_moved_(false), |
| 49 selection_points_swapped_(false), | 57 selection_points_swapped_(false) {} |
| 50 needs_animate_(false), | |
| 51 animation_enabled_(true), | |
| 52 dragging_enabled_(false) {} | |
| 53 | 58 |
| 54 ~TouchSelectionControllerTest() override {} | 59 ~MockTouchSelectionController() override {} |
| 55 | 60 |
| 56 // testing::Test implementation. | 61 void set_animation_enabled(bool enabled) { animation_enabled_ = enabled; } |
| 57 | 62 |
| 58 void SetUp() override { | 63 void set_dragging_enabled(bool enabled) { dragging_enabled_ = enabled; } |
| 59 // Default touch selection controller is created with | 64 |
| 60 // |show_on_tap_for_empty_editable| flag set to false. Use | 65 const gfx::PointF& GetLastEventAnchor() const { return last_event_start_; } |
| 61 // |AllowShowingOnTapForEmptyEditable()| function to override it. | 66 |
| 62 bool show_on_tap_for_empty_editable = false; | 67 std::vector<SelectionEventType> GetAndResetEvents() { |
| 63 controller_.reset(new TouchSelectionController( | 68 std::vector<SelectionEventType> events; |
| 64 this, | 69 events.swap(events_); |
| 65 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), | 70 return events; |
| 66 kDefaulTapSlop, | |
| 67 show_on_tap_for_empty_editable)); | |
| 68 } | 71 } |
| 69 | 72 |
| 70 void TearDown() override { controller_.reset(); } | 73 bool GetAndResetNeedsAnimate() { |
| 74 bool needs_animate = needs_animate_; |
| 75 RunAnimation(); |
| 76 return needs_animate; |
| 77 } |
| 71 | 78 |
| 72 // TouchSelectionControllerClient implementation. | 79 bool GetAndResetCaretMoved() { |
| 80 bool moved = caret_moved_; |
| 81 caret_moved_ = false; |
| 82 return moved; |
| 83 } |
| 84 |
| 85 bool GetAndResetSelectionMoved() { |
| 86 bool moved = selection_moved_; |
| 87 selection_moved_ = false; |
| 88 return moved; |
| 89 } |
| 90 |
| 91 bool GetAndResetSelectionPointsSwapped() { |
| 92 bool swapped = selection_points_swapped_; |
| 93 selection_points_swapped_ = false; |
| 94 return swapped; |
| 95 } |
| 96 |
| 97 const gfx::PointF& GetLastCaretPosition() const { return caret_position_; } |
| 98 const gfx::PointF& GetLastSelectionStart() const { return selection_start_; } |
| 99 const gfx::PointF& GetLastSelectionEnd() const { return selection_end_; } |
| 100 |
| 101 private: |
| 102 void RunAnimation() { |
| 103 base::TimeTicks now = base::TimeTicks::Now(); |
| 104 while (needs_animate_) { |
| 105 needs_animate_ = Animate(now); |
| 106 now += base::TimeDelta::FromMilliseconds(16); |
| 107 } |
| 108 } |
| 109 |
| 110 // TouchSelectionController implementation. |
| 111 |
| 112 void OnSelectionEvent(SelectionEventType event, |
| 113 const gfx::PointF& position) override { |
| 114 events_.push_back(event); |
| 115 last_event_start_ = position; |
| 116 } |
| 73 | 117 |
| 74 bool SupportsAnimation() const override { return animation_enabled_; } | 118 bool SupportsAnimation() const override { return animation_enabled_; } |
| 75 | 119 |
| 76 void SetNeedsAnimate() override { needs_animate_ = true; } | 120 void SetNeedsAnimate() override { needs_animate_ = true; } |
| 77 | 121 |
| 122 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { |
| 123 return make_scoped_ptr(new MockTouchHandleDrawable(&dragging_enabled_)); |
| 124 } |
| 125 |
| 126 // TouchSelectionControllerClient implementation. |
| 127 |
| 78 void MoveCaret(const gfx::PointF& position) override { | 128 void MoveCaret(const gfx::PointF& position) override { |
| 79 caret_moved_ = true; | 129 caret_moved_ = true; |
| 80 caret_position_ = position; | 130 caret_position_ = position; |
| 81 } | 131 } |
| 82 | 132 |
| 83 void SelectBetweenCoordinates(const gfx::PointF& base, | 133 void SelectBetweenCoordinates(const gfx::PointF& base, |
| 84 const gfx::PointF& extent) override { | 134 const gfx::PointF& extent) override { |
| 85 if (base == selection_end_ && extent == selection_start_) | 135 if (base == selection_end_ && extent == selection_start_) |
| 86 selection_points_swapped_ = true; | 136 selection_points_swapped_ = true; |
| 87 | 137 |
| 88 selection_start_ = base; | 138 selection_start_ = base; |
| 89 selection_end_ = extent; | 139 selection_end_ = extent; |
| 90 } | 140 } |
| 91 | 141 |
| 92 void MoveRangeSelectionExtent(const gfx::PointF& extent) override { | 142 void MoveRangeSelectionExtent(const gfx::PointF& extent) override { |
| 93 selection_moved_ = true; | 143 selection_moved_ = true; |
| 94 selection_end_ = extent; | 144 selection_end_ = extent; |
| 95 } | 145 } |
| 96 | 146 |
| 97 void OnSelectionEvent(SelectionEventType event, | 147 bool animation_enabled_; |
| 98 const gfx::PointF& end_position) override { | 148 bool dragging_enabled_; |
| 99 events_.push_back(event); | 149 bool needs_animate_; |
| 100 last_event_start_ = end_position; | 150 gfx::PointF last_event_start_; |
| 151 std::vector<SelectionEventType> events_; |
| 152 gfx::PointF caret_position_; |
| 153 gfx::PointF selection_start_; |
| 154 gfx::PointF selection_end_; |
| 155 bool caret_moved_; |
| 156 bool selection_moved_; |
| 157 bool selection_points_swapped_; |
| 158 |
| 159 DISALLOW_COPY_AND_ASSIGN(MockTouchSelectionController); |
| 160 }; |
| 161 |
| 162 } // namespace |
| 163 |
| 164 class TouchSelectionControllerTest : public testing::Test { |
| 165 public: |
| 166 TouchSelectionControllerTest() {} |
| 167 ~TouchSelectionControllerTest() override {} |
| 168 |
| 169 protected: |
| 170 void AllowShowingOnTapForEmptyEditable() { |
| 171 bool show_on_tap_for_empty_editable = true; |
| 172 controller_.reset( |
| 173 new MockTouchSelectionController(show_on_tap_for_empty_editable)); |
| 101 } | 174 } |
| 102 | 175 |
| 103 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { | 176 bool ClearSelection() { |
| 104 return make_scoped_ptr(new MockTouchHandleDrawable(&dragging_enabled_)); | 177 return controller_->OnSelectionBoundsUpdated(SelectionBound(), |
| 178 SelectionBound()); |
| 105 } | 179 } |
| 106 | 180 |
| 107 void AllowShowingOnTapForEmptyEditable() { | 181 bool ClearInsertion() { return ClearSelection(); } |
| 108 bool show_on_tap_for_empty_editable = true; | |
| 109 controller_.reset(new TouchSelectionController( | |
| 110 this, | |
| 111 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), | |
| 112 kDefaulTapSlop, | |
| 113 show_on_tap_for_empty_editable)); | |
| 114 } | |
| 115 | 182 |
| 116 void SetAnimationEnabled(bool enabled) { animation_enabled_ = enabled; } | 183 bool ChangeInsertion(const gfx::RectF& rect, bool visible) { |
| 117 void SetDraggingEnabled(bool enabled) { dragging_enabled_ = enabled; } | |
| 118 | |
| 119 void ClearSelection() { | |
| 120 controller_->OnSelectionBoundsChanged(SelectionBound(), | |
| 121 SelectionBound()); | |
| 122 } | |
| 123 | |
| 124 void ClearInsertion() { ClearSelection(); } | |
| 125 | |
| 126 void ChangeInsertion(const gfx::RectF& rect, bool visible) { | |
| 127 SelectionBound bound; | 184 SelectionBound bound; |
| 128 bound.set_type(SelectionBound::CENTER); | 185 bound.set_type(SelectionBound::CENTER); |
| 129 bound.SetEdge(rect.origin(), rect.bottom_left()); | 186 bound.SetEdge(rect.origin(), rect.bottom_left()); |
| 130 bound.set_visible(visible); | 187 bound.set_visible(visible); |
| 131 controller_->OnSelectionBoundsChanged(bound, bound); | 188 return controller_->OnSelectionBoundsUpdated(bound, bound); |
| 132 } | 189 } |
| 133 | 190 |
| 134 void ChangeSelection(const gfx::RectF& start_rect, | 191 bool ChangeSelection(const gfx::RectF& start_rect, |
| 135 bool start_visible, | 192 bool start_visible, |
| 136 const gfx::RectF& end_rect, | 193 const gfx::RectF& end_rect, |
| 137 bool end_visible) { | 194 bool end_visible) { |
| 138 SelectionBound start_bound, end_bound; | 195 SelectionBound start_bound, end_bound; |
| 139 start_bound.set_type(SelectionBound::LEFT); | 196 start_bound.set_type(SelectionBound::LEFT); |
| 140 end_bound.set_type(SelectionBound::RIGHT); | 197 end_bound.set_type(SelectionBound::RIGHT); |
| 141 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 198 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
| 142 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 199 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
| 143 start_bound.set_visible(start_visible); | 200 start_bound.set_visible(start_visible); |
| 144 end_bound.set_visible(end_visible); | 201 end_bound.set_visible(end_visible); |
| 145 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 202 return controller_->OnSelectionBoundsUpdated(start_bound, end_bound); |
| 146 } | 203 } |
| 147 | 204 |
| 148 void Animate() { | 205 MockTouchSelectionController& controller() { return *controller_; } |
| 149 base::TimeTicks now = base::TimeTicks::Now(); | 206 |
| 150 while (needs_animate_) { | 207 private: |
| 151 needs_animate_ = controller_->Animate(now); | 208 // testing::Test implementation. |
| 152 now += base::TimeDelta::FromMilliseconds(16); | 209 |
| 153 } | 210 void SetUp() override { |
| 211 // Default touch selection controller is created with |
| 212 // |show_on_tap_for_empty_editable| flag set to false. Use |
| 213 // |AllowShowingOnTapForEmptyEditable()| function to override it. |
| 214 bool show_on_tap_for_empty_editable = false; |
| 215 controller_.reset( |
| 216 new MockTouchSelectionController(show_on_tap_for_empty_editable)); |
| 154 } | 217 } |
| 155 | 218 |
| 156 bool GetAndResetNeedsAnimate() { | 219 void TearDown() override { controller_.reset(); } |
| 157 bool needs_animate = needs_animate_; | |
| 158 Animate(); | |
| 159 return needs_animate; | |
| 160 } | |
| 161 | 220 |
| 162 bool GetAndResetCaretMoved() { | 221 scoped_ptr<MockTouchSelectionController> controller_; |
| 163 bool moved = caret_moved_; | |
| 164 caret_moved_ = false; | |
| 165 return moved; | |
| 166 } | |
| 167 | 222 |
| 168 bool GetAndResetSelectionMoved() { | 223 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); |
| 169 bool moved = selection_moved_; | |
| 170 selection_moved_ = false; | |
| 171 return moved; | |
| 172 } | |
| 173 | |
| 174 bool GetAndResetSelectionPointsSwapped() { | |
| 175 bool swapped = selection_points_swapped_; | |
| 176 selection_points_swapped_ = false; | |
| 177 return swapped; | |
| 178 } | |
| 179 | |
| 180 const gfx::PointF& GetLastCaretPosition() const { return caret_position_; } | |
| 181 const gfx::PointF& GetLastSelectionStart() const { return selection_start_; } | |
| 182 const gfx::PointF& GetLastSelectionEnd() const { return selection_end_; } | |
| 183 const gfx::PointF& GetLastEventAnchor() const { return last_event_start_; } | |
| 184 | |
| 185 std::vector<SelectionEventType> GetAndResetEvents() { | |
| 186 std::vector<SelectionEventType> events; | |
| 187 events.swap(events_); | |
| 188 return events; | |
| 189 } | |
| 190 | |
| 191 TouchSelectionController& controller() { return *controller_; } | |
| 192 | |
| 193 private: | |
| 194 gfx::PointF last_event_start_; | |
| 195 gfx::PointF caret_position_; | |
| 196 gfx::PointF selection_start_; | |
| 197 gfx::PointF selection_end_; | |
| 198 std::vector<SelectionEventType> events_; | |
| 199 bool caret_moved_; | |
| 200 bool selection_moved_; | |
| 201 bool selection_points_swapped_; | |
| 202 bool needs_animate_; | |
| 203 bool animation_enabled_; | |
| 204 bool dragging_enabled_; | |
| 205 scoped_ptr<TouchSelectionController> controller_; | |
| 206 }; | 224 }; |
| 207 | 225 |
| 208 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 226 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
| 209 gfx::RectF insertion_rect(5, 5, 0, 10); | 227 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 210 bool visible = true; | 228 bool visible = true; |
| 211 | 229 |
| 212 // Insertion events are ignored until automatic showing is enabled. | 230 // Insertion events are ignored until automatic showing is enabled. |
| 213 ChangeInsertion(insertion_rect, visible); | 231 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 214 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 232 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 215 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 233 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 216 controller().OnTapEvent(); | 234 controller().OnTapEvent(); |
| 217 | 235 |
| 218 // Insertion events are ignored until the selection region is marked editable. | 236 // Insertion events are ignored until the selection region is marked editable. |
| 219 ChangeInsertion(insertion_rect, visible); | 237 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 220 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 238 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 221 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 239 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 222 | 240 |
| 223 controller().OnTapEvent(); | 241 controller().OnTapEvent(); |
| 224 controller().OnSelectionEditable(true); | 242 controller().OnSelectionEditable(true); |
| 225 ChangeInsertion(insertion_rect, visible); | 243 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 226 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 244 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 227 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 245 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 228 | 246 |
| 229 insertion_rect.Offset(1, 0); | 247 insertion_rect.Offset(1, 0); |
| 230 ChangeInsertion(insertion_rect, visible); | 248 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 231 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 249 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 232 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 250 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 233 | 251 |
| 234 insertion_rect.Offset(0, 1); | 252 insertion_rect.Offset(0, 1); |
| 235 ChangeInsertion(insertion_rect, visible); | 253 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 236 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 254 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 237 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 255 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 238 | 256 |
| 239 ClearInsertion(); | 257 EXPECT_TRUE(ClearInsertion()); |
| 240 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 258 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 241 } | 259 } |
| 242 | 260 |
| 243 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | 261 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { |
| 244 gfx::RectF insertion_rect(5, 5, 0, 10); | 262 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 245 bool visible = true; | 263 bool visible = true; |
| 246 controller().OnTapEvent(); | 264 controller().OnTapEvent(); |
| 247 controller().OnSelectionEditable(true); | 265 controller().OnSelectionEditable(true); |
| 248 | 266 |
| 249 ChangeInsertion(insertion_rect, visible); | 267 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 250 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 268 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 251 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 269 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 252 | 270 |
| 253 controller().OnSelectionEditable(false); | 271 controller().OnSelectionEditable(false); |
| 254 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 272 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 255 } | 273 } |
| 256 | 274 |
| 257 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { | 275 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { |
| 258 gfx::RectF insertion_rect(5, 5, 0, 10); | 276 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 259 bool visible = true; | 277 bool visible = true; |
| 260 controller().OnSelectionEditable(true); | 278 controller().OnSelectionEditable(true); |
| 261 | 279 |
| 262 // Taps on an empty editable region should be ignored if the controller is | 280 // Taps on an empty editable region should be ignored if the controller is |
| 263 // created with |show_on_tap_for_empty_editable| set to false. | 281 // created with |show_on_tap_for_empty_editable| set to false. |
| 264 controller().OnTapEvent(); | 282 controller().OnTapEvent(); |
| 265 controller().OnSelectionEmpty(true); | 283 controller().OnSelectionEmpty(true); |
| 266 ChangeInsertion(insertion_rect, visible); | 284 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 267 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 285 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 268 | 286 |
| 269 // Once the region becomes non-empty, taps should show the insertion handle. | 287 // Once the region becomes non-empty, taps should show the insertion handle. |
| 270 controller().OnTapEvent(); | 288 controller().OnTapEvent(); |
| 271 controller().OnSelectionEmpty(false); | 289 controller().OnSelectionEmpty(false); |
| 272 ChangeInsertion(insertion_rect, visible); | 290 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 273 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 291 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 274 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 292 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 275 | 293 |
| 276 // Reset the selection. | 294 // Reset the selection. |
| 277 controller().HideAndDisallowShowingAutomatically(); | 295 controller().HideAndDisallowShowingAutomatically(); |
| 278 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 296 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 279 | 297 |
| 280 // Long-pressing should show the handle even if the editable region is empty. | 298 // Long-pressing should show the handle even if the editable region is empty. |
| 281 insertion_rect.Offset(2, -2); | 299 insertion_rect.Offset(2, -2); |
| 282 controller().OnLongPressEvent(); | 300 controller().OnLongPressEvent(); |
| 283 controller().OnSelectionEmpty(true); | 301 controller().OnSelectionEmpty(true); |
| 284 ChangeInsertion(insertion_rect, visible); | 302 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 285 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 303 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 286 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 304 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 287 | 305 |
| 288 // Single Tap on an empty edit field should clear insertion handle. | 306 // Single Tap on an empty edit field should clear insertion handle. |
| 289 controller().OnTapEvent(); | 307 controller().OnTapEvent(); |
| 290 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 308 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 291 } | 309 } |
| 292 | 310 |
| 293 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { | 311 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { |
| 294 AllowShowingOnTapForEmptyEditable(); | 312 AllowShowingOnTapForEmptyEditable(); |
| 295 | 313 |
| 296 gfx::RectF insertion_rect(5, 5, 0, 10); | 314 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 297 bool visible = true; | 315 bool visible = true; |
| 298 controller().OnSelectionEditable(true); | 316 controller().OnSelectionEditable(true); |
| 299 | 317 |
| 300 // Taps on an empty editable region should show the insertion handle if the | 318 // Taps on an empty editable region should show the insertion handle if the |
| 301 // controller is created with |show_on_tap_for_empty_editable| set to true. | 319 // controller is created with |show_on_tap_for_empty_editable| set to true. |
| 302 controller().OnTapEvent(); | 320 controller().OnTapEvent(); |
| 303 controller().OnSelectionEmpty(true); | 321 controller().OnSelectionEmpty(true); |
| 304 ChangeInsertion(insertion_rect, visible); | 322 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 305 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 323 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 306 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 324 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 307 | 325 |
| 308 // Additional taps should not hide the insertion handle in this case. | 326 // Additional taps should not hide the insertion handle in this case. |
| 309 controller().OnTapEvent(); | 327 controller().OnTapEvent(); |
| 310 ChangeInsertion(insertion_rect, visible); | 328 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 311 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 329 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 312 } | 330 } |
| 313 | 331 |
| 314 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | 332 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { |
| 315 gfx::RectF insertion_rect(5, 5, 0, 10); | 333 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 316 bool visible = true; | 334 bool visible = true; |
| 317 | 335 |
| 318 // Simulate the user tapping an empty text field. | 336 // Simulate the user tapping an empty text field. |
| 319 controller().OnTapEvent(); | 337 controller().OnTapEvent(); |
| 320 controller().OnSelectionEditable(true); | 338 controller().OnSelectionEditable(true); |
| 321 controller().OnSelectionEmpty(true); | 339 controller().OnSelectionEmpty(true); |
| 322 ChangeInsertion(insertion_rect, visible); | 340 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 323 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 341 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 324 | 342 |
| 325 // Simulate the cursor moving while a user is typing. | 343 // Simulate the cursor moving while a user is typing. |
| 326 insertion_rect.Offset(10, 0); | 344 insertion_rect.Offset(10, 0); |
| 327 controller().OnSelectionEmpty(false); | 345 controller().OnSelectionEmpty(false); |
| 328 ChangeInsertion(insertion_rect, visible); | 346 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 329 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 347 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 330 | 348 |
| 331 // If the user taps the *same* position as the cursor at the end of the text | 349 // If the user taps the *same* position as the cursor at the end of the text |
| 332 // entry, the handle should appear. | 350 // entry, the handle should appear. |
| 333 controller().OnTapEvent(); | 351 controller().OnTapEvent(); |
| 334 ChangeInsertion(insertion_rect, visible); | 352 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 335 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 353 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 336 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 354 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 337 } | 355 } |
| 338 | 356 |
| 339 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 357 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
| 340 controller().OnLongPressEvent(); | 358 controller().OnLongPressEvent(); |
| 341 controller().OnSelectionEditable(true); | 359 controller().OnSelectionEditable(true); |
| 342 | 360 |
| 343 gfx::RectF start_rect(5, 5, 0, 10); | 361 gfx::RectF start_rect(5, 5, 0, 10); |
| 344 gfx::RectF end_rect(50, 5, 0, 10); | 362 gfx::RectF end_rect(50, 5, 0, 10); |
| 345 bool visible = true; | 363 bool visible = true; |
| 346 | 364 |
| 347 ChangeInsertion(start_rect, visible); | 365 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 348 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 366 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 349 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 367 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 350 | 368 |
| 351 ChangeSelection(start_rect, visible, end_rect, visible); | 369 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 352 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 370 EXPECT_THAT(controller().GetAndResetEvents(), |
| 353 SELECTION_SHOWN)); | 371 ElementsAre(INSERTION_CLEARED, SELECTION_SHOWN)); |
| 354 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 372 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 355 | 373 |
| 356 ChangeInsertion(end_rect, visible); | 374 EXPECT_TRUE(ChangeInsertion(end_rect, visible)); |
| 357 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 375 EXPECT_THAT(controller().GetAndResetEvents(), |
| 358 INSERTION_SHOWN)); | 376 ElementsAre(SELECTION_CLEARED, INSERTION_SHOWN)); |
| 359 EXPECT_EQ(end_rect.bottom_left(), GetLastEventAnchor()); | 377 EXPECT_EQ(end_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 360 | 378 |
| 361 controller().HideAndDisallowShowingAutomatically(); | 379 controller().HideAndDisallowShowingAutomatically(); |
| 362 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 380 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 363 | 381 |
| 364 controller().OnTapEvent(); | 382 controller().OnTapEvent(); |
| 365 ChangeInsertion(end_rect, visible); | 383 EXPECT_TRUE(ChangeInsertion(end_rect, visible)); |
| 366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 384 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 367 EXPECT_EQ(end_rect.bottom_left(), GetLastEventAnchor()); | 385 EXPECT_EQ(end_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 368 } | 386 } |
| 369 | 387 |
| 370 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 388 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
| 371 base::TimeTicks event_time = base::TimeTicks::Now(); | 389 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 372 controller().OnTapEvent(); | 390 controller().OnTapEvent(); |
| 373 controller().OnSelectionEditable(true); | 391 controller().OnSelectionEditable(true); |
| 374 | 392 |
| 375 // The touch sequence should not be handled if insertion is not active. | 393 // The touch sequence should not be handled if insertion is not active. |
| 376 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 394 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 377 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 395 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 378 | 396 |
| 379 float line_height = 10.f; | 397 float line_height = 10.f; |
| 380 gfx::RectF start_rect(10, 0, 0, line_height); | 398 gfx::RectF start_rect(10, 0, 0, line_height); |
| 381 bool visible = true; | 399 bool visible = true; |
| 382 ChangeInsertion(start_rect, visible); | 400 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 383 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 401 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 384 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 402 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 385 | 403 |
| 386 // The touch sequence should be handled only if the drawable reports a hit. | 404 // The touch sequence should be handled only if the drawable reports a hit. |
| 387 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 405 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 388 SetDraggingEnabled(true); | 406 controller().set_dragging_enabled(true); |
| 389 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 407 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 390 EXPECT_FALSE(GetAndResetCaretMoved()); | 408 EXPECT_FALSE(controller().GetAndResetCaretMoved()); |
| 391 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 409 EXPECT_THAT(controller().GetAndResetEvents(), |
| 410 ElementsAre(INSERTION_DRAG_STARTED)); |
| 392 | 411 |
| 393 // The MoveCaret() result should reflect the movement. | 412 // The MoveCaret() result should reflect the movement. |
| 394 // The reported position is offset from the center of |start_rect|. | 413 // The reported position is offset from the center of |start_rect|. |
| 395 gfx::PointF start_offset = start_rect.CenterPoint(); | 414 gfx::PointF start_offset = start_rect.CenterPoint(); |
| 396 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5); | 415 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5); |
| 397 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 416 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 398 EXPECT_TRUE(GetAndResetCaretMoved()); | 417 EXPECT_TRUE(controller().GetAndResetCaretMoved()); |
| 399 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), GetLastCaretPosition()); | 418 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), |
| 419 controller().GetLastCaretPosition()); |
| 400 | 420 |
| 401 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5); | 421 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5); |
| 402 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 422 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 403 EXPECT_TRUE(GetAndResetCaretMoved()); | 423 EXPECT_TRUE(controller().GetAndResetCaretMoved()); |
| 404 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), GetLastCaretPosition()); | 424 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), |
| 425 controller().GetLastCaretPosition()); |
| 405 | 426 |
| 406 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 10); | 427 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 10); |
| 407 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 428 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 408 EXPECT_TRUE(GetAndResetCaretMoved()); | 429 EXPECT_TRUE(controller().GetAndResetCaretMoved()); |
| 409 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 10), GetLastCaretPosition()); | 430 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 10), |
| 431 controller().GetLastCaretPosition()); |
| 410 | 432 |
| 411 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 433 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 412 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 434 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 413 EXPECT_FALSE(GetAndResetCaretMoved()); | 435 EXPECT_FALSE(controller().GetAndResetCaretMoved()); |
| 414 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); | 436 EXPECT_THAT(controller().GetAndResetEvents(), |
| 437 ElementsAre(INSERTION_DRAG_STOPPED)); |
| 415 | 438 |
| 416 // Once the drag is complete, no more touch events should be consumed until | 439 // Once the drag is complete, no more touch events should be consumed until |
| 417 // the next ACTION_DOWN. | 440 // the next ACTION_DOWN. |
| 418 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 441 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 419 } | 442 } |
| 420 | 443 |
| 421 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 444 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
| 422 base::TimeTicks event_time = base::TimeTicks::Now(); | 445 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 423 controller().OnTapEvent(); | 446 controller().OnTapEvent(); |
| 424 controller().OnSelectionEditable(true); | 447 controller().OnSelectionEditable(true); |
| 425 SetDraggingEnabled(true); | 448 controller().set_dragging_enabled(true); |
| 426 | 449 |
| 427 gfx::RectF start_rect(10, 0, 0, 10); | 450 gfx::RectF start_rect(10, 0, 0, 10); |
| 428 bool visible = true; | 451 bool visible = true; |
| 429 ChangeInsertion(start_rect, visible); | 452 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 430 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 453 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 431 | 454 |
| 432 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 455 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 433 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 456 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 434 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. | 457 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. |
| 435 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 458 EXPECT_THAT(controller().GetAndResetEvents(), |
| 459 ElementsAre(INSERTION_DRAG_STARTED)); |
| 436 | 460 |
| 437 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 461 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 438 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 462 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 439 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 463 EXPECT_THAT(controller().GetAndResetEvents(), |
| 440 INSERTION_DRAG_STOPPED)); | 464 ElementsAre(INSERTION_TAPPED, INSERTION_DRAG_STOPPED)); |
| 441 | 465 |
| 442 // Reset the insertion. | 466 // Reset the insertion. |
| 443 ClearInsertion(); | 467 EXPECT_TRUE(ClearInsertion()); |
| 444 controller().OnTapEvent(); | 468 controller().OnTapEvent(); |
| 445 ChangeInsertion(start_rect, visible); | 469 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 446 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 470 EXPECT_THAT(controller().GetAndResetEvents(), |
| 447 INSERTION_SHOWN)); | 471 ElementsAre(INSERTION_CLEARED, INSERTION_SHOWN)); |
| 448 | 472 |
| 449 // No tap should be signalled if the time between DOWN and UP was too long. | 473 // No tap should be signalled if the time between DOWN and UP was too long. |
| 450 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 474 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 451 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 475 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 452 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 476 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
| 453 event_time + base::TimeDelta::FromSeconds(1), | 477 event_time + base::TimeDelta::FromSeconds(1), |
| 454 0, | 478 0, |
| 455 0); | 479 0); |
| 456 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 480 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 457 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 481 EXPECT_THAT(controller().GetAndResetEvents(), |
| 458 INSERTION_DRAG_STOPPED)); | 482 ElementsAre(INSERTION_DRAG_STARTED, INSERTION_DRAG_STOPPED)); |
| 459 | 483 |
| 460 // Reset the insertion. | 484 // Reset the insertion. |
| 461 ClearInsertion(); | 485 EXPECT_TRUE(ClearInsertion()); |
| 462 controller().OnTapEvent(); | 486 controller().OnTapEvent(); |
| 463 ChangeInsertion(start_rect, visible); | 487 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 464 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 488 EXPECT_THAT(controller().GetAndResetEvents(), |
| 465 INSERTION_SHOWN)); | 489 ElementsAre(INSERTION_CLEARED, INSERTION_SHOWN)); |
| 466 | 490 |
| 467 // No tap should be signalled if the drag was too long. | 491 // No tap should be signalled if the drag was too long. |
| 468 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 492 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 469 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 493 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 470 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 494 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
| 471 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 495 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 472 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 496 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
| 473 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 497 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 474 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 498 EXPECT_THAT(controller().GetAndResetEvents(), |
| 475 INSERTION_DRAG_STOPPED)); | 499 ElementsAre(INSERTION_DRAG_STARTED, INSERTION_DRAG_STOPPED)); |
| 476 | 500 |
| 477 // Reset the insertion. | 501 // Reset the insertion. |
| 478 ClearInsertion(); | 502 EXPECT_TRUE(ClearInsertion()); |
| 479 controller().OnTapEvent(); | 503 controller().OnTapEvent(); |
| 480 ChangeInsertion(start_rect, visible); | 504 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 481 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 505 EXPECT_THAT(controller().GetAndResetEvents(), |
| 482 INSERTION_SHOWN)); | 506 ElementsAre(INSERTION_CLEARED, INSERTION_SHOWN)); |
| 483 | 507 |
| 484 // No tap should be signalled if the touch sequence is cancelled. | 508 // No tap should be signalled if the touch sequence is cancelled. |
| 485 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 509 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 486 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 487 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 511 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
| 488 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 512 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 489 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 513 EXPECT_THAT(controller().GetAndResetEvents(), |
| 490 INSERTION_DRAG_STOPPED)); | 514 ElementsAre(INSERTION_DRAG_STARTED, INSERTION_DRAG_STOPPED)); |
| 491 } | 515 } |
| 492 | 516 |
| 493 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 517 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
| 494 base::TimeTicks event_time = base::TimeTicks::Now(); | 518 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 495 controller().OnTapEvent(); | 519 controller().OnTapEvent(); |
| 496 controller().OnSelectionEditable(true); | 520 controller().OnSelectionEditable(true); |
| 497 SetDraggingEnabled(true); | 521 controller().set_dragging_enabled(true); |
| 498 | 522 |
| 499 gfx::RectF anchor_rect(10, 0, 0, 10); | 523 gfx::RectF anchor_rect(10, 0, 0, 10); |
| 500 bool visible = true; | 524 bool visible = true; |
| 501 ChangeInsertion(anchor_rect, visible); | 525 EXPECT_TRUE(ChangeInsertion(anchor_rect, visible)); |
| 502 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 526 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 503 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); | 527 EXPECT_EQ(anchor_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 504 | 528 |
| 505 // Tapping again shouldn't reset the active insertion point. | 529 // Tapping again shouldn't reset the active insertion point. |
| 506 controller().OnTapEvent(); | 530 controller().OnTapEvent(); |
| 507 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 531 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 508 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 532 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 509 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 533 EXPECT_THAT(controller().GetAndResetEvents(), |
| 510 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); | 534 ElementsAre(INSERTION_DRAG_STARTED)); |
| 535 EXPECT_EQ(anchor_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 511 | 536 |
| 512 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 537 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 513 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 538 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 514 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 539 EXPECT_THAT(controller().GetAndResetEvents(), |
| 515 INSERTION_DRAG_STOPPED)); | 540 ElementsAre(INSERTION_TAPPED, INSERTION_DRAG_STOPPED)); |
| 516 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); | 541 EXPECT_EQ(anchor_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 517 | 542 |
| 518 anchor_rect.Offset(5, 15); | 543 anchor_rect.Offset(5, 15); |
| 519 ChangeInsertion(anchor_rect, visible); | 544 EXPECT_TRUE(ChangeInsertion(anchor_rect, visible)); |
| 520 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 545 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 521 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); | 546 EXPECT_EQ(anchor_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 522 | 547 |
| 523 // Pressing shouldn't reset the active insertion point. | 548 // Pressing shouldn't reset the active insertion point. |
| 524 controller().OnLongPressEvent(); | 549 controller().OnLongPressEvent(); |
| 525 controller().OnSelectionEmpty(true); | 550 controller().OnSelectionEmpty(true); |
| 526 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 551 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 527 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 552 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 528 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 553 EXPECT_THAT(controller().GetAndResetEvents(), |
| 529 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); | 554 ElementsAre(INSERTION_DRAG_STARTED)); |
| 555 EXPECT_EQ(anchor_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 530 | 556 |
| 531 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 557 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 532 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 558 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 533 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 559 EXPECT_THAT(controller().GetAndResetEvents(), |
| 534 INSERTION_DRAG_STOPPED)); | 560 ElementsAre(INSERTION_TAPPED, INSERTION_DRAG_STOPPED)); |
| 535 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); | 561 EXPECT_EQ(anchor_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 536 } | 562 } |
| 537 | 563 |
| 538 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 564 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 539 gfx::RectF start_rect(5, 5, 0, 10); | 565 gfx::RectF start_rect(5, 5, 0, 10); |
| 540 gfx::RectF end_rect(50, 5, 0, 10); | 566 gfx::RectF end_rect(50, 5, 0, 10); |
| 541 bool visible = true; | 567 bool visible = true; |
| 542 | 568 |
| 543 // Selection events are ignored until automatic showing is enabled. | 569 // Selection events are ignored until automatic showing is enabled. |
| 544 ChangeSelection(start_rect, visible, end_rect, visible); | 570 EXPECT_FALSE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 545 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 571 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 546 | 572 |
| 547 controller().OnLongPressEvent(); | 573 controller().OnLongPressEvent(); |
| 548 ChangeSelection(start_rect, visible, end_rect, visible); | 574 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 549 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 575 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 550 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 576 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 551 | 577 |
| 552 start_rect.Offset(1, 0); | 578 start_rect.Offset(1, 0); |
| 553 ChangeSelection(start_rect, visible, end_rect, visible); | 579 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 554 // Selection movement does not currently trigger a separate event. | 580 // Selection movement does not currently trigger a separate event. |
| 555 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 581 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 556 | 582 |
| 557 ClearSelection(); | 583 EXPECT_TRUE(ClearSelection()); |
| 558 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 584 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 559 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 585 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 560 } | 586 } |
| 561 | 587 |
| 562 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 588 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 563 gfx::RectF start_rect(5, 5, 0, 10); | 589 gfx::RectF start_rect(5, 5, 0, 10); |
| 564 gfx::RectF end_rect(50, 5, 0, 10); | 590 gfx::RectF end_rect(50, 5, 0, 10); |
| 565 bool visible = true; | 591 bool visible = true; |
| 566 | 592 |
| 567 controller().OnLongPressEvent(); | 593 controller().OnLongPressEvent(); |
| 568 ChangeSelection(start_rect, visible, end_rect, visible); | 594 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 569 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 595 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 570 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 596 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 571 | 597 |
| 572 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 598 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
| 573 // event notification. | 599 // event notification. |
| 574 start_rect.Offset(10, 10); | 600 start_rect.Offset(10, 10); |
| 575 controller().OnLongPressEvent(); | 601 controller().OnLongPressEvent(); |
| 576 ChangeSelection(start_rect, visible, end_rect, visible); | 602 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 577 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 603 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 578 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 604 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 579 } | 605 } |
| 580 | 606 |
| 581 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 607 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 582 base::TimeTicks event_time = base::TimeTicks::Now(); | 608 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 583 controller().OnLongPressEvent(); | 609 controller().OnLongPressEvent(); |
| 584 | 610 |
| 585 // The touch sequence should not be handled if selection is not active. | 611 // The touch sequence should not be handled if selection is not active. |
| 586 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 612 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 587 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 613 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 588 | 614 |
| 589 float line_height = 10.f; | 615 float line_height = 10.f; |
| 590 gfx::RectF start_rect(0, 0, 0, line_height); | 616 gfx::RectF start_rect(0, 0, 0, line_height); |
| 591 gfx::RectF end_rect(50, 0, 0, line_height); | 617 gfx::RectF end_rect(50, 0, 0, line_height); |
| 592 bool visible = true; | 618 bool visible = true; |
| 593 ChangeSelection(start_rect, visible, end_rect, visible); | 619 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 594 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 620 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 595 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 621 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 596 | 622 |
| 597 // The touch sequence should be handled only if the drawable reports a hit. | 623 // The touch sequence should be handled only if the drawable reports a hit. |
| 598 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 624 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 599 SetDraggingEnabled(true); | 625 controller().set_dragging_enabled(true); |
| 600 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 626 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 601 EXPECT_FALSE(GetAndResetSelectionMoved()); | 627 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 602 | 628 |
| 603 // The SelectBetweenCoordinates() result should reflect the movement. Note | 629 // The SelectBetweenCoordinates() result should reflect the movement. Note |
| 604 // that the start coordinate will always reflect the "fixed" handle's | 630 // that the start coordinate will always reflect the "fixed" handle's |
| 605 // position, in this case the position from |end_rect|. | 631 // position, in this case the position from |end_rect|. |
| 606 // Note that the reported position is offset from the center of the | 632 // Note that the reported position is offset from the center of the |
| 607 // input rects (i.e., the middle of the corresponding text line). | 633 // input rects (i.e., the middle of the corresponding text line). |
| 608 gfx::PointF fixed_offset = end_rect.CenterPoint(); | 634 gfx::PointF fixed_offset = end_rect.CenterPoint(); |
| 609 gfx::PointF start_offset = start_rect.CenterPoint(); | 635 gfx::PointF start_offset = start_rect.CenterPoint(); |
| 610 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5); | 636 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5); |
| 611 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 637 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 612 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 638 EXPECT_THAT(controller().GetAndResetEvents(), |
| 613 EXPECT_TRUE(GetAndResetSelectionMoved()); | 639 ElementsAre(SELECTION_DRAG_STARTED)); |
| 614 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); | 640 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 615 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 641 EXPECT_EQ(fixed_offset, controller().GetLastSelectionStart()); |
| 642 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), |
| 643 controller().GetLastSelectionEnd()); |
| 616 | 644 |
| 617 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5); | 645 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5); |
| 618 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 646 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 619 EXPECT_TRUE(GetAndResetSelectionMoved()); | 647 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 620 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); | 648 EXPECT_EQ(fixed_offset, controller().GetLastSelectionStart()); |
| 621 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), GetLastSelectionEnd()); | 649 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), |
| 650 controller().GetLastSelectionEnd()); |
| 622 | 651 |
| 623 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 5); | 652 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 5); |
| 624 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 653 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 625 EXPECT_TRUE(GetAndResetSelectionMoved()); | 654 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 626 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); | 655 EXPECT_EQ(fixed_offset, controller().GetLastSelectionStart()); |
| 627 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 5), GetLastSelectionEnd()); | 656 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 5), |
| 657 controller().GetLastSelectionEnd()); |
| 628 | 658 |
| 629 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 659 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 630 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 660 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 631 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 661 EXPECT_THAT(controller().GetAndResetEvents(), |
| 632 EXPECT_FALSE(GetAndResetSelectionMoved()); | 662 ElementsAre(SELECTION_DRAG_STOPPED)); |
| 663 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 633 | 664 |
| 634 // Once the drag is complete, no more touch events should be consumed until | 665 // Once the drag is complete, no more touch events should be consumed until |
| 635 // the next ACTION_DOWN. | 666 // the next ACTION_DOWN. |
| 636 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 667 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 637 } | 668 } |
| 638 | 669 |
| 639 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 670 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 640 base::TimeTicks event_time = base::TimeTicks::Now(); | 671 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 641 controller().OnLongPressEvent(); | 672 controller().OnLongPressEvent(); |
| 642 | 673 |
| 643 float line_height = 10.f; | 674 float line_height = 10.f; |
| 644 gfx::RectF start_rect(0, 0, 0, line_height); | 675 gfx::RectF start_rect(0, 0, 0, line_height); |
| 645 gfx::RectF end_rect(50, 0, 0, line_height); | 676 gfx::RectF end_rect(50, 0, 0, line_height); |
| 646 bool visible = true; | 677 bool visible = true; |
| 647 ChangeSelection(start_rect, visible, end_rect, visible); | 678 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 648 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 679 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 649 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 680 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 650 | 681 |
| 651 // The ACTION_DOWN should lock to the closest handle. | 682 // The ACTION_DOWN should lock to the closest handle. |
| 652 gfx::PointF end_offset = end_rect.CenterPoint(); | 683 gfx::PointF end_offset = end_rect.CenterPoint(); |
| 653 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 684 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 654 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 685 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
| 655 MockMotionEvent event( | 686 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, |
| 656 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 687 0); |
| 657 SetDraggingEnabled(true); | 688 controller().set_dragging_enabled(true); |
| 658 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 689 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 659 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 690 EXPECT_THAT(controller().GetAndResetEvents(), |
| 660 EXPECT_FALSE(GetAndResetSelectionMoved()); | 691 ElementsAre(SELECTION_DRAG_STARTED)); |
| 692 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 661 | 693 |
| 662 // Even though the ACTION_MOVE is over the start handle, it should continue | 694 // Even though the ACTION_MOVE is over the start handle, it should continue |
| 663 // targetting the end handle that consumed the ACTION_DOWN. | 695 // targetting the end handle that consumed the ACTION_DOWN. |
| 664 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 0); | 696 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 0); |
| 665 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 697 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 666 EXPECT_TRUE(GetAndResetSelectionMoved()); | 698 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 667 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); | 699 EXPECT_EQ(fixed_offset, controller().GetLastSelectionStart()); |
| 668 EXPECT_EQ(end_offset - gfx::Vector2dF(touch_down_x, 0), | 700 EXPECT_EQ(end_offset - gfx::Vector2dF(touch_down_x, 0), |
| 669 GetLastSelectionEnd()); | 701 controller().GetLastSelectionEnd()); |
| 670 | 702 |
| 671 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 703 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 672 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 704 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 673 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 705 EXPECT_THAT(controller().GetAndResetEvents(), |
| 674 EXPECT_FALSE(GetAndResetSelectionMoved()); | 706 ElementsAre(SELECTION_DRAG_STOPPED)); |
| 707 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 675 } | 708 } |
| 676 | 709 |
| 677 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 710 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 678 base::TimeTicks event_time = base::TimeTicks::Now(); | 711 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 679 controller().OnLongPressEvent(); | 712 controller().OnLongPressEvent(); |
| 680 | 713 |
| 681 float line_height = 10.f; | 714 float line_height = 10.f; |
| 682 gfx::RectF start_rect(50, line_height, 0, line_height); | 715 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 683 gfx::RectF end_rect(100, line_height, 0, line_height); | 716 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 684 bool visible = true; | 717 bool visible = true; |
| 685 ChangeSelection(start_rect, visible, end_rect, visible); | 718 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 686 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 719 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 687 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 720 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 688 | 721 |
| 689 SetDraggingEnabled(true); | 722 controller().set_dragging_enabled(true); |
| 690 | 723 |
| 691 // Move the extent, not triggering a swap of points. | 724 // Move the extent, not triggering a swap of points. |
| 692 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 725 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 693 end_rect.x(), end_rect.bottom()); | 726 end_rect.x(), end_rect.bottom()); |
| 694 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 727 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 695 EXPECT_FALSE(GetAndResetSelectionMoved()); | 728 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 696 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 729 EXPECT_FALSE(controller().GetAndResetSelectionPointsSwapped()); |
| 697 | 730 |
| 698 gfx::PointF base_offset = start_rect.CenterPoint(); | 731 gfx::PointF base_offset = start_rect.CenterPoint(); |
| 699 gfx::PointF extent_offset = end_rect.CenterPoint(); | 732 gfx::PointF extent_offset = end_rect.CenterPoint(); |
| 700 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 733 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 701 end_rect.x(), end_rect.bottom() + 5); | 734 end_rect.x(), end_rect.bottom() + 5); |
| 702 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 735 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 703 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 736 EXPECT_THAT(controller().GetAndResetEvents(), |
| 704 EXPECT_TRUE(GetAndResetSelectionMoved()); | 737 ElementsAre(SELECTION_DRAG_STARTED)); |
| 705 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 738 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 706 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 739 EXPECT_FALSE(controller().GetAndResetSelectionPointsSwapped()); |
| 707 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 740 EXPECT_EQ(base_offset, controller().GetLastSelectionStart()); |
| 741 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), |
| 742 controller().GetLastSelectionEnd()); |
| 708 | 743 |
| 709 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 744 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 710 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 745 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 711 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 746 EXPECT_THAT(controller().GetAndResetEvents(), |
| 712 EXPECT_FALSE(GetAndResetSelectionMoved()); | 747 ElementsAre(SELECTION_DRAG_STOPPED)); |
| 748 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 713 | 749 |
| 714 end_rect += gfx::Vector2dF(0, 5); | 750 end_rect += gfx::Vector2dF(0, 5); |
| 715 ChangeSelection(start_rect, visible, end_rect, visible); | 751 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 716 | 752 |
| 717 // Move the base, triggering a swap of points. | 753 // Move the base, triggering a swap of points. |
| 718 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 754 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
| 719 start_rect.x(), start_rect.bottom()); | 755 start_rect.x(), start_rect.bottom()); |
| 720 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 756 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 721 EXPECT_FALSE(GetAndResetSelectionMoved()); | 757 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 722 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); | 758 EXPECT_TRUE(controller().GetAndResetSelectionPointsSwapped()); |
| 723 | 759 |
| 724 base_offset = end_rect.CenterPoint(); | 760 base_offset = end_rect.CenterPoint(); |
| 725 extent_offset = start_rect.CenterPoint(); | 761 extent_offset = start_rect.CenterPoint(); |
| 726 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 762 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 727 start_rect.x(), start_rect.bottom() + 5); | 763 start_rect.x(), start_rect.bottom() + 5); |
| 728 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 764 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 729 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 765 EXPECT_THAT(controller().GetAndResetEvents(), |
| 730 EXPECT_TRUE(GetAndResetSelectionMoved()); | 766 ElementsAre(SELECTION_DRAG_STARTED)); |
| 731 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 767 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 732 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 768 EXPECT_FALSE(controller().GetAndResetSelectionPointsSwapped()); |
| 733 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 769 EXPECT_EQ(base_offset, controller().GetLastSelectionStart()); |
| 770 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), |
| 771 controller().GetLastSelectionEnd()); |
| 734 | 772 |
| 735 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 773 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 736 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 774 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 737 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 775 EXPECT_THAT(controller().GetAndResetEvents(), |
| 738 EXPECT_FALSE(GetAndResetSelectionMoved()); | 776 ElementsAre(SELECTION_DRAG_STOPPED)); |
| 777 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 739 | 778 |
| 740 start_rect += gfx::Vector2dF(0, 5); | 779 start_rect += gfx::Vector2dF(0, 5); |
| 741 ChangeSelection(start_rect, visible, end_rect, visible); | 780 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 742 | 781 |
| 743 // Move the same point again, not triggering a swap of points. | 782 // Move the same point again, not triggering a swap of points. |
| 744 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 783 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
| 745 start_rect.x(), start_rect.bottom()); | 784 start_rect.x(), start_rect.bottom()); |
| 746 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 785 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 747 EXPECT_FALSE(GetAndResetSelectionMoved()); | 786 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 748 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 787 EXPECT_FALSE(controller().GetAndResetSelectionPointsSwapped()); |
| 749 | 788 |
| 750 base_offset = end_rect.CenterPoint(); | 789 base_offset = end_rect.CenterPoint(); |
| 751 extent_offset = start_rect.CenterPoint(); | 790 extent_offset = start_rect.CenterPoint(); |
| 752 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 791 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 753 start_rect.x(), start_rect.bottom() + 5); | 792 start_rect.x(), start_rect.bottom() + 5); |
| 754 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 793 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 755 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 794 EXPECT_THAT(controller().GetAndResetEvents(), |
| 756 EXPECT_TRUE(GetAndResetSelectionMoved()); | 795 ElementsAre(SELECTION_DRAG_STARTED)); |
| 757 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 796 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 758 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 797 EXPECT_FALSE(controller().GetAndResetSelectionPointsSwapped()); |
| 759 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 798 EXPECT_EQ(base_offset, controller().GetLastSelectionStart()); |
| 799 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), |
| 800 controller().GetLastSelectionEnd()); |
| 760 | 801 |
| 761 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 802 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 762 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 803 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 763 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 804 EXPECT_THAT(controller().GetAndResetEvents(), |
| 764 EXPECT_FALSE(GetAndResetSelectionMoved()); | 805 ElementsAre(SELECTION_DRAG_STOPPED)); |
| 806 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 765 | 807 |
| 766 start_rect += gfx::Vector2dF(0, 5); | 808 start_rect += gfx::Vector2dF(0, 5); |
| 767 ChangeSelection(start_rect, visible, end_rect, visible); | 809 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 768 | 810 |
| 769 // Move the base, triggering a swap of points. | 811 // Move the base, triggering a swap of points. |
| 770 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 812 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
| 771 end_rect.x(), end_rect.bottom()); | 813 end_rect.x(), end_rect.bottom()); |
| 772 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 814 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 773 EXPECT_FALSE(GetAndResetSelectionMoved()); | 815 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 774 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); | 816 EXPECT_TRUE(controller().GetAndResetSelectionPointsSwapped()); |
| 775 | 817 |
| 776 base_offset = start_rect.CenterPoint(); | 818 base_offset = start_rect.CenterPoint(); |
| 777 extent_offset = end_rect.CenterPoint(); | 819 extent_offset = end_rect.CenterPoint(); |
| 778 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 820 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 779 end_rect.x(), end_rect.bottom() + 5); | 821 end_rect.x(), end_rect.bottom() + 5); |
| 780 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 822 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 781 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 823 EXPECT_THAT(controller().GetAndResetEvents(), |
| 782 EXPECT_TRUE(GetAndResetSelectionMoved()); | 824 ElementsAre(SELECTION_DRAG_STARTED)); |
| 783 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 825 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 784 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 826 EXPECT_FALSE(controller().GetAndResetSelectionPointsSwapped()); |
| 785 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 827 EXPECT_EQ(base_offset, controller().GetLastSelectionStart()); |
| 828 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), |
| 829 controller().GetLastSelectionEnd()); |
| 786 | 830 |
| 787 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 831 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 788 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 832 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 789 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 833 EXPECT_THAT(controller().GetAndResetEvents(), |
| 790 EXPECT_FALSE(GetAndResetSelectionMoved()); | 834 ElementsAre(SELECTION_DRAG_STOPPED)); |
| 835 EXPECT_FALSE(controller().GetAndResetSelectionMoved()); |
| 791 } | 836 } |
| 792 | 837 |
| 793 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 838 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
| 794 base::TimeTicks event_time = base::TimeTicks::Now(); | 839 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 795 controller().OnLongPressEvent(); | 840 controller().OnLongPressEvent(); |
| 796 | 841 |
| 797 float small_line_height = 1.f; | 842 float small_line_height = 1.f; |
| 798 float large_line_height = 50.f; | 843 float large_line_height = 50.f; |
| 799 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 844 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 800 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 845 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 801 bool visible = true; | 846 bool visible = true; |
| 802 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 847 EXPECT_TRUE( |
| 803 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 848 ChangeSelection(small_line_rect, visible, large_line_rect, visible)); |
| 804 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventAnchor()); | 849 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 850 EXPECT_EQ(small_line_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 805 | 851 |
| 806 // Start dragging the handle on the small line. | 852 // Start dragging the handle on the small line. |
| 807 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 853 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 808 small_line_rect.x(), small_line_rect.y()); | 854 small_line_rect.x(), small_line_rect.y()); |
| 809 SetDraggingEnabled(true); | 855 controller().set_dragging_enabled(true); |
| 810 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 856 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 811 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 857 EXPECT_THAT(controller().GetAndResetEvents(), |
| 858 ElementsAre(SELECTION_DRAG_STARTED)); |
| 812 // The drag coordinate for large lines should be capped to a reasonable | 859 // The drag coordinate for large lines should be capped to a reasonable |
| 813 // offset, allowing seamless transition to neighboring lines with different | 860 // offset, allowing seamless transition to neighboring lines with different |
| 814 // sizes. The drag coordinate for small lines should have an offset | 861 // sizes. The drag coordinate for small lines should have an offset |
| 815 // commensurate with the small line size. | 862 // commensurate with the small line size. |
| 816 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 5.f), | 863 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 5.f), |
| 817 GetLastSelectionStart()); | 864 controller().GetLastSelectionStart()); |
| 818 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 865 EXPECT_EQ(small_line_rect.CenterPoint(), controller().GetLastSelectionEnd()); |
| 819 | 866 |
| 820 small_line_rect += gfx::Vector2dF(25.f, 0); | 867 small_line_rect += gfx::Vector2dF(25.f, 0); |
| 821 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 868 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 822 small_line_rect.x(), small_line_rect.y()); | 869 small_line_rect.x(), small_line_rect.y()); |
| 823 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 870 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 824 EXPECT_TRUE(GetAndResetSelectionMoved()); | 871 EXPECT_TRUE(controller().GetAndResetSelectionMoved()); |
| 825 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 872 EXPECT_EQ(small_line_rect.CenterPoint(), controller().GetLastSelectionEnd()); |
| 826 } | 873 } |
| 827 | 874 |
| 828 TEST_F(TouchSelectionControllerTest, Animation) { | 875 TEST_F(TouchSelectionControllerTest, Animation) { |
| 829 controller().OnTapEvent(); | 876 controller().OnTapEvent(); |
| 830 controller().OnSelectionEditable(true); | 877 controller().OnSelectionEditable(true); |
| 831 | 878 |
| 832 gfx::RectF insertion_rect(5, 5, 0, 10); | 879 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 833 | 880 |
| 834 bool visible = true; | 881 bool visible = true; |
| 835 ChangeInsertion(insertion_rect, visible); | 882 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 836 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 883 EXPECT_FALSE(controller().GetAndResetNeedsAnimate()); |
| 837 | 884 |
| 838 visible = false; | 885 visible = false; |
| 839 ChangeInsertion(insertion_rect, visible); | 886 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 840 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 887 EXPECT_TRUE(controller().GetAndResetNeedsAnimate()); |
| 841 | 888 |
| 842 visible = true; | 889 visible = true; |
| 843 ChangeInsertion(insertion_rect, visible); | 890 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 844 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 891 EXPECT_TRUE(controller().GetAndResetNeedsAnimate()); |
| 845 | 892 |
| 846 // If the handles are explicity hidden, no animation should be triggered. | 893 // If the handles are explicity hidden, no animation should be triggered. |
| 847 controller().HideAndDisallowShowingAutomatically(); | 894 controller().HideAndDisallowShowingAutomatically(); |
| 848 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 895 EXPECT_FALSE(controller().GetAndResetNeedsAnimate()); |
| 849 | 896 |
| 850 // If the client doesn't support animation, no animation should be triggered. | 897 // If the client doesn't support animation, no animation should be triggered. |
| 851 SetAnimationEnabled(false); | 898 controller().set_animation_enabled(false); |
| 852 controller().OnTapEvent(); | 899 controller().OnTapEvent(); |
| 853 visible = true; | 900 visible = true; |
| 854 ChangeInsertion(insertion_rect, visible); | 901 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 855 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 902 EXPECT_FALSE(controller().GetAndResetNeedsAnimate()); |
| 856 } | 903 } |
| 857 | 904 |
| 858 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 905 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 859 controller().OnTapEvent(); | 906 controller().OnTapEvent(); |
| 860 controller().OnSelectionEditable(true); | 907 controller().OnSelectionEditable(true); |
| 861 | 908 |
| 862 gfx::RectF insertion_rect(5, 5, 0, 10); | 909 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 863 | 910 |
| 864 bool visible = true; | 911 bool visible = true; |
| 865 ChangeInsertion(insertion_rect, visible); | 912 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 866 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 913 EXPECT_FALSE(controller().GetAndResetNeedsAnimate()); |
| 867 | 914 |
| 868 controller().SetTemporarilyHidden(true); | 915 controller().SetTemporarilyHidden(true); |
| 869 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 916 EXPECT_TRUE(controller().GetAndResetNeedsAnimate()); |
| 870 | 917 |
| 871 visible = false; | 918 visible = false; |
| 872 ChangeInsertion(insertion_rect, visible); | 919 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 873 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 920 EXPECT_FALSE(controller().GetAndResetNeedsAnimate()); |
| 874 | 921 |
| 875 visible = true; | 922 visible = true; |
| 876 ChangeInsertion(insertion_rect, visible); | 923 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 877 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 924 EXPECT_FALSE(controller().GetAndResetNeedsAnimate()); |
| 878 | 925 |
| 879 controller().SetTemporarilyHidden(false); | 926 controller().SetTemporarilyHidden(false); |
| 880 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 927 EXPECT_TRUE(controller().GetAndResetNeedsAnimate()); |
| 881 } | 928 } |
| 882 | 929 |
| 883 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 930 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 884 gfx::RectF start_rect(5, 5, 0, 10); | 931 gfx::RectF start_rect(5, 5, 0, 10); |
| 885 gfx::RectF end_rect(50, 5, 0, 10); | 932 gfx::RectF end_rect(50, 5, 0, 10); |
| 886 bool visible = true; | 933 bool visible = true; |
| 887 | 934 |
| 888 controller().OnLongPressEvent(); | 935 controller().OnLongPressEvent(); |
| 889 ChangeSelection(start_rect, visible, end_rect, visible); | 936 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 890 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 937 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 891 | 938 |
| 892 // Selection should not be cleared if the selection bounds have not changed. | 939 // Selection should not be cleared if the selection bounds have not changed. |
| 893 controller().OnTapEvent(); | 940 controller().OnTapEvent(); |
| 894 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 941 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 895 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 942 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 896 | 943 |
| 897 controller().OnTapEvent(); | 944 controller().OnTapEvent(); |
| 898 ClearSelection(); | 945 EXPECT_TRUE(ClearSelection()); |
| 899 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 946 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 900 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 947 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 901 } | 948 } |
| 902 | 949 |
| 903 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 950 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
| 904 gfx::RectF start_rect(5, 5, 0, 10); | 951 gfx::RectF start_rect(5, 5, 0, 10); |
| 905 gfx::RectF end_rect(50, 5, 0, 10); | 952 gfx::RectF end_rect(50, 5, 0, 10); |
| 906 bool visible = true; | 953 bool visible = true; |
| 907 | 954 |
| 908 // The selection should not be activated, as it wasn't yet allowed. | 955 // The selection should not be activated, as it wasn't yet allowed. |
| 909 ChangeSelection(start_rect, visible, end_rect, visible); | 956 EXPECT_FALSE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 910 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); | 957 EXPECT_EQ(gfx::PointF(), controller().GetLastEventAnchor()); |
| 911 | 958 |
| 912 // Now explicitly allow showing from the previously supplied bounds. | 959 // Now explicitly allow showing from the previously supplied bounds. |
| 913 controller().AllowShowingFromCurrentSelection(); | 960 controller().AllowShowingFromCurrentSelection(); |
| 914 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 961 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 915 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 962 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 916 | 963 |
| 917 // Repeated calls to show from the current selection should be ignored. | 964 // Repeated calls to show from the current selection should be ignored. |
| 918 controller().AllowShowingFromCurrentSelection(); | 965 controller().AllowShowingFromCurrentSelection(); |
| 919 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 966 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 920 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); | 967 EXPECT_EQ(start_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 921 | 968 |
| 922 // Trying to show from an empty selection will have no result. | 969 // Trying to show from an empty selection will have no result. |
| 923 ClearSelection(); | 970 EXPECT_TRUE(ClearSelection()); |
| 924 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 971 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 925 controller().AllowShowingFromCurrentSelection(); | 972 controller().AllowShowingFromCurrentSelection(); |
| 926 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 973 EXPECT_THAT(controller().GetAndResetEvents(), IsEmpty()); |
| 927 | 974 |
| 928 // Showing the insertion handle should also be supported. | 975 // Showing the insertion handle should also be supported. |
| 929 controller().OnSelectionEditable(true); | 976 controller().OnSelectionEditable(true); |
| 930 controller().OnSelectionEmpty(false); | 977 controller().OnSelectionEmpty(false); |
| 931 controller().HideAndDisallowShowingAutomatically(); | 978 controller().HideAndDisallowShowingAutomatically(); |
| 932 gfx::RectF insertion_rect(5, 5, 0, 10); | 979 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 933 ChangeInsertion(insertion_rect, visible); | 980 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 934 controller().AllowShowingFromCurrentSelection(); | 981 controller().AllowShowingFromCurrentSelection(); |
| 935 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 982 EXPECT_THAT(controller().GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 936 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); | 983 EXPECT_EQ(insertion_rect.bottom_left(), controller().GetLastEventAnchor()); |
| 937 } | 984 } |
| 938 | 985 |
| 939 } // namespace ui | 986 } // namespace ui |
| OLD | NEW |