| Index: content/renderer/input/input_scroll_elasticity_controller_unittest.cc
|
| diff --git a/content/renderer/input/input_scroll_elasticity_controller_unittest.cc b/content/renderer/input/input_scroll_elasticity_controller_unittest.cc
|
| deleted file mode 100644
|
| index fa2c7f19bee3ef3fcdf0d5cf69453647c09a28b4..0000000000000000000000000000000000000000
|
| --- a/content/renderer/input/input_scroll_elasticity_controller_unittest.cc
|
| +++ /dev/null
|
| @@ -1,387 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/input/input_handler.h"
|
| -#include "content/renderer/input/input_scroll_elasticity_controller.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| -
|
| -namespace content {
|
| -namespace {
|
| -
|
| -enum Phase {
|
| - PhaseNone = blink::WebMouseWheelEvent::PhaseNone,
|
| - PhaseBegan = blink::WebMouseWheelEvent::PhaseBegan,
|
| - PhaseStationary = blink::WebMouseWheelEvent::PhaseStationary,
|
| - PhaseChanged = blink::WebMouseWheelEvent::PhaseChanged,
|
| - PhaseEnded = blink::WebMouseWheelEvent::PhaseEnded,
|
| - PhaseCancelled = blink::WebMouseWheelEvent::PhaseCancelled,
|
| - PhaseMayBegin = blink::WebMouseWheelEvent::PhaseMayBegin,
|
| -};
|
| -
|
| -class MockScrollElasticityHelper : public cc::ScrollElasticityHelper {
|
| - public:
|
| - MockScrollElasticityHelper()
|
| - : is_user_scrollable_(true),
|
| - set_stretch_amount_count_(0),
|
| - request_animate_count_(0) {}
|
| - ~MockScrollElasticityHelper() override {}
|
| -
|
| - // cc::ScrollElasticityHelper implementation:
|
| - bool IsUserScrollable() const override { return is_user_scrollable_; }
|
| - gfx::Vector2dF StretchAmount() const override { return stretch_amount_; }
|
| - void SetStretchAmount(const gfx::Vector2dF& stretch_amount) override {
|
| - set_stretch_amount_count_ += 1;
|
| - stretch_amount_ = stretch_amount;
|
| - }
|
| - gfx::ScrollOffset ScrollOffset() const override { return scroll_offset_; }
|
| - gfx::ScrollOffset MaxScrollOffset() const override {
|
| - return max_scroll_offset_;
|
| - }
|
| - void ScrollBy(const gfx::Vector2dF& delta) override {
|
| - scroll_offset_ += gfx::ScrollOffset(delta);
|
| - }
|
| - void RequestAnimate() override { request_animate_count_ += 1; }
|
| -
|
| - // Counters for number of times functions were called.
|
| - int request_animate_count() const { return request_animate_count_; }
|
| - int set_stretch_amount_count() const { return set_stretch_amount_count_; }
|
| -
|
| - void SetScrollOffsetAndMaxScrollOffset(
|
| - const gfx::ScrollOffset& scroll_offset,
|
| - const gfx::ScrollOffset& max_scroll_offset) {
|
| - scroll_offset_ = scroll_offset;
|
| - max_scroll_offset_ = max_scroll_offset;
|
| - }
|
| - void SetUserScrollable(bool is_user_scrollable) {
|
| - is_user_scrollable_ = is_user_scrollable;
|
| - }
|
| -
|
| - private:
|
| - bool is_user_scrollable_;
|
| - gfx::Vector2dF stretch_amount_;
|
| - int set_stretch_amount_count_;
|
| - int request_animate_count_;
|
| -
|
| - gfx::ScrollOffset scroll_offset_;
|
| - gfx::ScrollOffset max_scroll_offset_;
|
| -};
|
| -
|
| -class ScrollElasticityControllerTest : public testing::Test {
|
| - public:
|
| - ScrollElasticityControllerTest()
|
| - : controller_(&helper_),
|
| - input_event_count_(0),
|
| - current_time_(base::TimeTicks::FromInternalValue(100000000ull)) {}
|
| - ~ScrollElasticityControllerTest() override {}
|
| -
|
| - void SendMouseWheelEvent(
|
| - Phase phase,
|
| - Phase momentum_phase,
|
| - const gfx::Vector2dF& event_delta = gfx::Vector2dF(),
|
| - const gfx::Vector2dF& overscroll_delta = gfx::Vector2dF()) {
|
| - blink::WebMouseWheelEvent event;
|
| - event.phase = static_cast<blink::WebMouseWheelEvent::Phase>(phase);
|
| - event.momentumPhase =
|
| - static_cast<blink::WebMouseWheelEvent::Phase>(momentum_phase);
|
| - event.deltaX = -event_delta.x();
|
| - event.deltaY = -event_delta.y();
|
| - TickCurrentTime();
|
| - event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF();
|
| -
|
| - cc::InputHandlerScrollResult scroll_result;
|
| - scroll_result.did_overscroll_root = !overscroll_delta.IsZero();
|
| - scroll_result.unused_scroll_delta = overscroll_delta;
|
| -
|
| - controller_.ObserveWheelEventAndResult(event, scroll_result);
|
| - input_event_count_ += 1;
|
| - }
|
| -
|
| - const base::TimeTicks& TickCurrentTime() {
|
| - current_time_ += base::TimeDelta::FromSecondsD(1 / 60.f);
|
| - return current_time_;
|
| - }
|
| - void TickCurrentTimeAndAnimate() {
|
| - TickCurrentTime();
|
| - controller_.Animate(current_time_);
|
| - }
|
| -
|
| - MockScrollElasticityHelper helper_;
|
| - InputScrollElasticityController controller_;
|
| - int input_event_count_;
|
| - base::TimeTicks current_time_;
|
| -};
|
| -
|
| -// Verify that stretching only occurs in one axis at a time, and that it
|
| -// is biased to the Y axis.
|
| -TEST_F(ScrollElasticityControllerTest, Axis) {
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0),
|
| - gfx::ScrollOffset(0, 0));
|
| -
|
| - // If we push equally in the X and Y directions, we should see a stretch only
|
| - // in the Y direction.
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(10, 10),
|
| - gfx::Vector2dF(10, 10));
|
| - EXPECT_EQ(1, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(0.f, helper_.StretchAmount().x());
|
| - EXPECT_LT(0.f, helper_.StretchAmount().y());
|
| - helper_.SetStretchAmount(gfx::Vector2dF());
|
| - EXPECT_EQ(2, helper_.set_stretch_amount_count());
|
| - SendMouseWheelEvent(PhaseEnded, PhaseNone);
|
| - EXPECT_EQ(0, helper_.request_animate_count());
|
| -
|
| - // If we push more in the X direction than the Y direction, we should see a
|
| - // stretch only in the X direction. This decision should be based on the
|
| - // input delta, not the actual overscroll delta.
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(-25, 10),
|
| - gfx::Vector2dF(-25, 40));
|
| - EXPECT_EQ(3, helper_.set_stretch_amount_count());
|
| - EXPECT_GT(0.f, helper_.StretchAmount().x());
|
| - EXPECT_EQ(0.f, helper_.StretchAmount().y());
|
| - helper_.SetStretchAmount(gfx::Vector2dF());
|
| - EXPECT_EQ(4, helper_.set_stretch_amount_count());
|
| - SendMouseWheelEvent(PhaseEnded, PhaseNone);
|
| - EXPECT_EQ(0, helper_.request_animate_count());
|
| -}
|
| -
|
| -// Verify that we need a total overscroll delta of at least 10 in a pinned
|
| -// direction before we start stretching.
|
| -TEST_F(ScrollElasticityControllerTest, MinimumDeltaBeforeStretch) {
|
| - // We should not start stretching while we are not pinned in the direction
|
| - // of the scroll (even if there is an overscroll delta). We have to wait for
|
| - // the regular scroll to eat all of the events.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
|
| - gfx::ScrollOffset(10, 10));
|
| - SendMouseWheelEvent(PhaseMayBegin, PhaseNone);
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10),
|
| - gfx::Vector2dF(0, 10));
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10),
|
| - gfx::Vector2dF(0, 10));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| -
|
| - // Now pin the -X and +Y direction. The first event will not generate a
|
| - // stretch
|
| - // because it is below the delta threshold of 10.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 10),
|
| - gfx::ScrollOffset(10, 10));
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10),
|
| - gfx::Vector2dF(0, 8));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| -
|
| - // Make the next scroll be in the -X direction more than the +Y direction,
|
| - // which will erase the memory of the previous unused delta of 8.
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(-10, 5),
|
| - gfx::Vector2dF(-8, 10));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| -
|
| - // Now push against the pinned +Y direction again by 8. We reset the
|
| - // previous delta, so this will not generate a stretch.
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10),
|
| - gfx::Vector2dF(0, 8));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| -
|
| - // Push against +Y by another 8. This gets us above the delta threshold of
|
| - // 10, so we should now have had the stretch set, and it should be in the
|
| - // +Y direction. The scroll in the -X direction should have been forgotten.
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10),
|
| - gfx::Vector2dF(0, 8));
|
| - EXPECT_EQ(1, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(0.f, helper_.StretchAmount().x());
|
| - EXPECT_LT(0.f, helper_.StretchAmount().y());
|
| -
|
| - // End the gesture. Because there is a non-zero stretch, we should be in the
|
| - // animated state, and should have had a frame requested.
|
| - EXPECT_EQ(0, helper_.request_animate_count());
|
| - SendMouseWheelEvent(PhaseEnded, PhaseNone);
|
| - EXPECT_EQ(1, helper_.request_animate_count());
|
| -}
|
| -
|
| -// Verify that an stretch caused by a momentum scroll will switch to the
|
| -// animating mode, where input events are ignored, and the stretch is updated
|
| -// while animating.
|
| -TEST_F(ScrollElasticityControllerTest, MomentumAnimate) {
|
| - // Do an active scroll, then switch to the momentum phase and scroll for a
|
| - // bit.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
|
| - gfx::ScrollOffset(10, 10));
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, 0));
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, 0));
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, 0));
|
| - SendMouseWheelEvent(PhaseEnded, PhaseNone);
|
| - SendMouseWheelEvent(PhaseNone, PhaseBegan);
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, 0));
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, 0));
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, 0));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| -
|
| - // Hit the -Y edge and overscroll slightly, but not enough to go over the
|
| - // threshold to cause a stretch.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 0),
|
| - gfx::ScrollOffset(10, 10));
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, -8));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(0, helper_.request_animate_count());
|
| -
|
| - // Take another step, this time going over the threshold. This should update
|
| - // the stretch amount, and then switch to the animating mode.
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, -80));
|
| - EXPECT_EQ(1, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(1, helper_.request_animate_count());
|
| - EXPECT_GT(-1.f, helper_.StretchAmount().y());
|
| -
|
| - // Subsequent momentum events should do nothing.
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, -80));
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, -80));
|
| - SendMouseWheelEvent(PhaseNone, PhaseEnded, gfx::Vector2dF(0, -80),
|
| - gfx::Vector2dF(0, -80));
|
| - EXPECT_EQ(1, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(1, helper_.request_animate_count());
|
| -
|
| - // Subsequent animate events should update the stretch amount and request
|
| - // another frame.
|
| - TickCurrentTimeAndAnimate();
|
| - EXPECT_EQ(2, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(2, helper_.request_animate_count());
|
| - EXPECT_GT(-1.f, helper_.StretchAmount().y());
|
| -
|
| - // Touching the trackpad (a PhaseMayBegin event) should disable animation.
|
| - SendMouseWheelEvent(PhaseMayBegin, PhaseNone);
|
| - TickCurrentTimeAndAnimate();
|
| - EXPECT_EQ(2, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(2, helper_.request_animate_count());
|
| -
|
| - // Releasing the trackpad should re-enable animation.
|
| - SendMouseWheelEvent(PhaseCancelled, PhaseNone);
|
| - EXPECT_EQ(2, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(3, helper_.request_animate_count());
|
| - TickCurrentTimeAndAnimate();
|
| - EXPECT_EQ(3, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(4, helper_.request_animate_count());
|
| -
|
| - // Keep animating frames until the stretch returns to rest.
|
| - int stretch_count = 3;
|
| - int animate_count = 4;
|
| - while (1) {
|
| - TickCurrentTimeAndAnimate();
|
| - if (helper_.StretchAmount().IsZero()) {
|
| - stretch_count += 1;
|
| - EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(animate_count, helper_.request_animate_count());
|
| - break;
|
| - }
|
| - stretch_count += 1;
|
| - animate_count += 1;
|
| - EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(animate_count, helper_.request_animate_count());
|
| - }
|
| -
|
| - // After coming to rest, no subsequent animate calls change anything.
|
| - TickCurrentTimeAndAnimate();
|
| - EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count());
|
| - EXPECT_EQ(animate_count, helper_.request_animate_count());
|
| -}
|
| -
|
| -// Verify that an stretch opposing a scroll is correctly resolved.
|
| -TEST_F(ScrollElasticityControllerTest, ReconcileStretchAndScroll) {
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| -
|
| - // Verify completely knocking out the scroll in the -Y direction.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
|
| - gfx::ScrollOffset(10, 10));
|
| - helper_.SetStretchAmount(gfx::Vector2dF(0, -10));
|
| - controller_.ReconcileStretchAndScroll();
|
| - EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, -5));
|
| - EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 0));
|
| -
|
| - // Verify partially knocking out the scroll in the -Y direction.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 8),
|
| - gfx::ScrollOffset(10, 10));
|
| - helper_.SetStretchAmount(gfx::Vector2dF(0, -5));
|
| - controller_.ReconcileStretchAndScroll();
|
| - EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
|
| - EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 3));
|
| -
|
| - // Verify completely knocking out the scroll in the +X direction.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5),
|
| - gfx::ScrollOffset(10, 10));
|
| - helper_.SetStretchAmount(gfx::Vector2dF(10, 0));
|
| - controller_.ReconcileStretchAndScroll();
|
| - EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(5, 0));
|
| - EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(10, 5));
|
| -
|
| - // Verify partially knocking out the scroll in the +X and +Y directions.
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(2, 3),
|
| - gfx::ScrollOffset(10, 10));
|
| - helper_.SetStretchAmount(gfx::Vector2dF(5, 5));
|
| - controller_.ReconcileStretchAndScroll();
|
| - EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
|
| - EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(7, 8));
|
| -}
|
| -
|
| -// Verify that stretching only happens when the area is user scrollable.
|
| -TEST_F(ScrollElasticityControllerTest, UserScrollableRequiredForStretch) {
|
| - helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0),
|
| - gfx::ScrollOffset(10, 10));
|
| - gfx::Vector2dF delta(0, -15);
|
| -
|
| - // Do an active scroll, and ensure that the stretch amount doesn't change,
|
| - // and also that the stretch amount isn't even ever changed.
|
| - helper_.SetUserScrollable(false);
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta);
|
| - SendMouseWheelEvent(PhaseEnded, PhaseNone);
|
| - EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| - SendMouseWheelEvent(PhaseNone, PhaseBegan);
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta);
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta);
|
| - SendMouseWheelEvent(PhaseNone, PhaseEnded);
|
| - EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
|
| - EXPECT_EQ(0, helper_.set_stretch_amount_count());
|
| -
|
| - // Re-enable user scrolling and ensure that stretching is re-enabled.
|
| - helper_.SetUserScrollable(true);
|
| - SendMouseWheelEvent(PhaseBegan, PhaseNone);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta);
|
| - SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta);
|
| - SendMouseWheelEvent(PhaseEnded, PhaseNone);
|
| - EXPECT_NE(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
|
| - EXPECT_GT(helper_.set_stretch_amount_count(), 0);
|
| - SendMouseWheelEvent(PhaseNone, PhaseBegan);
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta);
|
| - SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta);
|
| - SendMouseWheelEvent(PhaseNone, PhaseEnded);
|
| - EXPECT_NE(helper_.StretchAmount(), gfx::Vector2dF(0, 0));
|
| - EXPECT_GT(helper_.set_stretch_amount_count(), 0);
|
| -
|
| - // Disable user scrolling and tick the timer until the stretch goes back
|
| - // to zero. Ensure that the return to zero doesn't happen immediately.
|
| - helper_.SetUserScrollable(false);
|
| - int ticks_to_zero = 0;
|
| - while (1) {
|
| - TickCurrentTimeAndAnimate();
|
| - if (helper_.StretchAmount().IsZero())
|
| - break;
|
| - ticks_to_zero += 1;
|
| - }
|
| - EXPECT_GT(ticks_to_zero, 3);
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace content
|
|
|