| 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..23eb450f72ccd879f62ff340707b6cca2e0d4d20 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) {
|
| + // Send the pending GSE with |flingMightHappenNext = 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) {
|
| // 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 fling_might_happen_next) {
|
| 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.flingMightHappenNext = fling_might_happen_next;
|
| scroll_end.data.scrollEnd.inertialPhase =
|
| update_event.data.scrollUpdate.inertialPhase;
|
| scroll_end.data.scrollEnd.deltaUnits =
|
|
|