| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/touch_selection/touch_selection_controller.h" | 5 #include "ui/touch_selection/touch_selection_controller.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "ui/events/test/motion_event_test_utils.h" | 11 #include "ui/events/test/motion_event_test_utils.h" |
| 12 | 12 |
| 13 using testing::ElementsAre; | 13 using testing::ElementsAre; |
| 14 using testing::IsEmpty; | 14 using testing::IsEmpty; |
| 15 using ui::test::MockMotionEvent; | 15 using ui::test::MockMotionEvent; |
| 16 | 16 |
| 17 namespace ui { | 17 namespace ui { |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 const int kDefaultTapTimeoutMs = 200; | 20 const int kDefaultTapTimeoutMs = 200; |
| 21 const float kDefaulTapSlop = 10.f; | 21 const float kDefaulTapSlop = 10.f; |
| 22 const gfx::PointF kIgnoredPoint(0, 0); |
| 22 | 23 |
| 23 class MockTouchHandleDrawable : public TouchHandleDrawable { | 24 class MockTouchHandleDrawable : public TouchHandleDrawable { |
| 24 public: | 25 public: |
| 25 explicit MockTouchHandleDrawable(bool* contains_point) | 26 explicit MockTouchHandleDrawable(bool* contains_point) |
| 26 : intersects_rect_(contains_point) {} | 27 : intersects_rect_(contains_point) {} |
| 27 ~MockTouchHandleDrawable() override {} | 28 ~MockTouchHandleDrawable() override {} |
| 28 void SetEnabled(bool enabled) override {} | 29 void SetEnabled(bool enabled) override {} |
| 29 void SetOrientation(TouchHandleOrientation orientation) override {} | 30 void SetOrientation(TouchHandleOrientation orientation) override {} |
| 30 void SetAlpha(float alpha) override {} | 31 void SetAlpha(float alpha) override {} |
| 31 void SetFocus(const gfx::PointF& position) override {} | 32 void SetFocus(const gfx::PointF& position) override {} |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 SelectionBound start_bound, end_bound; | 141 SelectionBound start_bound, end_bound; |
| 141 start_bound.set_type(SelectionBound::LEFT); | 142 start_bound.set_type(SelectionBound::LEFT); |
| 142 end_bound.set_type(SelectionBound::RIGHT); | 143 end_bound.set_type(SelectionBound::RIGHT); |
| 143 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 144 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
| 144 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 145 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
| 145 start_bound.set_visible(start_visible); | 146 start_bound.set_visible(start_visible); |
| 146 end_bound.set_visible(end_visible); | 147 end_bound.set_visible(end_visible); |
| 147 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 148 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
| 148 } | 149 } |
| 149 | 150 |
| 151 void OnLongPressEvent() { |
| 152 ASSERT_FALSE(controller().WillHandleLongPressEvent(kIgnoredPoint)); |
| 153 } |
| 154 |
| 155 void OnTapEvent() { |
| 156 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint)); |
| 157 } |
| 158 |
| 150 void Animate() { | 159 void Animate() { |
| 151 base::TimeTicks now = base::TimeTicks::Now(); | 160 base::TimeTicks now = base::TimeTicks::Now(); |
| 152 while (needs_animate_) { | 161 while (needs_animate_) { |
| 153 needs_animate_ = controller_->Animate(now); | 162 needs_animate_ = controller_->Animate(now); |
| 154 now += base::TimeDelta::FromMilliseconds(16); | 163 now += base::TimeDelta::FromMilliseconds(16); |
| 155 } | 164 } |
| 156 } | 165 } |
| 157 | 166 |
| 158 bool GetAndResetNeedsAnimate() { | 167 bool GetAndResetNeedsAnimate() { |
| 159 bool needs_animate = needs_animate_; | 168 bool needs_animate = needs_animate_; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 }; | 221 }; |
| 213 | 222 |
| 214 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 223 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
| 215 gfx::RectF insertion_rect(5, 5, 0, 10); | 224 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 216 bool visible = true; | 225 bool visible = true; |
| 217 | 226 |
| 218 // Insertion events are ignored until automatic showing is enabled. | 227 // Insertion events are ignored until automatic showing is enabled. |
| 219 ChangeInsertion(insertion_rect, visible); | 228 ChangeInsertion(insertion_rect, visible); |
| 220 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 229 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 221 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 230 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 222 controller().OnTapEvent(); | 231 OnTapEvent(); |
| 223 | 232 |
| 224 // Insertion events are ignored until the selection region is marked editable. | 233 // Insertion events are ignored until the selection region is marked editable. |
| 225 ChangeInsertion(insertion_rect, visible); | 234 ChangeInsertion(insertion_rect, visible); |
| 226 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 235 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 227 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 236 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 228 | 237 |
| 229 controller().OnTapEvent(); | 238 OnTapEvent(); |
| 230 controller().OnSelectionEditable(true); | 239 controller().OnSelectionEditable(true); |
| 231 ChangeInsertion(insertion_rect, visible); | 240 ChangeInsertion(insertion_rect, visible); |
| 232 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 241 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 233 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 242 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 234 | 243 |
| 235 insertion_rect.Offset(1, 0); | 244 insertion_rect.Offset(1, 0); |
| 236 ChangeInsertion(insertion_rect, visible); | 245 ChangeInsertion(insertion_rect, visible); |
| 237 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 238 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 247 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 239 | 248 |
| 240 insertion_rect.Offset(0, 1); | 249 insertion_rect.Offset(0, 1); |
| 241 ChangeInsertion(insertion_rect, visible); | 250 ChangeInsertion(insertion_rect, visible); |
| 242 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 251 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 243 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 252 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 244 | 253 |
| 245 ClearInsertion(); | 254 ClearInsertion(); |
| 246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 247 } | 256 } |
| 248 | 257 |
| 249 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | 258 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { |
| 250 gfx::RectF insertion_rect(5, 5, 0, 10); | 259 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 251 bool visible = true; | 260 bool visible = true; |
| 252 controller().OnTapEvent(); | 261 OnTapEvent(); |
| 253 controller().OnSelectionEditable(true); | 262 controller().OnSelectionEditable(true); |
| 254 | 263 |
| 255 ChangeInsertion(insertion_rect, visible); | 264 ChangeInsertion(insertion_rect, visible); |
| 256 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 265 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 257 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 266 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 258 | 267 |
| 259 controller().OnSelectionEditable(false); | 268 controller().OnSelectionEditable(false); |
| 260 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 269 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 261 } | 270 } |
| 262 | 271 |
| 263 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { | 272 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { |
| 264 gfx::RectF insertion_rect(5, 5, 0, 10); | 273 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 265 bool visible = true; | 274 bool visible = true; |
| 266 controller().OnSelectionEditable(true); | 275 controller().OnSelectionEditable(true); |
| 267 | 276 |
| 268 // Taps on an empty editable region should be ignored if the controller is | 277 // Taps on an empty editable region should be ignored if the controller is |
| 269 // created with |show_on_tap_for_empty_editable| set to false. | 278 // created with |show_on_tap_for_empty_editable| set to false. |
| 270 controller().OnTapEvent(); | 279 OnTapEvent(); |
| 271 controller().OnSelectionEmpty(true); | 280 controller().OnSelectionEmpty(true); |
| 272 ChangeInsertion(insertion_rect, visible); | 281 ChangeInsertion(insertion_rect, visible); |
| 273 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 282 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 274 | 283 |
| 275 // Once the region becomes non-empty, taps should show the insertion handle. | 284 // Once the region becomes non-empty, taps should show the insertion handle. |
| 276 controller().OnTapEvent(); | 285 OnTapEvent(); |
| 277 controller().OnSelectionEmpty(false); | 286 controller().OnSelectionEmpty(false); |
| 278 ChangeInsertion(insertion_rect, visible); | 287 ChangeInsertion(insertion_rect, visible); |
| 279 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 288 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 280 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 289 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 281 | 290 |
| 282 // Reset the selection. | 291 // Reset the selection. |
| 283 controller().HideAndDisallowShowingAutomatically(); | 292 controller().HideAndDisallowShowingAutomatically(); |
| 284 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 293 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 285 | 294 |
| 286 // Long-pressing should show the handle even if the editable region is empty. | 295 // Long-pressing should show the handle even if the editable region is empty. |
| 287 insertion_rect.Offset(2, -2); | 296 insertion_rect.Offset(2, -2); |
| 288 controller().OnLongPressEvent(); | 297 OnLongPressEvent(); |
| 289 controller().OnSelectionEmpty(true); | 298 controller().OnSelectionEmpty(true); |
| 290 ChangeInsertion(insertion_rect, visible); | 299 ChangeInsertion(insertion_rect, visible); |
| 291 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 300 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 292 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 301 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 293 | 302 |
| 294 // Single Tap on an empty edit field should clear insertion handle. | 303 // Single Tap on an empty edit field should clear insertion handle. |
| 295 controller().OnTapEvent(); | 304 OnTapEvent(); |
| 296 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 305 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 297 } | 306 } |
| 298 | 307 |
| 299 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { | 308 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { |
| 300 AllowShowingOnTapForEmptyEditable(); | 309 AllowShowingOnTapForEmptyEditable(); |
| 301 | 310 |
| 302 gfx::RectF insertion_rect(5, 5, 0, 10); | 311 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 303 bool visible = true; | 312 bool visible = true; |
| 304 controller().OnSelectionEditable(true); | 313 controller().OnSelectionEditable(true); |
| 305 | 314 |
| 306 // Taps on an empty editable region should show the insertion handle if the | 315 // Taps on an empty editable region should show the insertion handle if the |
| 307 // controller is created with |show_on_tap_for_empty_editable| set to true. | 316 // controller is created with |show_on_tap_for_empty_editable| set to true. |
| 308 controller().OnTapEvent(); | 317 OnTapEvent(); |
| 309 controller().OnSelectionEmpty(true); | 318 controller().OnSelectionEmpty(true); |
| 310 ChangeInsertion(insertion_rect, visible); | 319 ChangeInsertion(insertion_rect, visible); |
| 311 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 320 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 312 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 321 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 313 | 322 |
| 314 // Additional taps should not hide the insertion handle in this case. | 323 // Additional taps should not hide the insertion handle in this case. |
| 315 controller().OnTapEvent(); | 324 OnTapEvent(); |
| 316 ChangeInsertion(insertion_rect, visible); | 325 ChangeInsertion(insertion_rect, visible); |
| 317 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 326 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 318 } | 327 } |
| 319 | 328 |
| 320 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | 329 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { |
| 321 gfx::RectF insertion_rect(5, 5, 0, 10); | 330 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 322 bool visible = true; | 331 bool visible = true; |
| 323 | 332 |
| 324 // Simulate the user tapping an empty text field. | 333 // Simulate the user tapping an empty text field. |
| 325 controller().OnTapEvent(); | 334 OnTapEvent(); |
| 326 controller().OnSelectionEditable(true); | 335 controller().OnSelectionEditable(true); |
| 327 controller().OnSelectionEmpty(true); | 336 controller().OnSelectionEmpty(true); |
| 328 ChangeInsertion(insertion_rect, visible); | 337 ChangeInsertion(insertion_rect, visible); |
| 329 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 338 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 330 | 339 |
| 331 // Simulate the cursor moving while a user is typing. | 340 // Simulate the cursor moving while a user is typing. |
| 332 insertion_rect.Offset(10, 0); | 341 insertion_rect.Offset(10, 0); |
| 333 controller().OnSelectionEmpty(false); | 342 controller().OnSelectionEmpty(false); |
| 334 ChangeInsertion(insertion_rect, visible); | 343 ChangeInsertion(insertion_rect, visible); |
| 335 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 344 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 336 | 345 |
| 337 // If the user taps the *same* position as the cursor at the end of the text | 346 // If the user taps the *same* position as the cursor at the end of the text |
| 338 // entry, the handle should appear. | 347 // entry, the handle should appear. |
| 339 controller().OnTapEvent(); | 348 OnTapEvent(); |
| 340 ChangeInsertion(insertion_rect, visible); | 349 ChangeInsertion(insertion_rect, visible); |
| 341 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 350 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 342 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 351 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 343 } | 352 } |
| 344 | 353 |
| 345 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 354 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
| 346 controller().OnLongPressEvent(); | 355 OnLongPressEvent(); |
| 347 controller().OnSelectionEditable(true); | 356 controller().OnSelectionEditable(true); |
| 348 | 357 |
| 349 gfx::RectF start_rect(5, 5, 0, 10); | 358 gfx::RectF start_rect(5, 5, 0, 10); |
| 350 gfx::RectF end_rect(50, 5, 0, 10); | 359 gfx::RectF end_rect(50, 5, 0, 10); |
| 351 bool visible = true; | 360 bool visible = true; |
| 352 | 361 |
| 353 ChangeInsertion(start_rect, visible); | 362 ChangeInsertion(start_rect, visible); |
| 354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 363 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 355 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 364 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 356 | 365 |
| 357 ChangeSelection(start_rect, visible, end_rect, visible); | 366 ChangeSelection(start_rect, visible, end_rect, visible); |
| 358 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 367 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 359 SELECTION_SHOWN)); | 368 SELECTION_SHOWN)); |
| 360 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 369 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 361 | 370 |
| 362 ChangeInsertion(end_rect, visible); | 371 ChangeInsertion(end_rect, visible); |
| 363 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 372 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, |
| 364 INSERTION_SHOWN)); | 373 INSERTION_SHOWN)); |
| 365 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 374 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 366 | 375 |
| 367 controller().HideAndDisallowShowingAutomatically(); | 376 controller().HideAndDisallowShowingAutomatically(); |
| 368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
| 369 | 378 |
| 370 controller().OnTapEvent(); | 379 OnTapEvent(); |
| 371 ChangeInsertion(end_rect, visible); | 380 ChangeInsertion(end_rect, visible); |
| 372 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 381 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 373 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 382 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 374 } | 383 } |
| 375 | 384 |
| 376 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 385 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
| 377 base::TimeTicks event_time = base::TimeTicks::Now(); | 386 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 378 controller().OnTapEvent(); | 387 OnTapEvent(); |
| 379 controller().OnSelectionEditable(true); | 388 controller().OnSelectionEditable(true); |
| 380 | 389 |
| 381 // The touch sequence should not be handled if insertion is not active. | 390 // The touch sequence should not be handled if insertion is not active. |
| 382 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 391 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 383 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 392 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 384 | 393 |
| 385 float line_height = 10.f; | 394 float line_height = 10.f; |
| 386 gfx::RectF start_rect(10, 0, 0, line_height); | 395 gfx::RectF start_rect(10, 0, 0, line_height); |
| 387 bool visible = true; | 396 bool visible = true; |
| 388 ChangeInsertion(start_rect, visible); | 397 ChangeInsertion(start_rect, visible); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 419 EXPECT_FALSE(GetAndResetCaretMoved()); | 428 EXPECT_FALSE(GetAndResetCaretMoved()); |
| 420 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); | 429 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); |
| 421 | 430 |
| 422 // Once the drag is complete, no more touch events should be consumed until | 431 // Once the drag is complete, no more touch events should be consumed until |
| 423 // the next ACTION_DOWN. | 432 // the next ACTION_DOWN. |
| 424 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 433 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 425 } | 434 } |
| 426 | 435 |
| 427 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 436 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
| 428 base::TimeTicks event_time = base::TimeTicks::Now(); | 437 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 429 controller().OnTapEvent(); | 438 OnTapEvent(); |
| 430 controller().OnSelectionEditable(true); | 439 controller().OnSelectionEditable(true); |
| 431 SetDraggingEnabled(true); | 440 SetDraggingEnabled(true); |
| 432 | 441 |
| 433 gfx::RectF start_rect(10, 0, 0, 10); | 442 gfx::RectF start_rect(10, 0, 0, 10); |
| 434 bool visible = true; | 443 bool visible = true; |
| 435 ChangeInsertion(start_rect, visible); | 444 ChangeInsertion(start_rect, visible); |
| 436 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 445 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 437 | 446 |
| 438 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 447 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 439 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 448 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 440 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 449 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 441 | 450 |
| 442 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 451 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 443 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 452 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 444 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 453 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 445 INSERTION_DRAG_STOPPED)); | 454 INSERTION_DRAG_STOPPED)); |
| 446 | 455 |
| 447 // Reset the insertion. | 456 // Reset the insertion. |
| 448 ClearInsertion(); | 457 ClearInsertion(); |
| 449 controller().OnTapEvent(); | 458 OnTapEvent(); |
| 450 ChangeInsertion(start_rect, visible); | 459 ChangeInsertion(start_rect, visible); |
| 451 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 460 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 452 INSERTION_SHOWN)); | 461 INSERTION_SHOWN)); |
| 453 | 462 |
| 454 // No tap should be signalled if the time between DOWN and UP was too long. | 463 // No tap should be signalled if the time between DOWN and UP was too long. |
| 455 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 464 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 456 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 465 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 457 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 466 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
| 458 event_time + base::TimeDelta::FromSeconds(1), | 467 event_time + base::TimeDelta::FromSeconds(1), |
| 459 0, | 468 0, |
| 460 0); | 469 0); |
| 461 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 470 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 462 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 471 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
| 463 INSERTION_DRAG_STOPPED)); | 472 INSERTION_DRAG_STOPPED)); |
| 464 | 473 |
| 465 // Reset the insertion. | 474 // Reset the insertion. |
| 466 ClearInsertion(); | 475 ClearInsertion(); |
| 467 controller().OnTapEvent(); | 476 OnTapEvent(); |
| 468 ChangeInsertion(start_rect, visible); | 477 ChangeInsertion(start_rect, visible); |
| 469 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 478 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 470 INSERTION_SHOWN)); | 479 INSERTION_SHOWN)); |
| 471 | 480 |
| 472 // No tap should be signalled if the drag was too long. | 481 // No tap should be signalled if the drag was too long. |
| 473 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 482 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 474 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 483 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 475 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 484 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
| 476 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 485 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 477 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 486 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
| 478 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 479 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 488 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
| 480 INSERTION_DRAG_STOPPED)); | 489 INSERTION_DRAG_STOPPED)); |
| 481 | 490 |
| 482 // Reset the insertion. | 491 // Reset the insertion. |
| 483 ClearInsertion(); | 492 ClearInsertion(); |
| 484 controller().OnTapEvent(); | 493 OnTapEvent(); |
| 485 ChangeInsertion(start_rect, visible); | 494 ChangeInsertion(start_rect, visible); |
| 486 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 495 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
| 487 INSERTION_SHOWN)); | 496 INSERTION_SHOWN)); |
| 488 | 497 |
| 489 // No tap should be signalled if the touch sequence is cancelled. | 498 // No tap should be signalled if the touch sequence is cancelled. |
| 490 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 499 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 491 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 500 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 492 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 501 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
| 493 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 502 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 494 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 503 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
| 495 INSERTION_DRAG_STOPPED)); | 504 INSERTION_DRAG_STOPPED)); |
| 496 } | 505 } |
| 497 | 506 |
| 498 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 507 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
| 499 base::TimeTicks event_time = base::TimeTicks::Now(); | 508 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 500 controller().OnTapEvent(); | 509 OnTapEvent(); |
| 501 controller().OnSelectionEditable(true); | 510 controller().OnSelectionEditable(true); |
| 502 SetDraggingEnabled(true); | 511 SetDraggingEnabled(true); |
| 503 | 512 |
| 504 gfx::RectF anchor_rect(10, 0, 0, 10); | 513 gfx::RectF anchor_rect(10, 0, 0, 10); |
| 505 bool visible = true; | 514 bool visible = true; |
| 506 ChangeInsertion(anchor_rect, visible); | 515 ChangeInsertion(anchor_rect, visible); |
| 507 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 508 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 517 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 509 | 518 |
| 510 // Tapping again shouldn't reset the active insertion point. | 519 // Tapping again shouldn't reset the active insertion point. |
| 511 controller().OnTapEvent(); | 520 OnTapEvent(); |
| 512 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 521 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 513 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 522 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 514 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 523 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 515 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 524 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 516 | 525 |
| 517 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 526 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 518 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 527 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 519 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 528 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 520 INSERTION_DRAG_STOPPED)); | 529 INSERTION_DRAG_STOPPED)); |
| 521 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 530 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 522 | 531 |
| 523 anchor_rect.Offset(5, 15); | 532 anchor_rect.Offset(5, 15); |
| 524 ChangeInsertion(anchor_rect, visible); | 533 ChangeInsertion(anchor_rect, visible); |
| 525 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 534 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
| 526 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 535 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 527 | 536 |
| 528 // Pressing shouldn't reset the active insertion point. | 537 // Pressing shouldn't reset the active insertion point. |
| 529 controller().OnLongPressEvent(); | 538 OnLongPressEvent(); |
| 530 controller().OnSelectionEmpty(true); | 539 controller().OnSelectionEmpty(true); |
| 531 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 540 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 532 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 541 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 533 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 542 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
| 534 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 543 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 535 | 544 |
| 536 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 545 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 537 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 546 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 538 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 547 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
| 539 INSERTION_DRAG_STOPPED)); | 548 INSERTION_DRAG_STOPPED)); |
| 540 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 549 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 541 } | 550 } |
| 542 | 551 |
| 543 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 552 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 544 gfx::RectF start_rect(5, 5, 0, 10); | 553 gfx::RectF start_rect(5, 5, 0, 10); |
| 545 gfx::RectF end_rect(50, 5, 0, 10); | 554 gfx::RectF end_rect(50, 5, 0, 10); |
| 546 bool visible = true; | 555 bool visible = true; |
| 547 | 556 |
| 548 // Selection events are ignored until automatic showing is enabled. | 557 // Selection events are ignored until automatic showing is enabled. |
| 549 ChangeSelection(start_rect, visible, end_rect, visible); | 558 ChangeSelection(start_rect, visible, end_rect, visible); |
| 550 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 559 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 551 | 560 |
| 552 controller().OnLongPressEvent(); | 561 OnLongPressEvent(); |
| 553 ChangeSelection(start_rect, visible, end_rect, visible); | 562 ChangeSelection(start_rect, visible, end_rect, visible); |
| 554 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 563 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 555 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 564 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 556 | 565 |
| 557 start_rect.Offset(1, 0); | 566 start_rect.Offset(1, 0); |
| 558 ChangeSelection(start_rect, visible, end_rect, visible); | 567 ChangeSelection(start_rect, visible, end_rect, visible); |
| 559 // Selection movement does not currently trigger a separate event. | 568 // Selection movement does not currently trigger a separate event. |
| 560 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 569 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 561 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 570 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 562 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 571 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 563 | 572 |
| 564 ClearSelection(); | 573 ClearSelection(); |
| 565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 574 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 566 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 575 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 567 } | 576 } |
| 568 | 577 |
| 569 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 578 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 570 gfx::RectF start_rect(5, 5, 0, 10); | 579 gfx::RectF start_rect(5, 5, 0, 10); |
| 571 gfx::RectF end_rect(50, 5, 0, 10); | 580 gfx::RectF end_rect(50, 5, 0, 10); |
| 572 bool visible = true; | 581 bool visible = true; |
| 573 | 582 |
| 574 controller().OnLongPressEvent(); | 583 OnLongPressEvent(); |
| 575 ChangeSelection(start_rect, visible, end_rect, visible); | 584 ChangeSelection(start_rect, visible, end_rect, visible); |
| 576 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 585 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 577 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 586 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 578 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 587 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 579 | 588 |
| 580 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 589 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
| 581 // event notification. | 590 // event notification. |
| 582 start_rect.Offset(10, 10); | 591 start_rect.Offset(10, 10); |
| 583 controller().OnLongPressEvent(); | 592 OnLongPressEvent(); |
| 584 ChangeSelection(start_rect, visible, end_rect, visible); | 593 ChangeSelection(start_rect, visible, end_rect, visible); |
| 585 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 594 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 586 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 595 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 587 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 596 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 588 } | 597 } |
| 589 | 598 |
| 590 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 599 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 591 base::TimeTicks event_time = base::TimeTicks::Now(); | 600 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 592 controller().OnLongPressEvent(); | 601 OnLongPressEvent(); |
| 593 | 602 |
| 594 // The touch sequence should not be handled if selection is not active. | 603 // The touch sequence should not be handled if selection is not active. |
| 595 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 604 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 596 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 605 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 597 | 606 |
| 598 float line_height = 10.f; | 607 float line_height = 10.f; |
| 599 gfx::RectF start_rect(0, 0, 0, line_height); | 608 gfx::RectF start_rect(0, 0, 0, line_height); |
| 600 gfx::RectF end_rect(50, 0, 0, line_height); | 609 gfx::RectF end_rect(50, 0, 0, line_height); |
| 601 bool visible = true; | 610 bool visible = true; |
| 602 ChangeSelection(start_rect, visible, end_rect, visible); | 611 ChangeSelection(start_rect, visible, end_rect, visible); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 649 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 641 EXPECT_FALSE(GetAndResetSelectionMoved()); | 650 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 642 | 651 |
| 643 // Once the drag is complete, no more touch events should be consumed until | 652 // Once the drag is complete, no more touch events should be consumed until |
| 644 // the next ACTION_DOWN. | 653 // the next ACTION_DOWN. |
| 645 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 654 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 646 } | 655 } |
| 647 | 656 |
| 648 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 657 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 649 base::TimeTicks event_time = base::TimeTicks::Now(); | 658 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 650 controller().OnLongPressEvent(); | 659 OnLongPressEvent(); |
| 651 | 660 |
| 652 float line_height = 10.f; | 661 float line_height = 10.f; |
| 653 gfx::RectF start_rect(0, 0, 0, line_height); | 662 gfx::RectF start_rect(0, 0, 0, line_height); |
| 654 gfx::RectF end_rect(50, 0, 0, line_height); | 663 gfx::RectF end_rect(50, 0, 0, line_height); |
| 655 bool visible = true; | 664 bool visible = true; |
| 656 ChangeSelection(start_rect, visible, end_rect, visible); | 665 ChangeSelection(start_rect, visible, end_rect, visible); |
| 657 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 666 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 658 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 667 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 659 | 668 |
| 660 // The ACTION_DOWN should lock to the closest handle. | 669 // The ACTION_DOWN should lock to the closest handle. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 678 GetLastSelectionEnd()); | 687 GetLastSelectionEnd()); |
| 679 | 688 |
| 680 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 689 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 681 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 690 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 682 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 691 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 683 EXPECT_FALSE(GetAndResetSelectionMoved()); | 692 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 684 } | 693 } |
| 685 | 694 |
| 686 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 695 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 687 base::TimeTicks event_time = base::TimeTicks::Now(); | 696 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 688 controller().OnLongPressEvent(); | 697 OnLongPressEvent(); |
| 689 | 698 |
| 690 float line_height = 10.f; | 699 float line_height = 10.f; |
| 691 gfx::RectF start_rect(50, line_height, 0, line_height); | 700 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 692 gfx::RectF end_rect(100, line_height, 0, line_height); | 701 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 693 bool visible = true; | 702 bool visible = true; |
| 694 ChangeSelection(start_rect, visible, end_rect, visible); | 703 ChangeSelection(start_rect, visible, end_rect, visible); |
| 695 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 704 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 696 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 705 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 697 | 706 |
| 698 SetDraggingEnabled(true); | 707 SetDraggingEnabled(true); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 806 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
| 798 | 807 |
| 799 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 808 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
| 800 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 809 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 801 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 810 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
| 802 EXPECT_FALSE(GetAndResetSelectionMoved()); | 811 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 803 } | 812 } |
| 804 | 813 |
| 805 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 814 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
| 806 base::TimeTicks event_time = base::TimeTicks::Now(); | 815 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 807 controller().OnLongPressEvent(); | 816 OnLongPressEvent(); |
| 808 | 817 |
| 809 float small_line_height = 1.f; | 818 float small_line_height = 1.f; |
| 810 float large_line_height = 50.f; | 819 float large_line_height = 50.f; |
| 811 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 820 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 812 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 821 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 813 bool visible = true; | 822 bool visible = true; |
| 814 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 823 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
| 815 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 824 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 816 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 825 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
| 817 | 826 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 831 | 840 |
| 832 small_line_rect += gfx::Vector2dF(25.f, 0); | 841 small_line_rect += gfx::Vector2dF(25.f, 0); |
| 833 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 842 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 834 small_line_rect.x(), small_line_rect.y()); | 843 small_line_rect.x(), small_line_rect.y()); |
| 835 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 844 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 836 EXPECT_TRUE(GetAndResetSelectionMoved()); | 845 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 837 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 846 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
| 838 } | 847 } |
| 839 | 848 |
| 840 TEST_F(TouchSelectionControllerTest, Animation) { | 849 TEST_F(TouchSelectionControllerTest, Animation) { |
| 841 controller().OnTapEvent(); | 850 OnTapEvent(); |
| 842 controller().OnSelectionEditable(true); | 851 controller().OnSelectionEditable(true); |
| 843 | 852 |
| 844 gfx::RectF insertion_rect(5, 5, 0, 10); | 853 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 845 | 854 |
| 846 bool visible = true; | 855 bool visible = true; |
| 847 ChangeInsertion(insertion_rect, visible); | 856 ChangeInsertion(insertion_rect, visible); |
| 848 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 857 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 849 | 858 |
| 850 visible = false; | 859 visible = false; |
| 851 ChangeInsertion(insertion_rect, visible); | 860 ChangeInsertion(insertion_rect, visible); |
| 852 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 861 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 853 | 862 |
| 854 visible = true; | 863 visible = true; |
| 855 ChangeInsertion(insertion_rect, visible); | 864 ChangeInsertion(insertion_rect, visible); |
| 856 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 865 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 857 | 866 |
| 858 // If the handles are explicity hidden, no animation should be triggered. | 867 // If the handles are explicity hidden, no animation should be triggered. |
| 859 controller().HideAndDisallowShowingAutomatically(); | 868 controller().HideAndDisallowShowingAutomatically(); |
| 860 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 869 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 861 | 870 |
| 862 // If the client doesn't support animation, no animation should be triggered. | 871 // If the client doesn't support animation, no animation should be triggered. |
| 863 SetAnimationEnabled(false); | 872 SetAnimationEnabled(false); |
| 864 controller().OnTapEvent(); | 873 OnTapEvent(); |
| 865 visible = true; | 874 visible = true; |
| 866 ChangeInsertion(insertion_rect, visible); | 875 ChangeInsertion(insertion_rect, visible); |
| 867 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 876 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 868 } | 877 } |
| 869 | 878 |
| 870 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 879 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 871 controller().OnTapEvent(); | 880 OnTapEvent(); |
| 872 controller().OnSelectionEditable(true); | 881 controller().OnSelectionEditable(true); |
| 873 | 882 |
| 874 gfx::RectF insertion_rect(5, 5, 0, 10); | 883 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 875 | 884 |
| 876 bool visible = true; | 885 bool visible = true; |
| 877 ChangeInsertion(insertion_rect, visible); | 886 ChangeInsertion(insertion_rect, visible); |
| 878 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 887 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 879 | 888 |
| 880 controller().SetTemporarilyHidden(true); | 889 controller().SetTemporarilyHidden(true); |
| 881 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 890 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 882 | 891 |
| 883 visible = false; | 892 visible = false; |
| 884 ChangeInsertion(insertion_rect, visible); | 893 ChangeInsertion(insertion_rect, visible); |
| 885 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 894 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 886 | 895 |
| 887 visible = true; | 896 visible = true; |
| 888 ChangeInsertion(insertion_rect, visible); | 897 ChangeInsertion(insertion_rect, visible); |
| 889 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 898 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 890 | 899 |
| 891 controller().SetTemporarilyHidden(false); | 900 controller().SetTemporarilyHidden(false); |
| 892 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 901 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| 893 } | 902 } |
| 894 | 903 |
| 895 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 904 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 896 gfx::RectF start_rect(5, 5, 0, 10); | 905 gfx::RectF start_rect(5, 5, 0, 10); |
| 897 gfx::RectF end_rect(50, 5, 0, 10); | 906 gfx::RectF end_rect(50, 5, 0, 10); |
| 898 bool visible = true; | 907 bool visible = true; |
| 899 | 908 |
| 900 controller().OnLongPressEvent(); | 909 OnLongPressEvent(); |
| 901 ChangeSelection(start_rect, visible, end_rect, visible); | 910 ChangeSelection(start_rect, visible, end_rect, visible); |
| 902 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 911 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 903 | 912 |
| 904 // Selection should not be cleared if the selection bounds have not changed. | 913 // Selection should not be cleared if the selection bounds have not changed. |
| 905 controller().OnTapEvent(); | 914 OnTapEvent(); |
| 906 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 915 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 907 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 916 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 908 | 917 |
| 909 controller().OnTapEvent(); | 918 OnTapEvent(); |
| 910 ClearSelection(); | 919 ClearSelection(); |
| 911 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 920 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 912 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 921 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 913 } | 922 } |
| 914 | 923 |
| 915 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | 924 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { |
| 916 gfx::RectF start_rect(5, 5, 0, 10); | 925 gfx::RectF start_rect(5, 5, 0, 10); |
| 917 gfx::RectF end_rect(50, 5, 0, 10); | 926 gfx::RectF end_rect(50, 5, 0, 10); |
| 918 bool visible = true; | 927 bool visible = true; |
| 919 | 928 |
| 920 // Tap-triggered selections should not be allowed. | 929 // Tap-triggered selections should not be allowed. |
| 921 controller().OnLongPressEvent(); | 930 OnLongPressEvent(); |
| 922 controller().OnTapEvent(); | 931 OnTapEvent(); |
| 923 ChangeSelection(start_rect, visible, end_rect, visible); | 932 ChangeSelection(start_rect, visible, end_rect, visible); |
| 924 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 933 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 925 | 934 |
| 926 // Subsequent longpress selections will be allowed. | 935 // Subsequent longpress selections will be allowed. |
| 927 controller().OnLongPressEvent(); | 936 OnLongPressEvent(); |
| 928 ChangeSelection(start_rect, visible, end_rect, visible); | 937 ChangeSelection(start_rect, visible, end_rect, visible); |
| 929 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 938 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 930 | 939 |
| 931 // Tapping again shouldn't have any effect on subsequent selection events. | 940 // Tapping again shouldn't have any effect on subsequent selection events. |
| 932 controller().OnTapEvent(); | 941 OnTapEvent(); |
| 933 end_rect.Offset(10, 10); | 942 end_rect.Offset(10, 10); |
| 934 ChangeSelection(start_rect, visible, end_rect, visible); | 943 ChangeSelection(start_rect, visible, end_rect, visible); |
| 935 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 944 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
| 936 ClearSelection(); | 945 ClearSelection(); |
| 937 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 946 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 938 } | 947 } |
| 939 | 948 |
| 940 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 949 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
| 941 gfx::RectF start_rect(5, 5, 0, 10); | 950 gfx::RectF start_rect(5, 5, 0, 10); |
| 942 gfx::RectF end_rect(50, 5, 0, 10); | 951 gfx::RectF end_rect(50, 5, 0, 10); |
| 943 bool visible = true; | 952 bool visible = true; |
| 944 | 953 |
| 945 // The selection should not be activated, as it wasn't yet allowed. | 954 // The selection should not be activated, as it wasn't yet allowed. |
| 946 ChangeSelection(start_rect, visible, end_rect, visible); | 955 ChangeSelection(start_rect, visible, end_rect, visible); |
| 947 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 956 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
| 948 | 957 |
| 949 // A longpress should have no immediate effect. | 958 // A longpress should have no immediate effect. |
| 950 controller().OnLongPressEvent(); | 959 OnLongPressEvent(); |
| 951 | 960 |
| 952 // Now explicitly allow showing from the previously supplied bounds. | 961 // Now explicitly allow showing from the previously supplied bounds. |
| 953 controller().AllowShowingFromCurrentSelection(); | 962 controller().AllowShowingFromCurrentSelection(); |
| 954 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 963 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 955 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 964 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 956 | 965 |
| 957 // Repeated calls to show from the current selection should be ignored. | 966 // Repeated calls to show from the current selection should be ignored. |
| 958 controller().AllowShowingFromCurrentSelection(); | 967 controller().AllowShowingFromCurrentSelection(); |
| 959 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 968 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 960 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 969 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 961 | 970 |
| 962 // Trying to show from an empty selection will have no result. | 971 // Trying to show from an empty selection will have no result. |
| 963 ClearSelection(); | 972 ClearSelection(); |
| 964 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 973 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
| 965 controller().AllowShowingFromCurrentSelection(); | 974 controller().AllowShowingFromCurrentSelection(); |
| 966 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 975 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 967 | 976 |
| 968 // Showing the insertion handle should also be supported. | 977 // Showing the insertion handle should also be supported. |
| 969 controller().OnSelectionEditable(true); | 978 controller().OnSelectionEditable(true); |
| 970 controller().OnSelectionEmpty(false); | 979 controller().OnSelectionEmpty(false); |
| 971 controller().HideAndDisallowShowingAutomatically(); | 980 controller().HideAndDisallowShowingAutomatically(); |
| 972 gfx::RectF insertion_rect(5, 5, 0, 10); | 981 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 973 ChangeInsertion(insertion_rect, visible); | 982 ChangeInsertion(insertion_rect, visible); |
| 974 controller().AllowShowingFromCurrentSelection(); | 983 controller().AllowShowingFromCurrentSelection(); |
| 975 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 984 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
| 976 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 985 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 977 } | 986 } |
| 978 | 987 |
| 988 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { |
| 989 bool visible = false; |
| 990 gfx::RectF start_rect(5, 5, 0, 10); |
| 991 gfx::RectF end_rect(50, 5, 0, 10); |
| 992 gfx::PointF inner_point(25, 10); |
| 993 gfx::PointF outer_point(100, 100); |
| 994 |
| 995 // Establish a selection without handles from 5 to 50 with height 10. |
| 996 ChangeSelection(start_rect, visible, end_rect, visible); |
| 997 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 998 |
| 999 // A point outside the rect should not be handled. |
| 1000 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point)); |
| 1001 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1002 |
| 1003 // A point inside the rect should be handled. |
| 1004 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point)); |
| 1005 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 1006 } |
| 1007 |
| 1008 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { |
| 1009 bool visible = false; |
| 1010 gfx::RectF start_rect(5, 5, 0, 10); |
| 1011 gfx::RectF end_rect(50, 5, 0, 10); |
| 1012 gfx::PointF inner_point(25, 10); |
| 1013 gfx::PointF outer_point(100, 100); |
| 1014 |
| 1015 // Establish a selection without handles from 5 to 50 with height 10. |
| 1016 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1017 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1018 |
| 1019 // A point outside the rect should not be handled. |
| 1020 EXPECT_FALSE(controller().WillHandleLongPressEvent(outer_point)); |
| 1021 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1022 |
| 1023 // A point inside the rect should be handled. |
| 1024 EXPECT_TRUE(controller().WillHandleLongPressEvent(inner_point)); |
| 1025 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
| 1026 } |
| 1027 |
| 979 } // namespace ui | 1028 } // namespace ui |
| OLD | NEW |