| 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 22 matching lines...) Expand all Loading... |
| 432 // Following ACTION_DOWN should not be consumed if it does not start handle | 340 // Following ACTION_DOWN should not be consumed if it does not start handle |
| 433 // dragging. | 341 // dragging. |
| 434 SetDraggingEnabled(false); | 342 SetDraggingEnabled(false); |
| 435 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); | 343 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 436 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 344 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 437 } | 345 } |
| 438 | 346 |
| 439 TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) { | 347 TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) { |
| 440 base::TimeTicks event_time = base::TimeTicks::Now(); | 348 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 441 OnTapEvent(); | 349 OnTapEvent(); |
| 442 controller().OnSelectionEditable(true); | |
| 443 | 350 |
| 444 float line_height = 10.f; | 351 float line_height = 10.f; |
| 445 gfx::RectF start_rect(10, 0, 0, line_height); | 352 gfx::RectF start_rect(10, 0, 0, line_height); |
| 446 bool visible = true; | 353 bool visible = true; |
| 447 ChangeInsertion(start_rect, visible); | 354 ChangeInsertion(start_rect, visible); |
| 448 EXPECT_THAT(GetAndResetEvents(), | 355 EXPECT_THAT(GetAndResetEvents(), |
| 449 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 356 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 450 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 357 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 451 | 358 |
| 452 // Enable dragging so that the following ACTION_DOWN starts handle dragging. | 359 // Enable dragging so that the following ACTION_DOWN starts handle dragging. |
| 453 SetDraggingEnabled(true); | 360 SetDraggingEnabled(true); |
| 454 | 361 |
| 455 // Touch down to start dragging. | 362 // Touch down to start dragging. |
| 456 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 363 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 457 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 364 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 458 EXPECT_FALSE(GetAndResetCaretMoved()); | 365 EXPECT_FALSE(GetAndResetCaretMoved()); |
| 459 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 487 // Following ACTION_DOWN should not be consumed if it does not start handle | 394 // Following ACTION_DOWN should not be consumed if it does not start handle |
| 488 // dragging. | 395 // dragging. |
| 489 SetDraggingEnabled(false); | 396 SetDraggingEnabled(false); |
| 490 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); | 397 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 491 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 398 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 492 } | 399 } |
| 493 | 400 |
| 494 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 401 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
| 495 base::TimeTicks event_time = base::TimeTicks::Now(); | 402 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 496 OnTapEvent(); | 403 OnTapEvent(); |
| 497 controller().OnSelectionEditable(true); | |
| 498 SetDraggingEnabled(true); | 404 SetDraggingEnabled(true); |
| 499 | 405 |
| 500 gfx::RectF start_rect(10, 0, 0, 10); | 406 gfx::RectF start_rect(10, 0, 0, 10); |
| 501 bool visible = true; | 407 bool visible = true; |
| 502 ChangeInsertion(start_rect, visible); | 408 ChangeInsertion(start_rect, visible); |
| 503 EXPECT_THAT(GetAndResetEvents(), | 409 EXPECT_THAT(GetAndResetEvents(), |
| 504 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 410 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 505 | 411 |
| 506 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 412 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 507 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 413 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 508 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 414 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 509 | 415 |
| 510 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 416 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 511 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 417 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 512 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 418 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
| 513 INSERTION_HANDLE_DRAG_STOPPED)); | 419 INSERTION_HANDLE_DRAG_STOPPED)); |
| 514 | 420 |
| 515 // Reset the insertion. | 421 // Reset the insertion. |
| 516 ClearInsertion(); | 422 ClearInsertion(); |
| 517 OnTapEvent(); | 423 OnTapEvent(); |
| 518 ChangeInsertion(start_rect, visible); | 424 ChangeInsertion(start_rect, visible); |
| 519 EXPECT_THAT(GetAndResetEvents(), | 425 EXPECT_THAT(GetAndResetEvents(), |
| 520 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 426 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 521 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 522 | 427 |
| 523 // No tap should be signalled if the time between DOWN and UP was too long. | 428 // No tap should be signalled if the time between DOWN and UP was too long. |
| 524 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 429 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 525 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 430 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 526 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 431 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
| 527 event_time + base::TimeDelta::FromSeconds(1), | 432 event_time + base::TimeDelta::FromSeconds(1), |
| 528 0, | 433 0, |
| 529 0); | 434 0); |
| 530 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 531 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 436 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
| 532 INSERTION_HANDLE_DRAG_STOPPED)); | 437 INSERTION_HANDLE_DRAG_STOPPED)); |
| 533 | 438 |
| 534 // Reset the insertion. | 439 // Reset the insertion. |
| 535 ClearInsertion(); | 440 ClearInsertion(); |
| 536 OnTapEvent(); | 441 OnTapEvent(); |
| 537 ChangeInsertion(start_rect, visible); | 442 ChangeInsertion(start_rect, visible); |
| 538 EXPECT_THAT(GetAndResetEvents(), | 443 EXPECT_THAT(GetAndResetEvents(), |
| 539 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 444 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 540 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 541 | 445 |
| 542 // No tap should be signalled if the drag was too long. | 446 // No tap should be signalled if the drag was too long. |
| 543 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 447 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 544 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 448 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 545 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 449 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
| 546 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 450 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 547 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 451 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
| 548 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 452 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 549 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 453 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
| 550 INSERTION_HANDLE_DRAG_STOPPED)); | 454 INSERTION_HANDLE_DRAG_STOPPED)); |
| 551 | 455 |
| 552 // Reset the insertion. | 456 // Reset the insertion. |
| 553 ClearInsertion(); | 457 ClearInsertion(); |
| 554 OnTapEvent(); | 458 OnTapEvent(); |
| 555 ChangeInsertion(start_rect, visible); | 459 ChangeInsertion(start_rect, visible); |
| 556 EXPECT_THAT(GetAndResetEvents(), | 460 EXPECT_THAT(GetAndResetEvents(), |
| 557 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED, | 461 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); |
| 558 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 559 | 462 |
| 560 // No tap should be signalled if the touch sequence is cancelled. | 463 // No tap should be signalled if the touch sequence is cancelled. |
| 561 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 464 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 562 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 465 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 563 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 466 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
| 564 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 467 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, | 468 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, |
| 566 INSERTION_HANDLE_DRAG_STOPPED)); | 469 INSERTION_HANDLE_DRAG_STOPPED)); |
| 567 } | 470 } |
| 568 | 471 |
| 569 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 472 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
| 570 base::TimeTicks event_time = base::TimeTicks::Now(); | 473 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 571 OnTapEvent(); | 474 OnTapEvent(); |
| 572 controller().OnSelectionEditable(true); | |
| 573 SetDraggingEnabled(true); | 475 SetDraggingEnabled(true); |
| 574 | 476 |
| 575 gfx::RectF anchor_rect(10, 0, 0, 10); | 477 gfx::RectF anchor_rect(10, 0, 0, 10); |
| 576 bool visible = true; | 478 bool visible = true; |
| 577 ChangeInsertion(anchor_rect, visible); | 479 ChangeInsertion(anchor_rect, visible); |
| 578 EXPECT_THAT(GetAndResetEvents(), | 480 EXPECT_THAT(GetAndResetEvents(), |
| 579 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 481 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 580 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 482 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 581 | 483 |
| 582 // Tapping again shouldn't reset the active insertion point. | 484 // Tapping again shouldn't reset the active insertion point. |
| 583 OnTapEvent(); | 485 OnTapEvent(); |
| 584 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 486 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 585 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 586 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 488 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 587 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 489 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 588 | 490 |
| 589 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 491 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 590 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 492 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 591 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 493 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
| 592 INSERTION_HANDLE_DRAG_STOPPED)); | 494 INSERTION_HANDLE_DRAG_STOPPED)); |
| 593 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 495 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 594 | 496 |
| 595 anchor_rect.Offset(5, 15); | 497 anchor_rect.Offset(5, 15); |
| 596 ChangeInsertion(anchor_rect, visible); | 498 ChangeInsertion(anchor_rect, visible); |
| 597 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); | 499 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); |
| 598 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 500 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 599 | 501 |
| 600 // Pressing shouldn't reset the active insertion point. | 502 // Pressing shouldn't reset the active insertion point. |
| 601 OnLongPressEvent(); | 503 OnLongPressEvent(); |
| 602 controller().OnSelectionEmpty(true); | |
| 603 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 504 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 604 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 505 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 605 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); | 506 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); |
| 606 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 507 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 607 | 508 |
| 608 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 509 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
| 609 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 610 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, | 511 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, |
| 611 INSERTION_HANDLE_DRAG_STOPPED)); | 512 INSERTION_HANDLE_DRAG_STOPPED)); |
| 612 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 513 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
| 613 } | 514 } |
| 614 | 515 |
| 615 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 516 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
| 616 gfx::RectF start_rect(5, 5, 0, 10); | 517 gfx::RectF start_rect(5, 5, 0, 10); |
| 617 gfx::RectF end_rect(50, 5, 0, 10); | 518 gfx::RectF end_rect(50, 5, 0, 10); |
| 618 bool visible = true; | 519 bool visible = true; |
| 619 | 520 |
| 620 // Selection events are ignored until automatic showing is enabled. | |
| 621 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 622 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 623 | |
| 624 OnLongPressEvent(); | 521 OnLongPressEvent(); |
| 625 ChangeSelection(start_rect, visible, end_rect, visible); | 522 ChangeSelection(start_rect, visible, end_rect, visible); |
| 626 EXPECT_THAT(GetAndResetEvents(), | 523 EXPECT_THAT(GetAndResetEvents(), |
| 627 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 524 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 628 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 525 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 629 | 526 |
| 630 start_rect.Offset(1, 0); | 527 start_rect.Offset(1, 0); |
| 631 ChangeSelection(start_rect, visible, end_rect, visible); | 528 ChangeSelection(start_rect, visible, end_rect, visible); |
| 632 // Selection movement does not currently trigger a separate event. | 529 // Selection movement does not currently trigger a separate event. |
| 633 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
| 634 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 531 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 635 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 532 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 636 | 533 |
| 637 ClearSelection(); | 534 ClearSelection(); |
| 638 EXPECT_THAT(GetAndResetEvents(), | 535 EXPECT_THAT(GetAndResetEvents(), |
| 639 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 536 ElementsAre(SELECTION_HANDLES_CLEARED)); |
| 640 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 641 } | 537 } |
| 642 | 538 |
| 643 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { | 539 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { |
| 644 gfx::RectF start_rect(5, 5, 0, 10); | 540 gfx::RectF start_rect(5, 5, 0, 10); |
| 645 gfx::RectF end_rect(50, 5, 0, 10); | 541 gfx::RectF end_rect(50, 5, 0, 10); |
| 646 bool visible = true; | 542 bool visible = true; |
| 647 | 543 |
| 648 OnDoubleTapEvent(); | 544 OnDoubleTapEvent(); |
| 649 ChangeSelection(start_rect, visible, end_rect, visible); | 545 ChangeSelection(start_rect, visible, end_rect, visible); |
| 650 EXPECT_THAT(GetAndResetEvents(), | 546 EXPECT_THAT(GetAndResetEvents(), |
| 651 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 547 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 652 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 548 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 653 } | 549 } |
| 654 | 550 |
| 655 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { | 551 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { |
| 656 gfx::RectF start_rect(5, 5, 0, 10); | 552 gfx::RectF start_rect(5, 5, 0, 10); |
| 657 gfx::RectF end_rect(50, 5, 0, 10); | 553 gfx::RectF end_rect(50, 5, 0, 10); |
| 658 bool visible = true; | 554 bool visible = true; |
| 659 | 555 |
| 660 controller().OnSelectionEditable(true); | |
| 661 | |
| 662 // If the user double tap selects text in an editable region, the first tap | 556 // If the user double tap selects text in an editable region, the first tap |
| 663 // will register insertion and the second tap selection. | 557 // will register insertion and the second tap selection. |
| 664 OnTapEvent(); | 558 OnTapEvent(); |
| 665 ChangeInsertion(start_rect, visible); | 559 ChangeInsertion(start_rect, visible); |
| 666 EXPECT_THAT(GetAndResetEvents(), | 560 EXPECT_THAT(GetAndResetEvents(), |
| 667 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | 561 ElementsAre(INSERTION_HANDLE_SHOWN)); |
| 668 | 562 |
| 669 OnDoubleTapEvent(); | 563 OnDoubleTapEvent(); |
| 670 ChangeSelection(start_rect, visible, end_rect, visible); | 564 ChangeSelection(start_rect, visible, end_rect, visible); |
| 671 EXPECT_THAT(GetAndResetEvents(), | 565 EXPECT_THAT(GetAndResetEvents(), |
| 672 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); | 566 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); |
| 673 } | 567 } |
| 674 | 568 |
| 675 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { | 569 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { |
| 676 gfx::RectF start_rect(5, 5, 0, 10); | 570 gfx::RectF start_rect(5, 5, 0, 10); |
| 677 gfx::RectF end_rect(50, 5, 0, 10); | 571 gfx::RectF end_rect(50, 5, 0, 10); |
| 678 bool visible = true; | 572 bool visible = true; |
| 679 | 573 |
| 680 OnLongPressEvent(); | 574 OnLongPressEvent(); |
| 681 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 575 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 682 | 576 |
| 683 // There may be several empty updates after a longpress due to the | 577 // There may be several empty updates after a longpress due to the |
| 684 // asynchronous response. These empty updates should not prevent the selection | 578 // asynchronous response. These empty updates should not prevent the selection |
| 685 // handles from (eventually) activating. | 579 // handles from (eventually) activating. |
| 686 ClearSelection(); | 580 ClearSelection(); |
| 687 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 581 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 688 | 582 |
| 689 ClearSelection(); | 583 ClearSelection(); |
| 690 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 584 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 691 | 585 |
| 692 ChangeSelection(start_rect, visible, end_rect, visible); | 586 ChangeSelection(start_rect, visible, end_rect, visible); |
| 693 EXPECT_THAT(GetAndResetEvents(), | 587 EXPECT_THAT(GetAndResetEvents(), |
| 694 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 588 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 695 } | 589 } |
| 696 | 590 |
| 697 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 591 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
| 698 gfx::RectF start_rect(5, 5, 0, 10); | 592 gfx::RectF start_rect(5, 5, 0, 10); |
| 699 gfx::RectF end_rect(50, 5, 0, 10); | 593 gfx::RectF end_rect(50, 5, 0, 10); |
| 700 bool visible = true; | 594 bool visible = true; |
| 701 | 595 |
| 702 OnLongPressEvent(); | 596 OnLongPressEvent(); |
| 703 ChangeSelection(start_rect, visible, end_rect, visible); | 597 ChangeSelection(start_rect, visible, end_rect, visible); |
| 704 EXPECT_THAT(GetAndResetEvents(), | 598 EXPECT_THAT(GetAndResetEvents(), |
| 705 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 599 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 706 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 600 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 707 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 601 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 708 | 602 |
| 709 // A long press triggering a new selection should re-send the | 603 // A long press triggering a new selection should re-send the |
| 710 // SELECTION_HANDLES_SHOWN | 604 // SELECTION_HANDLES_SHOWN |
| 711 // event notification. | 605 // event notification. |
| 712 start_rect.Offset(10, 10); | 606 start_rect.Offset(10, 10); |
| 713 OnLongPressEvent(); | 607 OnLongPressEvent(); |
| 714 ChangeSelection(start_rect, visible, end_rect, visible); | 608 ChangeSelection(start_rect, visible, end_rect, visible); |
| 715 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | 609 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 716 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 610 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 717 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 611 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
| 718 } | 612 } |
| 719 | 613 |
| 720 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 614 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
| 721 base::TimeTicks event_time = base::TimeTicks::Now(); | 615 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 722 OnLongPressEvent(); | 616 OnLongPressEvent(); |
| 723 | 617 |
| 724 // The touch sequence should not be handled if selection is not active. | 618 // The touch sequence should not be handled if selection is not active. |
| 725 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 619 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
| 726 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 620 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 727 | 621 |
| 728 float line_height = 10.f; | 622 float line_height = 10.f; |
| 729 gfx::RectF start_rect(0, 0, 0, line_height); | 623 gfx::RectF start_rect(0, 0, 0, line_height); |
| 730 gfx::RectF end_rect(50, 0, 0, line_height); | 624 gfx::RectF end_rect(50, 0, 0, line_height); |
| 731 bool visible = true; | 625 bool visible = true; |
| 732 ChangeSelection(start_rect, visible, end_rect, visible); | 626 ChangeSelection(start_rect, visible, end_rect, visible); |
| 733 EXPECT_THAT(GetAndResetEvents(), | 627 EXPECT_THAT(GetAndResetEvents(), |
| 734 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 628 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 735 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 629 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 736 | 630 |
| 737 // The touch sequence should be handled only if the drawable reports a hit. | 631 // The touch sequence should be handled only if the drawable reports a hit. |
| 738 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 632 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
| 739 SetDraggingEnabled(true); | 633 SetDraggingEnabled(true); |
| 740 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 634 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 741 EXPECT_FALSE(GetAndResetSelectionMoved()); | 635 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 742 | 636 |
| 743 // The SelectBetweenCoordinates() result should reflect the movement. Note | 637 // The SelectBetweenCoordinates() result should reflect the movement. Note |
| 744 // that the start coordinate will always reflect the "fixed" handle's | 638 // that the start coordinate will always reflect the "fixed" handle's |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 675 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
| 782 base::TimeTicks event_time = base::TimeTicks::Now(); | 676 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 783 OnLongPressEvent(); | 677 OnLongPressEvent(); |
| 784 | 678 |
| 785 float line_height = 10.f; | 679 float line_height = 10.f; |
| 786 gfx::RectF start_rect(0, 0, 0, line_height); | 680 gfx::RectF start_rect(0, 0, 0, line_height); |
| 787 gfx::RectF end_rect(50, 0, 0, line_height); | 681 gfx::RectF end_rect(50, 0, 0, line_height); |
| 788 bool visible = true; | 682 bool visible = true; |
| 789 ChangeSelection(start_rect, visible, end_rect, visible); | 683 ChangeSelection(start_rect, visible, end_rect, visible); |
| 790 EXPECT_THAT(GetAndResetEvents(), | 684 EXPECT_THAT(GetAndResetEvents(), |
| 791 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 685 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 792 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 686 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 793 | 687 |
| 794 // The ACTION_DOWN should lock to the closest handle. | 688 // The ACTION_DOWN should lock to the closest handle. |
| 795 gfx::PointF end_offset = end_rect.CenterPoint(); | 689 gfx::PointF end_offset = end_rect.CenterPoint(); |
| 796 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 690 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 797 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 691 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
| 798 MockMotionEvent event( | 692 MockMotionEvent event( |
| 799 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 693 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); |
| 800 SetDraggingEnabled(true); | 694 SetDraggingEnabled(true); |
| 801 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 695 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 820 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 714 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
| 821 base::TimeTicks event_time = base::TimeTicks::Now(); | 715 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 822 OnLongPressEvent(); | 716 OnLongPressEvent(); |
| 823 | 717 |
| 824 float line_height = 10.f; | 718 float line_height = 10.f; |
| 825 gfx::RectF start_rect(50, line_height, 0, line_height); | 719 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 826 gfx::RectF end_rect(100, line_height, 0, line_height); | 720 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 827 bool visible = true; | 721 bool visible = true; |
| 828 ChangeSelection(start_rect, visible, end_rect, visible); | 722 ChangeSelection(start_rect, visible, end_rect, visible); |
| 829 EXPECT_THAT(GetAndResetEvents(), | 723 EXPECT_THAT(GetAndResetEvents(), |
| 830 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 724 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 831 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 725 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 832 | 726 |
| 833 SetDraggingEnabled(true); | 727 SetDraggingEnabled(true); |
| 834 | 728 |
| 835 // Move the extent, not triggering a swap of points. | 729 // Move the extent, not triggering a swap of points. |
| 836 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 730 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 837 end_rect.x(), end_rect.bottom()); | 731 end_rect.x(), end_rect.bottom()); |
| 838 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 732 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 839 EXPECT_FALSE(GetAndResetSelectionMoved()); | 733 EXPECT_FALSE(GetAndResetSelectionMoved()); |
| 840 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 734 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 941 base::TimeTicks event_time = base::TimeTicks::Now(); | 835 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 942 OnLongPressEvent(); | 836 OnLongPressEvent(); |
| 943 | 837 |
| 944 float small_line_height = 1.f; | 838 float small_line_height = 1.f; |
| 945 float large_line_height = 50.f; | 839 float large_line_height = 50.f; |
| 946 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 840 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
| 947 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 841 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
| 948 bool visible = true; | 842 bool visible = true; |
| 949 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 843 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
| 950 EXPECT_THAT(GetAndResetEvents(), | 844 EXPECT_THAT(GetAndResetEvents(), |
| 951 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 845 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 952 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 846 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
| 953 | 847 |
| 954 // Start dragging the handle on the small line. | 848 // Start dragging the handle on the small line. |
| 955 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 849 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| 956 small_line_rect.x(), small_line_rect.y()); | 850 small_line_rect.x(), small_line_rect.y()); |
| 957 SetDraggingEnabled(true); | 851 SetDraggingEnabled(true); |
| 958 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 852 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 959 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); | 853 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); |
| 960 // The drag coordinate for large lines should be capped to a reasonable | 854 // The drag coordinate for large lines should be capped to a reasonable |
| 961 // offset, allowing seamless transition to neighboring lines with different | 855 // offset, allowing seamless transition to neighboring lines with different |
| 962 // sizes. The drag coordinate for small lines should have an offset | 856 // sizes. The drag coordinate for small lines should have an offset |
| 963 // commensurate with the small line size. | 857 // commensurate with the small line size. |
| 964 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), | 858 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), |
| 965 GetLastSelectionStart()); | 859 GetLastSelectionStart()); |
| 966 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 860 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
| 967 | 861 |
| 968 small_line_rect += gfx::Vector2dF(25.f, 0); | 862 small_line_rect += gfx::Vector2dF(25.f, 0); |
| 969 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 863 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
| 970 small_line_rect.x(), small_line_rect.y()); | 864 small_line_rect.x(), small_line_rect.y()); |
| 971 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 865 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 972 EXPECT_TRUE(GetAndResetSelectionMoved()); | 866 EXPECT_TRUE(GetAndResetSelectionMoved()); |
| 973 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 867 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
| 974 } | 868 } |
| 975 | 869 |
| 976 TEST_F(TouchSelectionControllerTest, Animation) { | 870 TEST_F(TouchSelectionControllerTest, Animation) { |
| 977 OnTapEvent(); | 871 OnTapEvent(); |
| 978 controller().OnSelectionEditable(true); | |
| 979 | 872 |
| 980 gfx::RectF insertion_rect(5, 5, 0, 10); | 873 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 981 | 874 |
| 982 bool visible = true; | 875 bool visible = true; |
| 983 ChangeInsertion(insertion_rect, visible); | 876 ChangeInsertion(insertion_rect, visible); |
| 984 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 877 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 985 | 878 |
| 986 visible = false; | 879 visible = false; |
| 987 ChangeInsertion(insertion_rect, visible); | 880 ChangeInsertion(insertion_rect, visible); |
| 988 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 881 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1000 OnTapEvent(); | 893 OnTapEvent(); |
| 1001 visible = true; | 894 visible = true; |
| 1002 ChangeInsertion(insertion_rect, visible); | 895 ChangeInsertion(insertion_rect, visible); |
| 1003 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 896 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 1004 } | 897 } |
| 1005 | 898 |
| 1006 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 899 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
| 1007 TouchSelectionControllerTestApi test_controller(&controller()); | 900 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1008 | 901 |
| 1009 OnTapEvent(); | 902 OnTapEvent(); |
| 1010 controller().OnSelectionEditable(true); | |
| 1011 | 903 |
| 1012 gfx::RectF insertion_rect(5, 5, 0, 10); | 904 gfx::RectF insertion_rect(5, 5, 0, 10); |
| 1013 | 905 |
| 1014 bool visible = true; | 906 bool visible = true; |
| 1015 ChangeInsertion(insertion_rect, visible); | 907 ChangeInsertion(insertion_rect, visible); |
| 1016 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 908 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
| 1017 EXPECT_TRUE(test_controller.GetStartVisible()); | 909 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1018 EXPECT_TRUE(test_controller.GetEndVisible()); | 910 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1019 | 911 |
| 1020 controller().SetTemporarilyHidden(true); | 912 controller().SetTemporarilyHidden(true); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1038 } | 930 } |
| 1039 | 931 |
| 1040 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 932 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
| 1041 gfx::RectF start_rect(5, 5, 0, 10); | 933 gfx::RectF start_rect(5, 5, 0, 10); |
| 1042 gfx::RectF end_rect(50, 5, 0, 10); | 934 gfx::RectF end_rect(50, 5, 0, 10); |
| 1043 bool visible = true; | 935 bool visible = true; |
| 1044 | 936 |
| 1045 OnLongPressEvent(); | 937 OnLongPressEvent(); |
| 1046 ChangeSelection(start_rect, visible, end_rect, visible); | 938 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1047 EXPECT_THAT(GetAndResetEvents(), | 939 EXPECT_THAT(GetAndResetEvents(), |
| 1048 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 940 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1049 | 941 |
| 1050 // Selection should not be cleared if the selection bounds have not changed. | 942 // Selection should not be cleared if the selection bounds have not changed. |
| 1051 OnTapEvent(); | 943 OnTapEvent(); |
| 1052 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 944 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1053 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 945 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1054 | 946 |
| 1055 OnTapEvent(); | 947 OnTapEvent(); |
| 1056 ClearSelection(); | 948 ClearSelection(); |
| 1057 EXPECT_THAT(GetAndResetEvents(), | 949 EXPECT_THAT(GetAndResetEvents(), |
| 1058 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 950 ElementsAre(SELECTION_HANDLES_CLEARED)); |
| 1059 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 1060 } | |
| 1061 | |
| 1062 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | |
| 1063 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1064 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1065 bool visible = true; | |
| 1066 | |
| 1067 // Tap-triggered selections should not be allowed. | |
| 1068 OnLongPressEvent(); | |
| 1069 OnTapEvent(); | |
| 1070 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1071 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1072 | |
| 1073 // Subsequent longpress selections will be allowed. | |
| 1074 OnLongPressEvent(); | |
| 1075 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1076 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
| 1077 | |
| 1078 // Tapping again shouldn't have any effect on subsequent selection events. | |
| 1079 OnTapEvent(); | |
| 1080 end_rect.Offset(10, 10); | |
| 1081 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1082 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | |
| 1083 ClearSelection(); | |
| 1084 EXPECT_THAT(GetAndResetEvents(), | |
| 1085 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
| 1086 } | |
| 1087 | |
| 1088 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | |
| 1089 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1090 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1091 bool visible = true; | |
| 1092 | |
| 1093 // The selection should not be activated, as it wasn't yet allowed. | |
| 1094 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1095 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | |
| 1096 | |
| 1097 // A longpress should have no immediate effect. | |
| 1098 OnLongPressEvent(); | |
| 1099 | |
| 1100 // Now explicitly allow showing from the previously supplied bounds. | |
| 1101 controller().AllowShowingFromCurrentSelection(); | |
| 1102 EXPECT_THAT(GetAndResetEvents(), | |
| 1103 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | |
| 1104 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
| 1105 | |
| 1106 // Repeated calls to show from the current selection should be ignored. | |
| 1107 controller().AllowShowingFromCurrentSelection(); | |
| 1108 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1109 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | |
| 1110 | |
| 1111 // Trying to show from an empty selection will have no result. | |
| 1112 ClearSelection(); | |
| 1113 EXPECT_THAT(GetAndResetEvents(), | |
| 1114 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | |
| 1115 controller().AllowShowingFromCurrentSelection(); | |
| 1116 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1117 | |
| 1118 // Showing the insertion handle should also be supported. | |
| 1119 controller().OnSelectionEditable(true); | |
| 1120 controller().OnSelectionEmpty(false); | |
| 1121 controller().HideAndDisallowShowingAutomatically(); | |
| 1122 gfx::RectF insertion_rect(5, 5, 0, 10); | |
| 1123 ChangeInsertion(insertion_rect, visible); | |
| 1124 controller().AllowShowingFromCurrentSelection(); | |
| 1125 EXPECT_THAT(GetAndResetEvents(), | |
| 1126 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN)); | |
| 1127 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | |
| 1128 } | |
| 1129 | |
| 1130 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { | |
| 1131 bool visible = false; | |
| 1132 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1133 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1134 gfx::PointF inner_point(25, 10); | |
| 1135 gfx::PointF outer_point(100, 100); | |
| 1136 | |
| 1137 // Establish a selection without handles from 5 to 50 with height 10. | |
| 1138 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1139 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1140 | |
| 1141 // A point outside the rect should not be handled. | |
| 1142 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point, 1)); | |
| 1143 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1144 | |
| 1145 // A point inside the rect should be handled. | |
| 1146 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point, 1)); | |
| 1147 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
| 1148 } | |
| 1149 | |
| 1150 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { | |
| 1151 bool visible = false; | |
| 1152 gfx::RectF start_rect(5, 5, 0, 10); | |
| 1153 gfx::RectF end_rect(50, 5, 0, 10); | |
| 1154 gfx::PointF inner_point(25, 10); | |
| 1155 gfx::PointF outer_point(100, 100); | |
| 1156 | |
| 1157 // Establish a selection without handles from 5 to 50 with height 10. | |
| 1158 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1159 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1160 | |
| 1161 // A point outside the rect should not be handled. | |
| 1162 EXPECT_FALSE( | |
| 1163 controller().WillHandleLongPressEvent(base::TimeTicks(), outer_point)); | |
| 1164 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1165 | |
| 1166 // A point inside the rect should be handled. | |
| 1167 EXPECT_TRUE( | |
| 1168 controller().WillHandleLongPressEvent(base::TimeTicks(), inner_point)); | |
| 1169 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); | |
| 1170 } | 951 } |
| 1171 | 952 |
| 1172 TEST_F(TouchSelectionControllerTest, LongPressDrag) { | 953 TEST_F(TouchSelectionControllerTest, LongPressDrag) { |
| 1173 EnableLongPressDragSelection(); | 954 EnableLongPressDragSelection(); |
| 1174 TouchSelectionControllerTestApi test_controller(&controller()); | 955 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1175 | 956 |
| 1176 gfx::RectF start_rect(-50, 0, 0, 10); | 957 gfx::RectF start_rect(-50, 0, 0, 10); |
| 1177 gfx::RectF end_rect(50, 0, 0, 10); | 958 gfx::RectF end_rect(50, 0, 0, 10); |
| 1178 bool visible = true; | 959 bool visible = true; |
| 1179 | 960 |
| 1180 // Start a touch sequence. | 961 // Start a touch sequence. |
| 1181 MockMotionEvent event; | 962 MockMotionEvent event; |
| 1182 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 963 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1183 | 964 |
| 1184 // Activate a longpress-triggered selection. | 965 // Activate a longpress-triggered selection. |
| 1185 OnLongPressEvent(); | 966 OnLongPressEvent(); |
| 1186 ChangeSelection(start_rect, visible, end_rect, visible); | 967 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1187 EXPECT_THAT(GetAndResetEvents(), | 968 EXPECT_THAT(GetAndResetEvents(), |
| 1188 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 969 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1189 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 970 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1190 | 971 |
| 1191 // The handles should remain invisible while the touch release and longpress | 972 // The handles should remain invisible while the touch release and longpress |
| 1192 // drag gesture are pending. | 973 // drag gesture are pending. |
| 1193 EXPECT_FALSE(test_controller.GetStartVisible()); | 974 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1194 EXPECT_FALSE(test_controller.GetEndVisible()); | 975 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1195 | 976 |
| 1196 // The selection coordinates should reflect the drag movement. | 977 // The selection coordinates should reflect the drag movement. |
| 1197 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 978 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
| 1198 gfx::PointF end_offset = end_rect.CenterPoint(); | 979 gfx::PointF end_offset = end_rect.CenterPoint(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1244 bool visible = true; | 1025 bool visible = true; |
| 1245 | 1026 |
| 1246 // Start a touch sequence. | 1027 // Start a touch sequence. |
| 1247 MockMotionEvent event; | 1028 MockMotionEvent event; |
| 1248 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 1029 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1249 | 1030 |
| 1250 // Activate a longpress-triggered selection. | 1031 // Activate a longpress-triggered selection. |
| 1251 OnLongPressEvent(); | 1032 OnLongPressEvent(); |
| 1252 ChangeSelection(start_rect, visible, end_rect, visible); | 1033 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1253 EXPECT_THAT(GetAndResetEvents(), | 1034 EXPECT_THAT(GetAndResetEvents(), |
| 1254 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1035 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1255 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1036 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1256 | 1037 |
| 1257 // The handles should remain invisible while the touch release and longpress | 1038 // The handles should remain invisible while the touch release and longpress |
| 1258 // drag gesture are pending. | 1039 // drag gesture are pending. |
| 1259 EXPECT_FALSE(test_controller.GetStartVisible()); | 1040 EXPECT_FALSE(test_controller.GetStartVisible()); |
| 1260 EXPECT_FALSE(test_controller.GetEndVisible()); | 1041 EXPECT_FALSE(test_controller.GetEndVisible()); |
| 1261 | 1042 |
| 1262 // If no drag movement occurs, the handles should reappear after the touch | 1043 // If no drag movement occurs, the handles should reappear after the touch |
| 1263 // is released. | 1044 // is released. |
| 1264 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 1045 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1276 bool visible = true; | 1057 bool visible = true; |
| 1277 | 1058 |
| 1278 // Start a touch sequence. | 1059 // Start a touch sequence. |
| 1279 MockMotionEvent event; | 1060 MockMotionEvent event; |
| 1280 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); | 1061 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); |
| 1281 | 1062 |
| 1282 // Activate a longpress-triggered selection. | 1063 // Activate a longpress-triggered selection. |
| 1283 OnLongPressEvent(); | 1064 OnLongPressEvent(); |
| 1284 ChangeSelection(start_rect, visible, end_rect, visible); | 1065 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1285 EXPECT_THAT(GetAndResetEvents(), | 1066 EXPECT_THAT(GetAndResetEvents(), |
| 1286 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1067 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1287 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1068 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1288 EXPECT_TRUE(test_controller.GetStartVisible()); | 1069 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1289 EXPECT_TRUE(test_controller.GetEndVisible()); | 1070 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1290 | 1071 |
| 1291 // Subsequent motion of the same touch sequence after longpress shouldn't | 1072 // Subsequent motion of the same touch sequence after longpress shouldn't |
| 1292 // trigger drag selection. | 1073 // trigger drag selection. |
| 1293 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); | 1074 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); |
| 1294 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1075 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1295 | 1076 |
| 1296 EXPECT_FALSE(controller().WillHandleTouchEvent( | 1077 EXPECT_FALSE(controller().WillHandleTouchEvent( |
| 1297 event.MovePoint(0, 0, kDefaulTapSlop * 10))); | 1078 event.MovePoint(0, 0, kDefaulTapSlop * 10))); |
| 1298 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1079 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1299 | 1080 |
| 1300 // Releasing the touch sequence should have no effect. | 1081 // Releasing the touch sequence should have no effect. |
| 1301 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | 1082 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); |
| 1302 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 1083 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
| 1303 EXPECT_TRUE(test_controller.GetStartVisible()); | 1084 EXPECT_TRUE(test_controller.GetStartVisible()); |
| 1304 EXPECT_TRUE(test_controller.GetEndVisible()); | 1085 EXPECT_TRUE(test_controller.GetEndVisible()); |
| 1305 } | 1086 } |
| 1306 | 1087 |
| 1307 // When there is a selection on the page and long-press drag is performed | |
| 1308 // somewhere that has nothing to select, long-press drag selector should not get | |
| 1309 // activated so the page can scroll. | |
| 1310 TEST_F(TouchSelectionControllerTest, LongPressDragScroll) { | |
| 1311 EnableLongPressDragSelection(); | |
| 1312 TouchSelectionControllerTestApi test_controller(&controller()); | |
| 1313 | |
| 1314 gfx::RectF start_rect(10, 0, 0, 10); | |
| 1315 gfx::RectF end_rect(20, 0, 0, 10); | |
| 1316 gfx::PointF touch_point(0, 0); | |
| 1317 bool visible = true; | |
| 1318 MockMotionEvent event; | |
| 1319 | |
| 1320 // Pre-select something. | |
| 1321 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1322 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_ESTABLISHED)); | |
| 1323 | |
| 1324 // Start the touch sequence and perform the long-press out of the existing | |
| 1325 // selection. | |
| 1326 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
| 1327 event.PressPoint(touch_point.x(), touch_point.y()))); | |
| 1328 OnLongPressEvent(); | |
| 1329 | |
| 1330 // Drag down. Selection controller should not consume the touch-move event. | |
| 1331 touch_point.Offset(0, 2 * kDefaulTapSlop); | |
| 1332 EXPECT_FALSE(controller().WillHandleTouchEvent( | |
| 1333 event.MovePoint(0, touch_point.x(), touch_point.y()))); | |
| 1334 | |
| 1335 // Begin page scroll and update the selection. Selection handles should not be | |
| 1336 // shown which means long-press drag selector is not activated. | |
| 1337 controller().OnScrollBeginEvent(); | |
| 1338 start_rect.Offset(0, 2 * kDefaulTapSlop); | |
| 1339 end_rect.Offset(0, 2 * kDefaulTapSlop); | |
| 1340 ChangeSelection(start_rect, visible, end_rect, visible); | |
| 1341 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
| 1342 | |
| 1343 // Release the touch sequence. | |
| 1344 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); | |
| 1345 } | |
| 1346 | |
| 1347 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { | 1088 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { |
| 1348 gfx::RectF start_rect(5, 5, 0, 10); | 1089 gfx::RectF start_rect(5, 5, 0, 10); |
| 1349 gfx::RectF end_rect(50, 5, 0, 10); | 1090 gfx::RectF end_rect(50, 5, 0, 10); |
| 1350 bool visible = true; | 1091 bool visible = true; |
| 1351 | 1092 |
| 1352 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1093 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
| 1353 | 1094 |
| 1354 OnLongPressEvent(); | 1095 OnLongPressEvent(); |
| 1355 ChangeSelection(start_rect, visible, end_rect, visible); | 1096 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1356 ASSERT_THAT(GetAndResetEvents(), | 1097 ASSERT_THAT(GetAndResetEvents(), |
| 1357 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1098 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1358 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); | 1099 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); |
| 1359 | 1100 |
| 1360 // The result of |GetRectBetweenBounds| should be available within the | 1101 // The result of |GetRectBetweenBounds| should be available within the |
| 1361 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. | 1102 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. |
| 1362 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1103 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
| 1363 | 1104 |
| 1364 start_rect.Offset(1, 0); | 1105 start_rect.Offset(1, 0); |
| 1365 ChangeSelection(start_rect, visible, end_rect, visible); | 1106 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1366 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1107 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
| 1367 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1108 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1380 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1121 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
| 1381 | 1122 |
| 1382 // If both bounds are visible, the full bounding rect should be returned. | 1123 // If both bounds are visible, the full bounding rect should be returned. |
| 1383 ChangeSelection(start_rect, false, end_rect, false); | 1124 ChangeSelection(start_rect, false, end_rect, false); |
| 1384 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); | 1125 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); |
| 1385 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); | 1126 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); |
| 1386 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); | 1127 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); |
| 1387 | 1128 |
| 1388 ClearSelection(); | 1129 ClearSelection(); |
| 1389 ASSERT_THAT(GetAndResetEvents(), | 1130 ASSERT_THAT(GetAndResetEvents(), |
| 1390 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED)); | 1131 ElementsAre(SELECTION_HANDLES_CLEARED)); |
| 1391 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); | 1132 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); |
| 1392 } | 1133 } |
| 1393 | 1134 |
| 1394 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { | 1135 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { |
| 1395 TouchSelectionControllerTestApi test_controller(&controller()); | 1136 TouchSelectionControllerTestApi test_controller(&controller()); |
| 1396 base::TimeTicks event_time = base::TimeTicks::Now(); | 1137 base::TimeTicks event_time = base::TimeTicks::Now(); |
| 1397 OnLongPressEvent(); | 1138 OnLongPressEvent(); |
| 1398 | 1139 |
| 1399 float line_height = 10.f; | 1140 float line_height = 10.f; |
| 1400 gfx::RectF start_rect(50, line_height, 0, line_height); | 1141 gfx::RectF start_rect(50, line_height, 0, line_height); |
| 1401 gfx::RectF end_rect(100, line_height, 0, line_height); | 1142 gfx::RectF end_rect(100, line_height, 0, line_height); |
| 1402 bool visible = true; | 1143 bool visible = true; |
| 1403 ChangeSelection(start_rect, visible, end_rect, visible); | 1144 ChangeSelection(start_rect, visible, end_rect, visible); |
| 1404 EXPECT_THAT(GetAndResetEvents(), | 1145 EXPECT_THAT(GetAndResetEvents(), |
| 1405 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN)); | 1146 ElementsAre(SELECTION_HANDLES_SHOWN)); |
| 1406 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 1147 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
| 1407 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1148 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
| 1408 TouchHandleOrientation::LEFT); | 1149 TouchHandleOrientation::LEFT); |
| 1409 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1150 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
| 1410 TouchHandleOrientation::RIGHT); | 1151 TouchHandleOrientation::RIGHT); |
| 1411 | 1152 |
| 1412 SetDraggingEnabled(true); | 1153 SetDraggingEnabled(true); |
| 1413 | 1154 |
| 1414 // Simulate moving the base, not triggering a swap of points. | 1155 // Simulate moving the base, not triggering a swap of points. |
| 1415 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 1156 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 offset_rect.x(), offset_rect.bottom()); | 1244 offset_rect.x(), offset_rect.bottom()); |
| 1504 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 1245 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
| 1505 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); | 1246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); |
| 1506 EXPECT_EQ(test_controller.GetStartHandleOrientation(), | 1247 EXPECT_EQ(test_controller.GetStartHandleOrientation(), |
| 1507 TouchHandleOrientation::LEFT); | 1248 TouchHandleOrientation::LEFT); |
| 1508 EXPECT_EQ(test_controller.GetEndHandleOrientation(), | 1249 EXPECT_EQ(test_controller.GetEndHandleOrientation(), |
| 1509 TouchHandleOrientation::RIGHT); | 1250 TouchHandleOrientation::RIGHT); |
| 1510 } | 1251 } |
| 1511 | 1252 |
| 1512 } // namespace ui | 1253 } // namespace ui |
| OLD | NEW |