Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" | 5 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 private: | 30 private: |
| 31 bool original_can_scroll_; | 31 bool original_can_scroll_; |
| 32 DISALLOW_COPY_AND_ASSIGN(QueuedWebMouseWheelEvent); | 32 DISALLOW_COPY_AND_ASSIGN(QueuedWebMouseWheelEvent); |
| 33 }; | 33 }; |
| 34 | 34 |
| 35 MouseWheelEventQueue::MouseWheelEventQueue(MouseWheelEventQueueClient* client, | 35 MouseWheelEventQueue::MouseWheelEventQueue(MouseWheelEventQueueClient* client, |
| 36 bool send_gestures, | 36 bool send_gestures, |
| 37 int64_t scroll_transaction_ms) | 37 int64_t scroll_transaction_ms) |
| 38 : client_(client), | 38 : client_(client), |
| 39 needs_scroll_begin_(true), | 39 needs_scroll_begin_(true), |
| 40 needs_scroll_end_(false), | |
| 40 send_gestures_(send_gestures), | 41 send_gestures_(send_gestures), |
| 41 scroll_transaction_ms_(scroll_transaction_ms), | 42 scroll_transaction_ms_(scroll_transaction_ms), |
| 42 scrolling_device_(blink::WebGestureDeviceUninitialized) { | 43 scrolling_device_(blink::WebGestureDeviceUninitialized) { |
| 43 DCHECK(client); | 44 DCHECK(client); |
| 44 } | 45 } |
| 45 | 46 |
| 46 MouseWheelEventQueue::~MouseWheelEventQueue() { | 47 MouseWheelEventQueue::~MouseWheelEventQueue() { |
| 47 if (!wheel_queue_.empty()) | 48 if (!wheel_queue_.empty()) |
| 48 STLDeleteElements(&wheel_queue_); | 49 STLDeleteElements(&wheel_queue_); |
| 49 } | 50 } |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 78 | 79 |
| 79 event_sent_for_gesture_ack_->latency.AddNewLatencyFrom(latency_info); | 80 event_sent_for_gesture_ack_->latency.AddNewLatencyFrom(latency_info); |
| 80 client_->OnMouseWheelEventAck(*event_sent_for_gesture_ack_, ack_result); | 81 client_->OnMouseWheelEventAck(*event_sent_for_gesture_ack_, ack_result); |
| 81 | 82 |
| 82 // If event wasn't consumed then generate a gesture scroll for it. | 83 // If event wasn't consumed then generate a gesture scroll for it. |
| 83 if (send_gestures_ && ack_result != INPUT_EVENT_ACK_STATE_CONSUMED && | 84 if (send_gestures_ && ack_result != INPUT_EVENT_ACK_STATE_CONSUMED && |
| 84 event_sent_for_gesture_ack_->event.canScroll && | 85 event_sent_for_gesture_ack_->event.canScroll && |
| 85 (scrolling_device_ == blink::WebGestureDeviceUninitialized || | 86 (scrolling_device_ == blink::WebGestureDeviceUninitialized || |
| 86 scrolling_device_ == blink::WebGestureDeviceTouchpad)) { | 87 scrolling_device_ == blink::WebGestureDeviceTouchpad)) { |
| 87 GestureEventWithLatencyInfo scroll_update; | 88 GestureEventWithLatencyInfo scroll_update; |
| 89 scroll_update.event.timeStampSeconds = | |
| 90 event_sent_for_gesture_ack_->event.timeStampSeconds; | |
| 91 | |
| 88 scroll_update.event.x = event_sent_for_gesture_ack_->event.x; | 92 scroll_update.event.x = event_sent_for_gesture_ack_->event.x; |
| 89 scroll_update.event.y = event_sent_for_gesture_ack_->event.y; | 93 scroll_update.event.y = event_sent_for_gesture_ack_->event.y; |
| 90 scroll_update.event.globalX = event_sent_for_gesture_ack_->event.globalX; | 94 scroll_update.event.globalX = event_sent_for_gesture_ack_->event.globalX; |
| 91 scroll_update.event.globalY = event_sent_for_gesture_ack_->event.globalY; | 95 scroll_update.event.globalY = event_sent_for_gesture_ack_->event.globalY; |
| 92 scroll_update.event.type = WebInputEvent::GestureScrollUpdate; | 96 scroll_update.event.type = WebInputEvent::GestureScrollUpdate; |
| 93 scroll_update.event.sourceDevice = blink::WebGestureDeviceTouchpad; | 97 scroll_update.event.sourceDevice = blink::WebGestureDeviceTouchpad; |
| 94 scroll_update.event.resendingPluginId = -1; | 98 scroll_update.event.resendingPluginId = -1; |
| 95 scroll_update.event.data.scrollUpdate.deltaX = | 99 scroll_update.event.data.scrollUpdate.deltaX = |
| 96 event_sent_for_gesture_ack_->event.deltaX; | 100 event_sent_for_gesture_ack_->event.deltaX; |
| 97 scroll_update.event.data.scrollUpdate.deltaY = | 101 scroll_update.event.data.scrollUpdate.deltaY = |
| 98 event_sent_for_gesture_ack_->event.deltaY; | 102 event_sent_for_gesture_ack_->event.deltaY; |
| 103 // Only OSX populates the momentumPhase; so expect this to | |
| 104 // always be PhaseNone on all other platforms. | |
| 105 scroll_update.event.data.scrollUpdate.inertial = | |
| 106 event_sent_for_gesture_ack_->event.momentumPhase != | |
| 107 blink::WebMouseWheelEvent::PhaseNone; | |
| 99 if (event_sent_for_gesture_ack_->event.scrollByPage) { | 108 if (event_sent_for_gesture_ack_->event.scrollByPage) { |
| 100 scroll_update.event.data.scrollUpdate.deltaUnits = | 109 scroll_update.event.data.scrollUpdate.deltaUnits = |
| 101 blink::WebGestureEvent::Page; | 110 blink::WebGestureEvent::Page; |
| 102 | 111 |
| 103 // Turn page scrolls into a *single* page scroll because | 112 // Turn page scrolls into a *single* page scroll because |
| 104 // the magnitude the number of ticks is lost when coalescing. | 113 // the magnitude the number of ticks is lost when coalescing. |
| 105 if (scroll_update.event.data.scrollUpdate.deltaX) | 114 if (scroll_update.event.data.scrollUpdate.deltaX) |
| 106 scroll_update.event.data.scrollUpdate.deltaX = | 115 scroll_update.event.data.scrollUpdate.deltaX = |
| 107 scroll_update.event.data.scrollUpdate.deltaX > 0 ? 1 : -1; | 116 scroll_update.event.data.scrollUpdate.deltaX > 0 ? 1 : -1; |
| 108 if (scroll_update.event.data.scrollUpdate.deltaY) | 117 if (scroll_update.event.data.scrollUpdate.deltaY) |
| 109 scroll_update.event.data.scrollUpdate.deltaY = | 118 scroll_update.event.data.scrollUpdate.deltaY = |
| 110 scroll_update.event.data.scrollUpdate.deltaY > 0 ? 1 : -1; | 119 scroll_update.event.data.scrollUpdate.deltaY > 0 ? 1 : -1; |
| 111 } else { | 120 } else { |
| 112 scroll_update.event.data.scrollUpdate.deltaUnits = | 121 scroll_update.event.data.scrollUpdate.deltaUnits = |
| 113 event_sent_for_gesture_ack_->event.hasPreciseScrollingDeltas | 122 event_sent_for_gesture_ack_->event.hasPreciseScrollingDeltas |
| 114 ? blink::WebGestureEvent::PrecisePixels | 123 ? blink::WebGestureEvent::PrecisePixels |
| 115 : blink::WebGestureEvent::Pixels; | 124 : blink::WebGestureEvent::Pixels; |
| 116 } | 125 } |
| 117 SendGesture(scroll_update); | 126 |
| 127 bool send_end_now = false; | |
| 128 bool has_phase_info = false; | |
| 129 | |
| 130 if (event_sent_for_gesture_ack_->event.phase != | |
| 131 blink::WebMouseWheelEvent::PhaseNone || | |
| 132 event_sent_for_gesture_ack_->event.momentumPhase != | |
| 133 blink::WebMouseWheelEvent::PhaseNone) { | |
| 134 has_phase_info = true; | |
| 135 send_end_now = event_sent_for_gesture_ack_->event.phase == | |
|
tdresser
2016/03/08 14:28:52
Add a comment describing the conditions in which w
dtapuska
2016/03/08 20:31:49
I'm hoping the renaming of the variable makes it c
| |
| 136 blink::WebMouseWheelEvent::PhaseEnded || | |
| 137 event_sent_for_gesture_ack_->event.phase == | |
| 138 blink::WebMouseWheelEvent::PhaseCancelled || | |
| 139 event_sent_for_gesture_ack_->event.momentumPhase == | |
| 140 blink::WebMouseWheelEvent::PhaseEnded || | |
| 141 event_sent_for_gesture_ack_->event.momentumPhase == | |
| 142 blink::WebMouseWheelEvent::PhaseCancelled; | |
| 143 } | |
| 144 | |
| 145 bool needs_update = scroll_update.event.data.scrollUpdate.deltaX != 0 || | |
| 146 scroll_update.event.data.scrollUpdate.deltaY != 0; | |
| 147 | |
| 148 if (needs_update || !(needs_scroll_begin_ && send_end_now)) { | |
|
tdresser
2016/03/08 14:28:52
I'm a bit confused by this condition.
It's probab
dtapuska
2016/03/08 20:31:49
Done.
| |
| 149 if (needs_scroll_begin_ || has_phase_info) | |
| 150 SendScrollBegin(scroll_update, !needs_scroll_begin_); | |
|
tdresser
2016/03/08 14:28:52
This is a bit confusing. Why do we mark it synthet
dtapuska
2016/03/08 20:31:49
I've broken it apart to make it more clear.
| |
| 151 | |
| 152 if (needs_update) | |
| 153 client_->SendGestureEvent(scroll_update); | |
| 154 | |
| 155 if (send_end_now) { | |
|
tdresser
2016/03/08 14:28:52
The naming of this variable is confusing. We send
dtapuska
2016/03/08 20:31:49
I've changed send_end_now to current_phase_ended..
| |
| 156 SendScrollEnd(scroll_update.event, false); | |
| 157 } else if (has_phase_info) { | |
| 158 SendScrollEnd(scroll_update.event, true); | |
| 159 } else { | |
| 160 scroll_end_timer_.Start( | |
| 161 FROM_HERE, | |
| 162 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), | |
| 163 base::Bind(&MouseWheelEventQueue::SendScrollEnd, | |
| 164 base::Unretained(this), scroll_update.event, false)); | |
| 165 } | |
| 166 } | |
| 118 } | 167 } |
| 119 | 168 |
| 120 event_sent_for_gesture_ack_.reset(); | 169 event_sent_for_gesture_ack_.reset(); |
| 121 TryForwardNextEventToRenderer(); | 170 TryForwardNextEventToRenderer(); |
| 122 } | 171 } |
| 123 | 172 |
| 124 void MouseWheelEventQueue::OnGestureScrollEvent( | 173 void MouseWheelEventQueue::OnGestureScrollEvent( |
| 125 const GestureEventWithLatencyInfo& gesture_event) { | 174 const GestureEventWithLatencyInfo& gesture_event) { |
| 126 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { | 175 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { |
| 127 // If there is a current scroll going on and a new scroll that isn't | 176 // If there is a current scroll going on and a new scroll that isn't |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 151 event_sent_for_gesture_ack_.reset(wheel_queue_.front()); | 200 event_sent_for_gesture_ack_.reset(wheel_queue_.front()); |
| 152 wheel_queue_.pop_front(); | 201 wheel_queue_.pop_front(); |
| 153 | 202 |
| 154 MouseWheelEventWithLatencyInfo send_event(*event_sent_for_gesture_ack_); | 203 MouseWheelEventWithLatencyInfo send_event(*event_sent_for_gesture_ack_); |
| 155 if (send_gestures_) | 204 if (send_gestures_) |
| 156 send_event.event.canScroll = false; | 205 send_event.event.canScroll = false; |
| 157 | 206 |
| 158 client_->SendMouseWheelEventImmediately(send_event); | 207 client_->SendMouseWheelEventImmediately(send_event); |
| 159 } | 208 } |
| 160 | 209 |
| 161 void MouseWheelEventQueue::SendScrollEnd(blink::WebGestureEvent update_event) { | 210 void MouseWheelEventQueue::SendScrollEnd(blink::WebGestureEvent update_event, |
| 162 GestureEventWithLatencyInfo scroll_end; | 211 bool synthetic) { |
| 212 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_); | |
| 213 | |
| 214 GestureEventWithLatencyInfo scroll_end(update_event); | |
| 215 scroll_end.event.timeStampSeconds = | |
| 216 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | |
| 163 scroll_end.event.type = WebInputEvent::GestureScrollEnd; | 217 scroll_end.event.type = WebInputEvent::GestureScrollEnd; |
| 164 scroll_end.event.sourceDevice = blink::WebGestureDeviceTouchpad; | |
| 165 scroll_end.event.resendingPluginId = -1; | 218 scroll_end.event.resendingPluginId = -1; |
| 219 scroll_end.event.data.scrollEnd.synthetic = synthetic; | |
| 220 scroll_end.event.data.scrollEnd.inertial = | |
| 221 update_event.data.scrollUpdate.inertial; | |
| 166 scroll_end.event.data.scrollEnd.deltaUnits = | 222 scroll_end.event.data.scrollEnd.deltaUnits = |
| 167 update_event.data.scrollUpdate.deltaUnits; | 223 update_event.data.scrollUpdate.deltaUnits; |
| 168 scroll_end.event.x = update_event.x; | |
| 169 scroll_end.event.y = update_event.y; | |
| 170 scroll_end.event.globalX = update_event.globalX; | |
| 171 scroll_end.event.globalY = update_event.globalY; | |
| 172 | 224 |
| 173 SendGesture(scroll_end); | 225 if (!synthetic) { |
| 226 needs_scroll_begin_ = true; | |
| 227 needs_scroll_end_ = false; | |
| 228 | |
| 229 if (scroll_end_timer_.IsRunning()) | |
| 230 scroll_end_timer_.Reset(); | |
| 231 } | |
| 232 client_->SendGestureEvent(scroll_end); | |
| 174 } | 233 } |
| 175 | 234 |
| 176 void MouseWheelEventQueue::SendGesture( | 235 void MouseWheelEventQueue::SendScrollBegin( |
| 177 const GestureEventWithLatencyInfo& gesture) { | 236 const GestureEventWithLatencyInfo& gesture_update, |
| 178 switch (gesture.event.type) { | 237 bool synthetic) { |
| 179 case WebInputEvent::GestureScrollUpdate: | 238 DCHECK((synthetic && !needs_scroll_begin_) || needs_scroll_begin_); |
| 180 if (needs_scroll_begin_) { | |
| 181 GestureEventWithLatencyInfo scroll_begin(gesture); | |
| 182 scroll_begin.event.x = gesture.event.x; | |
| 183 scroll_begin.event.y = gesture.event.y; | |
| 184 scroll_begin.event.globalX = gesture.event.globalX; | |
| 185 scroll_begin.event.globalY = gesture.event.globalY; | |
| 186 scroll_begin.event.type = WebInputEvent::GestureScrollBegin; | |
| 187 scroll_begin.event.data.scrollBegin.deltaXHint = | |
| 188 gesture.event.data.scrollUpdate.deltaX; | |
| 189 scroll_begin.event.data.scrollBegin.deltaYHint = | |
| 190 gesture.event.data.scrollUpdate.deltaY; | |
| 191 scroll_begin.event.data.scrollBegin.targetViewport = false; | |
| 192 scroll_begin.event.data.scrollBegin.deltaHintUnits = | |
| 193 gesture.event.data.scrollUpdate.deltaUnits; | |
| 194 | 239 |
| 195 SendGesture(scroll_begin); | 240 GestureEventWithLatencyInfo scroll_begin(gesture_update); |
| 196 } | 241 scroll_begin.event.type = WebInputEvent::GestureScrollBegin; |
| 197 if (scroll_end_timer_.IsRunning()) { | 242 scroll_begin.event.data.scrollBegin.synthetic = synthetic; |
| 198 scroll_end_timer_.Reset(); | 243 scroll_begin.event.data.scrollBegin.inertial = |
| 199 } else { | 244 gesture_update.event.data.scrollUpdate.inertial; |
| 200 scroll_end_timer_.Start( | 245 scroll_begin.event.data.scrollBegin.deltaXHint = |
| 201 FROM_HERE, | 246 gesture_update.event.data.scrollUpdate.deltaX; |
| 202 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), | 247 scroll_begin.event.data.scrollBegin.deltaYHint = |
| 203 base::Bind(&MouseWheelEventQueue::SendScrollEnd, | 248 gesture_update.event.data.scrollUpdate.deltaY; |
| 204 base::Unretained(this), gesture.event)); | 249 scroll_begin.event.data.scrollBegin.targetViewport = false; |
| 205 } | 250 scroll_begin.event.data.scrollBegin.deltaHintUnits = |
| 206 break; | 251 gesture_update.event.data.scrollUpdate.deltaUnits; |
| 207 case WebInputEvent::GestureScrollEnd: | 252 |
| 208 needs_scroll_begin_ = true; | 253 needs_scroll_begin_ = false; |
| 209 break; | 254 needs_scroll_end_ = true; |
| 210 case WebInputEvent::GestureScrollBegin: | 255 client_->SendGestureEvent(scroll_begin); |
| 211 needs_scroll_begin_ = false; | |
| 212 break; | |
| 213 default: | |
| 214 return; | |
| 215 } | |
| 216 client_->SendGestureEvent(gesture); | |
| 217 } | 256 } |
| 218 | 257 |
| 219 } // namespace content | 258 } // namespace content |
| OLD | NEW |