| 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 } // namespace |
| 42 | 44 |
| 43 class TouchSelectionControllerTest : public testing::Test, | 45 class TouchSelectionControllerTest : public testing::Test, |
| 44 public TouchSelectionControllerClient { | 46 public TouchSelectionControllerClient { |
| 45 public: | 47 public: |
| 46 TouchSelectionControllerTest() | 48 TouchSelectionControllerTest() |
| 47 : caret_moved_(false), | 49 : caret_moved_(false), |
| 48 selection_moved_(false), | 50 selection_moved_(false), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 void OnSelectionEvent(SelectionEventType event) override { | 99 void OnSelectionEvent(SelectionEventType event) override { |
| 98 events_.push_back(event); | 100 events_.push_back(event); |
| 99 last_event_start_ = controller_->GetStartPosition(); | 101 last_event_start_ = controller_->GetStartPosition(); |
| 100 last_event_end_ = controller_->GetEndPosition(); | 102 last_event_end_ = controller_->GetEndPosition(); |
| 101 } | 103 } |
| 102 | 104 |
| 103 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { | 105 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { |
| 104 return make_scoped_ptr(new MockTouchHandleDrawable(&dragging_enabled_)); | 106 return make_scoped_ptr(new MockTouchHandleDrawable(&dragging_enabled_)); |
| 105 } | 107 } |
| 106 | 108 |
| 109 void OnScrollStarted() override {} |
| 110 void OnScrollCompleted() override {} |
| 111 |
| 107 void AllowShowingOnTapForEmptyEditable() { | 112 void AllowShowingOnTapForEmptyEditable() { |
| 108 bool show_on_tap_for_empty_editable = true; | 113 bool show_on_tap_for_empty_editable = true; |
| 109 controller_.reset(new TouchSelectionController( | 114 controller_.reset(new TouchSelectionController( |
| 110 this, | 115 this, |
| 111 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), | 116 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), |
| 112 kDefaulTapSlop, | 117 kDefaulTapSlop, |
| 113 show_on_tap_for_empty_editable)); | 118 show_on_tap_for_empty_editable)); |
| 114 } | 119 } |
| 115 | 120 |
| 116 void SetAnimationEnabled(bool enabled) { animation_enabled_ = enabled; } | 121 void SetAnimationEnabled(bool enabled) { animation_enabled_ = enabled; } |
| 117 void SetDraggingEnabled(bool enabled) { dragging_enabled_ = enabled; } | 122 void SetDraggingEnabled(bool enabled) { dragging_enabled_ = enabled; } |
| 118 | 123 |
| 119 void ClearSelection() { | 124 bool ClearSelection() { |
| 120 controller_->OnSelectionBoundsChanged(SelectionBound(), | 125 return controller_->OnSelectionBoundsUpdated(SelectionBound(), |
| 121 SelectionBound()); | 126 SelectionBound()); |
| 122 } | 127 } |
| 123 | 128 |
| 124 void ClearInsertion() { ClearSelection(); } | 129 bool ClearInsertion() { return ClearSelection(); } |
| 125 | 130 |
| 126 void ChangeInsertion(const gfx::RectF& rect, bool visible) { | 131 bool ChangeInsertion(const gfx::RectF& rect, bool visible) { |
| 127 SelectionBound bound; | 132 SelectionBound bound; |
| 128 bound.set_type(SelectionBound::CENTER); | 133 bound.set_type(SelectionBound::CENTER); |
| 129 bound.SetEdge(rect.origin(), rect.bottom_left()); | 134 bound.SetEdge(rect.origin(), rect.bottom_left()); |
| 130 bound.set_visible(visible); | 135 bound.set_visible(visible); |
| 131 controller_->OnSelectionBoundsChanged(bound, bound); | 136 return controller_->OnSelectionBoundsUpdated(bound, bound); |
| 132 } | 137 } |
| 133 | 138 |
| 134 void ChangeSelection(const gfx::RectF& start_rect, | 139 bool ChangeSelection(const gfx::RectF& start_rect, |
| 135 bool start_visible, | 140 bool start_visible, |
| 136 const gfx::RectF& end_rect, | 141 const gfx::RectF& end_rect, |
| 137 bool end_visible) { | 142 bool end_visible) { |
| 138 SelectionBound start_bound, end_bound; | 143 SelectionBound start_bound, end_bound; |
| 139 start_bound.set_type(SelectionBound::LEFT); | 144 start_bound.set_type(SelectionBound::LEFT); |
| 140 end_bound.set_type(SelectionBound::RIGHT); | 145 end_bound.set_type(SelectionBound::RIGHT); |
| 141 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 146 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
| 142 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 147 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
| 143 start_bound.set_visible(start_visible); | 148 start_bound.set_visible(start_visible); |
| 144 end_bound.set_visible(end_visible); | 149 end_bound.set_visible(end_visible); |
| 145 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 150 return controller_->OnSelectionBoundsUpdated(start_bound, end_bound); |
| 146 } | 151 } |
| 147 | 152 |
| 148 void Animate() { | 153 void Animate() { |
| 149 base::TimeTicks now = base::TimeTicks::Now(); | 154 base::TimeTicks now = base::TimeTicks::Now(); |
| 150 while (needs_animate_) { | 155 while (needs_animate_) { |
| 151 needs_animate_ = controller_->Animate(now); | 156 needs_animate_ = controller_->Animate(now); |
| 152 now += base::TimeDelta::FromMilliseconds(16); | 157 now += base::TimeDelta::FromMilliseconds(16); |
| 153 } | 158 } |
| 154 } | 159 } |
| 155 | 160 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 gfx::PointF selection_start_; | 203 gfx::PointF selection_start_; |
| 199 gfx::PointF selection_end_; | 204 gfx::PointF selection_end_; |
| 200 std::vector<SelectionEventType> events_; | 205 std::vector<SelectionEventType> events_; |
| 201 bool caret_moved_; | 206 bool caret_moved_; |
| 202 bool selection_moved_; | 207 bool selection_moved_; |
| 203 bool selection_points_swapped_; | 208 bool selection_points_swapped_; |
| 204 bool needs_animate_; | 209 bool needs_animate_; |
| 205 bool animation_enabled_; | 210 bool animation_enabled_; |
| 206 bool dragging_enabled_; | 211 bool dragging_enabled_; |
| 207 scoped_ptr<TouchSelectionController> controller_; | 212 scoped_ptr<TouchSelectionController> controller_; |
| 213 |
| 214 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); |
| 208 }; | 215 }; |
| 209 | 216 |
| 210 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 217 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
| 211 gfx::RectF insertion_rect(5, 5, 0, 10); | 218 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 212 bool visible = true; | 219 bool visible = true; |
| 213 | 220 |
| 214 // Insertion events are ignored until automatic showing is enabled. | 221 // Insertion events are ignored until automatic showing is enabled. |
| 215 ChangeInsertion(insertion_rect, visible); | 222 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 216 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 223 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 217 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 224 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 218 controller().OnTapEvent(); | 225 controller().OnTapEvent(); |
| 219 | 226 |
| 220 // Insertion events are ignored until the selection region is marked editable. | 227 // Insertion events are ignored until the selection region is marked editable. |
| 221 ChangeInsertion(insertion_rect, visible); | 228 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 222 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 229 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 223 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 230 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 224 | 231 |
| 225 controller().OnTapEvent(); | 232 controller().OnTapEvent(); |
| 226 controller().OnSelectionEditable(true); | 233 controller().OnSelectionEditable(true); |
| 227 ChangeInsertion(insertion_rect, visible); | 234 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 228 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 235 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 229 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 236 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 230 | 237 |
| 231 insertion_rect.Offset(1, 0); | 238 insertion_rect.Offset(1, 0); |
| 232 ChangeInsertion(insertion_rect, visible); | 239 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 233 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 240 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 234 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 241 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 235 | 242 |
| 236 insertion_rect.Offset(0, 1); | 243 insertion_rect.Offset(0, 1); |
| 237 ChangeInsertion(insertion_rect, visible); | 244 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 238 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 239 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 246 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 240 | 247 |
| 241 ClearInsertion(); | 248 EXPECT_TRUE(ClearInsertion()); |
| 242 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 249 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 243 } | 250 } |
| 244 | 251 |
| 245 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | 252 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { |
| 246 gfx::RectF insertion_rect(5, 5, 0, 10); | 253 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 247 bool visible = true; | 254 bool visible = true; |
| 248 controller().OnTapEvent(); | 255 controller().OnTapEvent(); |
| 249 controller().OnSelectionEditable(true); | 256 controller().OnSelectionEditable(true); |
| 250 | 257 |
| 251 ChangeInsertion(insertion_rect, visible); | 258 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 252 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 259 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 253 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 260 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 254 | 261 |
| 255 controller().OnSelectionEditable(false); | 262 controller().OnSelectionEditable(false); |
| 256 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 257 } | 264 } |
| 258 | 265 |
| 259 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { | 266 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { |
| 260 gfx::RectF insertion_rect(5, 5, 0, 10); | 267 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 261 bool visible = true; | 268 bool visible = true; |
| 262 controller().OnSelectionEditable(true); | 269 controller().OnSelectionEditable(true); |
| 263 | 270 |
| 264 // Taps on an empty editable region should be ignored if the controller is | 271 // Taps on an empty editable region should be ignored if the controller is |
| 265 // created with |show_on_tap_for_empty_editable| set to false. | 272 // created with |show_on_tap_for_empty_editable| set to false. |
| 266 controller().OnTapEvent(); | 273 controller().OnTapEvent(); |
| 267 controller().OnSelectionEmpty(true); | 274 controller().OnSelectionEmpty(true); |
| 268 ChangeInsertion(insertion_rect, visible); | 275 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 269 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 276 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 270 | 277 |
| 271 // Once the region becomes non-empty, taps should show the insertion handle. | 278 // Once the region becomes non-empty, taps should show the insertion handle. |
| 272 controller().OnTapEvent(); | 279 controller().OnTapEvent(); |
| 273 controller().OnSelectionEmpty(false); | 280 controller().OnSelectionEmpty(false); |
| 274 ChangeInsertion(insertion_rect, visible); | 281 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 275 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 282 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 276 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 283 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 277 | 284 |
| 278 // Reset the selection. | 285 // Reset the selection. |
| 279 controller().HideAndDisallowShowingAutomatically(); | 286 controller().HideAndDisallowShowingAutomatically(); |
| 280 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 287 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 281 | 288 |
| 282 // Long-pressing should show the handle even if the editable region is empty. | 289 // Long-pressing should show the handle even if the editable region is empty. |
| 283 insertion_rect.Offset(2, -2); | 290 insertion_rect.Offset(2, -2); |
| 284 controller().OnLongPressEvent(); | 291 controller().OnLongPressEvent(); |
| 285 controller().OnSelectionEmpty(true); | 292 controller().OnSelectionEmpty(true); |
| 286 ChangeInsertion(insertion_rect, visible); | 293 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 287 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 294 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 288 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 295 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 289 | 296 |
| 290 // Single Tap on an empty edit field should clear insertion handle. | 297 // Single Tap on an empty edit field should clear insertion handle. |
| 291 controller().OnTapEvent(); | 298 controller().OnTapEvent(); |
| 292 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 299 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 293 } | 300 } |
| 294 | 301 |
| 295 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { | 302 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { |
| 296 AllowShowingOnTapForEmptyEditable(); | 303 AllowShowingOnTapForEmptyEditable(); |
| 297 | 304 |
| 298 gfx::RectF insertion_rect(5, 5, 0, 10); | 305 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 299 bool visible = true; | 306 bool visible = true; |
| 300 controller().OnSelectionEditable(true); | 307 controller().OnSelectionEditable(true); |
| 301 | 308 |
| 302 // Taps on an empty editable region should show the insertion handle if the | 309 // Taps on an empty editable region should show the insertion handle if the |
| 303 // controller is created with |show_on_tap_for_empty_editable| set to true. | 310 // controller is created with |show_on_tap_for_empty_editable| set to true. |
| 304 controller().OnTapEvent(); | 311 controller().OnTapEvent(); |
| 305 controller().OnSelectionEmpty(true); | 312 controller().OnSelectionEmpty(true); |
| 306 ChangeInsertion(insertion_rect, visible); | 313 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 307 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 314 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 308 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 315 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 309 | 316 |
| 310 // Additional taps should not hide the insertion handle in this case. | 317 // Additional taps should not hide the insertion handle in this case. |
| 311 controller().OnTapEvent(); | 318 controller().OnTapEvent(); |
| 312 ChangeInsertion(insertion_rect, visible); | 319 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 313 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 320 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 314 } | 321 } |
| 315 | 322 |
| 316 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | 323 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { |
| 317 gfx::RectF insertion_rect(5, 5, 0, 10); | 324 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 318 bool visible = true; | 325 bool visible = true; |
| 319 | 326 |
| 320 // Simulate the user tapping an empty text field. | 327 // Simulate the user tapping an empty text field. |
| 321 controller().OnTapEvent(); | 328 controller().OnTapEvent(); |
| 322 controller().OnSelectionEditable(true); | 329 controller().OnSelectionEditable(true); |
| 323 controller().OnSelectionEmpty(true); | 330 controller().OnSelectionEmpty(true); |
| 324 ChangeInsertion(insertion_rect, visible); | 331 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 325 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 332 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 326 | 333 |
| 327 // Simulate the cursor moving while a user is typing. | 334 // Simulate the cursor moving while a user is typing. |
| 328 insertion_rect.Offset(10, 0); | 335 insertion_rect.Offset(10, 0); |
| 329 controller().OnSelectionEmpty(false); | 336 controller().OnSelectionEmpty(false); |
| 330 ChangeInsertion(insertion_rect, visible); | 337 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 331 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 338 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 332 | 339 |
| 333 // If the user taps the *same* position as the cursor at the end of the text | 340 // If the user taps the *same* position as the cursor at the end of the text |
| 334 // entry, the handle should appear. | 341 // entry, the handle should appear. |
| 335 controller().OnTapEvent(); | 342 controller().OnTapEvent(); |
| 336 ChangeInsertion(insertion_rect, visible); | 343 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 337 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 344 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 338 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 345 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 339 } | 346 } |
| 340 | 347 |
| 341 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 348 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
| 342 controller().OnLongPressEvent(); | 349 controller().OnLongPressEvent(); |
| 343 controller().OnSelectionEditable(true); | 350 controller().OnSelectionEditable(true); |
| 344 | 351 |
| 345 gfx::RectF start_rect(5, 5, 0, 10); | 352 gfx::RectF start_rect(5, 5, 0, 10); |
| 346 gfx::RectF end_rect(50, 5, 0, 10); | 353 gfx::RectF end_rect(50, 5, 0, 10); |
| 347 bool visible = true; | 354 bool visible = true; |
| 348 | 355 |
| 349 ChangeInsertion(start_rect, visible); | 356 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 350 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 357 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 351 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 358 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 352 | 359 |
| 353 ChangeSelection(start_rect, visible, end_rect, visible); | 360 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 361 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 355 SELECTION_SHOWN)); | 362 SELECTION_SHOWN)); |
| 356 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 363 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 357 | 364 |
| 358 ChangeInsertion(end_rect, visible); | 365 EXPECT_TRUE(ChangeInsertion(end_rect, visible)); |
| 359 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, |
| 360 INSERTION_SHOWN)); | 367 INSERTION_SHOWN)); |
| 361 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 368 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 362 | 369 |
| 363 controller().HideAndDisallowShowingAutomatically(); | 370 controller().HideAndDisallowShowingAutomatically(); |
| 364 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 371 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 365 | 372 |
| 366 controller().OnTapEvent(); | 373 controller().OnTapEvent(); |
| 367 ChangeInsertion(end_rect, visible); | 374 EXPECT_TRUE(ChangeInsertion(end_rect, visible)); |
| 368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 375 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 369 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 376 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 370 } | 377 } |
| 371 | 378 |
| 372 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 379 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
| 373 base::TimeTicks event_time = base::TimeTicks::Now(); | 380 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 374 controller().OnTapEvent(); | 381 controller().OnTapEvent(); |
| 375 controller().OnSelectionEditable(true); | 382 controller().OnSelectionEditable(true); |
| 376 | 383 |
| 377 // The touch sequence should not be handled if insertion is not active. | 384 // The touch sequence should not be handled if insertion is not active. |
| 378 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 385 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 379 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 386 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 380 | 387 |
| 381 float line_height = 10.f; | 388 float line_height = 10.f; |
| 382 gfx::RectF start_rect(10, 0, 0, line_height); | 389 gfx::RectF start_rect(10, 0, 0, line_height); |
| 383 bool visible = true; | 390 bool visible = true; |
| 384 ChangeInsertion(start_rect, visible); | 391 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 385 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 392 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 386 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 393 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 387 | 394 |
| 388 // The touch sequence should be handled only if the drawable reports a hit. | 395 // The touch sequence should be handled only if the drawable reports a hit. |
| 389 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 396 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 390 SetDraggingEnabled(true); | 397 SetDraggingEnabled(true); |
| 391 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 398 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 392 EXPECT_FALSE(GetAndResetCaretMoved()); | 399 EXPECT_FALSE(GetAndResetCaretMoved()); |
| 393 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 400 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 394 | 401 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 421 } | 428 } |
| 422 | 429 |
| 423 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 430 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
| 424 base::TimeTicks event_time = base::TimeTicks::Now(); | 431 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 425 controller().OnTapEvent(); | 432 controller().OnTapEvent(); |
| 426 controller().OnSelectionEditable(true); | 433 controller().OnSelectionEditable(true); |
| 427 SetDraggingEnabled(true); | 434 SetDraggingEnabled(true); |
| 428 | 435 |
| 429 gfx::RectF start_rect(10, 0, 0, 10); | 436 gfx::RectF start_rect(10, 0, 0, 10); |
| 430 bool visible = true; | 437 bool visible = true; |
| 431 ChangeInsertion(start_rect, visible); | 438 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 432 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 439 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 433 | 440 |
| 434 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 441 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 442 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 436 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. | |
| 437 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 443 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 438 | 444 |
| 439 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 445 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 440 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 446 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 441 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 447 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 442 INSERTION_DRAG_STOPPED)); | 448 INSERTION_DRAG_STOPPED)); |
| 443 | 449 |
| 444 // Reset the insertion. | 450 // Reset the insertion. |
| 445 ClearInsertion(); | 451 EXPECT_TRUE(ClearInsertion()); |
| 446 controller().OnTapEvent(); | 452 controller().OnTapEvent(); |
| 447 ChangeInsertion(start_rect, visible); | 453 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 448 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 454 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 449 INSERTION_SHOWN)); | 455 INSERTION_SHOWN)); |
| 450 | 456 |
| 451 // No tap should be signalled if the time between DOWN and UP was too long. | 457 // No tap should be signalled if the time between DOWN and UP was too long. |
| 452 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 458 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 453 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 459 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 454 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 460 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
| 455 event_time + base::TimeDelta::FromSeconds(1), | 461 event_time + base::TimeDelta::FromSeconds(1), |
| 456 0, | 462 0, |
| 457 0); | 463 0); |
| 458 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 464 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 459 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 465 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
| 460 INSERTION_DRAG_STOPPED)); | 466 INSERTION_DRAG_STOPPED)); |
| 461 | 467 |
| 462 // Reset the insertion. | 468 // Reset the insertion. |
| 463 ClearInsertion(); | 469 EXPECT_TRUE(ClearInsertion()); |
| 464 controller().OnTapEvent(); | 470 controller().OnTapEvent(); |
| 465 ChangeInsertion(start_rect, visible); | 471 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 466 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 472 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 467 INSERTION_SHOWN)); | 473 INSERTION_SHOWN)); |
| 468 | 474 |
| 469 // No tap should be signalled if the drag was too long. | 475 // No tap should be signalled if the drag was too long. |
| 470 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 476 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 471 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 477 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 472 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 478 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
| 473 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 479 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 474 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 480 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
| 475 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 481 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 476 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 482 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
| 477 INSERTION_DRAG_STOPPED)); | 483 INSERTION_DRAG_STOPPED)); |
| 478 | 484 |
| 479 // Reset the insertion. | 485 // Reset the insertion. |
| 480 ClearInsertion(); | 486 EXPECT_TRUE(ClearInsertion()); |
| 481 controller().OnTapEvent(); | 487 controller().OnTapEvent(); |
| 482 ChangeInsertion(start_rect, visible); | 488 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
| 483 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 489 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 484 INSERTION_SHOWN)); | 490 INSERTION_SHOWN)); |
| 485 | 491 |
| 486 // No tap should be signalled if the touch sequence is cancelled. | 492 // No tap should be signalled if the touch sequence is cancelled. |
| 487 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 493 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 488 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 494 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 489 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 495 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
| 490 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 496 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 491 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 497 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
| 492 INSERTION_DRAG_STOPPED)); | 498 INSERTION_DRAG_STOPPED)); |
| 493 } | 499 } |
| 494 | 500 |
| 495 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 501 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
| 496 base::TimeTicks event_time = base::TimeTicks::Now(); | 502 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 497 controller().OnTapEvent(); | 503 controller().OnTapEvent(); |
| 498 controller().OnSelectionEditable(true); | 504 controller().OnSelectionEditable(true); |
| 499 SetDraggingEnabled(true); | 505 SetDraggingEnabled(true); |
| 500 | 506 |
| 501 gfx::RectF anchor_rect(10, 0, 0, 10); | 507 gfx::RectF anchor_rect(10, 0, 0, 10); |
| 502 bool visible = true; | 508 bool visible = true; |
| 503 ChangeInsertion(anchor_rect, visible); | 509 EXPECT_TRUE(ChangeInsertion(anchor_rect, visible)); |
| 504 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 510 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 505 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 511 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 506 | 512 |
| 507 // Tapping again shouldn't reset the active insertion point. | 513 // Tapping again shouldn't reset the active insertion point. |
| 508 controller().OnTapEvent(); | 514 controller().OnTapEvent(); |
| 509 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 515 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 516 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 511 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 517 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 512 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 518 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 513 | 519 |
| 514 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 520 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 515 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 521 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 522 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 517 INSERTION_DRAG_STOPPED)); | 523 INSERTION_DRAG_STOPPED)); |
| 518 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 524 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 519 | 525 |
| 520 anchor_rect.Offset(5, 15); | 526 anchor_rect.Offset(5, 15); |
| 521 ChangeInsertion(anchor_rect, visible); | 527 EXPECT_TRUE(ChangeInsertion(anchor_rect, visible)); |
| 522 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 528 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 523 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 529 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 524 | 530 |
| 525 // Pressing shouldn't reset the active insertion point. | 531 // Pressing shouldn't reset the active insertion point. |
| 526 controller().OnLongPressEvent(); | 532 controller().OnLongPressEvent(); |
| 527 controller().OnSelectionEmpty(true); | 533 controller().OnSelectionEmpty(true); |
| 528 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 534 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 529 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 535 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 536 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 531 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 537 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 532 | 538 |
| 533 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 539 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 534 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 540 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 535 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 541 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 536 INSERTION_DRAG_STOPPED)); | 542 INSERTION_DRAG_STOPPED)); |
| 537 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 543 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 538 } | 544 } |
| 539 | 545 |
| 540 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 546 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 541 gfx::RectF start_rect(5, 5, 0, 10); | 547 gfx::RectF start_rect(5, 5, 0, 10); |
| 542 gfx::RectF end_rect(50, 5, 0, 10); | 548 gfx::RectF end_rect(50, 5, 0, 10); |
| 543 bool visible = true; | 549 bool visible = true; |
| 544 | 550 |
| 545 // Selection events are ignored until automatic showing is enabled. | 551 // Selection events are ignored until automatic showing is enabled. |
| 546 ChangeSelection(start_rect, visible, end_rect, visible); | 552 EXPECT_FALSE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 547 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 553 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 548 | 554 |
| 549 controller().OnLongPressEvent(); | 555 controller().OnLongPressEvent(); |
| 550 ChangeSelection(start_rect, visible, end_rect, visible); | 556 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 551 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 557 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 552 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 558 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 553 | 559 |
| 554 start_rect.Offset(1, 0); | 560 start_rect.Offset(1, 0); |
| 555 ChangeSelection(start_rect, visible, end_rect, visible); | 561 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 556 // Selection movement does not currently trigger a separate event. | 562 // Selection movement does not currently trigger a separate event. |
| 557 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 563 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 558 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 564 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 559 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 565 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 560 | 566 |
| 561 ClearSelection(); | 567 EXPECT_TRUE(ClearSelection()); |
| 562 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 568 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 563 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 569 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 564 } | 570 } |
| 565 | 571 |
| 566 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 572 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 567 gfx::RectF start_rect(5, 5, 0, 10); | 573 gfx::RectF start_rect(5, 5, 0, 10); |
| 568 gfx::RectF end_rect(50, 5, 0, 10); | 574 gfx::RectF end_rect(50, 5, 0, 10); |
| 569 bool visible = true; | 575 bool visible = true; |
| 570 | 576 |
| 571 controller().OnLongPressEvent(); | 577 controller().OnLongPressEvent(); |
| 572 ChangeSelection(start_rect, visible, end_rect, visible); | 578 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 573 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 579 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 574 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 580 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 575 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 581 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 576 | 582 |
| 577 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 583 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
| 578 // event notification. | 584 // event notification. |
| 579 start_rect.Offset(10, 10); | 585 start_rect.Offset(10, 10); |
| 580 controller().OnLongPressEvent(); | 586 controller().OnLongPressEvent(); |
| 581 ChangeSelection(start_rect, visible, end_rect, visible); | 587 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 582 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 588 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 583 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 589 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 584 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 590 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 585 } | 591 } |
| 586 | 592 |
| 587 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 593 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 588 base::TimeTicks event_time = base::TimeTicks::Now(); | 594 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 589 controller().OnLongPressEvent(); | 595 controller().OnLongPressEvent(); |
| 590 | 596 |
| 591 // The touch sequence should not be handled if selection is not active. | 597 // The touch sequence should not be handled if selection is not active. |
| 592 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 598 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 593 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 599 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 594 | 600 |
| 595 float line_height = 10.f; | 601 float line_height = 10.f; |
| 596 gfx::RectF start_rect(0, 0, 0, line_height); | 602 gfx::RectF start_rect(0, 0, 0, line_height); |
| 597 gfx::RectF end_rect(50, 0, 0, line_height); | 603 gfx::RectF end_rect(50, 0, 0, line_height); |
| 598 bool visible = true; | 604 bool visible = true; |
| 599 ChangeSelection(start_rect, visible, end_rect, visible); | 605 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 600 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 606 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 601 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 607 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 602 | 608 |
| 603 // The touch sequence should be handled only if the drawable reports a hit. | 609 // The touch sequence should be handled only if the drawable reports a hit. |
| 604 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 610 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 605 SetDraggingEnabled(true); | 611 SetDraggingEnabled(true); |
| 606 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 612 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 607 EXPECT_FALSE(GetAndResetSelectionMoved()); | 613 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 608 | 614 |
| 609 // The SelectBetweenCoordinates() result should reflect the movement. Note | 615 // The SelectBetweenCoordinates() result should reflect the movement. Note |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 } | 649 } |
| 644 | 650 |
| 645 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 651 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 646 base::TimeTicks event_time = base::TimeTicks::Now(); | 652 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 647 controller().OnLongPressEvent(); | 653 controller().OnLongPressEvent(); |
| 648 | 654 |
| 649 float line_height = 10.f; | 655 float line_height = 10.f; |
| 650 gfx::RectF start_rect(0, 0, 0, line_height); | 656 gfx::RectF start_rect(0, 0, 0, line_height); |
| 651 gfx::RectF end_rect(50, 0, 0, line_height); | 657 gfx::RectF end_rect(50, 0, 0, line_height); |
| 652 bool visible = true; | 658 bool visible = true; |
| 653 ChangeSelection(start_rect, visible, end_rect, visible); | 659 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 654 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 660 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 655 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 661 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 656 | 662 |
| 657 // The ACTION_DOWN should lock to the closest handle. | 663 // The ACTION_DOWN should lock to the closest handle. |
| 658 gfx::PointF end_offset = end_rect.CenterPoint(); | 664 gfx::PointF end_offset = end_rect.CenterPoint(); |
| 659 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 665 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 660 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 666 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
| 661 MockMotionEvent event( | 667 MockMotionEvent event( |
| 662 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 668 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); |
| 663 SetDraggingEnabled(true); | 669 SetDraggingEnabled(true); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 681 } | 687 } |
| 682 | 688 |
| 683 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 689 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 684 base::TimeTicks event_time = base::TimeTicks::Now(); | 690 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 685 controller().OnLongPressEvent(); | 691 controller().OnLongPressEvent(); |
| 686 | 692 |
| 687 float line_height = 10.f; | 693 float line_height = 10.f; |
| 688 gfx::RectF start_rect(50, line_height, 0, line_height); | 694 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 689 gfx::RectF end_rect(100, line_height, 0, line_height); | 695 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 690 bool visible = true; | 696 bool visible = true; |
| 691 ChangeSelection(start_rect, visible, end_rect, visible); | 697 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 692 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 698 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 693 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 699 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 694 | 700 |
| 695 SetDraggingEnabled(true); | 701 SetDraggingEnabled(true); |
| 696 | 702 |
| 697 // Move the extent, not triggering a swap of points. | 703 // Move the extent, not triggering a swap of points. |
| 698 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 704 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 699 end_rect.x(), end_rect.bottom()); | 705 end_rect.x(), end_rect.bottom()); |
| 700 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 706 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 701 EXPECT_FALSE(GetAndResetSelectionMoved()); | 707 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 702 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 708 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| 703 | 709 |
| 704 gfx::PointF base_offset = start_rect.CenterPoint(); | 710 gfx::PointF base_offset = start_rect.CenterPoint(); |
| 705 gfx::PointF extent_offset = end_rect.CenterPoint(); | 711 gfx::PointF extent_offset = end_rect.CenterPoint(); |
| 706 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 712 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 707 end_rect.x(), end_rect.bottom() + 5); | 713 end_rect.x(), end_rect.bottom() + 5); |
| 708 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 714 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 709 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 715 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
| 710 EXPECT_TRUE(GetAndResetSelectionMoved()); | 716 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 711 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 717 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| 712 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 718 EXPECT_EQ(base_offset, GetLastSelectionStart()); |
| 713 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 719 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
| 714 | 720 |
| 715 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 721 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 716 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 722 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 717 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 723 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 718 EXPECT_FALSE(GetAndResetSelectionMoved()); | 724 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 719 | 725 |
| 720 end_rect += gfx::Vector2dF(0, 5); | 726 end_rect += gfx::Vector2dF(0, 5); |
| 721 ChangeSelection(start_rect, visible, end_rect, visible); | 727 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 722 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 728 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 723 | 729 |
| 724 // Move the base, triggering a swap of points. | 730 // Move the base, triggering a swap of points. |
| 725 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 731 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
| 726 start_rect.x(), start_rect.bottom()); | 732 start_rect.x(), start_rect.bottom()); |
| 727 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 733 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 728 EXPECT_FALSE(GetAndResetSelectionMoved()); | 734 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 729 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); | 735 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); |
| 730 | 736 |
| 731 base_offset = end_rect.CenterPoint(); | 737 base_offset = end_rect.CenterPoint(); |
| 732 extent_offset = start_rect.CenterPoint(); | 738 extent_offset = start_rect.CenterPoint(); |
| 733 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 739 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 734 start_rect.x(), start_rect.bottom() + 5); | 740 start_rect.x(), start_rect.bottom() + 5); |
| 735 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 741 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 736 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 742 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
| 737 EXPECT_TRUE(GetAndResetSelectionMoved()); | 743 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 738 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 744 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| 739 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 745 EXPECT_EQ(base_offset, GetLastSelectionStart()); |
| 740 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 746 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
| 741 | 747 |
| 742 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 748 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 743 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 749 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 744 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 750 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 745 EXPECT_FALSE(GetAndResetSelectionMoved()); | 751 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 746 | 752 |
| 747 start_rect += gfx::Vector2dF(0, 5); | 753 start_rect += gfx::Vector2dF(0, 5); |
| 748 ChangeSelection(start_rect, visible, end_rect, visible); | 754 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 749 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 755 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 750 | 756 |
| 751 // Move the same point again, not triggering a swap of points. | 757 // Move the same point again, not triggering a swap of points. |
| 752 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 758 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
| 753 start_rect.x(), start_rect.bottom()); | 759 start_rect.x(), start_rect.bottom()); |
| 754 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 760 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 755 EXPECT_FALSE(GetAndResetSelectionMoved()); | 761 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 756 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 762 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| 757 | 763 |
| 758 base_offset = end_rect.CenterPoint(); | 764 base_offset = end_rect.CenterPoint(); |
| 759 extent_offset = start_rect.CenterPoint(); | 765 extent_offset = start_rect.CenterPoint(); |
| 760 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 766 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 761 start_rect.x(), start_rect.bottom() + 5); | 767 start_rect.x(), start_rect.bottom() + 5); |
| 762 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 768 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 763 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 769 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
| 764 EXPECT_TRUE(GetAndResetSelectionMoved()); | 770 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 765 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 771 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| 766 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 772 EXPECT_EQ(base_offset, GetLastSelectionStart()); |
| 767 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 773 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
| 768 | 774 |
| 769 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 775 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 770 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 776 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 771 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 777 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 772 EXPECT_FALSE(GetAndResetSelectionMoved()); | 778 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 773 | 779 |
| 774 start_rect += gfx::Vector2dF(0, 5); | 780 start_rect += gfx::Vector2dF(0, 5); |
| 775 ChangeSelection(start_rect, visible, end_rect, visible); | 781 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 776 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 782 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 777 | 783 |
| 778 // Move the base, triggering a swap of points. | 784 // Move the base, triggering a swap of points. |
| 779 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 785 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
| 780 end_rect.x(), end_rect.bottom()); | 786 end_rect.x(), end_rect.bottom()); |
| 781 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 787 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 782 EXPECT_FALSE(GetAndResetSelectionMoved()); | 788 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 783 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); | 789 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); |
| 784 | 790 |
| 785 base_offset = start_rect.CenterPoint(); | 791 base_offset = start_rect.CenterPoint(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 801 | 807 |
| 802 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 808 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
| 803 base::TimeTicks event_time = base::TimeTicks::Now(); | 809 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 804 controller().OnLongPressEvent(); | 810 controller().OnLongPressEvent(); |
| 805 | 811 |
| 806 float small_line_height = 1.f; | 812 float small_line_height = 1.f; |
| 807 float large_line_height = 50.f; | 813 float large_line_height = 50.f; |
| 808 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 814 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 809 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 815 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 810 bool visible = true; | 816 bool visible = true; |
| 811 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 817 EXPECT_TRUE( |
| 818 ChangeSelection(small_line_rect, visible, large_line_rect, visible)); |
| 812 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 819 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 813 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 820 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
| 814 | 821 |
| 815 // Start dragging the handle on the small line. | 822 // Start dragging the handle on the small line. |
| 816 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 823 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 817 small_line_rect.x(), small_line_rect.y()); | 824 small_line_rect.x(), small_line_rect.y()); |
| 818 SetDraggingEnabled(true); | 825 SetDraggingEnabled(true); |
| 819 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 826 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 820 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 827 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
| 821 // The drag coordinate for large lines should be capped to a reasonable | 828 // The drag coordinate for large lines should be capped to a reasonable |
| (...skipping 12 matching lines...) Expand all Loading... |
| 834 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 841 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
| 835 } | 842 } |
| 836 | 843 |
| 837 TEST_F(TouchSelectionControllerTest, Animation) { | 844 TEST_F(TouchSelectionControllerTest, Animation) { |
| 838 controller().OnTapEvent(); | 845 controller().OnTapEvent(); |
| 839 controller().OnSelectionEditable(true); | 846 controller().OnSelectionEditable(true); |
| 840 | 847 |
| 841 gfx::RectF insertion_rect(5, 5, 0, 10); | 848 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 842 | 849 |
| 843 bool visible = true; | 850 bool visible = true; |
| 844 ChangeInsertion(insertion_rect, visible); | 851 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 845 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 852 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 846 | 853 |
| 847 visible = false; | 854 visible = false; |
| 848 ChangeInsertion(insertion_rect, visible); | 855 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 849 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 856 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 850 | 857 |
| 851 visible = true; | 858 visible = true; |
| 852 ChangeInsertion(insertion_rect, visible); | 859 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 853 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 860 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 854 | 861 |
| 855 // If the handles are explicity hidden, no animation should be triggered. | 862 // If the handles are explicity hidden, no animation should be triggered. |
| 856 controller().HideAndDisallowShowingAutomatically(); | 863 controller().HideAndDisallowShowingAutomatically(); |
| 857 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 864 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 858 | 865 |
| 859 // If the client doesn't support animation, no animation should be triggered. | 866 // If the client doesn't support animation, no animation should be triggered. |
| 860 SetAnimationEnabled(false); | 867 SetAnimationEnabled(false); |
| 861 controller().OnTapEvent(); | 868 controller().OnTapEvent(); |
| 862 visible = true; | 869 visible = true; |
| 863 ChangeInsertion(insertion_rect, visible); | 870 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 864 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 871 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 865 } | 872 } |
| 866 | 873 |
| 867 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 874 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 868 controller().OnTapEvent(); | 875 controller().OnTapEvent(); |
| 869 controller().OnSelectionEditable(true); | 876 controller().OnSelectionEditable(true); |
| 870 | 877 |
| 871 gfx::RectF insertion_rect(5, 5, 0, 10); | 878 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 872 | 879 |
| 873 bool visible = true; | 880 bool visible = true; |
| 874 ChangeInsertion(insertion_rect, visible); | 881 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 875 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 882 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 876 | 883 |
| 877 controller().SetTemporarilyHidden(true); | 884 controller().SetTemporarilyHidden(true); |
| 878 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 885 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 879 | 886 |
| 880 visible = false; | 887 visible = false; |
| 881 ChangeInsertion(insertion_rect, visible); | 888 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 882 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 889 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 883 | 890 |
| 884 visible = true; | 891 visible = true; |
| 885 ChangeInsertion(insertion_rect, visible); | 892 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
| 886 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 893 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 887 | 894 |
| 888 controller().SetTemporarilyHidden(false); | 895 controller().SetTemporarilyHidden(false); |
| 889 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 896 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 890 } | 897 } |
| 891 | 898 |
| 892 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 899 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 893 gfx::RectF start_rect(5, 5, 0, 10); | 900 gfx::RectF start_rect(5, 5, 0, 10); |
| 894 gfx::RectF end_rect(50, 5, 0, 10); | 901 gfx::RectF end_rect(50, 5, 0, 10); |
| 895 bool visible = true; | 902 bool visible = true; |
| 896 | 903 |
| 897 controller().OnLongPressEvent(); | 904 controller().OnLongPressEvent(); |
| 898 ChangeSelection(start_rect, visible, end_rect, visible); | 905 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 899 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 906 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 900 | 907 |
| 901 // Selection should not be cleared if the selection bounds have not changed. | 908 // Selection should not be cleared if the selection bounds have not changed. |
| 902 controller().OnTapEvent(); | 909 controller().OnTapEvent(); |
| 903 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 910 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 904 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 911 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 905 | 912 |
| 906 controller().OnTapEvent(); | 913 controller().OnTapEvent(); |
| 907 ClearSelection(); | 914 EXPECT_TRUE(ClearSelection()); |
| 908 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 915 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 909 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 916 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 910 } | 917 } |
| 911 | 918 |
| 912 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 919 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
| 913 gfx::RectF start_rect(5, 5, 0, 10); | 920 gfx::RectF start_rect(5, 5, 0, 10); |
| 914 gfx::RectF end_rect(50, 5, 0, 10); | 921 gfx::RectF end_rect(50, 5, 0, 10); |
| 915 bool visible = true; | 922 bool visible = true; |
| 916 | 923 |
| 917 // The selection should not be activated, as it wasn't yet allowed. | 924 // The selection should not be activated, as it wasn't yet allowed. |
| 918 ChangeSelection(start_rect, visible, end_rect, visible); | 925 EXPECT_FALSE(ChangeSelection(start_rect, visible, end_rect, visible)); |
| 919 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 926 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 920 | 927 |
| 921 // Now explicitly allow showing from the previously supplied bounds. | 928 // Now explicitly allow showing from the previously supplied bounds. |
| 922 controller().AllowShowingFromCurrentSelection(); | 929 controller().AllowShowingFromCurrentSelection(); |
| 923 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 930 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 924 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 931 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 925 | 932 |
| 926 // Repeated calls to show from the current selection should be ignored. | 933 // Repeated calls to show from the current selection should be ignored. |
| 927 controller().AllowShowingFromCurrentSelection(); | 934 controller().AllowShowingFromCurrentSelection(); |
| 928 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 935 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 929 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 936 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 930 | 937 |
| 931 // Trying to show from an empty selection will have no result. | 938 // Trying to show from an empty selection will have no result. |
| 932 ClearSelection(); | 939 EXPECT_TRUE(ClearSelection()); |
| 933 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 940 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 934 controller().AllowShowingFromCurrentSelection(); | 941 controller().AllowShowingFromCurrentSelection(); |
| 935 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 942 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 936 | 943 |
| 937 // Showing the insertion handle should also be supported. | 944 // Showing the insertion handle should also be supported. |
| 938 controller().OnSelectionEditable(true); | 945 controller().OnSelectionEditable(true); |
| 939 controller().OnSelectionEmpty(false); | 946 controller().OnSelectionEmpty(false); |
| 940 controller().HideAndDisallowShowingAutomatically(); | 947 controller().HideAndDisallowShowingAutomatically(); |
| 941 gfx::RectF insertion_rect(5, 5, 0, 10); | 948 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 942 ChangeInsertion(insertion_rect, visible); | 949 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
| 943 controller().AllowShowingFromCurrentSelection(); | 950 controller().AllowShowingFromCurrentSelection(); |
| 944 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 951 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 945 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 952 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 946 } | 953 } |
| 947 | 954 |
| 948 } // namespace ui | 955 } // namespace ui |
| OLD | NEW |