OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/touch_selection/touch_selection_controller.h" | 5 #include "ui/touch_selection/touch_selection_controller.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
11 #include "ui/events/test/motion_event_test_utils.h" | 11 #include "ui/events/test/motion_event_test_utils.h" |
12 | 12 |
13 using testing::ElementsAre; | 13 using testing::ElementsAre; |
14 using testing::IsEmpty; | 14 using testing::IsEmpty; |
15 using ui::test::MockMotionEvent; | 15 using ui::test::MockMotionEvent; |
16 | 16 |
17 namespace ui { | 17 namespace ui { |
18 namespace { | 18 namespace { |
19 | 19 |
20 const int kDefaultTapTimeoutMs = 200; | 20 const int kDefaultTapTimeoutMs = 200; |
21 const float kDefaulTapSlop = 10.f; | 21 const float kDefaulTapSlop = 10.f; |
22 const gfx::PointF kIgnoredPoint(0, 0); | |
22 | 23 |
23 class MockTouchHandleDrawable : public TouchHandleDrawable { | 24 class MockTouchHandleDrawable : public TouchHandleDrawable { |
24 public: | 25 public: |
25 explicit MockTouchHandleDrawable(bool* contains_point) | 26 explicit MockTouchHandleDrawable(bool* contains_point) |
26 : intersects_rect_(contains_point) {} | 27 : intersects_rect_(contains_point) {} |
27 ~MockTouchHandleDrawable() override {} | 28 ~MockTouchHandleDrawable() override {} |
28 void SetEnabled(bool enabled) override {} | 29 void SetEnabled(bool enabled) override {} |
29 void SetOrientation(TouchHandleOrientation orientation) override {} | 30 void SetOrientation(TouchHandleOrientation orientation) override {} |
30 void SetAlpha(float alpha) override {} | 31 void SetAlpha(float alpha) override {} |
31 void SetFocus(const gfx::PointF& position) override {} | 32 void SetFocus(const gfx::PointF& position) override {} |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
138 SelectionBound start_bound, end_bound; | 139 SelectionBound start_bound, end_bound; |
139 start_bound.set_type(SelectionBound::LEFT); | 140 start_bound.set_type(SelectionBound::LEFT); |
140 end_bound.set_type(SelectionBound::RIGHT); | 141 end_bound.set_type(SelectionBound::RIGHT); |
141 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 142 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
142 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 143 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
143 start_bound.set_visible(start_visible); | 144 start_bound.set_visible(start_visible); |
144 end_bound.set_visible(end_visible); | 145 end_bound.set_visible(end_visible); |
145 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 146 controller_->OnSelectionBoundsChanged(start_bound, end_bound); |
146 } | 147 } |
147 | 148 |
149 void OnLongPressEvent() { | |
150 ASSERT_FALSE(controller().WillHandleLongPressEvent(kIgnoredPoint)); | |
151 } | |
152 | |
153 void OnTapEvent() { | |
154 ASSERT_FALSE(controller().WillHandleTapEvent(kIgnoredPoint)); | |
155 } | |
156 | |
148 void Animate() { | 157 void Animate() { |
149 base::TimeTicks now = base::TimeTicks::Now(); | 158 base::TimeTicks now = base::TimeTicks::Now(); |
150 while (needs_animate_) { | 159 while (needs_animate_) { |
151 needs_animate_ = controller_->Animate(now); | 160 needs_animate_ = controller_->Animate(now); |
152 now += base::TimeDelta::FromMilliseconds(16); | 161 now += base::TimeDelta::FromMilliseconds(16); |
153 } | 162 } |
154 } | 163 } |
155 | 164 |
156 bool GetAndResetNeedsAnimate() { | 165 bool GetAndResetNeedsAnimate() { |
157 bool needs_animate = needs_animate_; | 166 bool needs_animate = needs_animate_; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
208 }; | 217 }; |
209 | 218 |
210 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 219 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
211 gfx::RectF insertion_rect(5, 5, 0, 10); | 220 gfx::RectF insertion_rect(5, 5, 0, 10); |
212 bool visible = true; | 221 bool visible = true; |
213 | 222 |
214 // Insertion events are ignored until automatic showing is enabled. | 223 // Insertion events are ignored until automatic showing is enabled. |
215 ChangeInsertion(insertion_rect, visible); | 224 ChangeInsertion(insertion_rect, visible); |
216 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 225 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
217 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 226 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
218 controller().OnTapEvent(); | 227 OnTapEvent(); |
219 | 228 |
220 // Insertion events are ignored until the selection region is marked editable. | 229 // Insertion events are ignored until the selection region is marked editable. |
221 ChangeInsertion(insertion_rect, visible); | 230 ChangeInsertion(insertion_rect, visible); |
222 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 231 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
223 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 232 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
224 | 233 |
225 controller().OnTapEvent(); | 234 OnTapEvent(); |
226 controller().OnSelectionEditable(true); | 235 controller().OnSelectionEditable(true); |
227 ChangeInsertion(insertion_rect, visible); | 236 ChangeInsertion(insertion_rect, visible); |
228 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 237 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
229 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 238 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
230 | 239 |
231 insertion_rect.Offset(1, 0); | 240 insertion_rect.Offset(1, 0); |
232 ChangeInsertion(insertion_rect, visible); | 241 ChangeInsertion(insertion_rect, visible); |
233 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 242 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
234 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 243 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
235 | 244 |
236 insertion_rect.Offset(0, 1); | 245 insertion_rect.Offset(0, 1); |
237 ChangeInsertion(insertion_rect, visible); | 246 ChangeInsertion(insertion_rect, visible); |
238 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 247 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
239 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 248 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
240 | 249 |
241 ClearInsertion(); | 250 ClearInsertion(); |
242 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 251 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
243 } | 252 } |
244 | 253 |
245 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | 254 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { |
246 gfx::RectF insertion_rect(5, 5, 0, 10); | 255 gfx::RectF insertion_rect(5, 5, 0, 10); |
247 bool visible = true; | 256 bool visible = true; |
248 controller().OnTapEvent(); | 257 OnTapEvent(); |
249 controller().OnSelectionEditable(true); | 258 controller().OnSelectionEditable(true); |
250 | 259 |
251 ChangeInsertion(insertion_rect, visible); | 260 ChangeInsertion(insertion_rect, visible); |
252 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 261 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
253 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 262 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
254 | 263 |
255 controller().OnSelectionEditable(false); | 264 controller().OnSelectionEditable(false); |
256 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 265 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
257 } | 266 } |
258 | 267 |
259 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { | 268 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { |
260 gfx::RectF insertion_rect(5, 5, 0, 10); | 269 gfx::RectF insertion_rect(5, 5, 0, 10); |
261 bool visible = true; | 270 bool visible = true; |
262 controller().OnSelectionEditable(true); | 271 controller().OnSelectionEditable(true); |
263 | 272 |
264 // Taps on an empty editable region should be ignored if the controller is | 273 // Taps on an empty editable region should be ignored if the controller is |
265 // created with |show_on_tap_for_empty_editable| set to false. | 274 // created with |show_on_tap_for_empty_editable| set to false. |
266 controller().OnTapEvent(); | 275 OnTapEvent(); |
267 controller().OnSelectionEmpty(true); | 276 controller().OnSelectionEmpty(true); |
268 ChangeInsertion(insertion_rect, visible); | 277 ChangeInsertion(insertion_rect, visible); |
269 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 278 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
270 | 279 |
271 // Once the region becomes non-empty, taps should show the insertion handle. | 280 // Once the region becomes non-empty, taps should show the insertion handle. |
272 controller().OnTapEvent(); | 281 OnTapEvent(); |
273 controller().OnSelectionEmpty(false); | 282 controller().OnSelectionEmpty(false); |
274 ChangeInsertion(insertion_rect, visible); | 283 ChangeInsertion(insertion_rect, visible); |
275 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 284 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
276 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 285 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
277 | 286 |
278 // Reset the selection. | 287 // Reset the selection. |
279 controller().HideAndDisallowShowingAutomatically(); | 288 controller().HideAndDisallowShowingAutomatically(); |
280 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 289 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
281 | 290 |
282 // Long-pressing should show the handle even if the editable region is empty. | 291 // Long-pressing should show the handle even if the editable region is empty. |
283 insertion_rect.Offset(2, -2); | 292 insertion_rect.Offset(2, -2); |
284 controller().OnLongPressEvent(); | 293 OnLongPressEvent(); |
285 controller().OnSelectionEmpty(true); | 294 controller().OnSelectionEmpty(true); |
286 ChangeInsertion(insertion_rect, visible); | 295 ChangeInsertion(insertion_rect, visible); |
287 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 296 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
288 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 297 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
289 | 298 |
290 // Single Tap on an empty edit field should clear insertion handle. | 299 // Single Tap on an empty edit field should clear insertion handle. |
291 controller().OnTapEvent(); | 300 OnTapEvent(); |
292 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 301 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
293 } | 302 } |
294 | 303 |
295 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { | 304 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { |
296 AllowShowingOnTapForEmptyEditable(); | 305 AllowShowingOnTapForEmptyEditable(); |
297 | 306 |
298 gfx::RectF insertion_rect(5, 5, 0, 10); | 307 gfx::RectF insertion_rect(5, 5, 0, 10); |
299 bool visible = true; | 308 bool visible = true; |
300 controller().OnSelectionEditable(true); | 309 controller().OnSelectionEditable(true); |
301 | 310 |
302 // Taps on an empty editable region should show the insertion handle if the | 311 // Taps on an empty editable region should show the insertion handle if the |
303 // controller is created with |show_on_tap_for_empty_editable| set to true. | 312 // controller is created with |show_on_tap_for_empty_editable| set to true. |
304 controller().OnTapEvent(); | 313 OnTapEvent(); |
305 controller().OnSelectionEmpty(true); | 314 controller().OnSelectionEmpty(true); |
306 ChangeInsertion(insertion_rect, visible); | 315 ChangeInsertion(insertion_rect, visible); |
307 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 316 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
308 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 317 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
309 | 318 |
310 // Additional taps should not hide the insertion handle in this case. | 319 // Additional taps should not hide the insertion handle in this case. |
311 controller().OnTapEvent(); | 320 OnTapEvent(); |
312 ChangeInsertion(insertion_rect, visible); | 321 ChangeInsertion(insertion_rect, visible); |
313 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 322 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
314 } | 323 } |
315 | 324 |
316 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | 325 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { |
317 gfx::RectF insertion_rect(5, 5, 0, 10); | 326 gfx::RectF insertion_rect(5, 5, 0, 10); |
318 bool visible = true; | 327 bool visible = true; |
319 | 328 |
320 // Simulate the user tapping an empty text field. | 329 // Simulate the user tapping an empty text field. |
321 controller().OnTapEvent(); | 330 OnTapEvent(); |
322 controller().OnSelectionEditable(true); | 331 controller().OnSelectionEditable(true); |
323 controller().OnSelectionEmpty(true); | 332 controller().OnSelectionEmpty(true); |
324 ChangeInsertion(insertion_rect, visible); | 333 ChangeInsertion(insertion_rect, visible); |
325 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 334 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
326 | 335 |
327 // Simulate the cursor moving while a user is typing. | 336 // Simulate the cursor moving while a user is typing. |
328 insertion_rect.Offset(10, 0); | 337 insertion_rect.Offset(10, 0); |
329 controller().OnSelectionEmpty(false); | 338 controller().OnSelectionEmpty(false); |
330 ChangeInsertion(insertion_rect, visible); | 339 ChangeInsertion(insertion_rect, visible); |
331 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 340 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
332 | 341 |
333 // If the user taps the *same* position as the cursor at the end of the text | 342 // If the user taps the *same* position as the cursor at the end of the text |
334 // entry, the handle should appear. | 343 // entry, the handle should appear. |
335 controller().OnTapEvent(); | 344 OnTapEvent(); |
336 ChangeInsertion(insertion_rect, visible); | 345 ChangeInsertion(insertion_rect, visible); |
337 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 346 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
338 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 347 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
339 } | 348 } |
340 | 349 |
341 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 350 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
342 controller().OnLongPressEvent(); | 351 OnLongPressEvent(); |
343 controller().OnSelectionEditable(true); | 352 controller().OnSelectionEditable(true); |
344 | 353 |
345 gfx::RectF start_rect(5, 5, 0, 10); | 354 gfx::RectF start_rect(5, 5, 0, 10); |
346 gfx::RectF end_rect(50, 5, 0, 10); | 355 gfx::RectF end_rect(50, 5, 0, 10); |
347 bool visible = true; | 356 bool visible = true; |
348 | 357 |
349 ChangeInsertion(start_rect, visible); | 358 ChangeInsertion(start_rect, visible); |
350 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 359 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
351 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 360 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
352 | 361 |
353 ChangeSelection(start_rect, visible, end_rect, visible); | 362 ChangeSelection(start_rect, visible, end_rect, visible); |
354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 363 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
355 SELECTION_SHOWN)); | 364 SELECTION_SHOWN)); |
356 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 365 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
357 | 366 |
358 ChangeInsertion(end_rect, visible); | 367 ChangeInsertion(end_rect, visible); |
359 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, |
360 INSERTION_SHOWN)); | 369 INSERTION_SHOWN)); |
361 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 370 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
362 | 371 |
363 controller().HideAndDisallowShowingAutomatically(); | 372 controller().HideAndDisallowShowingAutomatically(); |
364 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 373 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
365 | 374 |
366 controller().OnTapEvent(); | 375 OnTapEvent(); |
367 ChangeInsertion(end_rect, visible); | 376 ChangeInsertion(end_rect, visible); |
368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 377 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
369 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 378 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
370 } | 379 } |
371 | 380 |
372 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 381 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
373 base::TimeTicks event_time = base::TimeTicks::Now(); | 382 base::TimeTicks event_time = base::TimeTicks::Now(); |
374 controller().OnTapEvent(); | 383 OnTapEvent(); |
375 controller().OnSelectionEditable(true); | 384 controller().OnSelectionEditable(true); |
376 | 385 |
377 // The touch sequence should not be handled if insertion is not active. | 386 // The touch sequence should not be handled if insertion is not active. |
378 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 387 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
379 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 388 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
380 | 389 |
381 float line_height = 10.f; | 390 float line_height = 10.f; |
382 gfx::RectF start_rect(10, 0, 0, line_height); | 391 gfx::RectF start_rect(10, 0, 0, line_height); |
383 bool visible = true; | 392 bool visible = true; |
384 ChangeInsertion(start_rect, visible); | 393 ChangeInsertion(start_rect, visible); |
(...skipping 30 matching lines...) Expand all Loading... | |
415 EXPECT_FALSE(GetAndResetCaretMoved()); | 424 EXPECT_FALSE(GetAndResetCaretMoved()); |
416 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); | 425 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STOPPED)); |
417 | 426 |
418 // Once the drag is complete, no more touch events should be consumed until | 427 // Once the drag is complete, no more touch events should be consumed until |
419 // the next ACTION_DOWN. | 428 // the next ACTION_DOWN. |
420 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 429 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
421 } | 430 } |
422 | 431 |
423 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 432 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
424 base::TimeTicks event_time = base::TimeTicks::Now(); | 433 base::TimeTicks event_time = base::TimeTicks::Now(); |
425 controller().OnTapEvent(); | 434 OnTapEvent(); |
426 controller().OnSelectionEditable(true); | 435 controller().OnSelectionEditable(true); |
427 SetDraggingEnabled(true); | 436 SetDraggingEnabled(true); |
428 | 437 |
429 gfx::RectF start_rect(10, 0, 0, 10); | 438 gfx::RectF start_rect(10, 0, 0, 10); |
430 bool visible = true; | 439 bool visible = true; |
431 ChangeInsertion(start_rect, visible); | 440 ChangeInsertion(start_rect, visible); |
432 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 441 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
433 | 442 |
434 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 443 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 444 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
436 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. | 445 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. |
437 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 446 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
438 | 447 |
439 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 448 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
440 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 449 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
441 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 450 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
442 INSERTION_DRAG_STOPPED)); | 451 INSERTION_DRAG_STOPPED)); |
443 | 452 |
444 // Reset the insertion. | 453 // Reset the insertion. |
445 ClearInsertion(); | 454 ClearInsertion(); |
446 controller().OnTapEvent(); | 455 OnTapEvent(); |
447 ChangeInsertion(start_rect, visible); | 456 ChangeInsertion(start_rect, visible); |
448 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 457 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
449 INSERTION_SHOWN)); | 458 INSERTION_SHOWN)); |
450 | 459 |
451 // No tap should be signalled if the time between DOWN and UP was too long. | 460 // No tap should be signalled if the time between DOWN and UP was too long. |
452 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 461 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
453 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 462 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
454 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 463 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
455 event_time + base::TimeDelta::FromSeconds(1), | 464 event_time + base::TimeDelta::FromSeconds(1), |
456 0, | 465 0, |
457 0); | 466 0); |
458 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 467 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
459 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 468 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
460 INSERTION_DRAG_STOPPED)); | 469 INSERTION_DRAG_STOPPED)); |
461 | 470 |
462 // Reset the insertion. | 471 // Reset the insertion. |
463 ClearInsertion(); | 472 ClearInsertion(); |
464 controller().OnTapEvent(); | 473 OnTapEvent(); |
465 ChangeInsertion(start_rect, visible); | 474 ChangeInsertion(start_rect, visible); |
466 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 475 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
467 INSERTION_SHOWN)); | 476 INSERTION_SHOWN)); |
468 | 477 |
469 // No tap should be signalled if the drag was too long. | 478 // No tap should be signalled if the drag was too long. |
470 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 479 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
471 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 480 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
472 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 481 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
473 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 482 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
474 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 483 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
475 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 484 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
476 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 485 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
477 INSERTION_DRAG_STOPPED)); | 486 INSERTION_DRAG_STOPPED)); |
478 | 487 |
479 // Reset the insertion. | 488 // Reset the insertion. |
480 ClearInsertion(); | 489 ClearInsertion(); |
481 controller().OnTapEvent(); | 490 OnTapEvent(); |
482 ChangeInsertion(start_rect, visible); | 491 ChangeInsertion(start_rect, visible); |
483 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 492 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
484 INSERTION_SHOWN)); | 493 INSERTION_SHOWN)); |
485 | 494 |
486 // No tap should be signalled if the touch sequence is cancelled. | 495 // No tap should be signalled if the touch sequence is cancelled. |
487 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 496 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
488 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 497 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
489 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 498 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
490 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 499 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
491 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 500 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
492 INSERTION_DRAG_STOPPED)); | 501 INSERTION_DRAG_STOPPED)); |
493 } | 502 } |
494 | 503 |
495 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 504 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
496 base::TimeTicks event_time = base::TimeTicks::Now(); | 505 base::TimeTicks event_time = base::TimeTicks::Now(); |
497 controller().OnTapEvent(); | 506 OnTapEvent(); |
498 controller().OnSelectionEditable(true); | 507 controller().OnSelectionEditable(true); |
499 SetDraggingEnabled(true); | 508 SetDraggingEnabled(true); |
500 | 509 |
501 gfx::RectF anchor_rect(10, 0, 0, 10); | 510 gfx::RectF anchor_rect(10, 0, 0, 10); |
502 bool visible = true; | 511 bool visible = true; |
503 ChangeInsertion(anchor_rect, visible); | 512 ChangeInsertion(anchor_rect, visible); |
504 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 513 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
505 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 514 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
506 | 515 |
507 // Tapping again shouldn't reset the active insertion point. | 516 // Tapping again shouldn't reset the active insertion point. |
508 controller().OnTapEvent(); | 517 OnTapEvent(); |
509 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 518 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 519 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
511 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 520 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
512 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 521 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
513 | 522 |
514 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 523 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
515 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 524 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 525 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
517 INSERTION_DRAG_STOPPED)); | 526 INSERTION_DRAG_STOPPED)); |
518 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 527 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
519 | 528 |
520 anchor_rect.Offset(5, 15); | 529 anchor_rect.Offset(5, 15); |
521 ChangeInsertion(anchor_rect, visible); | 530 ChangeInsertion(anchor_rect, visible); |
522 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 531 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
523 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 532 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
524 | 533 |
525 // Pressing shouldn't reset the active insertion point. | 534 // Pressing shouldn't reset the active insertion point. |
526 controller().OnLongPressEvent(); | 535 OnLongPressEvent(); |
527 controller().OnSelectionEmpty(true); | 536 controller().OnSelectionEmpty(true); |
528 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 537 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
529 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 538 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 539 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
531 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 540 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
532 | 541 |
533 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 542 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
534 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 543 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
535 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 544 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
536 INSERTION_DRAG_STOPPED)); | 545 INSERTION_DRAG_STOPPED)); |
537 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 546 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
538 } | 547 } |
539 | 548 |
540 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 549 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
541 gfx::RectF start_rect(5, 5, 0, 10); | 550 gfx::RectF start_rect(5, 5, 0, 10); |
542 gfx::RectF end_rect(50, 5, 0, 10); | 551 gfx::RectF end_rect(50, 5, 0, 10); |
543 bool visible = true; | 552 bool visible = true; |
544 | 553 |
545 // Selection events are ignored until automatic showing is enabled. | 554 // Selection events are ignored until automatic showing is enabled. |
546 ChangeSelection(start_rect, visible, end_rect, visible); | 555 ChangeSelection(start_rect, visible, end_rect, visible); |
547 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 556 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
548 | 557 |
549 controller().OnLongPressEvent(); | 558 OnLongPressEvent(); |
550 ChangeSelection(start_rect, visible, end_rect, visible); | 559 ChangeSelection(start_rect, visible, end_rect, visible); |
551 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 560 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
552 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 561 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
553 | 562 |
554 start_rect.Offset(1, 0); | 563 start_rect.Offset(1, 0); |
555 ChangeSelection(start_rect, visible, end_rect, visible); | 564 ChangeSelection(start_rect, visible, end_rect, visible); |
556 // Selection movement does not currently trigger a separate event. | 565 // Selection movement does not currently trigger a separate event. |
557 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 566 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
558 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 567 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
559 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 568 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
560 | 569 |
561 ClearSelection(); | 570 ClearSelection(); |
562 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 571 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
563 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 572 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
564 } | 573 } |
565 | 574 |
566 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 575 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
567 gfx::RectF start_rect(5, 5, 0, 10); | 576 gfx::RectF start_rect(5, 5, 0, 10); |
568 gfx::RectF end_rect(50, 5, 0, 10); | 577 gfx::RectF end_rect(50, 5, 0, 10); |
569 bool visible = true; | 578 bool visible = true; |
570 | 579 |
571 controller().OnLongPressEvent(); | 580 OnLongPressEvent(); |
572 ChangeSelection(start_rect, visible, end_rect, visible); | 581 ChangeSelection(start_rect, visible, end_rect, visible); |
573 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 582 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
574 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 583 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
575 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 584 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
576 | 585 |
577 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 586 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
578 // event notification. | 587 // event notification. |
579 start_rect.Offset(10, 10); | 588 start_rect.Offset(10, 10); |
580 controller().OnLongPressEvent(); | 589 OnLongPressEvent(); |
581 ChangeSelection(start_rect, visible, end_rect, visible); | 590 ChangeSelection(start_rect, visible, end_rect, visible); |
582 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 591 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
583 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 592 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
584 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 593 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
585 } | 594 } |
586 | 595 |
587 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 596 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
588 base::TimeTicks event_time = base::TimeTicks::Now(); | 597 base::TimeTicks event_time = base::TimeTicks::Now(); |
589 controller().OnLongPressEvent(); | 598 OnLongPressEvent(); |
590 | 599 |
591 // The touch sequence should not be handled if selection is not active. | 600 // The touch sequence should not be handled if selection is not active. |
592 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 601 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
593 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 602 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
594 | 603 |
595 float line_height = 10.f; | 604 float line_height = 10.f; |
596 gfx::RectF start_rect(0, 0, 0, line_height); | 605 gfx::RectF start_rect(0, 0, 0, line_height); |
597 gfx::RectF end_rect(50, 0, 0, line_height); | 606 gfx::RectF end_rect(50, 0, 0, line_height); |
598 bool visible = true; | 607 bool visible = true; |
599 ChangeSelection(start_rect, visible, end_rect, visible); | 608 ChangeSelection(start_rect, visible, end_rect, visible); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 646 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
638 EXPECT_FALSE(GetAndResetSelectionMoved()); | 647 EXPECT_FALSE(GetAndResetSelectionMoved()); |
639 | 648 |
640 // Once the drag is complete, no more touch events should be consumed until | 649 // Once the drag is complete, no more touch events should be consumed until |
641 // the next ACTION_DOWN. | 650 // the next ACTION_DOWN. |
642 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 651 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
643 } | 652 } |
644 | 653 |
645 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 654 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
646 base::TimeTicks event_time = base::TimeTicks::Now(); | 655 base::TimeTicks event_time = base::TimeTicks::Now(); |
647 controller().OnLongPressEvent(); | 656 OnLongPressEvent(); |
648 | 657 |
649 float line_height = 10.f; | 658 float line_height = 10.f; |
650 gfx::RectF start_rect(0, 0, 0, line_height); | 659 gfx::RectF start_rect(0, 0, 0, line_height); |
651 gfx::RectF end_rect(50, 0, 0, line_height); | 660 gfx::RectF end_rect(50, 0, 0, line_height); |
652 bool visible = true; | 661 bool visible = true; |
653 ChangeSelection(start_rect, visible, end_rect, visible); | 662 ChangeSelection(start_rect, visible, end_rect, visible); |
654 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 663 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
655 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 664 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
656 | 665 |
657 // The ACTION_DOWN should lock to the closest handle. | 666 // The ACTION_DOWN should lock to the closest handle. |
(...skipping 17 matching lines...) Expand all Loading... | |
675 GetLastSelectionEnd()); | 684 GetLastSelectionEnd()); |
676 | 685 |
677 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 686 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
678 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 687 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
679 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 688 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
680 EXPECT_FALSE(GetAndResetSelectionMoved()); | 689 EXPECT_FALSE(GetAndResetSelectionMoved()); |
681 } | 690 } |
682 | 691 |
683 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 692 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
684 base::TimeTicks event_time = base::TimeTicks::Now(); | 693 base::TimeTicks event_time = base::TimeTicks::Now(); |
685 controller().OnLongPressEvent(); | 694 OnLongPressEvent(); |
686 | 695 |
687 float line_height = 10.f; | 696 float line_height = 10.f; |
688 gfx::RectF start_rect(50, line_height, 0, line_height); | 697 gfx::RectF start_rect(50, line_height, 0, line_height); |
689 gfx::RectF end_rect(100, line_height, 0, line_height); | 698 gfx::RectF end_rect(100, line_height, 0, line_height); |
690 bool visible = true; | 699 bool visible = true; |
691 ChangeSelection(start_rect, visible, end_rect, visible); | 700 ChangeSelection(start_rect, visible, end_rect, visible); |
692 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 701 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
693 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 702 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
694 | 703 |
695 SetDraggingEnabled(true); | 704 SetDraggingEnabled(true); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
794 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 803 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
795 | 804 |
796 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 805 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
797 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 806 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
798 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 807 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
799 EXPECT_FALSE(GetAndResetSelectionMoved()); | 808 EXPECT_FALSE(GetAndResetSelectionMoved()); |
800 } | 809 } |
801 | 810 |
802 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 811 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
803 base::TimeTicks event_time = base::TimeTicks::Now(); | 812 base::TimeTicks event_time = base::TimeTicks::Now(); |
804 controller().OnLongPressEvent(); | 813 OnLongPressEvent(); |
805 | 814 |
806 float small_line_height = 1.f; | 815 float small_line_height = 1.f; |
807 float large_line_height = 50.f; | 816 float large_line_height = 50.f; |
808 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 817 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
809 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 818 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
810 bool visible = true; | 819 bool visible = true; |
811 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 820 ChangeSelection(small_line_rect, visible, large_line_rect, visible); |
812 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 821 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
813 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 822 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
814 | 823 |
(...skipping 13 matching lines...) Expand all Loading... | |
828 | 837 |
829 small_line_rect += gfx::Vector2dF(25.f, 0); | 838 small_line_rect += gfx::Vector2dF(25.f, 0); |
830 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 839 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
831 small_line_rect.x(), small_line_rect.y()); | 840 small_line_rect.x(), small_line_rect.y()); |
832 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 841 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
833 EXPECT_TRUE(GetAndResetSelectionMoved()); | 842 EXPECT_TRUE(GetAndResetSelectionMoved()); |
834 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 843 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
835 } | 844 } |
836 | 845 |
837 TEST_F(TouchSelectionControllerTest, Animation) { | 846 TEST_F(TouchSelectionControllerTest, Animation) { |
838 controller().OnTapEvent(); | 847 OnTapEvent(); |
839 controller().OnSelectionEditable(true); | 848 controller().OnSelectionEditable(true); |
840 | 849 |
841 gfx::RectF insertion_rect(5, 5, 0, 10); | 850 gfx::RectF insertion_rect(5, 5, 0, 10); |
842 | 851 |
843 bool visible = true; | 852 bool visible = true; |
844 ChangeInsertion(insertion_rect, visible); | 853 ChangeInsertion(insertion_rect, visible); |
845 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 854 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
846 | 855 |
847 visible = false; | 856 visible = false; |
848 ChangeInsertion(insertion_rect, visible); | 857 ChangeInsertion(insertion_rect, visible); |
849 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 858 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
850 | 859 |
851 visible = true; | 860 visible = true; |
852 ChangeInsertion(insertion_rect, visible); | 861 ChangeInsertion(insertion_rect, visible); |
853 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 862 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
854 | 863 |
855 // If the handles are explicity hidden, no animation should be triggered. | 864 // If the handles are explicity hidden, no animation should be triggered. |
856 controller().HideAndDisallowShowingAutomatically(); | 865 controller().HideAndDisallowShowingAutomatically(); |
857 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 866 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
858 | 867 |
859 // If the client doesn't support animation, no animation should be triggered. | 868 // If the client doesn't support animation, no animation should be triggered. |
860 SetAnimationEnabled(false); | 869 SetAnimationEnabled(false); |
861 controller().OnTapEvent(); | 870 OnTapEvent(); |
862 visible = true; | 871 visible = true; |
863 ChangeInsertion(insertion_rect, visible); | 872 ChangeInsertion(insertion_rect, visible); |
864 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 873 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
865 } | 874 } |
866 | 875 |
867 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 876 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
868 controller().OnTapEvent(); | 877 OnTapEvent(); |
869 controller().OnSelectionEditable(true); | 878 controller().OnSelectionEditable(true); |
870 | 879 |
871 gfx::RectF insertion_rect(5, 5, 0, 10); | 880 gfx::RectF insertion_rect(5, 5, 0, 10); |
872 | 881 |
873 bool visible = true; | 882 bool visible = true; |
874 ChangeInsertion(insertion_rect, visible); | 883 ChangeInsertion(insertion_rect, visible); |
875 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 884 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
876 | 885 |
877 controller().SetTemporarilyHidden(true); | 886 controller().SetTemporarilyHidden(true); |
878 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 887 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
879 | 888 |
880 visible = false; | 889 visible = false; |
881 ChangeInsertion(insertion_rect, visible); | 890 ChangeInsertion(insertion_rect, visible); |
882 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 891 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
883 | 892 |
884 visible = true; | 893 visible = true; |
885 ChangeInsertion(insertion_rect, visible); | 894 ChangeInsertion(insertion_rect, visible); |
886 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 895 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
887 | 896 |
888 controller().SetTemporarilyHidden(false); | 897 controller().SetTemporarilyHidden(false); |
889 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 898 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
890 } | 899 } |
891 | 900 |
892 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 901 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
893 gfx::RectF start_rect(5, 5, 0, 10); | 902 gfx::RectF start_rect(5, 5, 0, 10); |
894 gfx::RectF end_rect(50, 5, 0, 10); | 903 gfx::RectF end_rect(50, 5, 0, 10); |
895 bool visible = true; | 904 bool visible = true; |
896 | 905 |
897 controller().OnLongPressEvent(); | 906 OnLongPressEvent(); |
898 ChangeSelection(start_rect, visible, end_rect, visible); | 907 ChangeSelection(start_rect, visible, end_rect, visible); |
899 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 908 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
900 | 909 |
901 // Selection should not be cleared if the selection bounds have not changed. | 910 // Selection should not be cleared if the selection bounds have not changed. |
902 controller().OnTapEvent(); | 911 OnTapEvent(); |
903 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 912 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
904 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 913 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
905 | 914 |
906 controller().OnTapEvent(); | 915 OnTapEvent(); |
907 ClearSelection(); | 916 ClearSelection(); |
908 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 917 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
909 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 918 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
910 } | 919 } |
911 | 920 |
912 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { | 921 TEST_F(TouchSelectionControllerTest, NoSelectionAfterLongpressThenTap) { |
913 gfx::RectF start_rect(5, 5, 0, 10); | 922 gfx::RectF start_rect(5, 5, 0, 10); |
914 gfx::RectF end_rect(50, 5, 0, 10); | 923 gfx::RectF end_rect(50, 5, 0, 10); |
915 bool visible = true; | 924 bool visible = true; |
916 | 925 |
917 // Tap-triggered selections should not be allowed. | 926 // Tap-triggered selections should not be allowed. |
918 controller().OnLongPressEvent(); | 927 OnLongPressEvent(); |
919 controller().OnTapEvent(); | 928 OnTapEvent(); |
920 ChangeSelection(start_rect, visible, end_rect, visible); | 929 ChangeSelection(start_rect, visible, end_rect, visible); |
921 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 930 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
922 | 931 |
923 // Subsequent longpress selections will be allowed. | 932 // Subsequent longpress selections will be allowed. |
924 controller().OnLongPressEvent(); | 933 OnLongPressEvent(); |
925 ChangeSelection(start_rect, visible, end_rect, visible); | 934 ChangeSelection(start_rect, visible, end_rect, visible); |
926 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 935 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
927 | 936 |
928 // Tapping again shouldn't have any effect on subsequent selection events. | 937 // Tapping again shouldn't have any effect on subsequent selection events. |
929 controller().OnTapEvent(); | 938 OnTapEvent(); |
930 end_rect.Offset(10, 10); | 939 end_rect.Offset(10, 10); |
931 ChangeSelection(start_rect, visible, end_rect, visible); | 940 ChangeSelection(start_rect, visible, end_rect, visible); |
932 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 941 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
933 ClearSelection(); | 942 ClearSelection(); |
934 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 943 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
935 } | 944 } |
936 | 945 |
937 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 946 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
938 gfx::RectF start_rect(5, 5, 0, 10); | 947 gfx::RectF start_rect(5, 5, 0, 10); |
939 gfx::RectF end_rect(50, 5, 0, 10); | 948 gfx::RectF end_rect(50, 5, 0, 10); |
(...skipping 23 matching lines...) Expand all Loading... | |
963 controller().OnSelectionEditable(true); | 972 controller().OnSelectionEditable(true); |
964 controller().OnSelectionEmpty(false); | 973 controller().OnSelectionEmpty(false); |
965 controller().HideAndDisallowShowingAutomatically(); | 974 controller().HideAndDisallowShowingAutomatically(); |
966 gfx::RectF insertion_rect(5, 5, 0, 10); | 975 gfx::RectF insertion_rect(5, 5, 0, 10); |
967 ChangeInsertion(insertion_rect, visible); | 976 ChangeInsertion(insertion_rect, visible); |
968 controller().AllowShowingFromCurrentSelection(); | 977 controller().AllowShowingFromCurrentSelection(); |
969 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 978 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
970 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 979 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
971 } | 980 } |
972 | 981 |
982 TEST_F(TouchSelectionControllerTest, HandlesShowOnTapInsideRect) { | |
983 bool visible = false; | |
984 gfx::RectF start_rect(5, 5, 0, 10); | |
985 gfx::RectF end_rect(50, 5, 0, 10); | |
986 gfx::PointF inner_point(25, 10); | |
987 gfx::PointF outer_point(100, 100); | |
988 | |
989 // Establish a selection without handles from 5 to 50 with height 10. | |
990 ChangeSelection(start_rect, visible, end_rect, visible); | |
991 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
992 | |
993 // A point outside the rect should not be handled. | |
994 EXPECT_FALSE(controller().WillHandleTapEvent(outer_point)); | |
995 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
996 | |
997 // Establish a selection without handles from 5 to 50 with height 10. | |
998 ChangeSelection(start_rect, visible, end_rect, visible); | |
jdduke (slow)
2015/05/11 21:32:17
I think you can remove this |ChangeSelection| line
| |
999 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1000 | |
1001 // A point inside the rect should be handled. | |
1002 EXPECT_TRUE(controller().WillHandleTapEvent(inner_point)); | |
1003 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | |
1004 } | |
1005 | |
1006 TEST_F(TouchSelectionControllerTest, HandlesShowOnLongPressInsideRect) { | |
1007 bool visible = false; | |
1008 gfx::RectF start_rect(5, 5, 0, 10); | |
1009 gfx::RectF end_rect(50, 5, 0, 10); | |
1010 gfx::PointF inner_point(25, 10); | |
1011 gfx::PointF outer_point(100, 100); | |
1012 | |
1013 // Establish a selection without handles from 5 to 50 with height 10. | |
1014 ChangeSelection(start_rect, visible, end_rect, visible); | |
1015 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1016 | |
1017 // A point outside the rect should not be handled. | |
1018 EXPECT_FALSE(controller().WillHandleLongPressEvent(outer_point)); | |
1019 | |
1020 // Reset the selection. | |
jdduke (slow)
2015/05/11 21:32:17
Hmm, why reset? It should be a simple matter of te
| |
1021 controller().HideAndDisallowShowingAutomatically(); | |
1022 | |
1023 // Establish a selection without handles from 5 to 50 with height 10. | |
1024 ChangeSelection(start_rect, visible, end_rect, visible); | |
1025 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | |
1026 | |
1027 // A point inside the rect should be handled. | |
1028 EXPECT_TRUE(controller().WillHandleLongPressEvent(inner_point)); | |
1029 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | |
1030 } | |
1031 | |
973 } // namespace ui | 1032 } // namespace ui |
OLD | NEW |