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

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

Issue 937773003: Add INSERTION_DRAG_STOPPED to SelectionEventType (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Used gmock macros Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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>
8
9 #include "testing/gmock/include/gmock/gmock.h"
7 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/events/test/motion_event_test_utils.h" 11 #include "ui/events/test/motion_event_test_utils.h"
9 12
13 using testing::ElementsAre;
14 using testing::IsEmpty;
10 using ui::test::MockMotionEvent; 15 using ui::test::MockMotionEvent;
11 16
12 namespace ui { 17 namespace ui {
13 namespace { 18 namespace {
14 19
15 const int kDefaultTapTimeoutMs = 200; 20 const int kDefaultTapTimeoutMs = 200;
16 const float kDefaulTapSlop = 10.f; 21 const float kDefaulTapSlop = 10.f;
17 22
18 class MockTouchHandleDrawable : public TouchHandleDrawable { 23 class MockTouchHandleDrawable : public TouchHandleDrawable {
19 public: 24 public:
(...skipping 12 matching lines...) Expand all
32 private: 37 private:
33 bool* intersects_rect_; 38 bool* intersects_rect_;
34 }; 39 };
35 40
36 } // namespace 41 } // namespace
37 42
38 class TouchSelectionControllerTest : public testing::Test, 43 class TouchSelectionControllerTest : public testing::Test,
39 public TouchSelectionControllerClient { 44 public TouchSelectionControllerClient {
40 public: 45 public:
41 TouchSelectionControllerTest() 46 TouchSelectionControllerTest()
42 : last_event_(SELECTION_CLEARED), 47 : caret_moved_(false),
43 caret_moved_(false),
44 selection_moved_(false), 48 selection_moved_(false),
45 selection_points_swapped_(false), 49 selection_points_swapped_(false),
46 needs_animate_(false), 50 needs_animate_(false),
47 animation_enabled_(true), 51 animation_enabled_(true),
48 dragging_enabled_(false) {} 52 dragging_enabled_(false) {}
49 53
50 ~TouchSelectionControllerTest() override {} 54 ~TouchSelectionControllerTest() override {}
51 55
52 // testing::Test implementation. 56 // testing::Test implementation.
53 57
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 selection_end_ = extent; 89 selection_end_ = extent;
86 } 90 }
87 91
88 void MoveRangeSelectionExtent(const gfx::PointF& extent) override { 92 void MoveRangeSelectionExtent(const gfx::PointF& extent) override {
89 selection_moved_ = true; 93 selection_moved_ = true;
90 selection_end_ = extent; 94 selection_end_ = extent;
91 } 95 }
92 96
93 void OnSelectionEvent(SelectionEventType event, 97 void OnSelectionEvent(SelectionEventType event,
94 const gfx::PointF& end_position) override { 98 const gfx::PointF& end_position) override {
95 last_event_ = event; 99 events_.push_back(event);
96 last_event_start_ = end_position; 100 last_event_start_ = end_position;
97 } 101 }
98 102
99 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { 103 scoped_ptr<TouchHandleDrawable> CreateDrawable() override {
100 return scoped_ptr<TouchHandleDrawable>( 104 return scoped_ptr<TouchHandleDrawable>(
101 new MockTouchHandleDrawable(&dragging_enabled_)); 105 new MockTouchHandleDrawable(&dragging_enabled_));
102 } 106 }
103 107
104 void AllowShowingOnTapForEmptyEditable() { 108 void AllowShowingOnTapForEmptyEditable() {
105 bool show_on_tap_for_empty_editable = true; 109 bool show_on_tap_for_empty_editable = true;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 174
171 bool GetAndResetSelectionPointsSwapped() { 175 bool GetAndResetSelectionPointsSwapped() {
172 bool swapped = selection_points_swapped_; 176 bool swapped = selection_points_swapped_;
173 selection_points_swapped_ = false; 177 selection_points_swapped_ = false;
174 return swapped; 178 return swapped;
175 } 179 }
176 180
177 const gfx::PointF& GetLastCaretPosition() const { return caret_position_; } 181 const gfx::PointF& GetLastCaretPosition() const { return caret_position_; }
178 const gfx::PointF& GetLastSelectionStart() const { return selection_start_; } 182 const gfx::PointF& GetLastSelectionStart() const { return selection_start_; }
179 const gfx::PointF& GetLastSelectionEnd() const { return selection_end_; } 183 const gfx::PointF& GetLastSelectionEnd() const { return selection_end_; }
180 SelectionEventType GetLastEventType() const { return last_event_; }
181 const gfx::PointF& GetLastEventAnchor() const { return last_event_start_; } 184 const gfx::PointF& GetLastEventAnchor() const { return last_event_start_; }
182 185
186 std::vector<SelectionEventType> GetAndResetEvents() {
187 std::vector<SelectionEventType> events = events_;
jdduke (slow) 2015/02/23 16:19:27 std::vector<SelectionEventType> events; events.swa
mohsen 2015/02/24 07:29:36 Done.
188 events_.clear();
189 return events;
190 }
191
183 TouchSelectionController& controller() { return *controller_; } 192 TouchSelectionController& controller() { return *controller_; }
184 193
185 private: 194 private:
186 gfx::PointF last_event_start_; 195 gfx::PointF last_event_start_;
187 gfx::PointF caret_position_; 196 gfx::PointF caret_position_;
188 gfx::PointF selection_start_; 197 gfx::PointF selection_start_;
189 gfx::PointF selection_end_; 198 gfx::PointF selection_end_;
190 SelectionEventType last_event_; 199 std::vector<SelectionEventType> events_;
191 bool caret_moved_; 200 bool caret_moved_;
192 bool selection_moved_; 201 bool selection_moved_;
193 bool selection_points_swapped_; 202 bool selection_points_swapped_;
194 bool needs_animate_; 203 bool needs_animate_;
195 bool animation_enabled_; 204 bool animation_enabled_;
196 bool dragging_enabled_; 205 bool dragging_enabled_;
197 scoped_ptr<TouchSelectionController> controller_; 206 scoped_ptr<TouchSelectionController> controller_;
198 }; 207 };
199 208
200 TEST_F(TouchSelectionControllerTest, InsertionBasic) { 209 TEST_F(TouchSelectionControllerTest, InsertionBasic) {
201 gfx::RectF insertion_rect(5, 5, 0, 10); 210 gfx::RectF insertion_rect(5, 5, 0, 10);
202 bool visible = true; 211 bool visible = true;
203 212
204 // Insertion events are ignored until automatic showing is enabled. 213 // Insertion events are ignored until automatic showing is enabled.
205 ChangeInsertion(insertion_rect, visible); 214 ChangeInsertion(insertion_rect, visible);
215 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
206 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 216 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
207 controller().OnTapEvent(); 217 controller().OnTapEvent();
208 218
209 // Insertion events are ignored until the selection region is marked editable. 219 // Insertion events are ignored until the selection region is marked editable.
210 ChangeInsertion(insertion_rect, visible); 220 ChangeInsertion(insertion_rect, visible);
221 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
211 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 222 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
212 223
213 controller().OnTapEvent(); 224 controller().OnTapEvent();
214 controller().OnSelectionEditable(true); 225 controller().OnSelectionEditable(true);
215 ChangeInsertion(insertion_rect, visible); 226 ChangeInsertion(insertion_rect, visible);
216 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 227 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
217 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 228 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
218 229
219 insertion_rect.Offset(1, 0); 230 insertion_rect.Offset(1, 0);
220 ChangeInsertion(insertion_rect, visible); 231 ChangeInsertion(insertion_rect, visible);
221 EXPECT_EQ(INSERTION_MOVED, GetLastEventType()); 232 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED));
222 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 233 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
223 234
224 insertion_rect.Offset(0, 1); 235 insertion_rect.Offset(0, 1);
225 ChangeInsertion(insertion_rect, visible); 236 ChangeInsertion(insertion_rect, visible);
226 EXPECT_EQ(INSERTION_MOVED, GetLastEventType()); 237 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED));
227 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 238 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
228 239
229 ClearInsertion(); 240 ClearInsertion();
230 EXPECT_EQ(INSERTION_CLEARED, GetLastEventType()); 241 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED));
231 } 242 }
232 243
233 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { 244 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) {
234 gfx::RectF insertion_rect(5, 5, 0, 10); 245 gfx::RectF insertion_rect(5, 5, 0, 10);
235 bool visible = true; 246 bool visible = true;
236 controller().OnTapEvent(); 247 controller().OnTapEvent();
237 controller().OnSelectionEditable(true); 248 controller().OnSelectionEditable(true);
238 249
239 ChangeInsertion(insertion_rect, visible); 250 ChangeInsertion(insertion_rect, visible);
240 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 251 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
241 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 252 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
242 253
243 controller().OnSelectionEditable(false); 254 controller().OnSelectionEditable(false);
244 EXPECT_EQ(INSERTION_CLEARED, GetLastEventType()); 255 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED));
245 } 256 }
246 257
247 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { 258 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) {
248 gfx::RectF insertion_rect(5, 5, 0, 10); 259 gfx::RectF insertion_rect(5, 5, 0, 10);
249 bool visible = true; 260 bool visible = true;
250 controller().OnSelectionEditable(true); 261 controller().OnSelectionEditable(true);
251 262
252 // Taps on an empty editable region should be ignored if the controller is 263 // Taps on an empty editable region should be ignored if the controller is
253 // created with |show_on_tap_for_empty_editable| set to false. 264 // created with |show_on_tap_for_empty_editable| set to false.
254 controller().OnTapEvent(); 265 controller().OnTapEvent();
255 controller().OnSelectionEmpty(true); 266 controller().OnSelectionEmpty(true);
256 ChangeInsertion(insertion_rect, visible); 267 ChangeInsertion(insertion_rect, visible);
257 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 268 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
258 269
259 // Once the region becomes non-empty, taps should show the insertion handle. 270 // Once the region becomes non-empty, taps should show the insertion handle.
260 controller().OnTapEvent(); 271 controller().OnTapEvent();
261 controller().OnSelectionEmpty(false); 272 controller().OnSelectionEmpty(false);
262 ChangeInsertion(insertion_rect, visible); 273 ChangeInsertion(insertion_rect, visible);
263 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 274 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
264 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 275 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
265 276
266 // Reset the selection. 277 // Reset the selection.
267 controller().HideAndDisallowShowingAutomatically(); 278 controller().HideAndDisallowShowingAutomatically();
268 EXPECT_EQ(INSERTION_CLEARED, GetLastEventType()); 279 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED));
269 280
270 // Long-pressing should show the handle even if the editable region is empty. 281 // Long-pressing should show the handle even if the editable region is empty.
271 insertion_rect.Offset(2, -2); 282 insertion_rect.Offset(2, -2);
272 controller().OnLongPressEvent(); 283 controller().OnLongPressEvent();
273 controller().OnSelectionEmpty(true); 284 controller().OnSelectionEmpty(true);
274 ChangeInsertion(insertion_rect, visible); 285 ChangeInsertion(insertion_rect, visible);
275 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 286 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
276 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 287 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
277 288
278 // Single Tap on an empty edit field should clear insertion handle. 289 // Single Tap on an empty edit field should clear insertion handle.
279 controller().OnTapEvent(); 290 controller().OnTapEvent();
280 EXPECT_EQ(INSERTION_CLEARED, GetLastEventType()); 291 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED));
281 } 292 }
282 293
283 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { 294 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) {
284 AllowShowingOnTapForEmptyEditable(); 295 AllowShowingOnTapForEmptyEditable();
285 296
286 gfx::RectF insertion_rect(5, 5, 0, 10); 297 gfx::RectF insertion_rect(5, 5, 0, 10);
287 bool visible = true; 298 bool visible = true;
288 controller().OnSelectionEditable(true); 299 controller().OnSelectionEditable(true);
289 300
290 // Taps on an empty editable region should show the insertion handle if the 301 // Taps on an empty editable region should show the insertion handle if the
291 // controller is created with |show_on_tap_for_empty_editable| set to true. 302 // controller is created with |show_on_tap_for_empty_editable| set to true.
292 controller().OnTapEvent(); 303 controller().OnTapEvent();
293 controller().OnSelectionEmpty(true); 304 controller().OnSelectionEmpty(true);
294 ChangeInsertion(insertion_rect, visible); 305 ChangeInsertion(insertion_rect, visible);
295 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 306 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
296 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 307 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
297 } 308 }
298 309
299 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { 310 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) {
300 gfx::RectF insertion_rect(5, 5, 0, 10); 311 gfx::RectF insertion_rect(5, 5, 0, 10);
301 bool visible = true; 312 bool visible = true;
302 313
303 // Simulate the user tapping an empty text field. 314 // Simulate the user tapping an empty text field.
304 controller().OnTapEvent(); 315 controller().OnTapEvent();
305 controller().OnSelectionEditable(true); 316 controller().OnSelectionEditable(true);
306 controller().OnSelectionEmpty(true); 317 controller().OnSelectionEmpty(true);
307 ChangeInsertion(insertion_rect, visible); 318 ChangeInsertion(insertion_rect, visible);
308 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 319 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
309 320
310 // Simulate the cursor moving while a user is typing. 321 // Simulate the cursor moving while a user is typing.
311 insertion_rect.Offset(10, 0); 322 insertion_rect.Offset(10, 0);
312 controller().OnSelectionEmpty(false); 323 controller().OnSelectionEmpty(false);
313 ChangeInsertion(insertion_rect, visible); 324 ChangeInsertion(insertion_rect, visible);
314 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 325 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
315 326
316 // If the user taps the *same* position as the cursor at the end of the text 327 // If the user taps the *same* position as the cursor at the end of the text
317 // entry, the handle should appear. 328 // entry, the handle should appear.
318 controller().OnTapEvent(); 329 controller().OnTapEvent();
319 ChangeInsertion(insertion_rect, visible); 330 ChangeInsertion(insertion_rect, visible);
320 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 331 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
321 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 332 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
322 } 333 }
323 334
324 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { 335 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) {
325 controller().OnLongPressEvent(); 336 controller().OnLongPressEvent();
326 controller().OnSelectionEditable(true); 337 controller().OnSelectionEditable(true);
327 338
328 gfx::RectF start_rect(5, 5, 0, 10); 339 gfx::RectF start_rect(5, 5, 0, 10);
329 gfx::RectF end_rect(50, 5, 0, 10); 340 gfx::RectF end_rect(50, 5, 0, 10);
330 bool visible = true; 341 bool visible = true;
331 342
332 ChangeInsertion(start_rect, visible); 343 ChangeInsertion(start_rect, visible);
333 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 344 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
334 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 345 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
335 346
336 ChangeSelection(start_rect, visible, end_rect, visible); 347 ChangeSelection(start_rect, visible, end_rect, visible);
337 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 348 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED,
349 SELECTION_SHOWN));
338 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 350 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
339 351
340 ChangeInsertion(end_rect, visible); 352 ChangeInsertion(end_rect, visible);
341 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 353 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED,
354 INSERTION_SHOWN));
342 EXPECT_EQ(end_rect.bottom_left(), GetLastEventAnchor()); 355 EXPECT_EQ(end_rect.bottom_left(), GetLastEventAnchor());
343 356
344 controller().HideAndDisallowShowingAutomatically(); 357 controller().HideAndDisallowShowingAutomatically();
345 EXPECT_EQ(INSERTION_CLEARED, GetLastEventType()); 358 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED));
346 359
347 controller().OnTapEvent(); 360 controller().OnTapEvent();
348 ChangeInsertion(end_rect, visible); 361 ChangeInsertion(end_rect, visible);
349 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 362 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
350 EXPECT_EQ(end_rect.bottom_left(), GetLastEventAnchor()); 363 EXPECT_EQ(end_rect.bottom_left(), GetLastEventAnchor());
351 } 364 }
352 365
353 TEST_F(TouchSelectionControllerTest, InsertionDragged) { 366 TEST_F(TouchSelectionControllerTest, InsertionDragged) {
354 base::TimeTicks event_time = base::TimeTicks::Now(); 367 base::TimeTicks event_time = base::TimeTicks::Now();
355 controller().OnTapEvent(); 368 controller().OnTapEvent();
356 controller().OnSelectionEditable(true); 369 controller().OnSelectionEditable(true);
357 370
358 // The touch sequence should not be handled if insertion is not active. 371 // The touch sequence should not be handled if insertion is not active.
359 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 372 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
360 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 373 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
361 374
362 float line_height = 10.f; 375 float line_height = 10.f;
363 gfx::RectF start_rect(10, 0, 0, line_height); 376 gfx::RectF start_rect(10, 0, 0, line_height);
364 bool visible = true; 377 bool visible = true;
365 ChangeInsertion(start_rect, visible); 378 ChangeInsertion(start_rect, visible);
366 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 379 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
367 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 380 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
368 381
369 // The touch sequence should be handled only if the drawable reports a hit. 382 // The touch sequence should be handled only if the drawable reports a hit.
370 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 383 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
371 SetDraggingEnabled(true); 384 SetDraggingEnabled(true);
372 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 385 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
373 EXPECT_FALSE(GetAndResetCaretMoved()); 386 EXPECT_FALSE(GetAndResetCaretMoved());
387 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED));
374 388
375 // The MoveCaret() result should reflect the movement. 389 // The MoveCaret() result should reflect the movement.
376 // The reported position is offset from the center of |start_rect|. 390 // The reported position is offset from the center of |start_rect|.
377 gfx::PointF start_offset = start_rect.CenterPoint(); 391 gfx::PointF start_offset = start_rect.CenterPoint();
378 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5); 392 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5);
379 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 393 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
380 EXPECT_TRUE(GetAndResetCaretMoved()); 394 EXPECT_TRUE(GetAndResetCaretMoved());
381 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), GetLastCaretPosition()); 395 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), GetLastCaretPosition());
382 396
383 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5); 397 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5);
384 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 398 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
385 EXPECT_TRUE(GetAndResetCaretMoved()); 399 EXPECT_TRUE(GetAndResetCaretMoved());
386 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), GetLastCaretPosition()); 400 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), GetLastCaretPosition());
387 401
388 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 10); 402 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 10);
389 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 403 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
390 EXPECT_TRUE(GetAndResetCaretMoved()); 404 EXPECT_TRUE(GetAndResetCaretMoved());
391 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 10), GetLastCaretPosition()); 405 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 10), GetLastCaretPosition());
392 406
393 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); 407 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
394 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 408 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
395 EXPECT_FALSE(GetAndResetCaretMoved()); 409 EXPECT_FALSE(GetAndResetCaretMoved());
410 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED));
396 411
397 // Once the drag is complete, no more touch events should be consumed until 412 // Once the drag is complete, no more touch events should be consumed until
398 // the next ACTION_DOWN. 413 // the next ACTION_DOWN.
399 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 414 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
400 } 415 }
401 416
402 TEST_F(TouchSelectionControllerTest, InsertionTapped) { 417 TEST_F(TouchSelectionControllerTest, InsertionTapped) {
403 base::TimeTicks event_time = base::TimeTicks::Now(); 418 base::TimeTicks event_time = base::TimeTicks::Now();
404 controller().OnTapEvent(); 419 controller().OnTapEvent();
405 controller().OnSelectionEditable(true); 420 controller().OnSelectionEditable(true);
406 SetDraggingEnabled(true); 421 SetDraggingEnabled(true);
407 422
408 gfx::RectF start_rect(10, 0, 0, 10); 423 gfx::RectF start_rect(10, 0, 0, 10);
409 bool visible = true; 424 bool visible = true;
410 ChangeInsertion(start_rect, visible); 425 ChangeInsertion(start_rect, visible);
411 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 426 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
412 427
413 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 428 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
414 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 429 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
415 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. 430 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed.
416 EXPECT_EQ(INSERTION_DRAG_STARTED, GetLastEventType()); 431 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED));
417 432
418 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 433 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
419 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 434 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
420 EXPECT_EQ(INSERTION_TAPPED, GetLastEventType()); 435 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED,
436 INSERTION_DRAG_STOPPED));
421 437
422 // Reset the insertion. 438 // Reset the insertion.
423 ClearInsertion(); 439 ClearInsertion();
424 controller().OnTapEvent(); 440 controller().OnTapEvent();
425 ChangeInsertion(start_rect, visible); 441 ChangeInsertion(start_rect, visible);
426 ASSERT_EQ(INSERTION_SHOWN, GetLastEventType()); 442 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED,
443 INSERTION_SHOWN));
427 444
428 // No tap should be signalled if the time between DOWN and UP was too long. 445 // No tap should be signalled if the time between DOWN and UP was too long.
429 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 446 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
430 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 447 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
431 event = MockMotionEvent(MockMotionEvent::ACTION_UP, 448 event = MockMotionEvent(MockMotionEvent::ACTION_UP,
432 event_time + base::TimeDelta::FromSeconds(1), 449 event_time + base::TimeDelta::FromSeconds(1),
433 0, 450 0,
434 0); 451 0);
435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 452 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
436 EXPECT_EQ(INSERTION_DRAG_STARTED, GetLastEventType()); 453 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED,
454 INSERTION_DRAG_STOPPED));
437 455
438 // Reset the insertion. 456 // Reset the insertion.
439 ClearInsertion(); 457 ClearInsertion();
440 controller().OnTapEvent(); 458 controller().OnTapEvent();
441 ChangeInsertion(start_rect, visible); 459 ChangeInsertion(start_rect, visible);
442 ASSERT_EQ(INSERTION_SHOWN, GetLastEventType()); 460 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED,
461 INSERTION_SHOWN));
443 462
444 // No tap should be signalled if the drag was too long. 463 // No tap should be signalled if the drag was too long.
445 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 464 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
446 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 465 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
447 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); 466 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0);
448 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 467 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
449 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); 468 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0);
450 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 469 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
451 EXPECT_EQ(INSERTION_DRAG_STARTED, GetLastEventType()); 470 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED,
471 INSERTION_DRAG_STOPPED));
452 472
453 // Reset the insertion. 473 // Reset the insertion.
454 ClearInsertion(); 474 ClearInsertion();
455 controller().OnTapEvent(); 475 controller().OnTapEvent();
456 ChangeInsertion(start_rect, visible); 476 ChangeInsertion(start_rect, visible);
457 ASSERT_EQ(INSERTION_SHOWN, GetLastEventType()); 477 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED,
478 INSERTION_SHOWN));
458 479
459 // No tap should be signalled if the touch sequence is cancelled. 480 // No tap should be signalled if the touch sequence is cancelled.
460 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 481 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
461 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 482 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
462 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); 483 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0);
463 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 484 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
464 EXPECT_EQ(INSERTION_DRAG_STARTED, GetLastEventType()); 485 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED,
486 INSERTION_DRAG_STOPPED));
465 } 487 }
466 488
467 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { 489 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) {
468 base::TimeTicks event_time = base::TimeTicks::Now(); 490 base::TimeTicks event_time = base::TimeTicks::Now();
469 controller().OnTapEvent(); 491 controller().OnTapEvent();
470 controller().OnSelectionEditable(true); 492 controller().OnSelectionEditable(true);
471 SetDraggingEnabled(true); 493 SetDraggingEnabled(true);
472 494
473 gfx::RectF anchor_rect(10, 0, 0, 10); 495 gfx::RectF anchor_rect(10, 0, 0, 10);
474 bool visible = true; 496 bool visible = true;
475 ChangeInsertion(anchor_rect, visible); 497 ChangeInsertion(anchor_rect, visible);
476 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 498 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
477 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); 499 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor());
478 500
479 // Tapping again shouldn't reset the active insertion point. 501 // Tapping again shouldn't reset the active insertion point.
480 controller().OnTapEvent(); 502 controller().OnTapEvent();
481 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 503 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
482 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 504 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
483 EXPECT_EQ(INSERTION_DRAG_STARTED, GetLastEventType()); 505 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED));
484 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); 506 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor());
485 507
486 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 508 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
487 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 509 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
488 EXPECT_EQ(INSERTION_TAPPED, GetLastEventType()); 510 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED,
511 INSERTION_DRAG_STOPPED));
489 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); 512 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor());
490 513
491 anchor_rect.Offset(5, 15); 514 anchor_rect.Offset(5, 15);
492 ChangeInsertion(anchor_rect, visible); 515 ChangeInsertion(anchor_rect, visible);
493 EXPECT_EQ(INSERTION_MOVED, GetLastEventType()); 516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED));
494 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); 517 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor());
495 518
496 // Pressing shouldn't reset the active insertion point. 519 // Pressing shouldn't reset the active insertion point.
497 controller().OnLongPressEvent(); 520 controller().OnLongPressEvent();
498 controller().OnSelectionEmpty(true); 521 controller().OnSelectionEmpty(true);
499 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 522 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
500 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 523 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
501 EXPECT_EQ(INSERTION_DRAG_STARTED, GetLastEventType()); 524 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED));
502 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); 525 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor());
503 526
504 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 527 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
505 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 528 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
506 EXPECT_EQ(INSERTION_TAPPED, GetLastEventType()); 529 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED,
530 INSERTION_DRAG_STOPPED));
507 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor()); 531 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventAnchor());
508 } 532 }
509 533
510 TEST_F(TouchSelectionControllerTest, SelectionBasic) { 534 TEST_F(TouchSelectionControllerTest, SelectionBasic) {
511 gfx::RectF start_rect(5, 5, 0, 10); 535 gfx::RectF start_rect(5, 5, 0, 10);
512 gfx::RectF end_rect(50, 5, 0, 10); 536 gfx::RectF end_rect(50, 5, 0, 10);
513 bool visible = true; 537 bool visible = true;
514 538
515 // Selection events are ignored until automatic showing is enabled. 539 // Selection events are ignored until automatic showing is enabled.
516 ChangeSelection(start_rect, visible, end_rect, visible); 540 ChangeSelection(start_rect, visible, end_rect, visible);
517 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 541 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
518 542
519 controller().OnLongPressEvent(); 543 controller().OnLongPressEvent();
520 ChangeSelection(start_rect, visible, end_rect, visible); 544 ChangeSelection(start_rect, visible, end_rect, visible);
521 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 545 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
522 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 546 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
523 547
524 start_rect.Offset(1, 0); 548 start_rect.Offset(1, 0);
525 ChangeSelection(start_rect, visible, end_rect, visible); 549 ChangeSelection(start_rect, visible, end_rect, visible);
526 // Selection movement does not currently trigger a separate event. 550 // Selection movement does not currently trigger a separate event.
527 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 551 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
528 552
529 ClearSelection(); 553 ClearSelection();
530 EXPECT_EQ(SELECTION_CLEARED, GetLastEventType()); 554 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED));
531 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 555 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
532 } 556 }
533 557
534 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { 558 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) {
535 gfx::RectF start_rect(5, 5, 0, 10); 559 gfx::RectF start_rect(5, 5, 0, 10);
536 gfx::RectF end_rect(50, 5, 0, 10); 560 gfx::RectF end_rect(50, 5, 0, 10);
537 bool visible = true; 561 bool visible = true;
538 562
539 controller().OnLongPressEvent(); 563 controller().OnLongPressEvent();
540 ChangeSelection(start_rect, visible, end_rect, visible); 564 ChangeSelection(start_rect, visible, end_rect, visible);
541 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 565 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
542 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 566 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
543 567
544 // A long press triggering a new selection should re-send the SELECTION_SHOWN 568 // A long press triggering a new selection should re-send the SELECTION_SHOWN
545 // event notification. 569 // event notification.
546 start_rect.Offset(10, 10); 570 start_rect.Offset(10, 10);
547 controller().OnLongPressEvent(); 571 controller().OnLongPressEvent();
548 ChangeSelection(start_rect, visible, end_rect, visible); 572 ChangeSelection(start_rect, visible, end_rect, visible);
549 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 573 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
550 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 574 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
551 } 575 }
552 576
553 TEST_F(TouchSelectionControllerTest, SelectionDragged) { 577 TEST_F(TouchSelectionControllerTest, SelectionDragged) {
554 base::TimeTicks event_time = base::TimeTicks::Now(); 578 base::TimeTicks event_time = base::TimeTicks::Now();
555 controller().OnLongPressEvent(); 579 controller().OnLongPressEvent();
556 580
557 // The touch sequence should not be handled if selection is not active. 581 // The touch sequence should not be handled if selection is not active.
558 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); 582 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0);
559 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 583 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
560 584
561 float line_height = 10.f; 585 float line_height = 10.f;
562 gfx::RectF start_rect(0, 0, 0, line_height); 586 gfx::RectF start_rect(0, 0, 0, line_height);
563 gfx::RectF end_rect(50, 0, 0, line_height); 587 gfx::RectF end_rect(50, 0, 0, line_height);
564 bool visible = true; 588 bool visible = true;
565 ChangeSelection(start_rect, visible, end_rect, visible); 589 ChangeSelection(start_rect, visible, end_rect, visible);
566 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 590 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
567 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 591 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
568 592
569 // The touch sequence should be handled only if the drawable reports a hit. 593 // The touch sequence should be handled only if the drawable reports a hit.
570 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 594 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
571 SetDraggingEnabled(true); 595 SetDraggingEnabled(true);
572 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 596 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
573 EXPECT_FALSE(GetAndResetSelectionMoved()); 597 EXPECT_FALSE(GetAndResetSelectionMoved());
574 598
575 // The SelectBetweenCoordinates() result should reflect the movement. Note 599 // The SelectBetweenCoordinates() result should reflect the movement. Note
576 // that the start coordinate will always reflect the "fixed" handle's 600 // that the start coordinate will always reflect the "fixed" handle's
577 // position, in this case the position from |end_rect|. 601 // position, in this case the position from |end_rect|.
578 // Note that the reported position is offset from the center of the 602 // Note that the reported position is offset from the center of the
579 // input rects (i.e., the middle of the corresponding text line). 603 // input rects (i.e., the middle of the corresponding text line).
580 gfx::PointF fixed_offset = end_rect.CenterPoint(); 604 gfx::PointF fixed_offset = end_rect.CenterPoint();
581 gfx::PointF start_offset = start_rect.CenterPoint(); 605 gfx::PointF start_offset = start_rect.CenterPoint();
582 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5); 606 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 5);
583 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 607 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
584 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 608 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
585 EXPECT_TRUE(GetAndResetSelectionMoved()); 609 EXPECT_TRUE(GetAndResetSelectionMoved());
586 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); 610 EXPECT_EQ(fixed_offset, GetLastSelectionStart());
587 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); 611 EXPECT_EQ(start_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
588 612
589 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5); 613 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 5, 5);
590 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 614 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
591 EXPECT_TRUE(GetAndResetSelectionMoved()); 615 EXPECT_TRUE(GetAndResetSelectionMoved());
592 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); 616 EXPECT_EQ(fixed_offset, GetLastSelectionStart());
593 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), GetLastSelectionEnd()); 617 EXPECT_EQ(start_offset + gfx::Vector2dF(5, 5), GetLastSelectionEnd());
594 618
595 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 5); 619 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 10, 5);
596 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 620 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
597 EXPECT_TRUE(GetAndResetSelectionMoved()); 621 EXPECT_TRUE(GetAndResetSelectionMoved());
598 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); 622 EXPECT_EQ(fixed_offset, GetLastSelectionStart());
599 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 5), GetLastSelectionEnd()); 623 EXPECT_EQ(start_offset + gfx::Vector2dF(10, 5), GetLastSelectionEnd());
600 624
601 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); 625 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
602 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 626 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
603 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 627 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
604 EXPECT_FALSE(GetAndResetSelectionMoved()); 628 EXPECT_FALSE(GetAndResetSelectionMoved());
605 629
606 // Once the drag is complete, no more touch events should be consumed until 630 // Once the drag is complete, no more touch events should be consumed until
607 // the next ACTION_DOWN. 631 // the next ACTION_DOWN.
608 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); 632 EXPECT_FALSE(controller().WillHandleTouchEvent(event));
609 } 633 }
610 634
611 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { 635 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) {
612 base::TimeTicks event_time = base::TimeTicks::Now(); 636 base::TimeTicks event_time = base::TimeTicks::Now();
613 controller().OnLongPressEvent(); 637 controller().OnLongPressEvent();
614 638
615 float line_height = 10.f; 639 float line_height = 10.f;
616 gfx::RectF start_rect(0, 0, 0, line_height); 640 gfx::RectF start_rect(0, 0, 0, line_height);
617 gfx::RectF end_rect(50, 0, 0, line_height); 641 gfx::RectF end_rect(50, 0, 0, line_height);
618 bool visible = true; 642 bool visible = true;
619 ChangeSelection(start_rect, visible, end_rect, visible); 643 ChangeSelection(start_rect, visible, end_rect, visible);
620 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 644 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
621 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 645 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
622 646
623 // The ACTION_DOWN should lock to the closest handle. 647 // The ACTION_DOWN should lock to the closest handle.
624 gfx::PointF end_offset = end_rect.CenterPoint(); 648 gfx::PointF end_offset = end_rect.CenterPoint();
625 gfx::PointF fixed_offset = start_rect.CenterPoint(); 649 gfx::PointF fixed_offset = start_rect.CenterPoint();
626 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; 650 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f;
627 MockMotionEvent event( 651 MockMotionEvent event(
628 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); 652 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0);
629 SetDraggingEnabled(true); 653 SetDraggingEnabled(true);
630 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 654 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
631 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 655 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
632 EXPECT_FALSE(GetAndResetSelectionMoved()); 656 EXPECT_FALSE(GetAndResetSelectionMoved());
633 657
634 // Even though the ACTION_MOVE is over the start handle, it should continue 658 // Even though the ACTION_MOVE is over the start handle, it should continue
635 // targetting the end handle that consumed the ACTION_DOWN. 659 // targetting the end handle that consumed the ACTION_DOWN.
636 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 0); 660 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 0, 0);
637 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 661 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
638 EXPECT_TRUE(GetAndResetSelectionMoved()); 662 EXPECT_TRUE(GetAndResetSelectionMoved());
639 EXPECT_EQ(fixed_offset, GetLastSelectionStart()); 663 EXPECT_EQ(fixed_offset, GetLastSelectionStart());
640 EXPECT_EQ(end_offset - gfx::Vector2dF(touch_down_x, 0), 664 EXPECT_EQ(end_offset - gfx::Vector2dF(touch_down_x, 0),
641 GetLastSelectionEnd()); 665 GetLastSelectionEnd());
642 666
643 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); 667 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0);
644 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 668 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
645 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 669 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
646 EXPECT_FALSE(GetAndResetSelectionMoved()); 670 EXPECT_FALSE(GetAndResetSelectionMoved());
647 } 671 }
648 672
649 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { 673 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) {
650 base::TimeTicks event_time = base::TimeTicks::Now(); 674 base::TimeTicks event_time = base::TimeTicks::Now();
651 controller().OnLongPressEvent(); 675 controller().OnLongPressEvent();
652 676
653 float line_height = 10.f; 677 float line_height = 10.f;
654 gfx::RectF start_rect(50, line_height, 0, line_height); 678 gfx::RectF start_rect(50, line_height, 0, line_height);
655 gfx::RectF end_rect(100, line_height, 0, line_height); 679 gfx::RectF end_rect(100, line_height, 0, line_height);
656 bool visible = true; 680 bool visible = true;
657 ChangeSelection(start_rect, visible, end_rect, visible); 681 ChangeSelection(start_rect, visible, end_rect, visible);
658 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 682 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
659 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 683 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
660 684
661 SetDraggingEnabled(true); 685 SetDraggingEnabled(true);
662 686
663 // Move the extent, not triggering a swap of points. 687 // Move the extent, not triggering a swap of points.
664 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 688 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time,
665 end_rect.x(), end_rect.bottom()); 689 end_rect.x(), end_rect.bottom());
666 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 690 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
667 EXPECT_FALSE(GetAndResetSelectionMoved()); 691 EXPECT_FALSE(GetAndResetSelectionMoved());
668 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 692 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
669 693
670 gfx::PointF base_offset = start_rect.CenterPoint(); 694 gfx::PointF base_offset = start_rect.CenterPoint();
671 gfx::PointF extent_offset = end_rect.CenterPoint(); 695 gfx::PointF extent_offset = end_rect.CenterPoint();
672 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 696 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
673 end_rect.x(), end_rect.bottom() + 5); 697 end_rect.x(), end_rect.bottom() + 5);
674 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 698 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
675 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 699 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
676 EXPECT_TRUE(GetAndResetSelectionMoved()); 700 EXPECT_TRUE(GetAndResetSelectionMoved());
677 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 701 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
678 EXPECT_EQ(base_offset, GetLastSelectionStart()); 702 EXPECT_EQ(base_offset, GetLastSelectionStart());
679 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); 703 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
680 704
681 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); 705 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
682 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 706 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
683 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 707 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
684 EXPECT_FALSE(GetAndResetSelectionMoved()); 708 EXPECT_FALSE(GetAndResetSelectionMoved());
685 709
686 end_rect += gfx::Vector2dF(0, 5); 710 end_rect += gfx::Vector2dF(0, 5);
687 ChangeSelection(start_rect, visible, end_rect, visible); 711 ChangeSelection(start_rect, visible, end_rect, visible);
688 712
689 // Move the base, triggering a swap of points. 713 // Move the base, triggering a swap of points.
690 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 714 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time,
691 start_rect.x(), start_rect.bottom()); 715 start_rect.x(), start_rect.bottom());
692 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 716 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
693 EXPECT_FALSE(GetAndResetSelectionMoved()); 717 EXPECT_FALSE(GetAndResetSelectionMoved());
694 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); 718 EXPECT_TRUE(GetAndResetSelectionPointsSwapped());
695 719
696 base_offset = end_rect.CenterPoint(); 720 base_offset = end_rect.CenterPoint();
697 extent_offset = start_rect.CenterPoint(); 721 extent_offset = start_rect.CenterPoint();
698 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 722 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
699 start_rect.x(), start_rect.bottom() + 5); 723 start_rect.x(), start_rect.bottom() + 5);
700 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 724 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
701 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 725 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
702 EXPECT_TRUE(GetAndResetSelectionMoved()); 726 EXPECT_TRUE(GetAndResetSelectionMoved());
703 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 727 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
704 EXPECT_EQ(base_offset, GetLastSelectionStart()); 728 EXPECT_EQ(base_offset, GetLastSelectionStart());
705 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); 729 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
706 730
707 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); 731 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
708 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 732 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
709 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 733 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
710 EXPECT_FALSE(GetAndResetSelectionMoved()); 734 EXPECT_FALSE(GetAndResetSelectionMoved());
711 735
712 start_rect += gfx::Vector2dF(0, 5); 736 start_rect += gfx::Vector2dF(0, 5);
713 ChangeSelection(start_rect, visible, end_rect, visible); 737 ChangeSelection(start_rect, visible, end_rect, visible);
714 738
715 // Move the same point again, not triggering a swap of points. 739 // Move the same point again, not triggering a swap of points.
716 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 740 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time,
717 start_rect.x(), start_rect.bottom()); 741 start_rect.x(), start_rect.bottom());
718 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 742 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
719 EXPECT_FALSE(GetAndResetSelectionMoved()); 743 EXPECT_FALSE(GetAndResetSelectionMoved());
720 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 744 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
721 745
722 base_offset = end_rect.CenterPoint(); 746 base_offset = end_rect.CenterPoint();
723 extent_offset = start_rect.CenterPoint(); 747 extent_offset = start_rect.CenterPoint();
724 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 748 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
725 start_rect.x(), start_rect.bottom() + 5); 749 start_rect.x(), start_rect.bottom() + 5);
726 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 750 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
727 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 751 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
728 EXPECT_TRUE(GetAndResetSelectionMoved()); 752 EXPECT_TRUE(GetAndResetSelectionMoved());
729 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 753 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
730 EXPECT_EQ(base_offset, GetLastSelectionStart()); 754 EXPECT_EQ(base_offset, GetLastSelectionStart());
731 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); 755 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
732 756
733 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); 757 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
734 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 758 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
735 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 759 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
736 EXPECT_FALSE(GetAndResetSelectionMoved()); 760 EXPECT_FALSE(GetAndResetSelectionMoved());
737 761
738 start_rect += gfx::Vector2dF(0, 5); 762 start_rect += gfx::Vector2dF(0, 5);
739 ChangeSelection(start_rect, visible, end_rect, visible); 763 ChangeSelection(start_rect, visible, end_rect, visible);
740 764
741 // Move the base, triggering a swap of points. 765 // Move the base, triggering a swap of points.
742 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 766 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time,
743 end_rect.x(), end_rect.bottom()); 767 end_rect.x(), end_rect.bottom());
744 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 768 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
745 EXPECT_FALSE(GetAndResetSelectionMoved()); 769 EXPECT_FALSE(GetAndResetSelectionMoved());
746 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); 770 EXPECT_TRUE(GetAndResetSelectionPointsSwapped());
747 771
748 base_offset = start_rect.CenterPoint(); 772 base_offset = start_rect.CenterPoint();
749 extent_offset = end_rect.CenterPoint(); 773 extent_offset = end_rect.CenterPoint();
750 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 774 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
751 end_rect.x(), end_rect.bottom() + 5); 775 end_rect.x(), end_rect.bottom() + 5);
752 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 776 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
753 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 777 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
754 EXPECT_TRUE(GetAndResetSelectionMoved()); 778 EXPECT_TRUE(GetAndResetSelectionMoved());
755 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); 779 EXPECT_FALSE(GetAndResetSelectionPointsSwapped());
756 EXPECT_EQ(base_offset, GetLastSelectionStart()); 780 EXPECT_EQ(base_offset, GetLastSelectionStart());
757 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); 781 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd());
758 782
759 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); 783 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5);
760 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 784 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
761 EXPECT_EQ(SELECTION_DRAG_STOPPED, GetLastEventType()); 785 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED));
762 EXPECT_FALSE(GetAndResetSelectionMoved()); 786 EXPECT_FALSE(GetAndResetSelectionMoved());
763 } 787 }
764 788
765 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { 789 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) {
766 base::TimeTicks event_time = base::TimeTicks::Now(); 790 base::TimeTicks event_time = base::TimeTicks::Now();
767 controller().OnLongPressEvent(); 791 controller().OnLongPressEvent();
768 792
769 float small_line_height = 1.f; 793 float small_line_height = 1.f;
770 float large_line_height = 50.f; 794 float large_line_height = 50.f;
771 gfx::RectF small_line_rect(0, 0, 0, small_line_height); 795 gfx::RectF small_line_rect(0, 0, 0, small_line_height);
772 gfx::RectF large_line_rect(50, 50, 0, large_line_height); 796 gfx::RectF large_line_rect(50, 50, 0, large_line_height);
773 bool visible = true; 797 bool visible = true;
774 ChangeSelection(small_line_rect, visible, large_line_rect, visible); 798 ChangeSelection(small_line_rect, visible, large_line_rect, visible);
775 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 799 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
776 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventAnchor()); 800 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventAnchor());
777 801
778 // Start dragging the handle on the small line. 802 // Start dragging the handle on the small line.
779 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 803 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time,
780 small_line_rect.x(), small_line_rect.y()); 804 small_line_rect.x(), small_line_rect.y());
781 SetDraggingEnabled(true); 805 SetDraggingEnabled(true);
782 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); 806 EXPECT_TRUE(controller().WillHandleTouchEvent(event));
783 EXPECT_EQ(SELECTION_DRAG_STARTED, GetLastEventType()); 807 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED));
784 // The drag coordinate for large lines should be capped to a reasonable 808 // The drag coordinate for large lines should be capped to a reasonable
785 // offset, allowing seamless transition to neighboring lines with different 809 // offset, allowing seamless transition to neighboring lines with different
786 // sizes. The drag coordinate for small lines should have an offset 810 // sizes. The drag coordinate for small lines should have an offset
787 // commensurate with the small line size. 811 // commensurate with the small line size.
788 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 5.f), 812 EXPECT_EQ(large_line_rect.bottom_left() - gfx::Vector2dF(0, 5.f),
789 GetLastSelectionStart()); 813 GetLastSelectionStart());
790 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); 814 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd());
791 815
792 small_line_rect += gfx::Vector2dF(25.f, 0); 816 small_line_rect += gfx::Vector2dF(25.f, 0);
793 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 817 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 EXPECT_TRUE(GetAndResetNeedsAnimate()); 876 EXPECT_TRUE(GetAndResetNeedsAnimate());
853 } 877 }
854 878
855 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { 879 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) {
856 gfx::RectF start_rect(5, 5, 0, 10); 880 gfx::RectF start_rect(5, 5, 0, 10);
857 gfx::RectF end_rect(50, 5, 0, 10); 881 gfx::RectF end_rect(50, 5, 0, 10);
858 bool visible = true; 882 bool visible = true;
859 883
860 controller().OnLongPressEvent(); 884 controller().OnLongPressEvent();
861 ChangeSelection(start_rect, visible, end_rect, visible); 885 ChangeSelection(start_rect, visible, end_rect, visible);
886 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
jdduke (slow) 2015/02/23 16:19:27 This is a great improvement overall, thanks.
862 887
863 // Selection should not be cleared if the selection bounds have not changed. 888 // Selection should not be cleared if the selection bounds have not changed.
864 controller().OnTapEvent(); 889 controller().OnTapEvent();
865 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 890 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
866 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 891 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
867 892
868 controller().OnTapEvent(); 893 controller().OnTapEvent();
869 ClearSelection(); 894 ClearSelection();
870 EXPECT_EQ(SELECTION_CLEARED, GetLastEventType()); 895 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED));
871 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 896 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
872 } 897 }
873 898
874 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { 899 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) {
875 gfx::RectF start_rect(5, 5, 0, 10); 900 gfx::RectF start_rect(5, 5, 0, 10);
876 gfx::RectF end_rect(50, 5, 0, 10); 901 gfx::RectF end_rect(50, 5, 0, 10);
877 bool visible = true; 902 bool visible = true;
878 903
879 // The selection should not have be activated, as it wasn't yet allowed. 904 // The selection should not be activated, as it wasn't yet allowed.
880 ChangeSelection(start_rect, visible, end_rect, visible); 905 ChangeSelection(start_rect, visible, end_rect, visible);
881 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor()); 906 EXPECT_EQ(gfx::PointF(), GetLastEventAnchor());
882 907
883 // Now explicitly allow showing from the previously supplied bounds. 908 // Now explicitly allow showing from the previously supplied bounds.
884 controller().AllowShowingFromCurrentSelection(); 909 controller().AllowShowingFromCurrentSelection();
885 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 910 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN));
886 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 911 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
887 912
888 // Repeated calls to show from the current selection should be ignored. 913 // Repeated calls to show from the current selection should be ignored.
889 controller().AllowShowingFromCurrentSelection(); 914 controller().AllowShowingFromCurrentSelection();
890 EXPECT_EQ(SELECTION_SHOWN, GetLastEventType()); 915 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
891 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor()); 916 EXPECT_EQ(start_rect.bottom_left(), GetLastEventAnchor());
892 917
893 // Trying to show from an empty selection will have no result. 918 // Trying to show from an empty selection will have no result.
894 ClearSelection(); 919 ClearSelection();
895 EXPECT_EQ(SELECTION_CLEARED, GetLastEventType()); 920 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED));
896 controller().AllowShowingFromCurrentSelection(); 921 controller().AllowShowingFromCurrentSelection();
897 EXPECT_EQ(SELECTION_CLEARED, GetLastEventType()); 922 EXPECT_THAT(GetAndResetEvents(), IsEmpty());
898 923
899 // Showing the insertion handle should also be supported. 924 // Showing the insertion handle should also be supported.
900 controller().OnSelectionEditable(true); 925 controller().OnSelectionEditable(true);
901 controller().OnSelectionEmpty(false); 926 controller().OnSelectionEmpty(false);
902 controller().HideAndDisallowShowingAutomatically(); 927 controller().HideAndDisallowShowingAutomatically();
903 gfx::RectF insertion_rect(5, 5, 0, 10); 928 gfx::RectF insertion_rect(5, 5, 0, 10);
904 ChangeInsertion(insertion_rect, visible); 929 ChangeInsertion(insertion_rect, visible);
905 controller().AllowShowingFromCurrentSelection(); 930 controller().AllowShowingFromCurrentSelection();
906 EXPECT_EQ(INSERTION_SHOWN, GetLastEventType()); 931 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN));
907 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor()); 932 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventAnchor());
908 } 933 }
909 934
910 } // namespace ui 935 } // namespace ui
OLDNEW
« no previous file with comments | « ui/touch_selection/touch_selection_controller.cc ('k') | ui/touch_selection/ui_touch_selection.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698