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

Unified Diff: content/renderer/input/input_scroll_elasticity_controller.cc

Issue 713413002: Hook ScrollElasticityController to InputHandlerProxy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback Created 6 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/input/input_scroll_elasticity_controller.cc
diff --git a/content/renderer/input/input_scroll_elasticity_controller.cc b/content/renderer/input/input_scroll_elasticity_controller.cc
index 059bc9d51270ef2ea31dcb07ad392d45768ea143..0269fad60276d0aaf35ca5d42000fa3c23584b75 100644
--- a/content/renderer/input/input_scroll_elasticity_controller.cc
+++ b/content/renderer/input/input_scroll_elasticity_controller.cc
@@ -6,8 +6,8 @@
#include <math.h>
-// ScrollElasticityController and ScrollElasticityControllerClient are based on
-// WebKit/Source/platform/mac/ScrollElasticityController.mm
+// InputScrollElasticityController is based on
+// WebKit/Source/platform/mac/InputScrollElasticityController.mm
/*
* Copyright (C) 2011 Apple Inc. All rights reserved.
*
@@ -88,18 +88,53 @@ float ScrollWheelMultiplier() {
} // namespace
-ScrollElasticityController::ScrollElasticityController(
- ScrollElasticityControllerClient* client)
- : client_(client),
+InputScrollElasticityController::InputScrollElasticityController(
+ cc::ScrollElasticityHelper* helper)
+ : helper_(helper),
in_scroll_gesture_(false),
has_scrolled_(false),
momentum_scroll_in_progress_(false),
ignore_momentum_scrolls_(false),
last_momentum_scroll_timestamp_(0),
- snap_rubberband_timer_is_active_(false) {
+ snap_rubberband_timer_is_active_(false),
+ weak_factory_(this) {
}
-bool ScrollElasticityController::HandleWheelEvent(
+InputScrollElasticityController::~InputScrollElasticityController() {
+ DCHECK(!helper_);
+}
+
+base::WeakPtr<InputScrollElasticityController>
+InputScrollElasticityController::GetWeakPtr() {
+ if (helper_)
+ return weak_factory_.GetWeakPtr();
+ return base::WeakPtr<InputScrollElasticityController>();
+}
+
+void InputScrollElasticityController::WillShutdown() {
+ weak_factory_.InvalidateWeakPtrs();
+ helper_ = NULL;
+}
+
+void InputScrollElasticityController::Animate(base::TimeTicks time) {
+ if (!snap_rubberband_timer_is_active_)
+ return;
+
+ // TODO(ccameron): This should send the time parameter to the snap function,
+ // so that animation can be based on frame time, not arbitrarily-sampled
+ // clock time.
+ SnapRubberbandTimerFired();
+}
+
+void InputScrollElasticityController::ObserveWheelEventAndResult(
+ const blink::WebMouseWheelEvent& wheel_event,
+ const cc::InputHandlerScrollResult& scroll_result) {
+ // TODO(ccameron): Pull non-over-scrolling scroll logic out of
+ // HandleWheelEvent, and read the scroll result instead.
+ HandleWheelEvent(wheel_event);
+}
+
+bool InputScrollElasticityController::HandleWheelEvent(
const blink::WebMouseWheelEvent& wheel_event) {
if (wheel_event.phase == blink::WebMouseWheelEvent::PhaseMayBegin)
return false;
@@ -112,7 +147,7 @@ bool ScrollElasticityController::HandleWheelEvent(
last_momentum_scroll_timestamp_ = 0;
momentum_velocity_ = gfx::Vector2dF();
- gfx::Vector2dF stretch_amount = client_->StretchAmount();
+ gfx::Vector2dF stretch_amount = helper_->StretchAmount();
stretch_scroll_force_.set_x(
ReboundDeltaForElasticDelta(stretch_amount.x()));
stretch_scroll_force_.set_y(
@@ -127,7 +162,7 @@ bool ScrollElasticityController::HandleWheelEvent(
// return ShouldHandleEvent(wheel_event);
// This logic is incorrect, since diagonal wheel events are not consumed.
- if (client_->PinnedInDirection(gfx::Vector2dF(-wheel_event.deltaX, 0))) {
+ if (helper_->PinnedInDirection(gfx::Vector2dF(-wheel_event.deltaX, 0))) {
if (wheel_event.deltaX > 0 && !wheel_event.canRubberbandLeft)
return false;
if (wheel_event.deltaX < 0 && !wheel_event.canRubberbandRight)
@@ -166,7 +201,7 @@ bool ScrollElasticityController::HandleWheelEvent(
// points and put it into overflow.
overflow_scroll_delta_ = gfx::Vector2dF();
- gfx::Vector2dF stretch_amount = client_->StretchAmount();
+ gfx::Vector2dF stretch_amount = helper_->StretchAmount();
bool is_vertically_stretched = stretch_amount.y() != 0.f;
bool is_horizontally_stretched = stretch_amount.x() != 0.f;
@@ -206,7 +241,7 @@ bool ScrollElasticityController::HandleWheelEvent(
if (is_vertically_stretched) {
if (!is_horizontally_stretched &&
- client_->PinnedInDirection(gfx::Vector2dF(delta_x, 0))) {
+ helper_->PinnedInDirection(gfx::Vector2dF(delta_x, 0))) {
// Stretching only in the vertical.
if (delta_y != 0 &&
(fabsf(delta_x / delta_y) < kRubberbandDirectionLockStretchRatio))
@@ -220,7 +255,7 @@ bool ScrollElasticityController::HandleWheelEvent(
}
} else if (is_horizontally_stretched) {
// Stretching only in the horizontal.
- if (client_->PinnedInDirection(gfx::Vector2dF(0, delta_y))) {
+ if (helper_->PinnedInDirection(gfx::Vector2dF(0, delta_y))) {
if (delta_x != 0 &&
(fabsf(delta_y / delta_x) < kRubberbandDirectionLockStretchRatio))
delta_y = 0;
@@ -233,7 +268,7 @@ bool ScrollElasticityController::HandleWheelEvent(
}
} else {
// Not stretching at all yet.
- if (client_->PinnedInDirection(gfx::Vector2dF(delta_x, delta_y))) {
+ if (helper_->PinnedInDirection(gfx::Vector2dF(delta_x, delta_y))) {
if (fabsf(delta_y) >= fabsf(delta_x)) {
if (fabsf(delta_x) < kRubberbandMinimumRequiredDeltaBeforeStretch) {
overflow_scroll_delta_.set_x(overflow_scroll_delta_.x() + delta_x);
@@ -252,41 +287,41 @@ bool ScrollElasticityController::HandleWheelEvent(
is_horizontally_stretched)) {
if (delta_y != 0) {
delta_y *= ScrollWheelMultiplier();
- client_->ImmediateScrollBy(gfx::Vector2dF(0, delta_y));
+ helper_->ImmediateScrollBy(gfx::Vector2dF(0, delta_y));
}
if (delta_x != 0) {
delta_x *= ScrollWheelMultiplier();
- client_->ImmediateScrollBy(gfx::Vector2dF(delta_x, 0));
+ helper_->ImmediateScrollBy(gfx::Vector2dF(delta_x, 0));
}
} else {
- if (!client_->AllowsHorizontalStretching()) {
+ if (!helper_->AllowsHorizontalStretching()) {
delta_x = 0;
event_coalesced_delta_x = 0;
} else if ((delta_x != 0) && !is_horizontally_stretched &&
- !client_->PinnedInDirection(gfx::Vector2dF(delta_x, 0))) {
+ !helper_->PinnedInDirection(gfx::Vector2dF(delta_x, 0))) {
delta_x *= ScrollWheelMultiplier();
- client_->ImmediateScrollByWithoutContentEdgeConstraints(
+ helper_->ImmediateScrollByWithoutContentEdgeConstraints(
gfx::Vector2dF(delta_x, 0));
delta_x = 0;
}
- if (!client_->AllowsVerticalStretching()) {
+ if (!helper_->AllowsVerticalStretching()) {
delta_y = 0;
event_coalesced_delta_y = 0;
} else if ((delta_y != 0) && !is_vertically_stretched &&
- !client_->PinnedInDirection(gfx::Vector2dF(0, delta_y))) {
+ !helper_->PinnedInDirection(gfx::Vector2dF(0, delta_y))) {
delta_y *= ScrollWheelMultiplier();
- client_->ImmediateScrollByWithoutContentEdgeConstraints(
+ helper_->ImmediateScrollByWithoutContentEdgeConstraints(
gfx::Vector2dF(0, delta_y));
delta_y = 0;
}
- gfx::Vector2dF stretch_amount = client_->StretchAmount();
+ gfx::Vector2dF stretch_amount = helper_->StretchAmount();
if (momentum_scroll_in_progress_) {
- if ((client_->PinnedInDirection(gfx::Vector2dF(
+ if ((helper_->PinnedInDirection(gfx::Vector2dF(
event_coalesced_delta_x, event_coalesced_delta_y)) ||
(fabsf(event_coalesced_delta_x) + fabsf(event_coalesced_delta_y) <=
0)) &&
@@ -304,7 +339,7 @@ bool ScrollElasticityController::HandleWheelEvent(
ceilf(ElasticDeltaForReboundDelta(stretch_scroll_force_.x())),
ceilf(ElasticDeltaForReboundDelta(stretch_scroll_force_.y())));
- client_->ImmediateScrollByWithoutContentEdgeConstraints(damped_delta -
+ helper_->ImmediateScrollByWithoutContentEdgeConstraints(damped_delta -
stretch_amount);
}
}
@@ -335,12 +370,12 @@ float RoundToDevicePixelTowardZero(float num) {
} // namespace
-void ScrollElasticityController::SnapRubberbandTimerFired() {
+void InputScrollElasticityController::SnapRubberbandTimerFired() {
if (!momentum_scroll_in_progress_ || ignore_momentum_scrolls_) {
float time_delta = (base::Time::Now() - start_time_).InSecondsF();
if (start_stretch_ == gfx::Vector2dF()) {
- start_stretch_ = client_->StretchAmount();
+ start_stretch_ = helper_->StretchAmount();
if (start_stretch_ == gfx::Vector2dF()) {
StopSnapRubberbandTimer();
@@ -351,7 +386,7 @@ void ScrollElasticityController::SnapRubberbandTimerFired() {
return;
}
- orig_origin_ = client_->AbsoluteScrollPosition() - start_stretch_;
+ orig_origin_ = helper_->AbsoluteScrollPosition() - start_stretch_;
orig_velocity_ = momentum_velocity_;
// Just like normal scrolling, prefer vertical rubberbanding
@@ -360,12 +395,12 @@ void ScrollElasticityController::SnapRubberbandTimerFired() {
// Don't rubber-band horizontally if it's not possible to scroll
// horizontally
- if (!client_->CanScrollHorizontally())
+ if (!helper_->CanScrollHorizontally())
orig_velocity_.set_x(0);
// Don't rubber-band vertically if it's not possible to scroll
// vertically
- if (!client_->CanScrollVertically())
+ if (!helper_->CanScrollVertically())
orig_velocity_.set_y(0);
}
@@ -376,15 +411,15 @@ void ScrollElasticityController::SnapRubberbandTimerFired() {
start_stretch_.y(), -orig_velocity_.y(), time_delta)));
if (fabs(delta.x()) >= 1 || fabs(delta.y()) >= 1) {
- client_->ImmediateScrollByWithoutContentEdgeConstraints(
- gfx::Vector2dF(delta.x(), delta.y()) - client_->StretchAmount());
+ helper_->ImmediateScrollByWithoutContentEdgeConstraints(
+ gfx::Vector2dF(delta.x(), delta.y()) - helper_->StretchAmount());
- gfx::Vector2dF new_stretch = client_->StretchAmount();
+ gfx::Vector2dF new_stretch = helper_->StretchAmount();
stretch_scroll_force_.set_x(ReboundDeltaForElasticDelta(new_stretch.x()));
stretch_scroll_force_.set_y(ReboundDeltaForElasticDelta(new_stretch.y()));
} else {
- client_->AdjustScrollPositionToBoundsIfNecessary();
+ helper_->AdjustScrollPositionToBoundsIfNecessary();
StopSnapRubberbandTimer();
stretch_scroll_force_ = gfx::Vector2dF();
@@ -397,22 +432,24 @@ void ScrollElasticityController::SnapRubberbandTimerFired() {
start_time_ = base::Time::Now();
start_stretch_ = gfx::Vector2dF();
}
+
+ helper_->SnapRubberbandTimerFired();
}
-bool ScrollElasticityController::IsRubberbandInProgress() const {
+bool InputScrollElasticityController::IsRubberbandInProgress() const {
if (!in_scroll_gesture_ && !momentum_scroll_in_progress_ &&
!snap_rubberband_timer_is_active_)
return false;
- return !client_->StretchAmount().IsZero();
+ return !helper_->StretchAmount().IsZero();
}
-void ScrollElasticityController::StopSnapRubberbandTimer() {
- client_->StopSnapRubberbandTimer();
+void InputScrollElasticityController::StopSnapRubberbandTimer() {
+ helper_->StopSnapRubberbandTimer();
snap_rubberband_timer_is_active_ = false;
}
-void ScrollElasticityController::SnapRubberband() {
+void InputScrollElasticityController::SnapRubberband() {
double time_delta = SystemUptime() - last_momentum_scroll_timestamp_;
if (last_momentum_scroll_timestamp_ &&
time_delta >= kScrollVelocityZeroingTimeout)
@@ -430,18 +467,18 @@ void ScrollElasticityController::SnapRubberband() {
// If there's no momentum scroll or stretch amount, no need to start the
// timer.
if (!momentum_scroll_in_progress_ &&
- client_->StretchAmount() == gfx::Vector2dF()) {
+ helper_->StretchAmount() == gfx::Vector2dF()) {
start_time_ = base::Time();
stretch_scroll_force_ = gfx::Vector2dF();
return;
}
start_time_ = base::Time::Now();
- client_->StartSnapRubberbandTimer();
+ helper_->StartSnapRubberbandTimer();
snap_rubberband_timer_is_active_ = true;
}
-bool ScrollElasticityController::ShouldHandleEvent(
+bool InputScrollElasticityController::ShouldHandleEvent(
const blink::WebMouseWheelEvent& wheel_event) {
// Once any scrolling has happened, all future events should be handled.
if (has_scrolled_)
@@ -451,12 +488,12 @@ bool ScrollElasticityController::ShouldHandleEvent(
if (wheel_event.deltaX == 0 && wheel_event.deltaY == 0)
return false;
- // If the client isn't pinned, then the event is guaranteed to cause
+ // If the helper isn't pinned, then the event is guaranteed to cause
// scrolling.
- if (!client_->PinnedInDirection(gfx::Vector2dF(-wheel_event.deltaX, 0)))
+ if (!helper_->PinnedInDirection(gfx::Vector2dF(-wheel_event.deltaX, 0)))
return true;
- // If the event is pinned, then the client can't scroll, but it might rubber
+ // If the event is pinned, then the helper can't scroll, but it might rubber
// band.
// Check if the event allows rubber banding.
if (wheel_event.deltaY == 0) {

Powered by Google App Engine
This is Rietveld 408576698