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

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: merge conflicts resolved. 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..6c1341ce25eeebff21c4d4b1b5c315922da1932b 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,25 @@ void MouseWheelEventQueue::ProcessMouseWheelAck(
bool empty_sequence =
!needs_update && needs_scroll_begin_ && current_phase_ended;
+ if (has_phase_info && enable_scroll_latching_) {
+ if (event_sent_for_gesture_ack_->event.momentumPhase ==
+ blink::WebMouseWheelEvent::PhaseBegan) {
tdresser 2016/11/22 21:44:40 Should we combine the two nested if's into a singl
sahel 2016/11/24 15:28:55 Done.
+ // Send the pending GSE with |mayPrecedeFling = true|.
+ if (scroll_end_timer_.IsRunning()) {
+ scroll_end_timer_.Stop();
+ SendScrollEnd(last_scroll_update_, false, true);
+ } else {
+ // GSE is already sent.
+ DCHECK(needs_scroll_begin_ && current_phase_ended);
+ }
+ }
+ }
+
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.
@@ -199,20 +216,40 @@ void MouseWheelEventQueue::ProcessMouseWheelAck(
if (current_phase_ended) {
dtapuska 2016/11/22 22:10:34 Can these blocks of code be reduced a bit to be:
sahel 2016/11/24 15:28:55 Done.
// Non-synthetic GSEs are sent when the current phase is canceled or
// ended.
- SendScrollEnd(scroll_update, false);
+ if (enable_scroll_latching_) {
+ if (momentum_phase_ended) {
+ SendScrollEnd(scroll_update, false, false);
+ } else {
+ // Don't send the ScrollEnd right away, instead set a timer
+ // and wait to see if a MouseWheelEvent with momentum phase (fling)
+ // arrives or not.
+ DCHECK(scroll_phase_ended);
+ scroll_end_timer_.Start(
+ FROM_HERE,
+ base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
+ base::Bind(&MouseWheelEventQueue::SendScrollEnd,
+ base::Unretained(this), scroll_update, false,
+ false));
+ }
+
+ } else {
+ SendScrollEnd(scroll_update, false, false);
+ }
} else if (has_phase_info) {
// 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);
+ if (!enable_scroll_latching_)
+ SendScrollEnd(scroll_update, true, false);
} else {
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 +292,8 @@ void MouseWheelEventQueue::TryForwardNextEventToRenderer() {
}
void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
- bool synthetic) {
+ bool synthetic,
+ bool may_precede_fling) {
DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_);
WebGestureEvent scroll_end(update_event);
@@ -264,6 +302,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.mayPrecedeFling = may_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