#include "content/browser/renderer_host/overscroll_controller.h"
#include <memory>
#include "base/containers/queue.h"
#include "base/test/scoped_feature_list.h"
#include "content/browser/renderer_host/overscroll_controller_delegate.h"
#include "content/public/browser/overscroll_configuration.h"
#include "content/public/common/content_features.h"
#include "content/public/test/scoped_overscroll_modes.h"
#include "content/test/test_overscroll_delegate.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
#include "third_party/blink/public/common/input/web_input_event.h"
namespace content {
class OverscrollControllerTest : public ::testing::Test {
public:
OverscrollControllerTest(const OverscrollControllerTest&) = delete;
OverscrollControllerTest& operator=(const OverscrollControllerTest&) = delete;
protected:
OverscrollControllerTest() {}
~OverscrollControllerTest() override {}
void SetUp() override {
OverscrollConfig::ResetTouchpadOverscrollHistoryNavigationEnabled();
scoped_feature_list_.InitAndEnableFeature(
features::kTouchpadOverscrollHistoryNavigation);
delegate_ = std::make_unique<TestOverscrollDelegate>(gfx::Size(400, 300));
controller_ = std::make_unique<OverscrollController>();
controller_->set_delegate(delegate_->GetWeakPtr());
}
void TearDown() override {
controller_ = nullptr;
delegate_ = nullptr;
}
bool SimulateMouseWheel(float dx, float dy) {
DCHECK(!current_event_);
current_event_ = std::make_unique<blink::WebMouseWheelEvent>(
blink::SyntheticWebMouseWheelEventBuilder::Build(
0, 0, dx, dy, 0, ui::ScrollGranularity::kScrollByPrecisePixel));
return controller_->WillHandleEvent(*current_event_);
}
bool SimulateGestureEvent(blink::WebInputEvent::Type type,
blink::WebGestureDevice source_device,
base::TimeTicks timestamp) {
DCHECK(!current_event_);
current_event_ = std::make_unique<blink::WebGestureEvent>(
blink::SyntheticWebGestureEventBuilder::Build(type, source_device));
current_event_->SetTimeStamp(timestamp);
return controller_->WillHandleEvent(*current_event_);
}
bool SimulateGestureScrollUpdate(float dx,
float dy,
blink::WebGestureDevice device,
base::TimeTicks timestamp,
bool inertial_update) {
DCHECK(!current_event_);
auto event = std::make_unique<blink::WebGestureEvent>(
blink::SyntheticWebGestureEventBuilder::BuildScrollUpdate(dx, dy, 0,
device));
event->SetTimeStamp(timestamp);
if (inertial_update) {
event->data.scroll_update.inertial_phase =
blink::WebGestureEvent::InertialPhaseState::kMomentum;
}
current_event_ = std::move(event);
return controller_->WillHandleEvent(*current_event_);
}
bool SimulateGestureFlingStart(float velocity_x,
float velocity_y,
blink::WebGestureDevice device,
base::TimeTicks timestamp) {
DCHECK(!current_event_);
current_event_ = std::make_unique<blink::WebGestureEvent>(
blink::SyntheticWebGestureEventBuilder::BuildFling(velocity_x,
velocity_y, device));
current_event_->SetTimeStamp(timestamp);
return controller_->WillHandleEvent(*current_event_);
}
void SimulateAck(bool processed) {
DCHECK(current_event_);
controller_->ReceivedEventACK(*current_event_, processed);
current_event_ = nullptr;
}
TestOverscrollDelegate* delegate() const { return delegate_.get(); }
OverscrollMode controller_mode() const {
return controller_->overscroll_mode_;
}
OverscrollSource controller_source() const {
return controller_->overscroll_source_;
}
private:
std::unique_ptr<TestOverscrollDelegate> delegate_;
std::unique_ptr<OverscrollController> controller_;
std::unique_ptr<blink::WebInputEvent> current_event_;
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(OverscrollControllerTest, MouseWheelConsumedPreventsOverscroll) {
const base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(SimulateMouseWheel(10, 0));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
10, 0, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
EXPECT_FALSE(SimulateMouseWheel(10, 0));
SimulateAck(true);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
EXPECT_FALSE(SimulateMouseWheel(100, 0));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
100, 0, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest,
InertialGestureScrollUpdateCompletesOverscroll) {
const base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
200, 0, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_EAST, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source());
EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
EXPECT_FALSE(SimulateGestureScrollUpdate(
100, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_EAST, delegate()->completed_mode());
EXPECT_TRUE(SimulateGestureScrollUpdate(
100, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
}
TEST_F(OverscrollControllerTest, InertialGSUsDoNotStartOverscroll) {
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(SimulateGestureScrollUpdate(
100, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest, OnlyProcessLimitedInertialGSUEvents) {
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
61, 0, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_EAST, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source());
EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_TRUE(SimulateGestureScrollUpdate(
1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
SimulateAck(true);
EXPECT_EQ(OVERSCROLL_EAST, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source());
EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(10);
EXPECT_TRUE(SimulateGestureScrollUpdate(
1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
SimulateAck(true);
EXPECT_EQ(OVERSCROLL_EAST, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source());
EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(291);
EXPECT_TRUE(SimulateGestureScrollUpdate(
1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
SimulateAck(true);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(100);
EXPECT_TRUE(SimulateGestureScrollUpdate(
1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true));
}
TEST_F(OverscrollControllerTest, PullToRefreshDisabled) {
ScopedPullToRefreshMode scoped_mode(
OverscrollConfig::PullToRefreshMode::kDisabled);
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(SimulateGestureFlingStart(
0, 0, blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest, PullToRefreshEnabled) {
ScopedPullToRefreshMode scoped_mode(
OverscrollConfig::PullToRefreshMode::kEnabled);
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(SimulateGestureFlingStart(
0, 0, blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest, PullToRefreshEnabledTouchscreen) {
ScopedPullToRefreshMode scoped_mode(
OverscrollConfig::PullToRefreshMode::kEnabledTouchschreen);
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(SimulateGestureFlingStart(
0, 0, blink::WebGestureDevice::kTouchpad, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest, DisableTouchpadOverscrollHistoryNavigation) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(
features::kTouchpadOverscrollHistoryNavigation);
ASSERT_FALSE(OverscrollConfig::TouchpadOverscrollHistoryNavigationEnabled());
const base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(SimulateGestureScrollUpdate(
200, 0, blink::WebGestureDevice::kTouchpad, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest, PullToRefreshBeforeCoolOff) {
ScopedPullToRefreshMode scoped_mode(
OverscrollConfig::PullToRefreshMode::kEnabled);
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(true);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(500);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(500);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(500);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
TEST_F(OverscrollControllerTest, PullToRefreshAfterCoolOff) {
ScopedPullToRefreshMode scoped_mode(
OverscrollConfig::PullToRefreshMode::kEnabled);
base::TimeTicks timestamp =
blink::WebInputEvent::GetStaticTimeStampForTests();
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(true);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Milliseconds(500);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_FALSE(SimulateGestureScrollUpdate(
0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode());
EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source());
EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
timestamp += base::Seconds(1);
EXPECT_FALSE(
SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd,
blink::WebGestureDevice::kTouchscreen, timestamp));
SimulateAck(false);
EXPECT_EQ(OVERSCROLL_NONE, controller_mode());
EXPECT_EQ(OverscrollSource::NONE, controller_source());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode());
EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode());
}
}