Chromium Code Reviews| 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..a854dda7e94e2f60e17d07a4bf6630319d79c28a 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 |mayPrecedeFling = 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,24 @@ 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)) { |
| + SendScrollEnd(scroll_update, false, false); |
|
tdresser
2016/11/28 15:25:17
I think a comment here would be useful.
sahel
2016/11/29 18:57:16
Done.
|
| + } 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) { |
|
tdresser
2016/11/28 15:25:17
A comment might also be useful here.
sahel
2016/11/29 18:57:16
Done.
|
| 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 +269,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 +279,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 = |