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

Side by Side Diff: content/browser/renderer_host/input/mouse_wheel_event_queue.cc

Issue 2486673008: Touchpad scroll latching enabled for Mac behind flag. (Closed)
Patch Set: mayPrecedeFling->precedeFling Created 4 years 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 unified diff | Download patch
OLDNEW
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/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/metrics/histogram_macros.h" 8 #include "base/metrics/histogram_macros.h"
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "ui/events/blink/web_input_event_traits.h" 10 #include "ui/events/blink/web_input_event_traits.h"
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 142
143 if (event_sent_for_gesture_ack_->event.railsMode == 143 if (event_sent_for_gesture_ack_->event.railsMode ==
144 WebInputEvent::RailsModeVertical) 144 WebInputEvent::RailsModeVertical)
145 scroll_update.data.scrollUpdate.deltaX = 0; 145 scroll_update.data.scrollUpdate.deltaX = 0;
146 if (event_sent_for_gesture_ack_->event.railsMode == 146 if (event_sent_for_gesture_ack_->event.railsMode ==
147 WebInputEvent::RailsModeHorizontal) 147 WebInputEvent::RailsModeHorizontal)
148 scroll_update.data.scrollUpdate.deltaY = 0; 148 scroll_update.data.scrollUpdate.deltaY = 0;
149 } 149 }
150 150
151 bool current_phase_ended = false; 151 bool current_phase_ended = false;
152 bool scroll_phase_ended = false;
153 bool momentum_phase_ended = false;
152 bool has_phase_info = false; 154 bool has_phase_info = false;
153 155
154 if (event_sent_for_gesture_ack_->event.phase != 156 if (event_sent_for_gesture_ack_->event.phase !=
155 blink::WebMouseWheelEvent::PhaseNone || 157 blink::WebMouseWheelEvent::PhaseNone ||
156 event_sent_for_gesture_ack_->event.momentumPhase != 158 event_sent_for_gesture_ack_->event.momentumPhase !=
157 blink::WebMouseWheelEvent::PhaseNone) { 159 blink::WebMouseWheelEvent::PhaseNone) {
158 has_phase_info = true; 160 has_phase_info = true;
159 current_phase_ended = event_sent_for_gesture_ack_->event.phase == 161 scroll_phase_ended = event_sent_for_gesture_ack_->event.phase ==
160 blink::WebMouseWheelEvent::PhaseEnded || 162 blink::WebMouseWheelEvent::PhaseEnded ||
161 event_sent_for_gesture_ack_->event.phase == 163 event_sent_for_gesture_ack_->event.phase ==
162 blink::WebMouseWheelEvent::PhaseCancelled || 164 blink::WebMouseWheelEvent::PhaseCancelled;
163 event_sent_for_gesture_ack_->event.momentumPhase == 165 momentum_phase_ended = event_sent_for_gesture_ack_->event.momentumPhase ==
164 blink::WebMouseWheelEvent::PhaseEnded || 166 blink::WebMouseWheelEvent::PhaseEnded ||
165 event_sent_for_gesture_ack_->event.momentumPhase == 167 event_sent_for_gesture_ack_->event.momentumPhase ==
166 blink::WebMouseWheelEvent::PhaseCancelled; 168 blink::WebMouseWheelEvent::PhaseCancelled;
169 current_phase_ended = scroll_phase_ended || momentum_phase_ended;
167 } 170 }
168 171
169 bool needs_update = scroll_update.data.scrollUpdate.deltaX != 0 || 172 bool needs_update = scroll_update.data.scrollUpdate.deltaX != 0 ||
170 scroll_update.data.scrollUpdate.deltaY != 0; 173 scroll_update.data.scrollUpdate.deltaY != 0;
171 174
172 // If there is no update to send and the current phase is ended yet a GSB 175 // If there is no update to send and the current phase is ended yet a GSB
173 // needs to be sent, this event sequence doesn't need to be generated 176 // needs to be sent, this event sequence doesn't need to be generated
174 // because the events generated will be a GSB (non-synthetic) and GSE 177 // because the events generated will be a GSB (non-synthetic) and GSE
175 // (non-synthetic). This situation arises when OSX generates double 178 // (non-synthetic). This situation arises when OSX generates double
176 // phase end information. 179 // phase end information.
177 bool empty_sequence = 180 bool empty_sequence =
178 !needs_update && needs_scroll_begin_ && current_phase_ended; 181 !needs_update && needs_scroll_begin_ && current_phase_ended;
179 182
183 if (enable_scroll_latching_ &&
184 event_sent_for_gesture_ack_->event.momentumPhase ==
185 blink::WebMouseWheelEvent::PhaseBegan) {
186 // Send the pending GSE with |precedeFling = true|.
187 if (scroll_end_timer_.IsRunning()) {
188 scroll_end_timer_.Stop();
189 SendScrollEnd(last_scroll_update_, false, true);
190 }
191 }
192
180 if (needs_update || !empty_sequence) { 193 if (needs_update || !empty_sequence) {
181 if (needs_scroll_begin_) { 194 if (needs_scroll_begin_) {
182 // If no GSB has been sent, it will be a non-synthetic GSB. 195 // If no GSB has been sent, it will be a non-synthetic GSB.
183 SendScrollBegin(scroll_update, false); 196 SendScrollBegin(scroll_update, false);
184 } else if (has_phase_info) { 197 } else if (has_phase_info && !enable_scroll_latching_) {
185 // If a GSB has been sent, generate a synthetic GSB if we have phase 198 // If a GSB has been sent, generate a synthetic GSB if we have phase
186 // information. This should be removed once crbug.com/526463 is fully 199 // information. This should be removed once crbug.com/526463 is fully
187 // implemented. 200 // implemented.
188 SendScrollBegin(scroll_update, true); 201 SendScrollBegin(scroll_update, true);
189 } 202 }
190 203
191 if (needs_update) { 204 if (needs_update) {
192 ui::LatencyInfo latency = ui::LatencyInfo(ui::SourceEventType::WHEEL); 205 ui::LatencyInfo latency = ui::LatencyInfo(ui::SourceEventType::WHEEL);
193 latency.AddLatencyNumber( 206 latency.AddLatencyNumber(
194 ui::INPUT_EVENT_LATENCY_GENERATE_SCROLL_UPDATE_FROM_MOUSE_WHEEL, 0, 207 ui::INPUT_EVENT_LATENCY_GENERATE_SCROLL_UPDATE_FROM_MOUSE_WHEEL, 0,
195 0); 208 0);
196 client_->ForwardGestureEventWithLatencyInfo(scroll_update, latency); 209 client_->ForwardGestureEventWithLatencyInfo(scroll_update, latency);
197 } 210 }
198 211
199 if (current_phase_ended) { 212 if ((enable_scroll_latching_ && momentum_phase_ended) ||
200 // Non-synthetic GSEs are sent when the current phase is canceled or 213 (!enable_scroll_latching_ && current_phase_ended)) {
201 // ended. 214 // Send GSE with |precedeFling = false| if scroll latching is enabled
202 SendScrollEnd(scroll_update, false); 215 // and no fling is going to happen next, or if scroll latching is
203 } else if (has_phase_info) { 216 // disabled and current phase ended.
217 SendScrollEnd(scroll_update, false, false);
218 } else if (has_phase_info && !enable_scroll_latching_) {
204 // Generate a synthetic GSE for every update to force hit testing so 219 // Generate a synthetic GSE for every update to force hit testing so
205 // that the non-latching behavior is preserved. Remove once 220 // that the non-latching behavior is preserved. Remove once
206 // crbug.com/526463 is fully implemented. 221 // crbug.com/526463 is fully implemented.
207 SendScrollEnd(scroll_update, true); 222 SendScrollEnd(scroll_update, true, false);
208 } else { 223 } else if ((enable_scroll_latching_ && scroll_phase_ended) ||
224 !has_phase_info) {
225 // If scroll latching is enabled and a fling might happen next, or no
226 // phase info exists, start the scroll_end_timer_.
209 scroll_end_timer_.Start( 227 scroll_end_timer_.Start(
210 FROM_HERE, 228 FROM_HERE,
211 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), 229 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
212 base::Bind(&MouseWheelEventQueue::SendScrollEnd, 230 base::Bind(&MouseWheelEventQueue::SendScrollEnd,
213 base::Unretained(this), scroll_update, false)); 231 base::Unretained(this), scroll_update, false, false));
214 } 232 }
215 } 233 }
234 last_scroll_update_ = scroll_update;
216 } 235 }
217 236
218 event_sent_for_gesture_ack_.reset(); 237 event_sent_for_gesture_ack_.reset();
219 TryForwardNextEventToRenderer(); 238 TryForwardNextEventToRenderer();
220 } 239 }
221 240
222 void MouseWheelEventQueue::OnGestureScrollEvent( 241 void MouseWheelEventQueue::OnGestureScrollEvent(
223 const GestureEventWithLatencyInfo& gesture_event) { 242 const GestureEventWithLatencyInfo& gesture_event) {
224 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { 243 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) {
225 // If there is a current scroll going on and a new scroll that isn't 244 // If there is a current scroll going on and a new scroll that isn't
(...skipping 22 matching lines...) Expand all
248 if (wheel_queue_.empty() || event_sent_for_gesture_ack_) 267 if (wheel_queue_.empty() || event_sent_for_gesture_ack_)
249 return; 268 return;
250 269
251 event_sent_for_gesture_ack_ = std::move(wheel_queue_.front()); 270 event_sent_for_gesture_ack_ = std::move(wheel_queue_.front());
252 wheel_queue_.pop_front(); 271 wheel_queue_.pop_front();
253 272
254 client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_); 273 client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_);
255 } 274 }
256 275
257 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event, 276 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
258 bool synthetic) { 277 bool synthetic,
278 bool precede_fling) {
259 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_); 279 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_);
260 280
261 WebGestureEvent scroll_end(update_event); 281 WebGestureEvent scroll_end(update_event);
262 scroll_end.timeStampSeconds = 282 scroll_end.timeStampSeconds =
263 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 283 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
264 scroll_end.type = WebInputEvent::GestureScrollEnd; 284 scroll_end.type = WebInputEvent::GestureScrollEnd;
265 scroll_end.resendingPluginId = -1; 285 scroll_end.resendingPluginId = -1;
266 scroll_end.data.scrollEnd.synthetic = synthetic; 286 scroll_end.data.scrollEnd.synthetic = synthetic;
287 scroll_end.data.scrollEnd.precedeFling = precede_fling;
267 scroll_end.data.scrollEnd.inertialPhase = 288 scroll_end.data.scrollEnd.inertialPhase =
268 update_event.data.scrollUpdate.inertialPhase; 289 update_event.data.scrollUpdate.inertialPhase;
269 scroll_end.data.scrollEnd.deltaUnits = 290 scroll_end.data.scrollEnd.deltaUnits =
270 update_event.data.scrollUpdate.deltaUnits; 291 update_event.data.scrollUpdate.deltaUnits;
271 292
272 if (!synthetic) { 293 if (!synthetic) {
273 needs_scroll_begin_ = true; 294 needs_scroll_begin_ = true;
274 needs_scroll_end_ = false; 295 needs_scroll_end_ = false;
275 296
276 if (scroll_end_timer_.IsRunning()) 297 if (scroll_end_timer_.IsRunning())
(...skipping 21 matching lines...) Expand all
298 scroll_begin.data.scrollBegin.deltaHintUnits = 319 scroll_begin.data.scrollBegin.deltaHintUnits =
299 gesture_update.data.scrollUpdate.deltaUnits; 320 gesture_update.data.scrollUpdate.deltaUnits;
300 321
301 needs_scroll_begin_ = false; 322 needs_scroll_begin_ = false;
302 needs_scroll_end_ = true; 323 needs_scroll_end_ = true;
303 client_->ForwardGestureEventWithLatencyInfo( 324 client_->ForwardGestureEventWithLatencyInfo(
304 scroll_begin, ui::LatencyInfo(ui::SourceEventType::WHEEL)); 325 scroll_begin, ui::LatencyInfo(ui::SourceEventType::WHEEL));
305 } 326 }
306 327
307 } // namespace content 328 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698