Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: ui/touch_selection/touch_selection_controller_unittest.cc

Issue 2664253002: Revert "Blink handle selection handle visibility" (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/touch_selection/touch_selection_controller.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 controller().HandleLongPressEvent(base::TimeTicks(), 148 ASSERT_FALSE(controller().WillHandleLongPressEvent(base::TimeTicks(),
149 kIgnoredPoint); 149 kIgnoredPoint));
150 } 150 }
151 151
152 void OnTapEvent() { 152 void OnTapEvent() {
153 controller().HandleTapEvent(kIgnoredPoint, 1); 153 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint, 1));
154 } 154 }
155 155
156 void OnDoubleTapEvent() { 156 void OnDoubleTapEvent() {
157 controller().HandleTapEvent(kIgnoredPoint, 2); 157 ASSERT_FALSE(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
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());
243 OnTapEvent(); 247 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);
244 ChangeInsertion(insertion_rect, visible); 257 ChangeInsertion(insertion_rect, visible);
245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); 258 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN));
246 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); 259 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
247 260
248 insertion_rect.Offset(1, 0); 261 insertion_rect.Offset(1, 0);
249 ChangeInsertion(insertion_rect, visible); 262 ChangeInsertion(insertion_rect, visible);
250 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); 263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED));
251 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); 264 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
252 265
253 insertion_rect.Offset(0, 1); 266 insertion_rect.Offset(0, 1);
254 ChangeInsertion(insertion_rect, visible); 267 ChangeInsertion(insertion_rect, visible);
255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); 268 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED));
256 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); 269 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
257 270
258 ClearInsertion(); 271 ClearInsertion();
259 EXPECT_THAT(GetAndResetEvents(), 272 EXPECT_THAT(GetAndResetEvents(),
260 ElementsAre(INSERTION_HANDLE_CLEARED)); 273 ElementsAre(SELECTION_DISSOLVED, 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());
261 } 351 }
262 352
263 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { 353 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
264 OnLongPressEvent(); 354 OnLongPressEvent();
355 controller().OnSelectionEditable(true);
265 356
266 gfx::RectF start_rect(5, 5, 0, 10); 357 gfx::RectF start_rect(5, 5, 0, 10);
267 gfx::RectF end_rect(50, 5, 0, 10); 358 gfx::RectF end_rect(50, 5, 0, 10);
268 bool visible = true; 359 bool visible = true;
269 360
270 ChangeInsertion(start_rect, visible); 361 ChangeInsertion(start_rect, visible);
271 EXPECT_THAT(GetAndResetEvents(), 362 EXPECT_THAT(GetAndResetEvents(),
272 ElementsAre(INSERTION_HANDLE_SHOWN)); 363 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
273 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 364 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
274 365
275 ChangeSelection(start_rect, visible, end_rect, visible); 366 ChangeSelection(start_rect, visible, end_rect, visible);
276 EXPECT_THAT(GetAndResetEvents(), 367 EXPECT_THAT(GetAndResetEvents(),
277 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); 368 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN));
278 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 369 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
279 370
280 ChangeInsertion(end_rect, visible); 371 ChangeInsertion(end_rect, visible);
281 EXPECT_THAT(GetAndResetEvents(), 372 EXPECT_THAT(GetAndResetEvents(),
282 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN)); 373 ElementsAre(SELECTION_HANDLES_CLEARED, INSERTION_HANDLE_SHOWN));
283 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); 374 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart());
284 375
285 ClearInsertion(); 376 controller().HideAndDisallowShowingAutomatically();
286 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED)); 377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_CLEARED));
287 378
288 OnTapEvent(); 379 OnTapEvent();
289 ChangeInsertion(end_rect, visible); 380 ChangeInsertion(end_rect, visible);
290 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN)); 381 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN));
291 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); 382 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart());
292 } 383 }
293 384
294 TEST_F(TouchSelectionControllerTest, InsertionDragged) { 385 TEST_F(TouchSelectionControllerTest, InsertionDragged) {
295 base::TimeTicks event_time = base::TimeTicks::Now(); 386 base::TimeTicks event_time = base::TimeTicks::Now();
296 OnTapEvent(); 387 OnTapEvent();
388 controller().OnSelectionEditable(true);
297 389
298 // The touch sequence should not be handled if insertion is not active. 390 // The touch sequence should not be handled if insertion is not active.
299 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 391 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
300 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 392 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
301 393
302 float line_height = 10.f; 394 float line_height = 10.f;
303 gfx::RectF start_rect(10, 0, 0, line_height); 395 gfx::RectF start_rect(10, 0, 0, line_height);
304 bool visible = true; 396 bool visible = true;
305 ChangeInsertion(start_rect, visible); 397 ChangeInsertion(start_rect, visible);
306 EXPECT_THAT(GetAndResetEvents(), 398 EXPECT_THAT(GetAndResetEvents(),
307 ElementsAre(INSERTION_HANDLE_SHOWN)); 399 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
308 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 400 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
309 401
310 // The touch sequence should be handled only if the drawable reports a hit. 402 // The touch sequence should be handled only if the drawable reports a hit.
311 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 403 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
312 SetDraggingEnabled(true); 404 SetDraggingEnabled(true);
313 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 405 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
314 EXPECT_FALSE(GetAndResetCaretMoved()); 406 EXPECT_FALSE(GetAndResetCaretMoved());
315 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); 407 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED));
316 408
317 // The MoveCaret() result should reflect the movement. 409 // The MoveCaret() result should reflect the movement.
(...skipping 22 matching lines...) Expand all
340 // Following ACTION_DOWN should not be consumed if it does not start handle 432 // Following ACTION_DOWN should not be consumed if it does not start handle
341 // dragging. 433 // dragging.
342 SetDraggingEnabled(false); 434 SetDraggingEnabled(false);
343 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); 435 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0);
344 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 436 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
345 } 437 }
346 438
347 TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) { 439 TEST_F(TouchSelectionControllerTest, InsertionDeactivatedWhileDragging) {
348 base::TimeTicks event_time = base::TimeTicks::Now(); 440 base::TimeTicks event_time = base::TimeTicks::Now();
349 OnTapEvent(); 441 OnTapEvent();
442 controller().OnSelectionEditable(true);
350 443
351 float line_height = 10.f; 444 float line_height = 10.f;
352 gfx::RectF start_rect(10, 0, 0, line_height); 445 gfx::RectF start_rect(10, 0, 0, line_height);
353 bool visible = true; 446 bool visible = true;
354 ChangeInsertion(start_rect, visible); 447 ChangeInsertion(start_rect, visible);
355 EXPECT_THAT(GetAndResetEvents(), 448 EXPECT_THAT(GetAndResetEvents(),
356 ElementsAre(INSERTION_HANDLE_SHOWN)); 449 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
357 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 450 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
358 451
359 // Enable dragging so that the following ACTION_DOWN starts handle dragging. 452 // Enable dragging so that the following ACTION_DOWN starts handle dragging.
360 SetDraggingEnabled(true); 453 SetDraggingEnabled(true);
361 454
362 // Touch down to start dragging. 455 // Touch down to start dragging.
363 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 456 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
364 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 457 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
365 EXPECT_FALSE(GetAndResetCaretMoved()); 458 EXPECT_FALSE(GetAndResetCaretMoved());
366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); 459 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED));
(...skipping 27 matching lines...) Expand all
394 // Following ACTION_DOWN should not be consumed if it does not start handle 487 // Following ACTION_DOWN should not be consumed if it does not start handle
395 // dragging. 488 // dragging.
396 SetDraggingEnabled(false); 489 SetDraggingEnabled(false);
397 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0); 490 event = MockMotionEvent(MotionEvent::ACTION_DOWN, event_time, 0, 0);
398 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 491 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
399 } 492 }
400 493
401 TEST_F(TouchSelectionControllerTest, InsertionTapped) { 494 TEST_F(TouchSelectionControllerTest, InsertionTapped) {
402 base::TimeTicks event_time = base::TimeTicks::Now(); 495 base::TimeTicks event_time = base::TimeTicks::Now();
403 OnTapEvent(); 496 OnTapEvent();
497 controller().OnSelectionEditable(true);
404 SetDraggingEnabled(true); 498 SetDraggingEnabled(true);
405 499
406 gfx::RectF start_rect(10, 0, 0, 10); 500 gfx::RectF start_rect(10, 0, 0, 10);
407 bool visible = true; 501 bool visible = true;
408 ChangeInsertion(start_rect, visible); 502 ChangeInsertion(start_rect, visible);
409 EXPECT_THAT(GetAndResetEvents(), 503 EXPECT_THAT(GetAndResetEvents(),
410 ElementsAre(INSERTION_HANDLE_SHOWN)); 504 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
411 505
412 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 506 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
413 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 507 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
414 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); 508 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED));
415 509
416 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 510 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
417 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 511 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
418 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, 512 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED,
419 INSERTION_HANDLE_DRAG_STOPPED)); 513 INSERTION_HANDLE_DRAG_STOPPED));
420 514
421 // Reset the insertion. 515 // Reset the insertion.
422 ClearInsertion(); 516 ClearInsertion();
423 OnTapEvent(); 517 OnTapEvent();
424 ChangeInsertion(start_rect, visible); 518 ChangeInsertion(start_rect, visible);
425 EXPECT_THAT(GetAndResetEvents(), 519 EXPECT_THAT(GetAndResetEvents(),
426 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); 520 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED,
521 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
427 522
428 // No tap should be signalled if the time between DOWN and UP was too long. 523 // No tap should be signalled if the time between DOWN and UP was too long.
429 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 524 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
430 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 525 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
431 event = MockMotionEvent(MockMotionEvent::ACTION_UP, 526 event = MockMotionEvent(MockMotionEvent::ACTION_UP,
432 event_time + base::TimeDelta::FromSeconds(1), 527 event_time + base::TimeDelta::FromSeconds(1),
433 0, 528 0,
434 0); 529 0);
435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 530 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
436 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, 531 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED,
437 INSERTION_HANDLE_DRAG_STOPPED)); 532 INSERTION_HANDLE_DRAG_STOPPED));
438 533
439 // Reset the insertion. 534 // Reset the insertion.
440 ClearInsertion(); 535 ClearInsertion();
441 OnTapEvent(); 536 OnTapEvent();
442 ChangeInsertion(start_rect, visible); 537 ChangeInsertion(start_rect, visible);
443 EXPECT_THAT(GetAndResetEvents(), 538 EXPECT_THAT(GetAndResetEvents(),
444 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); 539 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED,
540 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
445 541
446 // No tap should be signalled if the drag was too long. 542 // No tap should be signalled if the drag was too long.
447 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 543 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
448 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 544 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
449 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); 545 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0);
450 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 546 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
451 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); 547 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0);
452 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 548 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
453 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, 549 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED,
454 INSERTION_HANDLE_DRAG_STOPPED)); 550 INSERTION_HANDLE_DRAG_STOPPED));
455 551
456 // Reset the insertion. 552 // Reset the insertion.
457 ClearInsertion(); 553 ClearInsertion();
458 OnTapEvent(); 554 OnTapEvent();
459 ChangeInsertion(start_rect, visible); 555 ChangeInsertion(start_rect, visible);
460 EXPECT_THAT(GetAndResetEvents(), 556 EXPECT_THAT(GetAndResetEvents(),
461 ElementsAre(INSERTION_HANDLE_CLEARED, INSERTION_HANDLE_SHOWN)); 557 ElementsAre(SELECTION_DISSOLVED, INSERTION_HANDLE_CLEARED,
558 SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
462 559
463 // No tap should be signalled if the touch sequence is cancelled. 560 // No tap should be signalled if the touch sequence is cancelled.
464 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 561 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
465 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 562 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
466 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); 563 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0);
467 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 564 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
468 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED, 565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED,
469 INSERTION_HANDLE_DRAG_STOPPED)); 566 INSERTION_HANDLE_DRAG_STOPPED));
470 } 567 }
471 568
472 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { 569 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) {
473 base::TimeTicks event_time = base::TimeTicks::Now(); 570 base::TimeTicks event_time = base::TimeTicks::Now();
474 OnTapEvent(); 571 OnTapEvent();
572 controller().OnSelectionEditable(true);
475 SetDraggingEnabled(true); 573 SetDraggingEnabled(true);
476 574
477 gfx::RectF anchor_rect(10, 0, 0, 10); 575 gfx::RectF anchor_rect(10, 0, 0, 10);
478 bool visible = true; 576 bool visible = true;
479 ChangeInsertion(anchor_rect, visible); 577 ChangeInsertion(anchor_rect, visible);
480 EXPECT_THAT(GetAndResetEvents(), 578 EXPECT_THAT(GetAndResetEvents(),
481 ElementsAre(INSERTION_HANDLE_SHOWN)); 579 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
482 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); 580 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
483 581
484 // Tapping again shouldn't reset the active insertion point. 582 // Tapping again shouldn't reset the active insertion point.
485 OnTapEvent(); 583 OnTapEvent();
486 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 584 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 585 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
488 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); 586 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED));
489 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); 587 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
490 588
491 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 589 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
492 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 590 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
493 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, 591 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED,
494 INSERTION_HANDLE_DRAG_STOPPED)); 592 INSERTION_HANDLE_DRAG_STOPPED));
495 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); 593 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
496 594
497 anchor_rect.Offset(5, 15); 595 anchor_rect.Offset(5, 15);
498 ChangeInsertion(anchor_rect, visible); 596 ChangeInsertion(anchor_rect, visible);
499 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED)); 597 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_MOVED));
500 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); 598 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
501 599
502 // Pressing shouldn't reset the active insertion point. 600 // Pressing shouldn't reset the active insertion point.
503 OnLongPressEvent(); 601 OnLongPressEvent();
602 controller().OnSelectionEmpty(true);
504 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 603 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
505 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 604 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
506 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED)); 605 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_DRAG_STARTED));
507 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); 606 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
508 607
509 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 608 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 609 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
511 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED, 610 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_TAPPED,
512 INSERTION_HANDLE_DRAG_STOPPED)); 611 INSERTION_HANDLE_DRAG_STOPPED));
513 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); 612 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart());
514 } 613 }
515 614
516 TEST_F(TouchSelectionControllerTest, SelectionBasic) { 615 TEST_F(TouchSelectionControllerTest, SelectionBasic) {
517 gfx::RectF start_rect(5, 5, 0, 10); 616 gfx::RectF start_rect(5, 5, 0, 10);
518 gfx::RectF end_rect(50, 5, 0, 10); 617 gfx::RectF end_rect(50, 5, 0, 10);
519 bool visible = true; 618 bool visible = true;
520 619
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
521 OnLongPressEvent(); 624 OnLongPressEvent();
522 ChangeSelection(start_rect, visible, end_rect, visible); 625 ChangeSelection(start_rect, visible, end_rect, visible);
523 EXPECT_THAT(GetAndResetEvents(), 626 EXPECT_THAT(GetAndResetEvents(),
524 ElementsAre(SELECTION_HANDLES_SHOWN)); 627 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
525 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 628 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
526 629
527 start_rect.Offset(1, 0); 630 start_rect.Offset(1, 0);
528 ChangeSelection(start_rect, visible, end_rect, visible); 631 ChangeSelection(start_rect, visible, end_rect, visible);
529 // Selection movement does not currently trigger a separate event. 632 // Selection movement does not currently trigger a separate event.
530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); 633 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED));
531 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 634 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
532 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); 635 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd());
533 636
534 ClearSelection(); 637 ClearSelection();
535 EXPECT_THAT(GetAndResetEvents(), 638 EXPECT_THAT(GetAndResetEvents(),
536 ElementsAre(SELECTION_HANDLES_CLEARED)); 639 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
640 EXPECT_EQ(gfx::PointF(), GetLastEventStart());
537 } 641 }
538 642
539 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) { 643 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTap) {
540 gfx::RectF start_rect(5, 5, 0, 10); 644 gfx::RectF start_rect(5, 5, 0, 10);
541 gfx::RectF end_rect(50, 5, 0, 10); 645 gfx::RectF end_rect(50, 5, 0, 10);
542 bool visible = true; 646 bool visible = true;
543 647
544 OnDoubleTapEvent(); 648 OnDoubleTapEvent();
545 ChangeSelection(start_rect, visible, end_rect, visible); 649 ChangeSelection(start_rect, visible, end_rect, visible);
546 EXPECT_THAT(GetAndResetEvents(), 650 EXPECT_THAT(GetAndResetEvents(),
547 ElementsAre(SELECTION_HANDLES_SHOWN)); 651 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
548 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 652 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
549 } 653 }
550 654
551 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) { 655 TEST_F(TouchSelectionControllerTest, SelectionAllowedByDoubleTapOnEditable) {
552 gfx::RectF start_rect(5, 5, 0, 10); 656 gfx::RectF start_rect(5, 5, 0, 10);
553 gfx::RectF end_rect(50, 5, 0, 10); 657 gfx::RectF end_rect(50, 5, 0, 10);
554 bool visible = true; 658 bool visible = true;
555 659
660 controller().OnSelectionEditable(true);
661
556 // If the user double tap selects text in an editable region, the first tap 662 // If the user double tap selects text in an editable region, the first tap
557 // will register insertion and the second tap selection. 663 // will register insertion and the second tap selection.
558 OnTapEvent(); 664 OnTapEvent();
559 ChangeInsertion(start_rect, visible); 665 ChangeInsertion(start_rect, visible);
560 EXPECT_THAT(GetAndResetEvents(), 666 EXPECT_THAT(GetAndResetEvents(),
561 ElementsAre(INSERTION_HANDLE_SHOWN)); 667 ElementsAre(SELECTION_ESTABLISHED, INSERTION_HANDLE_SHOWN));
562 668
563 OnDoubleTapEvent(); 669 OnDoubleTapEvent();
564 ChangeSelection(start_rect, visible, end_rect, visible); 670 ChangeSelection(start_rect, visible, end_rect, visible);
565 EXPECT_THAT(GetAndResetEvents(), 671 EXPECT_THAT(GetAndResetEvents(),
566 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN)); 672 ElementsAre(INSERTION_HANDLE_CLEARED, SELECTION_HANDLES_SHOWN));
567 } 673 }
568 674
569 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) { 675 TEST_F(TouchSelectionControllerTest, SelectionAllowsEmptyUpdateAfterLongPress) {
570 gfx::RectF start_rect(5, 5, 0, 10); 676 gfx::RectF start_rect(5, 5, 0, 10);
571 gfx::RectF end_rect(50, 5, 0, 10); 677 gfx::RectF end_rect(50, 5, 0, 10);
572 bool visible = true; 678 bool visible = true;
573 679
574 OnLongPressEvent(); 680 OnLongPressEvent();
575 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 681 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
576 682
577 // There may be several empty updates after a longpress due to the 683 // There may be several empty updates after a longpress due to the
578 // asynchronous response. These empty updates should not prevent the selection 684 // asynchronous response. These empty updates should not prevent the selection
579 // handles from (eventually) activating. 685 // handles from (eventually) activating.
580 ClearSelection(); 686 ClearSelection();
581 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 687 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
582 688
583 ClearSelection(); 689 ClearSelection();
584 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 690 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
585 691
586 ChangeSelection(start_rect, visible, end_rect, visible); 692 ChangeSelection(start_rect, visible, end_rect, visible);
587 EXPECT_THAT(GetAndResetEvents(), 693 EXPECT_THAT(GetAndResetEvents(),
588 ElementsAre(SELECTION_HANDLES_SHOWN)); 694 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
589 } 695 }
590 696
591 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { 697 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
592 gfx::RectF start_rect(5, 5, 0, 10); 698 gfx::RectF start_rect(5, 5, 0, 10);
593 gfx::RectF end_rect(50, 5, 0, 10); 699 gfx::RectF end_rect(50, 5, 0, 10);
594 bool visible = true; 700 bool visible = true;
595 701
596 OnLongPressEvent(); 702 OnLongPressEvent();
597 ChangeSelection(start_rect, visible, end_rect, visible); 703 ChangeSelection(start_rect, visible, end_rect, visible);
598 EXPECT_THAT(GetAndResetEvents(), 704 EXPECT_THAT(GetAndResetEvents(),
599 ElementsAre(SELECTION_HANDLES_SHOWN)); 705 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
600 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 706 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
601 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); 707 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd());
602 708
603 // A long press triggering a new selection should re-send the 709 // A long press triggering a new selection should re-send the
604 // SELECTION_HANDLES_SHOWN 710 // SELECTION_HANDLES_SHOWN
605 // event notification. 711 // event notification.
606 start_rect.Offset(10, 10); 712 start_rect.Offset(10, 10);
607 OnLongPressEvent(); 713 OnLongPressEvent();
608 ChangeSelection(start_rect, visible, end_rect, visible); 714 ChangeSelection(start_rect, visible, end_rect, visible);
609 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN)); 715 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_SHOWN));
610 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 716 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
611 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); 717 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd());
612 } 718 }
613 719
614 TEST_F(TouchSelectionControllerTest, SelectionDragged) { 720 TEST_F(TouchSelectionControllerTest, SelectionDragged) {
615 base::TimeTicks event_time = base::TimeTicks::Now(); 721 base::TimeTicks event_time = base::TimeTicks::Now();
616 OnLongPressEvent(); 722 OnLongPressEvent();
617 723
618 // The touch sequence should not be handled if selection is not active. 724 // The touch sequence should not be handled if selection is not active.
619 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 725 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
620 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 726 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
621 727
622 float line_height = 10.f; 728 float line_height = 10.f;
623 gfx::RectF start_rect(0, 0, 0, line_height); 729 gfx::RectF start_rect(0, 0, 0, line_height);
624 gfx::RectF end_rect(50, 0, 0, line_height); 730 gfx::RectF end_rect(50, 0, 0, line_height);
625 bool visible = true; 731 bool visible = true;
626 ChangeSelection(start_rect, visible, end_rect, visible); 732 ChangeSelection(start_rect, visible, end_rect, visible);
627 EXPECT_THAT(GetAndResetEvents(), 733 EXPECT_THAT(GetAndResetEvents(),
628 ElementsAre(SELECTION_HANDLES_SHOWN)); 734 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
629 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 735 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
630 736
631 // The touch sequence should be handled only if the drawable reports a hit. 737 // The touch sequence should be handled only if the drawable reports a hit.
632 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 738 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
633 SetDraggingEnabled(true); 739 SetDraggingEnabled(true);
634 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 740 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
635 EXPECT_FALSE(GetAndResetSelectionMoved()); 741 EXPECT_FALSE(GetAndResetSelectionMoved());
636 742
637 // The SelectBetweenCoordinates() result should reflect the movement. Note 743 // The SelectBetweenCoordinates() result should reflect the movement. Note
638 // that the start coordinate will always reflect the "fixed" handle's 744 // that the start coordinate will always reflect the "fixed" handle's
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { 781 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) {
676 base::TimeTicks event_time = base::TimeTicks::Now(); 782 base::TimeTicks event_time = base::TimeTicks::Now();
677 OnLongPressEvent(); 783 OnLongPressEvent();
678 784
679 float line_height = 10.f; 785 float line_height = 10.f;
680 gfx::RectF start_rect(0, 0, 0, line_height); 786 gfx::RectF start_rect(0, 0, 0, line_height);
681 gfx::RectF end_rect(50, 0, 0, line_height); 787 gfx::RectF end_rect(50, 0, 0, line_height);
682 bool visible = true; 788 bool visible = true;
683 ChangeSelection(start_rect, visible, end_rect, visible); 789 ChangeSelection(start_rect, visible, end_rect, visible);
684 EXPECT_THAT(GetAndResetEvents(), 790 EXPECT_THAT(GetAndResetEvents(),
685 ElementsAre(SELECTION_HANDLES_SHOWN)); 791 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
686 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 792 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
687 793
688 // The ACTION_DOWN should lock to the closest handle. 794 // The ACTION_DOWN should lock to the closest handle.
689 gfx::PointF end_offset = end_rect.CenterPoint(); 795 gfx::PointF end_offset = end_rect.CenterPoint();
690 gfx::PointF fixed_offset = start_rect.CenterPoint(); 796 gfx::PointF fixed_offset = start_rect.CenterPoint();
691 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; 797 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f;
692 MockMotionEvent event( 798 MockMotionEvent event(
693 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); 799 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0);
694 SetDraggingEnabled(true); 800 SetDraggingEnabled(true);
695 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 801 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
(...skipping 18 matching lines...) Expand all
714 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { 820 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) {
715 base::TimeTicks event_time = base::TimeTicks::Now(); 821 base::TimeTicks event_time = base::TimeTicks::Now();
716 OnLongPressEvent(); 822 OnLongPressEvent();
717 823
718 float line_height = 10.f; 824 float line_height = 10.f;
719 gfx::RectF start_rect(50, line_height, 0, line_height); 825 gfx::RectF start_rect(50, line_height, 0, line_height);
720 gfx::RectF end_rect(100, line_height, 0, line_height); 826 gfx::RectF end_rect(100, line_height, 0, line_height);
721 bool visible = true; 827 bool visible = true;
722 ChangeSelection(start_rect, visible, end_rect, visible); 828 ChangeSelection(start_rect, visible, end_rect, visible);
723 EXPECT_THAT(GetAndResetEvents(), 829 EXPECT_THAT(GetAndResetEvents(),
724 ElementsAre(SELECTION_HANDLES_SHOWN)); 830 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
725 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 831 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
726 832
727 SetDraggingEnabled(true); 833 SetDraggingEnabled(true);
728 834
729 // Move the extent, not triggering a swap of points. 835 // Move the extent, not triggering a swap of points.
730 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 836 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time,
731 end_rect.x(), end_rect.bottom()); 837 end_rect.x(), end_rect.bottom());
732 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 838 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
733 EXPECT_FALSE(GetAndResetSelectionMoved()); 839 EXPECT_FALSE(GetAndResetSelectionMoved());
734 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 840 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 base::TimeTicks event_time = base::TimeTicks::Now(); 941 base::TimeTicks event_time = base::TimeTicks::Now();
836 OnLongPressEvent(); 942 OnLongPressEvent();
837 943
838 float small_line_height = 1.f; 944 float small_line_height = 1.f;
839 float large_line_height = 50.f; 945 float large_line_height = 50.f;
840 gfx::RectF small_line_rect(0, 0, 0, small_line_height); 946 gfx::RectF small_line_rect(0, 0, 0, small_line_height);
841 gfx::RectF large_line_rect(50, 50, 0, large_line_height); 947 gfx::RectF large_line_rect(50, 50, 0, large_line_height);
842 bool visible = true; 948 bool visible = true;
843 ChangeSelection(small_line_rect, visible, large_line_rect, visible); 949 ChangeSelection(small_line_rect, visible, large_line_rect, visible);
844 EXPECT_THAT(GetAndResetEvents(), 950 EXPECT_THAT(GetAndResetEvents(),
845 ElementsAre(SELECTION_HANDLES_SHOWN)); 951 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
846 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); 952 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart());
847 953
848 // Start dragging the handle on the small line. 954 // Start dragging the handle on the small line.
849 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 955 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time,
850 small_line_rect.x(), small_line_rect.y()); 956 small_line_rect.x(), small_line_rect.y());
851 SetDraggingEnabled(true); 957 SetDraggingEnabled(true);
852 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 958 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
853 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED)); 959 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STARTED));
854 // The drag coordinate for large lines should be capped to a reasonable 960 // The drag coordinate for large lines should be capped to a reasonable
855 // offset, allowing seamless transition to neighboring lines with different 961 // offset, allowing seamless transition to neighboring lines with different
856 // sizes. The drag coordinate for small lines should have an offset 962 // sizes. The drag coordinate for small lines should have an offset
857 // commensurate with the small line size. 963 // commensurate with the small line size.
858 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f), 964 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 8.f),
859 GetLastSelectionStart()); 965 GetLastSelectionStart());
860 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); 966 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd());
861 967
862 small_line_rect += gfx::Vector2dF(25.f, 0); 968 small_line_rect += gfx::Vector2dF(25.f, 0);
863 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 969 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
864 small_line_rect.x(), small_line_rect.y()); 970 small_line_rect.x(), small_line_rect.y());
865 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 971 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
866 EXPECT_TRUE(GetAndResetSelectionMoved()); 972 EXPECT_TRUE(GetAndResetSelectionMoved());
867 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); 973 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd());
868 } 974 }
869 975
870 TEST_F(TouchSelectionControllerTest, Animation) { 976 TEST_F(TouchSelectionControllerTest, Animation) {
871 OnTapEvent(); 977 OnTapEvent();
978 controller().OnSelectionEditable(true);
872 979
873 gfx::RectF insertion_rect(5, 5, 0, 10); 980 gfx::RectF insertion_rect(5, 5, 0, 10);
874 981
875 bool visible = true; 982 bool visible = true;
876 ChangeInsertion(insertion_rect, visible); 983 ChangeInsertion(insertion_rect, visible);
877 EXPECT_FALSE(GetAndResetNeedsAnimate()); 984 EXPECT_FALSE(GetAndResetNeedsAnimate());
878 985
879 visible = false; 986 visible = false;
880 ChangeInsertion(insertion_rect, visible); 987 ChangeInsertion(insertion_rect, visible);
881 EXPECT_TRUE(GetAndResetNeedsAnimate()); 988 EXPECT_TRUE(GetAndResetNeedsAnimate());
(...skipping 11 matching lines...) Expand all
893 OnTapEvent(); 1000 OnTapEvent();
894 visible = true; 1001 visible = true;
895 ChangeInsertion(insertion_rect, visible); 1002 ChangeInsertion(insertion_rect, visible);
896 EXPECT_FALSE(GetAndResetNeedsAnimate()); 1003 EXPECT_FALSE(GetAndResetNeedsAnimate());
897 } 1004 }
898 1005
899 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { 1006 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) {
900 TouchSelectionControllerTestApi test_controller(&controller()); 1007 TouchSelectionControllerTestApi test_controller(&controller());
901 1008
902 OnTapEvent(); 1009 OnTapEvent();
1010 controller().OnSelectionEditable(true);
903 1011
904 gfx::RectF insertion_rect(5, 5, 0, 10); 1012 gfx::RectF insertion_rect(5, 5, 0, 10);
905 1013
906 bool visible = true; 1014 bool visible = true;
907 ChangeInsertion(insertion_rect, visible); 1015 ChangeInsertion(insertion_rect, visible);
908 EXPECT_FALSE(GetAndResetNeedsAnimate()); 1016 EXPECT_FALSE(GetAndResetNeedsAnimate());
909 EXPECT_TRUE(test_controller.GetStartVisible()); 1017 EXPECT_TRUE(test_controller.GetStartVisible());
910 EXPECT_TRUE(test_controller.GetEndVisible()); 1018 EXPECT_TRUE(test_controller.GetEndVisible());
911 1019
912 controller().SetTemporarilyHidden(true); 1020 controller().SetTemporarilyHidden(true);
(...skipping 17 matching lines...) Expand all
930 } 1038 }
931 1039
932 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { 1040 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
933 gfx::RectF start_rect(5, 5, 0, 10); 1041 gfx::RectF start_rect(5, 5, 0, 10);
934 gfx::RectF end_rect(50, 5, 0, 10); 1042 gfx::RectF end_rect(50, 5, 0, 10);
935 bool visible = true; 1043 bool visible = true;
936 1044
937 OnLongPressEvent(); 1045 OnLongPressEvent();
938 ChangeSelection(start_rect, visible, end_rect, visible); 1046 ChangeSelection(start_rect, visible, end_rect, visible);
939 EXPECT_THAT(GetAndResetEvents(), 1047 EXPECT_THAT(GetAndResetEvents(),
940 ElementsAre(SELECTION_HANDLES_SHOWN)); 1048 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
941 1049
942 // Selection should not be cleared if the selection bounds have not changed. 1050 // Selection should not be cleared if the selection bounds have not changed.
943 OnTapEvent(); 1051 OnTapEvent();
944 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 1052 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
945 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 1053 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
946 1054
947 OnTapEvent(); 1055 OnTapEvent();
948 ClearSelection(); 1056 ClearSelection();
949 EXPECT_THAT(GetAndResetEvents(), 1057 EXPECT_THAT(GetAndResetEvents(),
950 ElementsAre(SELECTION_HANDLES_CLEARED)); 1058 ElementsAre(SELECTION_DISSOLVED, 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));
951 } 1170 }
952 1171
953 TEST_F(TouchSelectionControllerTest, LongPressDrag) { 1172 TEST_F(TouchSelectionControllerTest, LongPressDrag) {
954 EnableLongPressDragSelection(); 1173 EnableLongPressDragSelection();
955 TouchSelectionControllerTestApi test_controller(&controller()); 1174 TouchSelectionControllerTestApi test_controller(&controller());
956 1175
957 gfx::RectF start_rect(-50, 0, 0, 10); 1176 gfx::RectF start_rect(-50, 0, 0, 10);
958 gfx::RectF end_rect(50, 0, 0, 10); 1177 gfx::RectF end_rect(50, 0, 0, 10);
959 bool visible = true; 1178 bool visible = true;
960 1179
961 // Start a touch sequence. 1180 // Start a touch sequence.
962 MockMotionEvent event; 1181 MockMotionEvent event;
963 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); 1182 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0)));
964 1183
965 // Activate a longpress-triggered selection. 1184 // Activate a longpress-triggered selection.
966 OnLongPressEvent(); 1185 OnLongPressEvent();
967 ChangeSelection(start_rect, visible, end_rect, visible); 1186 ChangeSelection(start_rect, visible, end_rect, visible);
968 EXPECT_THAT(GetAndResetEvents(), 1187 EXPECT_THAT(GetAndResetEvents(),
969 ElementsAre(SELECTION_HANDLES_SHOWN)); 1188 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
970 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 1189 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
971 1190
972 // The handles should remain invisible while the touch release and longpress 1191 // The handles should remain invisible while the touch release and longpress
973 // drag gesture are pending. 1192 // drag gesture are pending.
974 EXPECT_FALSE(test_controller.GetStartVisible()); 1193 EXPECT_FALSE(test_controller.GetStartVisible());
975 EXPECT_FALSE(test_controller.GetEndVisible()); 1194 EXPECT_FALSE(test_controller.GetEndVisible());
976 1195
977 // The selection coordinates should reflect the drag movement. 1196 // The selection coordinates should reflect the drag movement.
978 gfx::PointF fixed_offset = start_rect.CenterPoint(); 1197 gfx::PointF fixed_offset = start_rect.CenterPoint();
979 gfx::PointF end_offset = end_rect.CenterPoint(); 1198 gfx::PointF end_offset = end_rect.CenterPoint();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 bool visible = true; 1244 bool visible = true;
1026 1245
1027 // Start a touch sequence. 1246 // Start a touch sequence.
1028 MockMotionEvent event; 1247 MockMotionEvent event;
1029 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); 1248 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0)));
1030 1249
1031 // Activate a longpress-triggered selection. 1250 // Activate a longpress-triggered selection.
1032 OnLongPressEvent(); 1251 OnLongPressEvent();
1033 ChangeSelection(start_rect, visible, end_rect, visible); 1252 ChangeSelection(start_rect, visible, end_rect, visible);
1034 EXPECT_THAT(GetAndResetEvents(), 1253 EXPECT_THAT(GetAndResetEvents(),
1035 ElementsAre(SELECTION_HANDLES_SHOWN)); 1254 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
1036 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 1255 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
1037 1256
1038 // The handles should remain invisible while the touch release and longpress 1257 // The handles should remain invisible while the touch release and longpress
1039 // drag gesture are pending. 1258 // drag gesture are pending.
1040 EXPECT_FALSE(test_controller.GetStartVisible()); 1259 EXPECT_FALSE(test_controller.GetStartVisible());
1041 EXPECT_FALSE(test_controller.GetEndVisible()); 1260 EXPECT_FALSE(test_controller.GetEndVisible());
1042 1261
1043 // If no drag movement occurs, the handles should reappear after the touch 1262 // If no drag movement occurs, the handles should reappear after the touch
1044 // is released. 1263 // is released.
1045 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); 1264 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint()));
(...skipping 11 matching lines...) Expand all
1057 bool visible = true; 1276 bool visible = true;
1058 1277
1059 // Start a touch sequence. 1278 // Start a touch sequence.
1060 MockMotionEvent event; 1279 MockMotionEvent event;
1061 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0))); 1280 EXPECT_FALSE(controller().WillHandleTouchEvent(event.PressPoint(0, 0)));
1062 1281
1063 // Activate a longpress-triggered selection. 1282 // Activate a longpress-triggered selection.
1064 OnLongPressEvent(); 1283 OnLongPressEvent();
1065 ChangeSelection(start_rect, visible, end_rect, visible); 1284 ChangeSelection(start_rect, visible, end_rect, visible);
1066 EXPECT_THAT(GetAndResetEvents(), 1285 EXPECT_THAT(GetAndResetEvents(),
1067 ElementsAre(SELECTION_HANDLES_SHOWN)); 1286 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
1068 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 1287 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
1069 EXPECT_TRUE(test_controller.GetStartVisible()); 1288 EXPECT_TRUE(test_controller.GetStartVisible());
1070 EXPECT_TRUE(test_controller.GetEndVisible()); 1289 EXPECT_TRUE(test_controller.GetEndVisible());
1071 1290
1072 // Subsequent motion of the same touch sequence after longpress shouldn't 1291 // Subsequent motion of the same touch sequence after longpress shouldn't
1073 // trigger drag selection. 1292 // trigger drag selection.
1074 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0))); 1293 EXPECT_FALSE(controller().WillHandleTouchEvent(event.MovePoint(0, 0, 0)));
1075 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 1294 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
1076 1295
1077 EXPECT_FALSE(controller().WillHandleTouchEvent( 1296 EXPECT_FALSE(controller().WillHandleTouchEvent(
1078 event.MovePoint(0, 0, kDefaulTapSlop * 10))); 1297 event.MovePoint(0, 0, kDefaulTapSlop * 10)));
1079 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 1298 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
1080 1299
1081 // Releasing the touch sequence should have no effect. 1300 // Releasing the touch sequence should have no effect.
1082 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint())); 1301 EXPECT_FALSE(controller().WillHandleTouchEvent(event.ReleasePoint()));
1083 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); 1302 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
1084 EXPECT_TRUE(test_controller.GetStartVisible()); 1303 EXPECT_TRUE(test_controller.GetStartVisible());
1085 EXPECT_TRUE(test_controller.GetEndVisible()); 1304 EXPECT_TRUE(test_controller.GetEndVisible());
1086 } 1305 }
1087 1306
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
1088 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) { 1347 TEST_F(TouchSelectionControllerTest, RectBetweenBounds) {
1089 gfx::RectF start_rect(5, 5, 0, 10); 1348 gfx::RectF start_rect(5, 5, 0, 10);
1090 gfx::RectF end_rect(50, 5, 0, 10); 1349 gfx::RectF end_rect(50, 5, 0, 10);
1091 bool visible = true; 1350 bool visible = true;
1092 1351
1093 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); 1352 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds());
1094 1353
1095 OnLongPressEvent(); 1354 OnLongPressEvent();
1096 ChangeSelection(start_rect, visible, end_rect, visible); 1355 ChangeSelection(start_rect, visible, end_rect, visible);
1097 ASSERT_THAT(GetAndResetEvents(), 1356 ASSERT_THAT(GetAndResetEvents(),
1098 ElementsAre(SELECTION_HANDLES_SHOWN)); 1357 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
1099 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds()); 1358 EXPECT_EQ(gfx::RectF(5, 5, 45, 10), controller().GetRectBetweenBounds());
1100 1359
1101 // The result of |GetRectBetweenBounds| should be available within the 1360 // The result of |GetRectBetweenBounds| should be available within the
1102 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|. 1361 // |OnSelectionEvent| callback, as stored by |GetLastEventBoundsRect()|.
1103 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); 1362 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds());
1104 1363
1105 start_rect.Offset(1, 0); 1364 start_rect.Offset(1, 0);
1106 ChangeSelection(start_rect, visible, end_rect, visible); 1365 ChangeSelection(start_rect, visible, end_rect, visible);
1107 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); 1366 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED));
1108 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); 1367 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds());
(...skipping 12 matching lines...) Expand all
1121 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); 1380 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds());
1122 1381
1123 // If both bounds are visible, the full bounding rect should be returned. 1382 // If both bounds are visible, the full bounding rect should be returned.
1124 ChangeSelection(start_rect, false, end_rect, false); 1383 ChangeSelection(start_rect, false, end_rect, false);
1125 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED)); 1384 ASSERT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLES_MOVED));
1126 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds()); 1385 EXPECT_EQ(gfx::RectF(6, 5, 44, 10), controller().GetRectBetweenBounds());
1127 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds()); 1386 EXPECT_EQ(GetLastEventBoundsRect(), controller().GetRectBetweenBounds());
1128 1387
1129 ClearSelection(); 1388 ClearSelection();
1130 ASSERT_THAT(GetAndResetEvents(), 1389 ASSERT_THAT(GetAndResetEvents(),
1131 ElementsAre(SELECTION_HANDLES_CLEARED)); 1390 ElementsAre(SELECTION_DISSOLVED, SELECTION_HANDLES_CLEARED));
1132 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds()); 1391 EXPECT_EQ(gfx::RectF(), controller().GetRectBetweenBounds());
1133 } 1392 }
1134 1393
1135 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) { 1394 TEST_F(TouchSelectionControllerTest, SelectionNoOrientationChangeWhenSwapped) {
1136 TouchSelectionControllerTestApi test_controller(&controller()); 1395 TouchSelectionControllerTestApi test_controller(&controller());
1137 base::TimeTicks event_time = base::TimeTicks::Now(); 1396 base::TimeTicks event_time = base::TimeTicks::Now();
1138 OnLongPressEvent(); 1397 OnLongPressEvent();
1139 1398
1140 float line_height = 10.f; 1399 float line_height = 10.f;
1141 gfx::RectF start_rect(50, line_height, 0, line_height); 1400 gfx::RectF start_rect(50, line_height, 0, line_height);
1142 gfx::RectF end_rect(100, line_height, 0, line_height); 1401 gfx::RectF end_rect(100, line_height, 0, line_height);
1143 bool visible = true; 1402 bool visible = true;
1144 ChangeSelection(start_rect, visible, end_rect, visible); 1403 ChangeSelection(start_rect, visible, end_rect, visible);
1145 EXPECT_THAT(GetAndResetEvents(), 1404 EXPECT_THAT(GetAndResetEvents(),
1146 ElementsAre(SELECTION_HANDLES_SHOWN)); 1405 ElementsAre(SELECTION_ESTABLISHED, SELECTION_HANDLES_SHOWN));
1147 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); 1406 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart());
1148 EXPECT_EQ(test_controller.GetStartHandleOrientation(), 1407 EXPECT_EQ(test_controller.GetStartHandleOrientation(),
1149 TouchHandleOrientation::LEFT); 1408 TouchHandleOrientation::LEFT);
1150 EXPECT_EQ(test_controller.GetEndHandleOrientation(), 1409 EXPECT_EQ(test_controller.GetEndHandleOrientation(),
1151 TouchHandleOrientation::RIGHT); 1410 TouchHandleOrientation::RIGHT);
1152 1411
1153 SetDraggingEnabled(true); 1412 SetDraggingEnabled(true);
1154 1413
1155 // Simulate moving the base, not triggering a swap of points. 1414 // Simulate moving the base, not triggering a swap of points.
1156 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 1415 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1244 offset_rect.x(), offset_rect.bottom()); 1503 offset_rect.x(), offset_rect.bottom());
1245 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 1504 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
1246 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED)); 1505 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_HANDLE_DRAG_STOPPED));
1247 EXPECT_EQ(test_controller.GetStartHandleOrientation(), 1506 EXPECT_EQ(test_controller.GetStartHandleOrientation(),
1248 TouchHandleOrientation::LEFT); 1507 TouchHandleOrientation::LEFT);
1249 EXPECT_EQ(test_controller.GetEndHandleOrientation(), 1508 EXPECT_EQ(test_controller.GetEndHandleOrientation(),
1250 TouchHandleOrientation::RIGHT); 1509 TouchHandleOrientation::RIGHT);
1251 } 1510 }
1252 1511
1253 } // namespace ui 1512 } // namespace ui
OLDNEW
« no previous file with comments | « ui/touch_selection/touch_selection_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698