| 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 "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 start_bound.set_type(gfx::SelectionBound::LEFT); | 138 start_bound.set_type(gfx::SelectionBound::LEFT); |
| 139 end_bound.set_type(gfx::SelectionBound::RIGHT); | 139 end_bound.set_type(gfx::SelectionBound::RIGHT); |
| 140 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 140 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
| 141 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 141 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
| 142 start_bound.set_visible(start_visible); | 142 start_bound.set_visible(start_visible); |
| 143 end_bound.set_visible(end_visible); | 143 end_bound.set_visible(end_visible); |
| 144 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 144 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
| 145 } | 145 } |
| 146 | 146 |
| 147 void OnLongPressEvent() { | 147 void OnLongPressEvent() { |
| 148 ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(), | 148 controller().WillHandleLongPressEvent(base::TimeTicks(), |
| 149 kIgnoredPoint)); | 149 kIgnoredPoint); |
| 150 } | 150 } |
| 151 | 151 |
| 152 void OnTapEvent() { | 152 void OnTapEvent() { |
| 153 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 1)); | 153 controller().WillHandleTapEvent(kIgnoredPoint, 1); |
| 154 } | 154 } |
| 155 | 155 |
| 156 void OnDoubleTapEvent() { | 156 void OnDoubleTapEvent() { |
| 157 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 2)); | 157 controller().WillHandleTapEvent(kIgnoredPoint, 2); |
| 158 } | 158 } |
| 159 | 159 |
| 160 void Animate() { | 160 void Animate() { |
| 161 base::TimeTicks now = base::TimeTicks::Now(); | 161 base::TimeTicks now = base::TimeTicks::Now(); |
| 162 while (needs_animate_) { | 162 while (needs_animate_) { |
| 163 needs_animate_ = controller_->Animate(now); | 163 needs_animate_ = controller_->Animate(now); |
| 164 now += base::TimeDelta::FromMilliseconds(16); | 164 now += base::TimeDelta::FromMilliseconds(16); |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 | 167 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 bool dragging_enabled_; | 233 bool dragging_enabled_; |
| 234 std::unique_ptr<TouchSelectionController> controller_; | 234 std::unique_ptr<TouchSelectionController> controller_; |
| 235 | 235 |
| 236 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); | 236 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); |
| 237 }; | 237 }; |
| 238 | 238 |
| 239 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 239 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
| 240 gfx::RectF insertion_rect(5, 5, 0, 10); | 240 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 241 bool visible = true; | 241 bool visible = true; |
| 242 | 242 |
| 243 // Insertion handles are not shown until automatic showing is enabled. | |
| 244 ChangeInsertion(insertion_rect, visible); | |
| 245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 246 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 247 OnTapEvent(); | 243 OnTapEvent(); |
| 248 | |
| 249 // Insertion handles are not shown until the selection region is | |
| 250 // marked editable. | |
| 251 ChangeInsertion(insertion_rect, visible); | |
| 252 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 253 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 254 | |
| 255 OnTapEvent(); | |
| 256 controller().OnSelectionEditable(true); | |
| 257 ChangeInsertion(insertion_rect, visible); | 244 ChangeInsertion(insertion_rect, visible); |
| 258 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | 245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 259 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 246 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 260 | 247 |
| 261 insertion_rect.Offset(1, 0); | 248 insertion_rect.Offset(1, 0); |
| 262 ChangeInsertion(insertion_rect, visible); | 249 ChangeInsertion(insertion_rect, visible); |
| 263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 250 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
| 264 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 251 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 265 | 252 |
| 266 insertion_rect.Offset(0, 1); | 253 insertion_rect.Offset(0, 1); |
| 267 ChangeInsertion(insertion_rect, visible); | 254 ChangeInsertion(insertion_rect, visible); |
| 268 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
| 269 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 256 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
| 270 | 257 |
| 271 ClearInsertion(); | 258 ClearInsertion(); |
| 272 EXPECT_THAT(GetAndResetEvents(), | 259 EXPECT_THAT(GetAndResetEvents(), |
| 273 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED)); | 260 ElementsAre(INSERTION_HANDLE_CLEARED)); |
| 274 } | |
| 275 | |
| 276 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | |
| 277 gfx::RectF insertion_rect(5, 5, 0, 10); | |
| 278 bool visible = true; | |
| 279 OnTapEvent(); | |
| 280 controller().OnSelectionEditable(true); | |
| 281 | |
| 282 ChangeInsertion(insertion_rect, visible); | |
| 283 EXPECT_THAT(GetAndResetEvents(), | |
| 284 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 285 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
| 286 | |
| 287 controller().OnSelectionEditable(false); | |
| 288 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
| 289 } | |
| 290 | |
| 291 TEST_F(TouchSelectionControllerTest, InsertionEmptyEditable) { | |
| 292 gfx::RectF insertion_rect(5, 5, 0, 10); | |
| 293 bool visible = true; | |
| 294 controller().OnSelectionEditable(true); | |
| 295 | |
| 296 // Taps on an empty editable region should be ignored | |
| 297 OnTapEvent(); | |
| 298 controller().OnSelectionEmpty(true); | |
| 299 ChangeInsertion(insertion_rect, visible); | |
| 300 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 301 | |
| 302 // Once the region becomes non-empty, taps should show the insertion handle. | |
| 303 OnTapEvent(); | |
| 304 controller().OnSelectionEmpty(false); | |
| 305 ChangeInsertion(insertion_rect, visible); | |
| 306 EXPECT_THAT(GetAndResetEvents(), | |
| 307 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 308 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
| 309 | |
| 310 // Reset the selection. | |
| 311 controller().HideAndDisallowShowingAutomatically(); | |
| 312 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
| 313 | |
| 314 // Long-pressing should show the handle even if the editable region is empty. | |
| 315 insertion_rect.Offset(2, -2); | |
| 316 OnLongPressEvent(); | |
| 317 controller().OnSelectionEmpty(true); | |
| 318 ChangeInsertion(insertion_rect, visible); | |
| 319 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | |
| 320 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
| 321 | |
| 322 // Single Tap on an empty edit field should clear insertion handle. | |
| 323 OnTapEvent(); | |
| 324 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | |
| 325 } | |
| 326 | |
| 327 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | |
| 328 gfx::RectF insertion_rect(5, 5, 0, 10); | |
| 329 bool visible = true; | |
| 330 | |
| 331 // Simulate the user tapping an empty text field. | |
| 332 OnTapEvent(); | |
| 333 controller().OnSelectionEditable(true); | |
| 334 controller().OnSelectionEmpty(true); | |
| 335 ChangeInsertion(insertion_rect, visible); | |
| 336 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 337 | |
| 338 // Simulate the cursor moving while a user is typing. | |
| 339 insertion_rect.Offset(10, 0); | |
| 340 controller().OnSelectionEmpty(false); | |
| 341 ChangeInsertion(insertion_rect, visible); | |
| 342 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 343 | |
| 344 // If the user taps the *same* position as the cursor at the end of the text | |
| 345 // entry, the handle should appear. | |
| 346 OnTapEvent(); | |
| 347 ChangeInsertion(insertion_rect, visible); | |
| 348 EXPECT_THAT(GetAndResetEvents(), | |
| 349 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 350 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
| 351 } | 261 } |
| 352 | 262 |
| 353 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 263 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
| 354 OnLongPressEvent(); | 264 OnLongPressEvent(); |
| 355 controller().OnSelectionEditable(true); | |
| 356 | 265 |
| 357 gfx::RectF start_rect(5, 5, 0, 10); | 266 gfx::RectF start_rect(5, 5, 0, 10); |
| 358 gfx::RectF end_rect(50, 5, 0, 10); | 267 gfx::RectF end_rect(50, 5, 0, 10); |
| 359 bool visible = true; | 268 bool visible = true; |
| 360 | 269 |
| 361 ChangeInsertion(start_rect, visible); | 270 ChangeInsertion(start_rect, visible); |
| 362 EXPECT_THAT(GetAndResetEvents(), | 271 EXPECT_THAT(GetAndResetEvents(), |
| 363 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 272 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 364 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 273 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 365 | 274 |
| 366 ChangeSelection(start_rect, visible, end_rect, visible); | 275 ChangeSelection(start_rect, visible, end_rect, visible); |
| 367 EXPECT_THAT(GetAndResetEvents(), | 276 EXPECT_THAT(GetAndResetEvents(), |
| 368 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 277 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
| 369 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 278 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 370 | 279 |
| 371 ChangeInsertion(end_rect, visible); | 280 ChangeInsertion(end_rect, visible); |
| 372 EXPECT_THAT(GetAndResetEvents(), | 281 EXPECT_THAT(GetAndResetEvents(), |
| 373 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); | 282 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 374 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 283 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 375 | 284 |
| 376 controller().HideAndDisallowShowingAutomatically(); | 285 controller().HideAndDisallowShowingAutomatically(); |
| 377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); | 286 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); |
| 378 | 287 |
| 379 OnTapEvent(); | 288 OnTapEvent(); |
| 380 ChangeInsertion(end_rect, visible); | 289 ChangeInsertion(end_rect, visible); |
| 381 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); | 290 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 382 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 291 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
| 383 } | 292 } |
| 384 | 293 |
| 385 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 294 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
| 386 base::TimeTicks event_time = base::TimeTicks::Now(); | 295 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 387 OnTapEvent(); | 296 OnTapEvent(); |
| 388 controller().OnSelectionEditable(true); | |
| 389 | 297 |
| 390 // The touch sequence should not be handled if insertion is not active. | 298 // The touch sequence should not be handled if insertion is not active. |
| 391 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 299 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 392 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 300 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 393 | 301 |
| 394 float line_height = 10.f; | 302 float line_height = 10.f; |
| 395 gfx::RectF start_rect(10, 0, 0, line_height); | 303 gfx::RectF start_rect(10, 0, 0, line_height); |
| 396 bool visible = true; | 304 bool visible = true; |
| 397 ChangeInsertion(start_rect, visible); | 305 ChangeInsertion(start_rect, visible); |
| 398 EXPECT_THAT(GetAndResetEvents(), | 306 EXPECT_THAT(GetAndResetEvents(), |
| 399 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 307 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 400 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 308 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 401 | 309 |
| 402 // The touch sequence should be handled only if the drawable reports a hit. | 310 // The touch sequence should be handled only if the drawable reports a hit. |
| 403 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 311 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 404 SetDraggingEnabled(true); | 312 SetDraggingEnabled(true); |
| 405 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 313 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 406 EXPECT_FALSE(GetAndResetCaretMoved()); | 314 EXPECT_FALSE(GetAndResetCaretMoved()); |
| 407 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 315 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 408 | 316 |
| 409 // The MoveCaret() result should reflect the movement. | 317 // The MoveCaret() result should reflect the movement. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 430 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STOPPED)); | 338 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STOPPED)); |
| 431 | 339 |
| 432 // Once the drag is complete, no more touch events should be consumed until | 340 // Once the drag is complete, no more touch events should be consumed until |
| 433 // the next ACTION_DOWN. | 341 // the next ACTION_DOWN. |
| 434 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 342 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 435 } | 343 } |
| 436 | 344 |
| 437 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 345 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
| 438 base::TimeTicks event_time = base::TimeTicks::Now(); | 346 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 439 OnTapEvent(); | 347 OnTapEvent(); |
| 440 controller().OnSelectionEditable(true); | |
| 441 SetDraggingEnabled(true); | 348 SetDraggingEnabled(true); |
| 442 | 349 |
| 443 gfx::RectF start_rect(10, 0, 0, 10); | 350 gfx::RectF start_rect(10, 0, 0, 10); |
| 444 bool visible = true; | 351 bool visible = true; |
| 445 ChangeInsertion(start_rect, visible); | 352 ChangeInsertion(start_rect, visible); |
| 446 EXPECT_THAT(GetAndResetEvents(), | 353 EXPECT_THAT(GetAndResetEvents(), |
| 447 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 354 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 448 | 355 |
| 449 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 356 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 450 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 357 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 451 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 358 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 452 | 359 |
| 453 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 360 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 454 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 361 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 455 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 362 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
| 456 INSERTION_HANDLE_DRAG_STOPPED)); | 363 INSERTION_HANDLE_DRAG_STOPPED)); |
| 457 | 364 |
| 458 // Reset the insertion. | 365 // Reset the insertion. |
| 459 ClearInsertion(); | 366 ClearInsertion(); |
| 460 OnTapEvent(); | 367 OnTapEvent(); |
| 461 ChangeInsertion(start_rect, visible); | 368 ChangeInsertion(start_rect, visible); |
| 462 EXPECT_THAT(GetAndResetEvents(), | 369 EXPECT_THAT(GetAndResetEvents(), |
| 463 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 370 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 464 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 465 | 371 |
| 466 // No tap should be signalled if the time between DOWN and UP was too long. | 372 // No tap should be signalled if the time between DOWN and UP was too long. |
| 467 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 373 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 468 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 374 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 469 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 375 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
| 470 event_time + base::TimeDelta::FromSeconds(1), | 376 event_time + base::TimeDelta::FromSeconds(1), |
| 471 0, | 377 0, |
| 472 0); | 378 0); |
| 473 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 379 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 474 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 380 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
| 475 INSERTION_HANDLE_DRAG_STOPPED)); | 381 INSERTION_HANDLE_DRAG_STOPPED)); |
| 476 | 382 |
| 477 // Reset the insertion. | 383 // Reset the insertion. |
| 478 ClearInsertion(); | 384 ClearInsertion(); |
| 479 OnTapEvent(); | 385 OnTapEvent(); |
| 480 ChangeInsertion(start_rect, visible); | 386 ChangeInsertion(start_rect, visible); |
| 481 EXPECT_THAT(GetAndResetEvents(), | 387 EXPECT_THAT(GetAndResetEvents(), |
| 482 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 388 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 483 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 484 | 389 |
| 485 // No tap should be signalled if the drag was too long. | 390 // No tap should be signalled if the drag was too long. |
| 486 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 391 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 392 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 488 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 393 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
| 489 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 394 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 490 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 395 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
| 491 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 396 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 492 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 397 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
| 493 INSERTION_HANDLE_DRAG_STOPPED)); | 398 INSERTION_HANDLE_DRAG_STOPPED)); |
| 494 | 399 |
| 495 // Reset the insertion. | 400 // Reset the insertion. |
| 496 ClearInsertion(); | 401 ClearInsertion(); |
| 497 OnTapEvent(); | 402 OnTapEvent(); |
| 498 ChangeInsertion(start_rect, visible); | 403 ChangeInsertion(start_rect, visible); |
| 499 EXPECT_THAT(GetAndResetEvents(), | 404 EXPECT_THAT(GetAndResetEvents(), |
| 500 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 405 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 501 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 502 | 406 |
| 503 // No tap should be signalled if the touch sequence is cancelled. | 407 // No tap should be signalled if the touch sequence is cancelled. |
| 504 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 408 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 505 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 409 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 506 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 410 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
| 507 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 411 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 508 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 412 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
| 509 INSERTION_HANDLE_DRAG_STOPPED)); | 413 INSERTION_HANDLE_DRAG_STOPPED)); |
| 510 } | 414 } |
| 511 | 415 |
| 512 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 416 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
| 513 base::TimeTicks event_time = base::TimeTicks::Now(); | 417 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 514 OnTapEvent(); | 418 OnTapEvent(); |
| 515 controller().OnSelectionEditable(true); | |
| 516 SetDraggingEnabled(true); | 419 SetDraggingEnabled(true); |
| 517 | 420 |
| 518 gfx::RectF anchor_rect(10, 0, 0, 10); | 421 gfx::RectF anchor_rect(10, 0, 0, 10); |
| 519 bool visible = true; | 422 bool visible = true; |
| 520 ChangeInsertion(anchor_rect, visible); | 423 ChangeInsertion(anchor_rect, visible); |
| 521 EXPECT_THAT(GetAndResetEvents(), | 424 EXPECT_THAT(GetAndResetEvents(), |
| 522 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 425 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 523 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 426 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 524 | 427 |
| 525 // Tapping again shouldn't reset the active insertion point. | 428 // Tapping again shouldn't reset the active insertion point. |
| 526 OnTapEvent(); | 429 OnTapEvent(); |
| 527 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 430 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 528 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 431 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 529 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 432 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 530 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 433 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 531 | 434 |
| 532 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 435 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 533 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 436 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 534 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 437 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
| 535 INSERTION_HANDLE_DRAG_STOPPED)); | 438 INSERTION_HANDLE_DRAG_STOPPED)); |
| 536 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 439 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 537 | 440 |
| 538 anchor_rect.Offset(5, 15); | 441 anchor_rect.Offset(5, 15); |
| 539 ChangeInsertion(anchor_rect, visible); | 442 ChangeInsertion(anchor_rect, visible); |
| 540 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 443 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
| 541 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 444 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 542 | 445 |
| 543 // Pressing shouldn't reset the active insertion point. | 446 // Pressing shouldn't reset the active insertion point. |
| 544 OnLongPressEvent(); | 447 OnLongPressEvent(); |
| 545 controller().OnSelectionEmpty(true); | |
| 546 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 448 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 547 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 449 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 548 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 450 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 549 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 451 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 550 | 452 |
| 551 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 453 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 552 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 454 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 553 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 455 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
| 554 INSERTION_HANDLE_DRAG_STOPPED)); | 456 INSERTION_HANDLE_DRAG_STOPPED)); |
| 555 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 457 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 556 } | 458 } |
| 557 | 459 |
| 558 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 460 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 559 gfx::RectF start_rect(5, 5, 0, 10); | 461 gfx::RectF start_rect(5, 5, 0, 10); |
| 560 gfx::RectF end_rect(50, 5, 0, 10); | 462 gfx::RectF end_rect(50, 5, 0, 10); |
| 561 bool visible = true; | 463 bool visible = true; |
| 562 | 464 |
| 563 // Selection events are ignored until automatic showing is enabled. | |
| 564 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 565 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 566 | |
| 567 OnLongPressEvent(); | 465 OnLongPressEvent(); |
| 568 ChangeSelection(start_rect, visible, end_rect, visible); | 466 ChangeSelection(start_rect, visible, end_rect, visible); |
| 569 EXPECT_THAT(GetAndResetEvents(), | 467 EXPECT_THAT(GetAndResetEvents(), |
| 570 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 468 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 571 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 469 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 572 | 470 |
| 573 start_rect.Offset(1, 0); | 471 start_rect.Offset(1, 0); |
| 574 ChangeSelection(start_rect, visible, end_rect, visible); | 472 ChangeSelection(start_rect, visible, end_rect, visible); |
| 575 // Selection movement does not currently trigger a separate event. | 473 // Selection movement does not currently trigger a separate event. |
| 576 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 474 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
| 577 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 475 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 578 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 476 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 579 | 477 |
| 580 ClearSelection(); | 478 ClearSelection(); |
| 581 EXPECT_THAT(GetAndResetEvents(), | 479 EXPECT_THAT(GetAndResetEvents(), |
| 582 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 480 ElementsAre(SELECTION_HANDLES_CLEARED)); |
| 583 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 584 } | 481 } |
| 585 | 482 |
| 586 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { | 483 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { |
| 587 gfx::RectF start_rect(5, 5, 0, 10); | 484 gfx::RectF start_rect(5, 5, 0, 10); |
| 588 gfx::RectF end_rect(50, 5, 0, 10); | 485 gfx::RectF end_rect(50, 5, 0, 10); |
| 589 bool visible = true; | 486 bool visible = true; |
| 590 | 487 |
| 591 OnDoubleTapEvent(); | 488 OnDoubleTapEvent(); |
| 592 ChangeSelection(start_rect, visible, end_rect, visible); | 489 ChangeSelection(start_rect, visible, end_rect, visible); |
| 593 EXPECT_THAT(GetAndResetEvents(), | 490 EXPECT_THAT(GetAndResetEvents(), |
| 594 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 491 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 595 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 492 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 596 } | 493 } |
| 597 | 494 |
| 598 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { | 495 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { |
| 599 gfx::RectF start_rect(5, 5, 0, 10); | 496 gfx::RectF start_rect(5, 5, 0, 10); |
| 600 gfx::RectF end_rect(50, 5, 0, 10); | 497 gfx::RectF end_rect(50, 5, 0, 10); |
| 601 bool visible = true; | 498 bool visible = true; |
| 602 | 499 |
| 603 controller().OnSelectionEditable(true); | |
| 604 | |
| 605 // If the user double tap selects text in an editable region, the first tap | 500 // If the user double tap selects text in an editable region, the first tap |
| 606 // will register insertion and the second tap selection. | 501 // will register insertion and the second tap selection. |
| 607 OnTapEvent(); | 502 OnTapEvent(); |
| 608 ChangeInsertion(start_rect, visible); | 503 ChangeInsertion(start_rect, visible); |
| 609 EXPECT_THAT(GetAndResetEvents(), | 504 EXPECT_THAT(GetAndResetEvents(), |
| 610 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 505 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 611 | 506 |
| 612 OnDoubleTapEvent(); | 507 OnDoubleTapEvent(); |
| 613 ChangeSelection(start_rect, visible, end_rect, visible); | 508 ChangeSelection(start_rect, visible, end_rect, visible); |
| 614 EXPECT_THAT(GetAndResetEvents(), | 509 EXPECT_THAT(GetAndResetEvents(), |
| 615 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 510 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
| 616 } | 511 } |
| 617 | 512 |
| 618 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { | 513 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { |
| 619 gfx::RectF start_rect(5, 5, 0, 10); | 514 gfx::RectF start_rect(5, 5, 0, 10); |
| 620 gfx::RectF end_rect(50, 5, 0, 10); | 515 gfx::RectF end_rect(50, 5, 0, 10); |
| 621 bool visible = true; | 516 bool visible = true; |
| 622 | 517 |
| 623 OnLongPressEvent(); | 518 OnLongPressEvent(); |
| 624 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 519 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 625 | 520 |
| 626 // There may be several empty updates after a longpress due to the | 521 // There may be several empty updates after a longpress due to the |
| 627 // asynchronous response. These empty updates should not prevent the selection | 522 // asynchronous response. These empty updates should not prevent the selection |
| 628 // handles from (eventually) activating. | 523 // handles from (eventually) activating. |
| 629 ClearSelection(); | 524 ClearSelection(); |
| 630 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 525 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 631 | 526 |
| 632 ClearSelection(); | 527 ClearSelection(); |
| 633 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 528 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 634 | 529 |
| 635 ChangeSelection(start_rect, visible, end_rect, visible); | 530 ChangeSelection(start_rect, visible, end_rect, visible); |
| 636 EXPECT_THAT(GetAndResetEvents(), | 531 EXPECT_THAT(GetAndResetEvents(), |
| 637 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 532 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 638 } | 533 } |
| 639 | 534 |
| 640 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 535 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 641 gfx::RectF start_rect(5, 5, 0, 10); | 536 gfx::RectF start_rect(5, 5, 0, 10); |
| 642 gfx::RectF end_rect(50, 5, 0, 10); | 537 gfx::RectF end_rect(50, 5, 0, 10); |
| 643 bool visible = true; | 538 bool visible = true; |
| 644 | 539 |
| 645 OnLongPressEvent(); | 540 OnLongPressEvent(); |
| 646 ChangeSelection(start_rect, visible, end_rect, visible); | 541 ChangeSelection(start_rect, visible, end_rect, visible); |
| 647 EXPECT_THAT(GetAndResetEvents(), | 542 EXPECT_THAT(GetAndResetEvents(), |
| 648 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 543 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 649 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 544 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 650 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 545 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 651 | 546 |
| 652 // A long press triggering a new selection should re-send the | 547 // A long press triggering a new selection should re-send the |
| 653 // SELECTION_HANDLES_SHOWN | 548 // SELECTION_HANDLES_SHOWN |
| 654 // event notification. | 549 // event notification. |
| 655 start_rect.Offset(10, 10); | 550 start_rect.Offset(10, 10); |
| 656 OnLongPressEvent(); | 551 OnLongPressEvent(); |
| 657 ChangeSelection(start_rect, visible, end_rect, visible); | 552 ChangeSelection(start_rect, visible, end_rect, visible); |
| 658 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | 553 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 659 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 554 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 660 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 555 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 661 } | 556 } |
| 662 | 557 |
| 663 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 558 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 664 base::TimeTicks event_time = base::TimeTicks::Now(); | 559 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 665 OnLongPressEvent(); | 560 OnLongPressEvent(); |
| 666 | 561 |
| 667 // The touch sequence should not be handled if selection is not active. | 562 // The touch sequence should not be handled if selection is not active. |
| 668 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 563 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 669 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 564 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 670 | 565 |
| 671 float line_height = 10.f; | 566 float line_height = 10.f; |
| 672 gfx::RectF start_rect(0, 0, 0, line_height); | 567 gfx::RectF start_rect(0, 0, 0, line_height); |
| 673 gfx::RectF end_rect(50, 0, 0, line_height); | 568 gfx::RectF end_rect(50, 0, 0, line_height); |
| 674 bool visible = true; | 569 bool visible = true; |
| 675 ChangeSelection(start_rect, visible, end_rect, visible); | 570 ChangeSelection(start_rect, visible, end_rect, visible); |
| 676 EXPECT_THAT(GetAndResetEvents(), | 571 EXPECT_THAT(GetAndResetEvents(), |
| 677 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 572 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 678 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 573 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 679 | 574 |
| 680 // The touch sequence should be handled only if the drawable reports a hit. | 575 // The touch sequence should be handled only if the drawable reports a hit. |
| 681 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 576 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 682 SetDraggingEnabled(true); | 577 SetDraggingEnabled(true); |
| 683 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 578 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 684 EXPECT_FALSE(GetAndResetSelectionMoved()); | 579 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 685 | 580 |
| 686 // The SelectBetweenCoordinates() result should reflect the movement. Note | 581 // The SelectBetweenCoordinates() result should reflect the movement. Note |
| 687 // that the start coordinate will always reflect the "fixed" handle's | 582 // that the start coordinate will always reflect the "fixed" handle's |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 617 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 723 base::TimeTicks event_time = base::TimeTicks::Now(); | 618 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 724 OnLongPressEvent(); | 619 OnLongPressEvent(); |
| 725 | 620 |
| 726 float line_height = 10.f; | 621 float line_height = 10.f; |
| 727 gfx::RectF start_rect(0, 0, 0, line_height); | 622 gfx::RectF start_rect(0, 0, 0, line_height); |
| 728 gfx::RectF end_rect(50, 0, 0, line_height); | 623 gfx::RectF end_rect(50, 0, 0, line_height); |
| 729 bool visible = true; | 624 bool visible = true; |
| 730 ChangeSelection(start_rect, visible, end_rect, visible); | 625 ChangeSelection(start_rect, visible, end_rect, visible); |
| 731 EXPECT_THAT(GetAndResetEvents(), | 626 EXPECT_THAT(GetAndResetEvents(), |
| 732 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 627 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 733 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 628 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 734 | 629 |
| 735 // The ACTION_DOWN should lock to the closest handle. | 630 // The ACTION_DOWN should lock to the closest handle. |
| 736 gfx::PointF end_offset = end_rect.CenterPoint(); | 631 gfx::PointF end_offset = end_rect.CenterPoint(); |
| 737 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 632 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 738 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 633 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
| 739 MockMotionEvent event( | 634 MockMotionEvent event( |
| 740 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 635 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); |
| 741 SetDraggingEnabled(true); | 636 SetDraggingEnabled(true); |
| 742 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 637 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 761 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 656 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 762 base::TimeTicks event_time = base::TimeTicks::Now(); | 657 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 763 OnLongPressEvent(); | 658 OnLongPressEvent(); |
| 764 | 659 |
| 765 float line_height = 10.f; | 660 float line_height = 10.f; |
| 766 gfx::RectF start_rect(50, line_height, 0, line_height); | 661 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 767 gfx::RectF end_rect(100, line_height, 0, line_height); | 662 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 768 bool visible = true; | 663 bool visible = true; |
| 769 ChangeSelection(start_rect, visible, end_rect, visible); | 664 ChangeSelection(start_rect, visible, end_rect, visible); |
| 770 EXPECT_THAT(GetAndResetEvents(), | 665 EXPECT_THAT(GetAndResetEvents(), |
| 771 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 666 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 772 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 667 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 773 | 668 |
| 774 SetDraggingEnabled(true); | 669 SetDraggingEnabled(true); |
| 775 | 670 |
| 776 // Move the extent, not triggering a swap of points. | 671 // Move the extent, not triggering a swap of points. |
| 777 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 672 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 778 end_rect.x(), end_rect.bottom()); | 673 end_rect.x(), end_rect.bottom()); |
| 779 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 674 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 780 EXPECT_FALSE(GetAndResetSelectionMoved()); | 675 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 781 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 676 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 base::TimeTicks event_time = base::TimeTicks::Now(); | 777 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 883 OnLongPressEvent(); | 778 OnLongPressEvent(); |
| 884 | 779 |
| 885 float small_line_height = 1.f; | 780 float small_line_height = 1.f; |
| 886 float large_line_height = 50.f; | 781 float large_line_height = 50.f; |
| 887 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 782 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 888 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 783 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 889 bool visible = true; | 784 bool visible = true; |
| 890 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 785 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
| 891 EXPECT_THAT(GetAndResetEvents(), | 786 EXPECT_THAT(GetAndResetEvents(), |
| 892 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 787 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 893 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 788 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
| 894 | 789 |
| 895 // Start dragging the handle on the small line. | 790 // Start dragging the handle on the small line. |
| 896 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 791 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 897 small_line_rect.x(), small_line_rect.y()); | 792 small_line_rect.x(), small_line_rect.y()); |
| 898 SetDraggingEnabled(true); | 793 SetDraggingEnabled(true); |
| 899 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 794 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 900 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); | 795 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
| 901 // The drag coordinate for large lines should be capped to a reasonable | 796 // The drag coordinate for large lines should be capped to a reasonable |
| 902 // offset, allowing seamless transition to neighboring lines with different | 797 // offset, allowing seamless transition to neighboring lines with different |
| 903 // sizes. The drag coordinate for small lines should have an offset | 798 // sizes. The drag coordinate for small lines should have an offset |
| 904 // commensurate with the small line size. | 799 // commensurate with the small line size. |
| 905 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), | 800 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), |
| 906 GetLastSelectionStart()); | 801 GetLastSelectionStart()); |
| 907 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 802 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
| 908 | 803 |
| 909 small_line_rect += gfx::Vector2dF(25.f, 0); | 804 small_line_rect += gfx::Vector2dF(25.f, 0); |
| 910 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 805 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 911 small_line_rect.x(), small_line_rect.y()); | 806 small_line_rect.x(), small_line_rect.y()); |
| 912 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 807 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 913 EXPECT_TRUE(GetAndResetSelectionMoved()); | 808 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 914 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 809 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
| 915 } | 810 } |
| 916 | 811 |
| 917 TEST_F(TouchSelectionControllerTest, Animation) { | 812 TEST_F(TouchSelectionControllerTest, Animation) { |
| 918 OnTapEvent(); | 813 OnTapEvent(); |
| 919 controller().OnSelectionEditable(true); | |
| 920 | 814 |
| 921 gfx::RectF insertion_rect(5, 5, 0, 10); | 815 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 922 | 816 |
| 923 bool visible = true; | 817 bool visible = true; |
| 924 ChangeInsertion(insertion_rect, visible); | 818 ChangeInsertion(insertion_rect, visible); |
| 925 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 819 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 926 | 820 |
| 927 visible = false; | 821 visible = false; |
| 928 ChangeInsertion(insertion_rect, visible); | 822 ChangeInsertion(insertion_rect, visible); |
| 929 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 823 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 941 OnTapEvent(); | 835 OnTapEvent(); |
| 942 visible = true; | 836 visible = true; |
| 943 ChangeInsertion(insertion_rect, visible); | 837 ChangeInsertion(insertion_rect, visible); |
| 944 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 838 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 945 } | 839 } |
| 946 | 840 |
| 947 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 841 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 948 TouchSelectionControllerTestApi test_controller(&controller()); | 842 TouchSelectionControllerTestApi test_controller(&controller()); |
| 949 | 843 |
| 950 OnTapEvent(); | 844 OnTapEvent(); |
| 951 controller().OnSelectionEditable(true); | |
| 952 | 845 |
| 953 gfx::RectF insertion_rect(5, 5, 0, 10); | 846 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 954 | 847 |
| 955 bool visible = true; | 848 bool visible = true; |
| 956 ChangeInsertion(insertion_rect, visible); | 849 ChangeInsertion(insertion_rect, visible); |
| 957 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 850 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 958 EXPECT_TRUE(test_controller.GetStartVisible()); | 851 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 959 EXPECT_TRUE(test_controller.GetEndVisible()); | 852 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 960 | 853 |
| 961 controller().SetTemporarilyHidden(true); | 854 controller().SetTemporarilyHidden(true); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 979 } | 872 } |
| 980 | 873 |
| 981 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 874 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 982 gfx::RectF start_rect(5, 5, 0, 10); | 875 gfx::RectF start_rect(5, 5, 0, 10); |
| 983 gfx::RectF end_rect(50, 5, 0, 10); | 876 gfx::RectF end_rect(50, 5, 0, 10); |
| 984 bool visible = true; | 877 bool visible = true; |
| 985 | 878 |
| 986 OnLongPressEvent(); | 879 OnLongPressEvent(); |
| 987 ChangeSelection(start_rect, visible, end_rect, visible); | 880 ChangeSelection(start_rect, visible, end_rect, visible); |
| 988 EXPECT_THAT(GetAndResetEvents(), | 881 EXPECT_THAT(GetAndResetEvents(), |
| 989 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 882 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 990 | 883 |
| 991 // Selection should not be cleared if the selection bounds have not changed. | 884 // Selection should not be cleared if the selection bounds have not changed. |
| 992 OnTapEvent(); | 885 OnTapEvent(); |
| 993 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 886 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 994 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 887 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 995 | 888 |
| 996 OnTapEvent(); | 889 OnTapEvent(); |
| 997 ClearSelection(); | 890 ClearSelection(); |
| 998 EXPECT_THAT(GetAndResetEvents(), | 891 EXPECT_THAT(GetAndResetEvents(), |
| 999 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 892 ElementsAre(SELECTION_HANDLES_CLEARED)); |
| 1000 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 1001 } | |
| 1002 | |
| 1003 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | |
| 1004 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1005 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1006 bool visible = true; | |
| 1007 | |
| 1008 // Tap-triggered selections should not be allowed. | |
| 1009 OnLongPressEvent(); | |
| 1010 OnTapEvent(); | |
| 1011 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1012 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1013 | |
| 1014 // Subsequent longpress selections will be allowed. | |
| 1015 OnLongPressEvent(); | |
| 1016 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1017 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
| 1018 | |
| 1019 // Tapping again shouldn't have any effect on subsequent selection events. | |
| 1020 OnTapEvent(); | |
| 1021 end_rect.Offset(10, 10); | |
| 1022 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1023 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | |
| 1024 ClearSelection(); | |
| 1025 EXPECT_THAT(GetAndResetEvents(), | |
| 1026 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
| 1027 } | |
| 1028 | |
| 1029 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | |
| 1030 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1031 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1032 bool visible = true; | |
| 1033 | |
| 1034 // The selection should not be activated, as it wasn't yet allowed. | |
| 1035 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1036 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 1037 | |
| 1038 // A longpress should have no immediate effect. | |
| 1039 OnLongPressEvent(); | |
| 1040 | |
| 1041 // Now explicitly allow showing from the previously supplied bounds. | |
| 1042 controller().AllowShowingFromCurrentSelection(); | |
| 1043 EXPECT_THAT(GetAndResetEvents(), | |
| 1044 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | |
| 1045 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
| 1046 | |
| 1047 // Repeated calls to show from the current selection should be ignored. | |
| 1048 controller().AllowShowingFromCurrentSelection(); | |
| 1049 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1050 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
| 1051 | |
| 1052 // Trying to show from an empty selection will have no result. | |
| 1053 ClearSelection(); | |
| 1054 EXPECT_THAT(GetAndResetEvents(), | |
| 1055 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
| 1056 controller().AllowShowingFromCurrentSelection(); | |
| 1057 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1058 | |
| 1059 // Showing the insertion handle should also be supported. | |
| 1060 controller().OnSelectionEditable(true); | |
| 1061 controller().OnSelectionEmpty(false); | |
| 1062 controller().HideAndDisallowShowingAutomatically(); | |
| 1063 gfx::RectF insertion_rect(5, 5, 0, 10); | |
| 1064 ChangeInsertion(insertion_rect, visible); | |
| 1065 controller().AllowShowingFromCurrentSelection(); | |
| 1066 EXPECT_THAT(GetAndResetEvents(), | |
| 1067 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 1068 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
| 1069 } | |
| 1070 | |
| 1071 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { | |
| 1072 bool visible = false; | |
| 1073 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1074 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1075 gfx::PointF inner_point(25, 10); | |
| 1076 gfx::PointF outer_point(100, 100); | |
| 1077 | |
| 1078 // Establish a selection without handles from 5 to 50 with height 10. | |
| 1079 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1080 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1081 | |
| 1082 // A point outside the rect should not be handled. | |
| 1083 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point, 1)); | |
| 1084 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1085 | |
| 1086 // A point inside the rect should be handled. | |
| 1087 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point, 1)); | |
| 1088 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
| 1089 } | |
| 1090 | |
| 1091 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { | |
| 1092 bool visible = false; | |
| 1093 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1094 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1095 gfx::PointF inner_point(25, 10); | |
| 1096 gfx::PointF outer_point(100, 100); | |
| 1097 | |
| 1098 // Establish a selection without handles from 5 to 50 with height 10. | |
| 1099 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1100 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1101 | |
| 1102 // A point outside the rect should not be handled. | |
| 1103 EXPECT_FALSE( | |
| 1104 controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point)); | |
| 1105 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1106 | |
| 1107 // A point inside the rect should be handled. | |
| 1108 EXPECT_TRUE( | |
| 1109 controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point)); | |
| 1110 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
| 1111 } | 893 } |
| 1112 | 894 |
| 1113 TEST_F(TouchSelectionControllerTest, LongPressDrag) { | 895 TEST_F(TouchSelectionControllerTest, LongPressDrag) { |
| 1114 EnableLongPressDragSelection(); | 896 EnableLongPressDragSelection(); |
| 1115 TouchSelectionControllerTestApi test_controller(&controller()); | 897 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1116 | 898 |
| 1117 gfx::RectF start_rect(-50, 0, 0, 10); | 899 gfx::RectF start_rect(-50, 0, 0, 10); |
| 1118 gfx::RectF end_rect(50, 0, 0, 10); | 900 gfx::RectF end_rect(50, 0, 0, 10); |
| 1119 bool visible = true; | 901 bool visible = true; |
| 1120 | 902 |
| 1121 // Start a touch sequence. | 903 // Start a touch sequence. |
| 1122 MockMotionEvent event; | 904 MockMotionEvent event; |
| 1123 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 905 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1124 | 906 |
| 1125 // Activate a longpress-triggered selection. | 907 // Activate a longpress-triggered selection. |
| 1126 OnLongPressEvent(); | 908 OnLongPressEvent(); |
| 1127 ChangeSelection(start_rect, visible, end_rect, visible); | 909 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1128 EXPECT_THAT(GetAndResetEvents(), | 910 EXPECT_THAT(GetAndResetEvents(), |
| 1129 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 911 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1130 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 912 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1131 | 913 |
| 1132 // The handles should remain invisible while the touch release and longpress | 914 // The handles should remain invisible while the touch release and longpress |
| 1133 // drag gesture are pending. | 915 // drag gesture are pending. |
| 1134 EXPECT_FALSE(test_controller.GetStartVisible()); | 916 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1135 EXPECT_FALSE(test_controller.GetEndVisible()); | 917 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1136 | 918 |
| 1137 // The selection coordinates should reflect the drag movement. | 919 // The selection coordinates should reflect the drag movement. |
| 1138 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 920 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 1139 gfx::PointF end_offset = end_rect.CenterPoint(); | 921 gfx::PointF end_offset = end_rect.CenterPoint(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1185 bool visible = true; | 967 bool visible = true; |
| 1186 | 968 |
| 1187 // Start a touch sequence. | 969 // Start a touch sequence. |
| 1188 MockMotionEvent event; | 970 MockMotionEvent event; |
| 1189 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 971 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1190 | 972 |
| 1191 // Activate a longpress-triggered selection. | 973 // Activate a longpress-triggered selection. |
| 1192 OnLongPressEvent(); | 974 OnLongPressEvent(); |
| 1193 ChangeSelection(start_rect, visible, end_rect, visible); | 975 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1194 EXPECT_THAT(GetAndResetEvents(), | 976 EXPECT_THAT(GetAndResetEvents(), |
| 1195 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 977 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1196 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 978 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1197 | 979 |
| 1198 // The handles should remain invisible while the touch release and longpress | 980 // The handles should remain invisible while the touch release and longpress |
| 1199 // drag gesture are pending. | 981 // drag gesture are pending. |
| 1200 EXPECT_FALSE(test_controller.GetStartVisible()); | 982 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1201 EXPECT_FALSE(test_controller.GetEndVisible()); | 983 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1202 | 984 |
| 1203 // If no drag movement occurs, the handles should reappear after the touch | 985 // If no drag movement occurs, the handles should reappear after the touch |
| 1204 // is released. | 986 // is released. |
| 1205 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 987 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1217 bool visible = true; | 999 bool visible = true; |
| 1218 | 1000 |
| 1219 // Start a touch sequence. | 1001 // Start a touch sequence. |
| 1220 MockMotionEvent event; | 1002 MockMotionEvent event; |
| 1221 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 1003 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1222 | 1004 |
| 1223 // Activate a longpress-triggered selection. | 1005 // Activate a longpress-triggered selection. |
| 1224 OnLongPressEvent(); | 1006 OnLongPressEvent(); |
| 1225 ChangeSelection(start_rect, visible, end_rect, visible); | 1007 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1226 EXPECT_THAT(GetAndResetEvents(), | 1008 EXPECT_THAT(GetAndResetEvents(), |
| 1227 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1009 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1228 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1010 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1229 EXPECT_TRUE(test_controller.GetStartVisible()); | 1011 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1230 EXPECT_TRUE(test_controller.GetEndVisible()); | 1012 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1231 | 1013 |
| 1232 // Subsequent motion of the same touch sequence after longpress shouldn't | 1014 // Subsequent motion of the same touch sequence after longpress shouldn't |
| 1233 // trigger drag selection. | 1015 // trigger drag selection. |
| 1234 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 1016 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
| 1235 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1017 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1236 | 1018 |
| 1237 EXPECT_FALSE(controller().WillHandleTouchEvent( | 1019 EXPECT_FALSE(controller().WillHandleTouchEvent( |
| 1238 event.MovePoint(0, 0, kDefaulTapSlop * 10))); | 1020 event.MovePoint(0, 0, kDefaulTapSlop * 10))); |
| 1239 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1021 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1240 | 1022 |
| 1241 // Releasing the touch sequence should have no effect. | 1023 // Releasing the touch sequence should have no effect. |
| 1242 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 1024 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
| 1243 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1025 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1244 EXPECT_TRUE(test_controller.GetStartVisible()); | 1026 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1245 EXPECT_TRUE(test_controller.GetEndVisible()); | 1027 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1246 } | 1028 } |
| 1247 | 1029 |
| 1248 // When there is a selection on the page and long-press drag is performed | |
| 1249 // somewhere that has nothing to select, long-press drag selector should not get | |
| 1250 // activated so the page can scroll. | |
| 1251 TEST_F(TouchSelectionControllerTest, LongPressDragScroll) { | |
| 1252 EnableLongPressDragSelection(); | |
| 1253 TouchSelectionControllerTestApi test_controller(&controller()); | |
| 1254 | |
| 1255 gfx::RectF start_rect(10, 0, 0, 10); | |
| 1256 gfx::RectF end_rect(20, 0, 0, 10); | |
| 1257 gfx::PointF touch_point(0, 0); | |
| 1258 bool visible = true; | |
| 1259 MockMotionEvent event; | |
| 1260 | |
| 1261 // Pre-select something. | |
| 1262 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1264 | |
| 1265 // Start the touch sequence and perform the long-press out of the existing | |
| 1266 // selection. | |
| 1267 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
| 1268 event.PressPoint(touch_point.x(), touch_point.y()))); | |
| 1269 OnLongPressEvent(); | |
| 1270 | |
| 1271 // Drag down. Selection controller should not consume the touch-move event. | |
| 1272 touch_point.Offset(0, 2 * kDefaulTapSlop); | |
| 1273 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
| 1274 event.MovePoint(0, touch_point.x(), touch_point.y()))); | |
| 1275 | |
| 1276 // Begin page scroll and update the selection. Selection handles should not be | |
| 1277 // shown which means long-press drag selector is not activated. | |
| 1278 controller().OnScrollBeginEvent(); | |
| 1279 start_rect.Offset(0, 2 * kDefaulTapSlop); | |
| 1280 end_rect.Offset(0, 2 * kDefaulTapSlop); | |
| 1281 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1282 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1283 | |
| 1284 // Release the touch sequence. | |
| 1285 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | |
| 1286 } | |
| 1287 | |
| 1288 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { | 1030 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { |
| 1289 gfx::RectF start_rect(5, 5, 0, 10); | 1031 gfx::RectF start_rect(5, 5, 0, 10); |
| 1290 gfx::RectF end_rect(50, 5, 0, 10); | 1032 gfx::RectF end_rect(50, 5, 0, 10); |
| 1291 bool visible = true; | 1033 bool visible = true; |
| 1292 | 1034 |
| 1293 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1035 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
| 1294 | 1036 |
| 1295 OnLongPressEvent(); | 1037 OnLongPressEvent(); |
| 1296 ChangeSelection(start_rect, visible, end_rect, visible); | 1038 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1297 ASSERT_THAT(GetAndResetEvents(), | 1039 ASSERT_THAT(GetAndResetEvents(), |
| 1298 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1040 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1299 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); | 1041 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); |
| 1300 | 1042 |
| 1301 // The result of |GetRectBetweenBounds| should be available within the | 1043 // The result of |GetRectBetweenBounds| should be available within the |
| 1302 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. | 1044 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. |
| 1303 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1045 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
| 1304 | 1046 |
| 1305 start_rect.Offset(1, 0); | 1047 start_rect.Offset(1, 0); |
| 1306 ChangeSelection(start_rect, visible, end_rect, visible); | 1048 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1307 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1049 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
| 1308 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1050 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1321 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1063 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
| 1322 | 1064 |
| 1323 // If both bounds are visible, the full bounding rect should be returned. | 1065 // If both bounds are visible, the full bounding rect should be returned. |
| 1324 ChangeSelection(start_rect, false, end_rect, false); | 1066 ChangeSelection(start_rect, false, end_rect, false); |
| 1325 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1067 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
| 1326 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1068 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
| 1327 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1069 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
| 1328 | 1070 |
| 1329 ClearSelection(); | 1071 ClearSelection(); |
| 1330 ASSERT_THAT(GetAndResetEvents(), | 1072 ASSERT_THAT(GetAndResetEvents(), |
| 1331 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 1073 ElementsAre(SELECTION_HANDLES_CLEARED)); |
| 1332 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1074 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
| 1333 } | 1075 } |
| 1334 | 1076 |
| 1335 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { | 1077 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { |
| 1336 TouchSelectionControllerTestApi test_controller(&controller()); | 1078 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1337 base::TimeTicks event_time = base::TimeTicks::Now(); | 1079 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 1338 OnLongPressEvent(); | 1080 OnLongPressEvent(); |
| 1339 | 1081 |
| 1340 float line_height = 10.f; | 1082 float line_height = 10.f; |
| 1341 gfx::RectF start_rect(50, line_height, 0, line_height); | 1083 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 1342 gfx::RectF end_rect(100, line_height, 0, line_height); | 1084 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 1343 bool visible = true; | 1085 bool visible = true; |
| 1344 ChangeSelection(start_rect, visible, end_rect, visible); | 1086 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1345 EXPECT_THAT(GetAndResetEvents(), | 1087 EXPECT_THAT(GetAndResetEvents(), |
| 1346 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1088 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1347 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1089 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1348 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1090 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
| 1349 TouchHandleOrientation::LEFT); | 1091 TouchHandleOrientation::LEFT); |
| 1350 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1092 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
| 1351 TouchHandleOrientation::RIGHT); | 1093 TouchHandleOrientation::RIGHT); |
| 1352 | 1094 |
| 1353 SetDraggingEnabled(true); | 1095 SetDraggingEnabled(true); |
| 1354 | 1096 |
| 1355 // Simulate moving the base, not triggering a swap of points. | 1097 // Simulate moving the base, not triggering a swap of points. |
| 1356 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 1098 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1444 offset_rect.x(), offset_rect.bottom()); | 1186 offset_rect.x(), offset_rect.bottom()); |
| 1445 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 1187 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 1446 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); | 1188 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
| 1447 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1189 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
| 1448 TouchHandleOrientation::LEFT); | 1190 TouchHandleOrientation::LEFT); |
| 1449 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1191 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
| 1450 TouchHandleOrientation::RIGHT); | 1192 TouchHandleOrientation::RIGHT); |
| 1451 } | 1193 } |
| 1452 | 1194 |
| 1453 } // namespace ui | 1195 } // namespace ui |
| OLD | NEW |