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

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: Mouse_wheel_event_queue.cc polished. 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 |mayPrecedeFling = 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 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.
202 SendScrollEnd(scroll_update, false); 215 } else if (has_phase_info && !enable_scroll_latching_) {
203 } else if (has_phase_info) {
204 // Generate a synthetic GSE for every update to force hit testing so 216 // Generate a synthetic GSE for every update to force hit testing so
205 // that the non-latching behavior is preserved. Remove once 217 // that the non-latching behavior is preserved. Remove once
206 // crbug.com/526463 is fully implemented. 218 // crbug.com/526463 is fully implemented.
207 SendScrollEnd(scroll_update, true); 219 SendScrollEnd(scroll_update, true, false);
208 } else { 220 } else if ((enable_scroll_latching_ && scroll_phase_ended) ||
221 !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.
209 scroll_end_timer_.Start( 222 scroll_end_timer_.Start(
210 FROM_HERE, 223 FROM_HERE,
211 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), 224 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
212 base::Bind(&MouseWheelEventQueue::SendScrollEnd, 225 base::Bind(&MouseWheelEventQueue::SendScrollEnd,
213 base::Unretained(this), scroll_update, false)); 226 base::Unretained(this), scroll_update, false, false));
214 } 227 }
215 } 228 }
229 last_scroll_update_ = scroll_update;
216 } 230 }
217 231
218 event_sent_for_gesture_ack_.reset(); 232 event_sent_for_gesture_ack_.reset();
219 TryForwardNextEventToRenderer(); 233 TryForwardNextEventToRenderer();
220 } 234 }
221 235
222 void MouseWheelEventQueue::OnGestureScrollEvent( 236 void MouseWheelEventQueue::OnGestureScrollEvent(
223 const GestureEventWithLatencyInfo& gesture_event) { 237 const GestureEventWithLatencyInfo& gesture_event) {
224 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { 238 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) {
225 // If there is a current scroll going on and a new scroll that isn't 239 // 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_) 262 if (wheel_queue_.empty() || event_sent_for_gesture_ack_)
249 return; 263 return;
250 264
251 event_sent_for_gesture_ack_ = std::move(wheel_queue_.front()); 265 event_sent_for_gesture_ack_ = std::move(wheel_queue_.front());
252 wheel_queue_.pop_front(); 266 wheel_queue_.pop_front();
253 267
254 client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_); 268 client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_);
255 } 269 }
256 270
257 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event, 271 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
258 bool synthetic) { 272 bool synthetic,
273 bool may_precede_fling) {
259 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_); 274 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_);
260 275
261 WebGestureEvent scroll_end(update_event); 276 WebGestureEvent scroll_end(update_event);
262 scroll_end.timeStampSeconds = 277 scroll_end.timeStampSeconds =
263 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 278 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
264 scroll_end.type = WebInputEvent::GestureScrollEnd; 279 scroll_end.type = WebInputEvent::GestureScrollEnd;
265 scroll_end.resendingPluginId = -1; 280 scroll_end.resendingPluginId = -1;
266 scroll_end.data.scrollEnd.synthetic = synthetic; 281 scroll_end.data.scrollEnd.synthetic = synthetic;
282 scroll_end.data.scrollEnd.mayPrecedeFling = may_precede_fling;
267 scroll_end.data.scrollEnd.inertialPhase = 283 scroll_end.data.scrollEnd.inertialPhase =
268 update_event.data.scrollUpdate.inertialPhase; 284 update_event.data.scrollUpdate.inertialPhase;
269 scroll_end.data.scrollEnd.deltaUnits = 285 scroll_end.data.scrollEnd.deltaUnits =
270 update_event.data.scrollUpdate.deltaUnits; 286 update_event.data.scrollUpdate.deltaUnits;
271 287
272 if (!synthetic) { 288 if (!synthetic) {
273 needs_scroll_begin_ = true; 289 needs_scroll_begin_ = true;
274 needs_scroll_end_ = false; 290 needs_scroll_end_ = false;
275 291
276 if (scroll_end_timer_.IsRunning()) 292 if (scroll_end_timer_.IsRunning())
(...skipping 21 matching lines...) Expand all
298 scroll_begin.data.scrollBegin.deltaHintUnits = 314 scroll_begin.data.scrollBegin.deltaHintUnits =
299 gesture_update.data.scrollUpdate.deltaUnits; 315 gesture_update.data.scrollUpdate.deltaUnits;
300 316
301 needs_scroll_begin_ = false; 317 needs_scroll_begin_ = false;
302 needs_scroll_end_ = true; 318 needs_scroll_end_ = true;
303 client_->ForwardGestureEventWithLatencyInfo( 319 client_->ForwardGestureEventWithLatencyInfo(
304 scroll_begin, ui::LatencyInfo(ui::SourceEventType::WHEEL)); 320 scroll_begin, ui::LatencyInfo(ui::SourceEventType::WHEEL));
305 } 321 }
306 322
307 } // namespace content 323 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698