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

Unified Diff: content/browser/renderer_host/input/mouse_wheel_event_queue.cc

Issue 2486673008: Touchpad scroll latching enabled for Mac behind flag. (Closed)
Patch Set: mayPrecedeFling->precedeFling Created 4 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/browser/renderer_host/input/mouse_wheel_event_queue.cc
diff --git a/content/browser/renderer_host/input/mouse_wheel_event_queue.cc b/content/browser/renderer_host/input/mouse_wheel_event_queue.cc
index 72d9e95ca706eda95fbe9e2905da993b41e3dd24..901a00f2caad500fb261282def62dfe0470575e5 100644
--- a/content/browser/renderer_host/input/mouse_wheel_event_queue.cc
+++ b/content/browser/renderer_host/input/mouse_wheel_event_queue.cc
@@ -149,6 +149,8 @@ void MouseWheelEventQueue::ProcessMouseWheelAck(
}
bool current_phase_ended = false;
+ bool scroll_phase_ended = false;
+ bool momentum_phase_ended = false;
bool has_phase_info = false;
if (event_sent_for_gesture_ack_->event.phase !=
@@ -156,14 +158,15 @@ void MouseWheelEventQueue::ProcessMouseWheelAck(
event_sent_for_gesture_ack_->event.momentumPhase !=
blink::WebMouseWheelEvent::PhaseNone) {
has_phase_info = true;
- current_phase_ended = event_sent_for_gesture_ack_->event.phase ==
- blink::WebMouseWheelEvent::PhaseEnded ||
- event_sent_for_gesture_ack_->event.phase ==
- blink::WebMouseWheelEvent::PhaseCancelled ||
- event_sent_for_gesture_ack_->event.momentumPhase ==
- blink::WebMouseWheelEvent::PhaseEnded ||
- event_sent_for_gesture_ack_->event.momentumPhase ==
- blink::WebMouseWheelEvent::PhaseCancelled;
+ scroll_phase_ended = event_sent_for_gesture_ack_->event.phase ==
+ blink::WebMouseWheelEvent::PhaseEnded ||
+ event_sent_for_gesture_ack_->event.phase ==
+ blink::WebMouseWheelEvent::PhaseCancelled;
+ momentum_phase_ended = event_sent_for_gesture_ack_->event.momentumPhase ==
+ blink::WebMouseWheelEvent::PhaseEnded ||
+ event_sent_for_gesture_ack_->event.momentumPhase ==
+ blink::WebMouseWheelEvent::PhaseCancelled;
+ current_phase_ended = scroll_phase_ended || momentum_phase_ended;
}
bool needs_update = scroll_update.data.scrollUpdate.deltaX != 0 ||
@@ -177,11 +180,21 @@ void MouseWheelEventQueue::ProcessMouseWheelAck(
bool empty_sequence =
!needs_update && needs_scroll_begin_ && current_phase_ended;
+ if (enable_scroll_latching_ &&
+ event_sent_for_gesture_ack_->event.momentumPhase ==
+ blink::WebMouseWheelEvent::PhaseBegan) {
+ // Send the pending GSE with |precedeFling = true|.
+ if (scroll_end_timer_.IsRunning()) {
+ scroll_end_timer_.Stop();
+ SendScrollEnd(last_scroll_update_, false, true);
+ }
+ }
+
if (needs_update || !empty_sequence) {
if (needs_scroll_begin_) {
// If no GSB has been sent, it will be a non-synthetic GSB.
SendScrollBegin(scroll_update, false);
- } else if (has_phase_info) {
+ } else if (has_phase_info && !enable_scroll_latching_) {
// If a GSB has been sent, generate a synthetic GSB if we have phase
// information. This should be removed once crbug.com/526463 is fully
// implemented.
@@ -196,23 +209,29 @@ void MouseWheelEventQueue::ProcessMouseWheelAck(
client_->ForwardGestureEventWithLatencyInfo(scroll_update, latency);
}
- if (current_phase_ended) {
- // Non-synthetic GSEs are sent when the current phase is canceled or
- // ended.
- SendScrollEnd(scroll_update, false);
- } else if (has_phase_info) {
+ if ((enable_scroll_latching_ && momentum_phase_ended) ||
+ (!enable_scroll_latching_ && current_phase_ended)) {
+ // Send GSE with |precedeFling = false| if scroll latching is enabled
+ // and no fling is going to happen next, or if scroll latching is
+ // disabled and current phase ended.
+ SendScrollEnd(scroll_update, false, false);
+ } else if (has_phase_info && !enable_scroll_latching_) {
// Generate a synthetic GSE for every update to force hit testing so
// that the non-latching behavior is preserved. Remove once
// crbug.com/526463 is fully implemented.
- SendScrollEnd(scroll_update, true);
- } else {
+ SendScrollEnd(scroll_update, true, false);
+ } else if ((enable_scroll_latching_ && scroll_phase_ended) ||
+ !has_phase_info) {
+ // If scroll latching is enabled and a fling might happen next, or no
+ // phase info exists, start the scroll_end_timer_.
scroll_end_timer_.Start(
FROM_HERE,
base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
base::Bind(&MouseWheelEventQueue::SendScrollEnd,
- base::Unretained(this), scroll_update, false));
+ base::Unretained(this), scroll_update, false, false));
}
}
+ last_scroll_update_ = scroll_update;
}
event_sent_for_gesture_ack_.reset();
@@ -255,7 +274,8 @@ void MouseWheelEventQueue::TryForwardNextEventToRenderer() {
}
void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
- bool synthetic) {
+ bool synthetic,
+ bool precede_fling) {
DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_);
WebGestureEvent scroll_end(update_event);
@@ -264,6 +284,7 @@ void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
scroll_end.type = WebInputEvent::GestureScrollEnd;
scroll_end.resendingPluginId = -1;
scroll_end.data.scrollEnd.synthetic = synthetic;
+ scroll_end.data.scrollEnd.precedeFling = precede_fling;
scroll_end.data.scrollEnd.inertialPhase =
update_event.data.scrollUpdate.inertialPhase;
scroll_end.data.scrollEnd.deltaUnits =

Powered by Google App Engine
This is Rietveld 408576698