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

Side by Side Diff: ui/events/blink/input_scroll_elasticity_controller_unittest.cc

Issue 1749343004: Implement Wheel Gesture Scrolling on OSX. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ensure only high precision scroll begins are used Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/events/blink/input_scroll_elasticity_controller.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/events/blink/input_scroll_elasticity_controller.h" 5 #include "ui/events/blink/input_scroll_elasticity_controller.h"
6 6
7 #include "cc/input/input_handler.h" 7 #include "cc/input/input_handler.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "third_party/WebKit/public/web/WebInputEvent.h" 9 #include "third_party/WebKit/public/web/WebInputEvent.h"
10 10
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF(); 92 event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF();
93 93
94 cc::InputHandlerScrollResult scroll_result; 94 cc::InputHandlerScrollResult scroll_result;
95 scroll_result.did_overscroll_root = !overscroll_delta.IsZero(); 95 scroll_result.did_overscroll_root = !overscroll_delta.IsZero();
96 scroll_result.unused_scroll_delta = overscroll_delta; 96 scroll_result.unused_scroll_delta = overscroll_delta;
97 97
98 controller_.ObserveWheelEventAndResult(event, scroll_result); 98 controller_.ObserveWheelEventAndResult(event, scroll_result);
99 input_event_count_ += 1; 99 input_event_count_ += 1;
100 } 100 }
101 101
102 void SendGestureScrollBegin(bool inertial) {
103 blink::WebGestureEvent event;
104 event.sourceDevice = blink::WebGestureDeviceTouchpad;
105 event.type = blink::WebInputEvent::GestureScrollBegin;
106 event.data.scrollBegin.inertial = inertial;
107 TickCurrentTime();
108 event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF();
109
110 controller_.ObserveGestureEventAndResult(event,
111 cc::InputHandlerScrollResult());
112 input_event_count_ += 1;
113 }
114
115 void SendGestureScrollUpdate(
116 bool inertial,
117 const gfx::Vector2dF& event_delta = gfx::Vector2dF(),
118 const gfx::Vector2dF& overscroll_delta = gfx::Vector2dF()) {
119 blink::WebGestureEvent event;
120 event.sourceDevice = blink::WebGestureDeviceTouchpad;
121 event.type = blink::WebInputEvent::GestureScrollUpdate;
122 event.data.scrollUpdate.inertial = inertial;
123 event.data.scrollUpdate.deltaX = -event_delta.x();
124 event.data.scrollUpdate.deltaY = -event_delta.y();
125 TickCurrentTime();
126 event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF();
127
128 cc::InputHandlerScrollResult scroll_result;
129 scroll_result.did_overscroll_root = !overscroll_delta.IsZero();
130 scroll_result.unused_scroll_delta = overscroll_delta;
131
132 controller_.ObserveGestureEventAndResult(event, scroll_result);
133 input_event_count_ += 1;
134 }
135
136 void SendGestureScrollEnd() {
137 blink::WebGestureEvent event;
138 event.sourceDevice = blink::WebGestureDeviceTouchpad;
139 event.type = blink::WebInputEvent::GestureScrollEnd;
140
141 TickCurrentTime();
142 event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF();
143
144 controller_.ObserveGestureEventAndResult(event,
145 cc::InputHandlerScrollResult());
146 input_event_count_ += 1;
147 }
148
102 const base::TimeTicks& TickCurrentTime() { 149 const base::TimeTicks& TickCurrentTime() {
103 current_time_ += base::TimeDelta::FromSecondsD(1 / 60.f); 150 current_time_ += base::TimeDelta::FromSecondsD(1 / 60.f);
104 return current_time_; 151 return current_time_;
105 } 152 }
106 void TickCurrentTimeAndAnimate() { 153 void TickCurrentTimeAndAnimate() {
107 TickCurrentTime(); 154 TickCurrentTime();
108 controller_.Animate(current_time_); 155 controller_.Animate(current_time_);
109 } 156 }
110 157
111 MockScrollElasticityHelper helper_; 158 MockScrollElasticityHelper helper_;
(...skipping 29 matching lines...) Expand all
141 gfx::Vector2dF(-25, 40)); 188 gfx::Vector2dF(-25, 40));
142 EXPECT_EQ(3, helper_.set_stretch_amount_count()); 189 EXPECT_EQ(3, helper_.set_stretch_amount_count());
143 EXPECT_GT(0.f, helper_.StretchAmount().x()); 190 EXPECT_GT(0.f, helper_.StretchAmount().x());
144 EXPECT_EQ(0.f, helper_.StretchAmount().y()); 191 EXPECT_EQ(0.f, helper_.StretchAmount().y());
145 helper_.SetStretchAmount(gfx::Vector2dF()); 192 helper_.SetStretchAmount(gfx::Vector2dF());
146 EXPECT_EQ(4, helper_.set_stretch_amount_count()); 193 EXPECT_EQ(4, helper_.set_stretch_amount_count());
147 SendMouseWheelEvent(PhaseEnded, PhaseNone); 194 SendMouseWheelEvent(PhaseEnded, PhaseNone);
148 EXPECT_EQ(0, helper_.request_begin_frame_count()); 195 EXPECT_EQ(0, helper_.request_begin_frame_count());
149 } 196 }
150 197
198 // Verify that stretching only occurs in one axis at a time, and that it
199 // is biased to the Y axis.
200 TEST_F(ScrollElasticityControllerTest, GestureBased_Axis) {
201 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0),
202 gfx::ScrollOffset(0, 0));
203
204 // If we push equally in the X and Y directions, we should see a stretch only
205 // in the Y direction.
206 SendGestureScrollBegin(false);
207 SendGestureScrollUpdate(false, gfx::Vector2dF(10, 10),
208 gfx::Vector2dF(10, 10));
209 EXPECT_EQ(1, helper_.set_stretch_amount_count());
210 EXPECT_EQ(0.f, helper_.StretchAmount().x());
211 EXPECT_LT(0.f, helper_.StretchAmount().y());
212 helper_.SetStretchAmount(gfx::Vector2dF());
213 EXPECT_EQ(2, helper_.set_stretch_amount_count());
214 SendGestureScrollEnd();
215 EXPECT_EQ(0, helper_.request_begin_frame_count());
216
217 // If we push more in the X direction than the Y direction, we should see a
218 // stretch only in the X direction. This decision should be based on the
219 // input delta, not the actual overscroll delta.
220 SendGestureScrollBegin(false);
221 SendGestureScrollUpdate(false, gfx::Vector2dF(-25, 10),
222 gfx::Vector2dF(-25, 40));
223 EXPECT_EQ(3, helper_.set_stretch_amount_count());
224 EXPECT_GT(0.f, helper_.StretchAmount().x());
225 EXPECT_EQ(0.f, helper_.StretchAmount().y());
226 helper_.SetStretchAmount(gfx::Vector2dF());
227 EXPECT_EQ(4, helper_.set_stretch_amount_count());
228 SendGestureScrollEnd();
229 EXPECT_EQ(0, helper_.request_begin_frame_count());
230 }
231
151 // Verify that we need a total overscroll delta of at least 10 in a pinned 232 // Verify that we need a total overscroll delta of at least 10 in a pinned
152 // direction before we start stretching. 233 // direction before we start stretching.
153 TEST_F(ScrollElasticityControllerTest, MinimumDeltaBeforeStretch) { 234 TEST_F(ScrollElasticityControllerTest, MinimumDeltaBeforeStretch) {
154 // We should not start stretching while we are not pinned in the direction 235 // We should not start stretching while we are not pinned in the direction
155 // of the scroll (even if there is an overscroll delta). We have to wait for 236 // of the scroll (even if there is an overscroll delta). We have to wait for
156 // the regular scroll to eat all of the events. 237 // the regular scroll to eat all of the events.
157 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), 238 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
158 gfx::ScrollOffset(10, 10)); 239 gfx::ScrollOffset(10, 10));
159 SendMouseWheelEvent(PhaseMayBegin, PhaseNone); 240 SendMouseWheelEvent(PhaseMayBegin, PhaseNone);
160 SendMouseWheelEvent(PhaseBegan, PhaseNone); 241 SendMouseWheelEvent(PhaseBegan, PhaseNone);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 EXPECT_EQ(0.f, helper_.StretchAmount().x()); 275 EXPECT_EQ(0.f, helper_.StretchAmount().x());
195 EXPECT_LT(0.f, helper_.StretchAmount().y()); 276 EXPECT_LT(0.f, helper_.StretchAmount().y());
196 277
197 // End the gesture. Because there is a non-zero stretch, we should be in the 278 // End the gesture. Because there is a non-zero stretch, we should be in the
198 // animated state, and should have had a frame requested. 279 // animated state, and should have had a frame requested.
199 EXPECT_EQ(0, helper_.request_begin_frame_count()); 280 EXPECT_EQ(0, helper_.request_begin_frame_count());
200 SendMouseWheelEvent(PhaseEnded, PhaseNone); 281 SendMouseWheelEvent(PhaseEnded, PhaseNone);
201 EXPECT_EQ(1, helper_.request_begin_frame_count()); 282 EXPECT_EQ(1, helper_.request_begin_frame_count());
202 } 283 }
203 284
204 // Verify that an stretch caused by a momentum scroll will switch to the 285 // Verify that we need a total overscroll delta of at least 10 in a pinned
286 // direction before we start stretching.
287 TEST_F(ScrollElasticityControllerTest, GestureBased_MinimumDeltaBeforeStretch) {
288 // We should not start stretching while we are not pinned in the direction
289 // of the scroll (even if there is an overscroll delta). We have to wait for
290 // the regular scroll to eat all of the events.
291 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
292 gfx::ScrollOffset(10, 10));
293 SendGestureScrollBegin(false);
294 SendGestureScrollUpdate(false, gfx::Vector2dF(0, 10), gfx::Vector2dF(0, 10));
295 SendGestureScrollUpdate(false, gfx::Vector2dF(0, 10), gfx::Vector2dF(0, 10));
296 EXPECT_EQ(0, helper_.set_stretch_amount_count());
297
298 // Now pin the -X and +Y direction. The first event will not generate a
299 // stretch
300 // because it is below the delta threshold of 10.
301 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 10),
302 gfx::ScrollOffset(10, 10));
303 SendGestureScrollUpdate(false, gfx::Vector2dF(0, 10), gfx::Vector2dF(0, 8));
304 EXPECT_EQ(0, helper_.set_stretch_amount_count());
305
306 // Make the next scroll be in the -X direction more than the +Y direction,
307 // which will erase the memory of the previous unused delta of 8.
308 SendGestureScrollUpdate(false, gfx::Vector2dF(-10, 5),
309 gfx::Vector2dF(-8, 10));
310 EXPECT_EQ(0, helper_.set_stretch_amount_count());
311
312 // Now push against the pinned +Y direction again by 8. We reset the
313 // previous delta, so this will not generate a stretch.
314 SendGestureScrollUpdate(false, gfx::Vector2dF(0, 10), gfx::Vector2dF(0, 8));
315 EXPECT_EQ(0, helper_.set_stretch_amount_count());
316
317 // Push against +Y by another 8. This gets us above the delta threshold of
318 // 10, so we should now have had the stretch set, and it should be in the
319 // +Y direction. The scroll in the -X direction should have been forgotten.
320 SendGestureScrollUpdate(false, gfx::Vector2dF(0, 10), gfx::Vector2dF(0, 8));
321 EXPECT_EQ(1, helper_.set_stretch_amount_count());
322 EXPECT_EQ(0.f, helper_.StretchAmount().x());
323 EXPECT_LT(0.f, helper_.StretchAmount().y());
324
325 // End the gesture. Because there is a non-zero stretch, we should be in the
326 // animated state, and should have had a frame requested.
327 EXPECT_EQ(0, helper_.request_begin_frame_count());
328 SendGestureScrollEnd();
329 EXPECT_EQ(1, helper_.request_begin_frame_count());
330 }
331
332 // Verify that a stretch caused by a momentum scroll will switch to the
205 // animating mode, where input events are ignored, and the stretch is updated 333 // animating mode, where input events are ignored, and the stretch is updated
206 // while animating. 334 // while animating.
207 TEST_F(ScrollElasticityControllerTest, MomentumAnimate) { 335 TEST_F(ScrollElasticityControllerTest, MomentumAnimate) {
208 // Do an active scroll, then switch to the momentum phase and scroll for a 336 // Do an active scroll, then switch to the momentum phase and scroll for a
209 // bit. 337 // bit.
210 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), 338 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
211 gfx::ScrollOffset(10, 10)); 339 gfx::ScrollOffset(10, 10));
212 SendMouseWheelEvent(PhaseBegan, PhaseNone); 340 SendMouseWheelEvent(PhaseBegan, PhaseNone);
213 SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80), 341 SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80),
214 gfx::Vector2dF(0, 0)); 342 gfx::Vector2dF(0, 0));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count()); 418 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
291 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count()); 419 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count());
292 } 420 }
293 421
294 // After coming to rest, no subsequent animate calls change anything. 422 // After coming to rest, no subsequent animate calls change anything.
295 TickCurrentTimeAndAnimate(); 423 TickCurrentTimeAndAnimate();
296 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count()); 424 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
297 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count()); 425 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count());
298 } 426 }
299 427
300 // Verify that an stretch opposing a scroll is correctly resolved. 428 // Verify that a stretch caused by a momentum scroll will switch to the
429 // animating mode, where input events are ignored, and the stretch is updated
430 // while animating.
431 TEST_F(ScrollElasticityControllerTest, GestureBased_MomentumAnimate) {
432 // Do an active scroll, then switch to the momentum phase and scroll for a
433 // bit.
434 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
435 gfx::ScrollOffset(10, 10));
436 SendGestureScrollBegin(false);
437 SendGestureScrollUpdate(false, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, 0));
438 SendGestureScrollUpdate(false, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, 0));
439 SendGestureScrollUpdate(false, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, 0));
440 SendGestureScrollEnd();
441 SendGestureScrollBegin(true);
442 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, 0));
443 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, 0));
444 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, 0));
445 EXPECT_EQ(0, helper_.set_stretch_amount_count());
446
447 // Hit the -Y edge and overscroll slightly, but not enough to go over the
448 // threshold to cause a stretch.
449 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 0),
450 gfx::ScrollOffset(10, 10));
451 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, -8));
452 EXPECT_EQ(0, helper_.set_stretch_amount_count());
453 EXPECT_EQ(0, helper_.request_begin_frame_count());
454
455 // Take another step, this time going over the threshold. This should update
456 // the stretch amount, and then switch to the animating mode.
457 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, -80));
458 EXPECT_EQ(1, helper_.set_stretch_amount_count());
459 EXPECT_EQ(1, helper_.request_begin_frame_count());
460 EXPECT_GT(-1.f, helper_.StretchAmount().y());
461
462 // Subsequent momentum events should do nothing.
463 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, -80));
464 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, -80));
465 SendGestureScrollUpdate(true, gfx::Vector2dF(0, -80), gfx::Vector2dF(0, -80));
466 SendGestureScrollEnd();
467 EXPECT_EQ(1, helper_.set_stretch_amount_count());
468 EXPECT_EQ(1, helper_.request_begin_frame_count());
469
470 // Subsequent animate events should update the stretch amount and request
471 // another frame.
472 TickCurrentTimeAndAnimate();
473 EXPECT_EQ(2, helper_.set_stretch_amount_count());
474 EXPECT_EQ(2, helper_.request_begin_frame_count());
475 EXPECT_GT(-1.f, helper_.StretchAmount().y());
476
477 // Touching the trackpad (a PhaseMayBegin event) should disable animation.
478 SendGestureScrollBegin(false);
479 TickCurrentTimeAndAnimate();
480 EXPECT_EQ(2, helper_.set_stretch_amount_count());
481 EXPECT_EQ(2, helper_.request_begin_frame_count());
482
483 // Releasing the trackpad should re-enable animation.
484 SendGestureScrollEnd();
485 EXPECT_EQ(2, helper_.set_stretch_amount_count());
486 EXPECT_EQ(3, helper_.request_begin_frame_count());
487 TickCurrentTimeAndAnimate();
488 EXPECT_EQ(3, helper_.set_stretch_amount_count());
489 EXPECT_EQ(4, helper_.request_begin_frame_count());
490
491 // Keep animating frames until the stretch returns to rest.
492 int stretch_count = 3;
493 int begin_frame_count = 4;
494 while (1) {
495 TickCurrentTimeAndAnimate();
496 if (helper_.StretchAmount().IsZero()) {
497 stretch_count += 1;
498 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
499 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count());
500 break;
501 }
502 stretch_count += 1;
503 begin_frame_count += 1;
504 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
505 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count());
506 }
507
508 // After coming to rest, no subsequent animate calls change anything.
509 TickCurrentTimeAndAnimate();
510 EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
511 EXPECT_EQ(begin_frame_count, helper_.request_begin_frame_count());
512 }
513
514 // Verify that a stretch opposing a scroll is correctly resolved.
301 TEST_F(ScrollElasticityControllerTest, ReconcileStretchAndScroll) { 515 TEST_F(ScrollElasticityControllerTest, ReconcileStretchAndScroll) {
302 SendMouseWheelEvent(PhaseBegan, PhaseNone); 516 SendMouseWheelEvent(PhaseBegan, PhaseNone);
303 517
304 // Verify completely knocking out the scroll in the -Y direction. 518 // Verify completely knocking out the scroll in the -Y direction.
305 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), 519 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
306 gfx::ScrollOffset(10, 10)); 520 gfx::ScrollOffset(10, 10));
307 helper_.SetStretchAmount(gfx::Vector2dF(0, -10)); 521 helper_.SetStretchAmount(gfx::Vector2dF(0, -10));
308 controller_.ReconcileStretchAndScroll(); 522 controller_.ReconcileStretchAndScroll();
309 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, -5)); 523 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, -5));
310 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 0)); 524 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 0));
(...skipping 16 matching lines...) Expand all
327 541
328 // Verify partially knocking out the scroll in the +X and +Y directions. 542 // Verify partially knocking out the scroll in the +X and +Y directions.
329 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(2, 3), 543 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(2, 3),
330 gfx::ScrollOffset(10, 10)); 544 gfx::ScrollOffset(10, 10));
331 helper_.SetStretchAmount(gfx::Vector2dF(5, 5)); 545 helper_.SetStretchAmount(gfx::Vector2dF(5, 5));
332 controller_.ReconcileStretchAndScroll(); 546 controller_.ReconcileStretchAndScroll();
333 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); 547 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
334 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(7, 8)); 548 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(7, 8));
335 } 549 }
336 550
551 // Verify that a stretch opposing a scroll is correctly resolved.
552 TEST_F(ScrollElasticityControllerTest, GestureBased_ReconcileStretchAndScroll) {
553 SendGestureScrollBegin(false);
554
555 // Verify completely knocking out the scroll in the -Y direction.
556 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
557 gfx::ScrollOffset(10, 10));
558 helper_.SetStretchAmount(gfx::Vector2dF(0, -10));
559 controller_.ReconcileStretchAndScroll();
560 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, -5));
561 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 0));
562
563 // Verify partially knocking out the scroll in the -Y direction.
564 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 8),
565 gfx::ScrollOffset(10, 10));
566 helper_.SetStretchAmount(gfx::Vector2dF(0, -5));
567 controller_.ReconcileStretchAndScroll();
568 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
569 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 3));
570
571 // Verify completely knocking out the scroll in the +X direction.
572 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
573 gfx::ScrollOffset(10, 10));
574 helper_.SetStretchAmount(gfx::Vector2dF(10, 0));
575 controller_.ReconcileStretchAndScroll();
576 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(5, 0));
577 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(10, 5));
578
579 // Verify partially knocking out the scroll in the +X and +Y directions.
580 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(2, 3),
581 gfx::ScrollOffset(10, 10));
582 helper_.SetStretchAmount(gfx::Vector2dF(5, 5));
583 controller_.ReconcileStretchAndScroll();
584 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
585 EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(7, 8));
586 }
587
337 // Verify that stretching only happens when the area is user scrollable. 588 // Verify that stretching only happens when the area is user scrollable.
338 TEST_F(ScrollElasticityControllerTest, UserScrollableRequiredForStretch) { 589 TEST_F(ScrollElasticityControllerTest, UserScrollableRequiredForStretch) {
339 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0), 590 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0),
340 gfx::ScrollOffset(10, 10)); 591 gfx::ScrollOffset(10, 10));
341 gfx::Vector2dF delta(0, -15); 592 gfx::Vector2dF delta(0, -15);
342 593
343 // Do an active scroll, and ensure that the stretch amount doesn't change, 594 // Do an active scroll, and ensure that the stretch amount doesn't change.
344 // and also that the stretch amount isn't even ever changed.
345 helper_.SetUserScrollable(false); 595 helper_.SetUserScrollable(false);
346 SendMouseWheelEvent(PhaseBegan, PhaseNone); 596 SendMouseWheelEvent(PhaseBegan, PhaseNone);
347 SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta); 597 SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta);
348 SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta); 598 SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta);
349 SendMouseWheelEvent(PhaseEnded, PhaseNone); 599 SendMouseWheelEvent(PhaseEnded, PhaseNone);
350 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); 600 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
351 EXPECT_EQ(0, helper_.set_stretch_amount_count()); 601 EXPECT_EQ(0, helper_.set_stretch_amount_count());
352 SendMouseWheelEvent(PhaseNone, PhaseBegan); 602 SendMouseWheelEvent(PhaseNone, PhaseBegan);
353 SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta); 603 SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta);
354 SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta); 604 SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta);
(...skipping 22 matching lines...) Expand all
377 int ticks_to_zero = 0; 627 int ticks_to_zero = 0;
378 while (1) { 628 while (1) {
379 TickCurrentTimeAndAnimate(); 629 TickCurrentTimeAndAnimate();
380 if (helper_.StretchAmount().IsZero()) 630 if (helper_.StretchAmount().IsZero())
381 break; 631 break;
382 ticks_to_zero += 1; 632 ticks_to_zero += 1;
383 } 633 }
384 EXPECT_GT(ticks_to_zero, 3); 634 EXPECT_GT(ticks_to_zero, 3);
385 } 635 }
386 636
637 // Verify that stretching only happens when the area is user scrollable.
638 TEST_F(ScrollElasticityControllerTest,
639 GestureBased_UserScrollableRequiredForStretch) {
640 helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0),
641 gfx::ScrollOffset(10, 10));
642 gfx::Vector2dF delta(0, -15);
643
644 // Do an active scroll, and ensure that the stretch amount doesn't change.
645 helper_.SetUserScrollable(false);
646 SendGestureScrollBegin(false);
647 SendGestureScrollUpdate(false, delta, delta);
648 SendGestureScrollUpdate(false, delta, delta);
649 SendGestureScrollEnd();
650 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
651 EXPECT_EQ(0, helper_.set_stretch_amount_count());
652 SendGestureScrollBegin(true);
653 SendGestureScrollUpdate(true, delta, delta);
654 SendGestureScrollUpdate(true, delta, delta);
655 SendGestureScrollEnd();
656 EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
657 EXPECT_EQ(0, helper_.set_stretch_amount_count());
658
659 // Re-enable user scrolling and ensure that stretching is re-enabled.
660 helper_.SetUserScrollable(true);
661 SendGestureScrollBegin(false);
662 SendGestureScrollUpdate(false, delta, delta);
663 SendGestureScrollUpdate(false, delta, delta);
664 SendGestureScrollEnd();
665 EXPECT_NE(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
666 EXPECT_GT(helper_.set_stretch_amount_count(), 0);
667 SendGestureScrollBegin(true);
668 SendGestureScrollUpdate(true, delta, delta);
669 SendGestureScrollUpdate(true, delta, delta);
670 SendGestureScrollEnd();
671 EXPECT_NE(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
672 EXPECT_GT(helper_.set_stretch_amount_count(), 0);
673
674 // Disable user scrolling and tick the timer until the stretch goes back
675 // to zero. Ensure that the return to zero doesn't happen immediately.
676 helper_.SetUserScrollable(false);
677 int ticks_to_zero = 0;
678 while (1) {
679 TickCurrentTimeAndAnimate();
680 if (helper_.StretchAmount().IsZero())
681 break;
682 ticks_to_zero += 1;
683 }
684 EXPECT_GT(ticks_to_zero, 3);
685 }
686
387 } // namespace 687 } // namespace
388 } // namespace ui 688 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/blink/input_scroll_elasticity_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698