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

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

Issue 2201853002: Blink handle selection handle visibility (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed contextual search test function Created 4 years, 2 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
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 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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698