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

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

Powered by Google App Engine
This is Rietveld 408576698