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 48dbad231bb553d57a13efc79263eecab3a69f64..8e77365d5d2859e5c6f0e1bcdee40bd3fc884257 100644 |
| --- a/content/browser/renderer_host/input/mouse_wheel_event_queue.cc |
| +++ b/content/browser/renderer_host/input/mouse_wheel_event_queue.cc |
| @@ -85,6 +85,9 @@ void MouseWheelEventQueue::ProcessMouseWheelAck( |
| (scrolling_device_ == blink::WebGestureDeviceUninitialized || |
| scrolling_device_ == blink::WebGestureDeviceTouchpad)) { |
| GestureEventWithLatencyInfo scroll_update; |
| + scroll_update.event.timeStampSeconds = |
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
|
tdresser
2016/03/02 18:26:53
We should take the timestamp from the wheel event.
dtapuska
2016/03/07 18:03:59
Done.
|
| + |
| scroll_update.event.x = event_sent_for_gesture_ack_->event.x; |
| scroll_update.event.y = event_sent_for_gesture_ack_->event.y; |
| scroll_update.event.globalX = event_sent_for_gesture_ack_->event.globalX; |
| @@ -96,6 +99,9 @@ void MouseWheelEventQueue::ProcessMouseWheelAck( |
| event_sent_for_gesture_ack_->event.deltaX; |
| scroll_update.event.data.scrollUpdate.deltaY = |
| event_sent_for_gesture_ack_->event.deltaY; |
| + scroll_update.event.data.scrollUpdate.inertial = |
| + event_sent_for_gesture_ack_->event.momentumPhase != |
| + blink::WebMouseWheelEvent::PhaseNone; |
|
tdresser
2016/03/02 18:26:53
What's the momentum phase for non-mac?
Maybe add a
dtapuska
2016/03/07 18:03:59
Done.
|
| if (event_sent_for_gesture_ack_->event.scrollByPage) { |
| scroll_update.event.data.scrollUpdate.deltaUnits = |
| blink::WebGestureEvent::Page; |
| @@ -114,7 +120,30 @@ void MouseWheelEventQueue::ProcessMouseWheelAck( |
| ? blink::WebGestureEvent::PrecisePixels |
| : blink::WebGestureEvent::Pixels; |
| } |
| - SendGesture(scroll_update); |
| + |
| + bool send_end_now = false; |
| + bool schedule_end = true; |
| + |
| + if (event_sent_for_gesture_ack_->event.phase != |
| + blink::WebMouseWheelEvent::PhaseNone || |
| + event_sent_for_gesture_ack_->event.momentumPhase != |
| + blink::WebMouseWheelEvent::PhaseNone) { |
| + schedule_end = false; |
| + send_end_now = 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; |
| + } |
| + |
| + if (scroll_update.event.data.scrollUpdate.deltaX != 0 || |
| + scroll_update.event.data.scrollUpdate.deltaY != 0) |
| + SendGesture(scroll_update, schedule_end); |
| + if (send_end_now) |
| + SendScrollEnd(scroll_update.event); |
| } |
| event_sent_for_gesture_ack_.reset(); |
| @@ -160,6 +189,8 @@ void MouseWheelEventQueue::TryForwardNextEventToRenderer() { |
| void MouseWheelEventQueue::SendScrollEnd(blink::WebGestureEvent update_event) { |
| GestureEventWithLatencyInfo scroll_end; |
| + scroll_end.event.timeStampSeconds = |
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
|
tdresser
2016/03/02 18:26:53
I suppose this timestamp needs to be made up, unfo
dtapuska
2016/03/07 18:03:59
Acknowledged.
|
| scroll_end.event.type = WebInputEvent::GestureScrollEnd; |
| scroll_end.event.sourceDevice = blink::WebGestureDeviceTouchpad; |
| scroll_end.event.resendingPluginId = -1; |
| @@ -170,20 +201,24 @@ void MouseWheelEventQueue::SendScrollEnd(blink::WebGestureEvent update_event) { |
| scroll_end.event.globalX = update_event.globalX; |
| scroll_end.event.globalY = update_event.globalY; |
| - SendGesture(scroll_end); |
| + SendGesture(scroll_end, false); |
| } |
| void MouseWheelEventQueue::SendGesture( |
| - const GestureEventWithLatencyInfo& gesture) { |
| + const GestureEventWithLatencyInfo& gesture, |
| + bool generate_end) { |
| switch (gesture.event.type) { |
| case WebInputEvent::GestureScrollUpdate: |
| if (needs_scroll_begin_) { |
| GestureEventWithLatencyInfo scroll_begin(gesture); |
| + scroll_begin.event.timeStampSeconds = gesture.event.timeStampSeconds; |
| scroll_begin.event.x = gesture.event.x; |
| scroll_begin.event.y = gesture.event.y; |
| scroll_begin.event.globalX = gesture.event.globalX; |
| scroll_begin.event.globalY = gesture.event.globalY; |
| scroll_begin.event.type = WebInputEvent::GestureScrollBegin; |
| + scroll_begin.event.data.scrollBegin.inertial = |
| + gesture.event.data.scrollUpdate.inertial; |
|
tdresser
2016/03/02 18:26:53
It isn't clear to me when we'd need a scroll begin
dtapuska
2016/03/07 18:03:59
So the way phasing is done on OSX is that the phas
|
| scroll_begin.event.data.scrollBegin.deltaXHint = |
| gesture.event.data.scrollUpdate.deltaX; |
| scroll_begin.event.data.scrollBegin.deltaYHint = |
| @@ -192,11 +227,12 @@ void MouseWheelEventQueue::SendGesture( |
| scroll_begin.event.data.scrollBegin.deltaHintUnits = |
| gesture.event.data.scrollUpdate.deltaUnits; |
| - SendGesture(scroll_begin); |
| + SendGesture(scroll_begin, false); |
| } |
| - if (scroll_end_timer_.IsRunning()) { |
| + if (scroll_end_timer_.IsRunning()) |
| scroll_end_timer_.Reset(); |
| - } else { |
| + |
| + if (generate_end) { |
| scroll_end_timer_.Start( |
| FROM_HERE, |
| base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), |