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

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: merge conflicts resolved. Created 4 years, 1 month 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 (has_phase_info && enable_scroll_latching_) {
184 if (event_sent_for_gesture_ack_->event.momentumPhase ==
185 blink::WebMouseWheelEvent::PhaseBegan) {
tdresser 2016/11/22 21:44:40 Should we combine the two nested if's into a singl
sahel 2016/11/24 15:28:55 Done.
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 } else {
191 // GSE is already sent.
192 DCHECK(needs_scroll_begin_ && current_phase_ended);
193 }
194 }
195 }
196
180 if (needs_update || !empty_sequence) { 197 if (needs_update || !empty_sequence) {
181 if (needs_scroll_begin_) { 198 if (needs_scroll_begin_) {
182 // If no GSB has been sent, it will be a non-synthetic GSB. 199 // If no GSB has been sent, it will be a non-synthetic GSB.
183 SendScrollBegin(scroll_update, false); 200 SendScrollBegin(scroll_update, false);
184 } else if (has_phase_info) { 201 } else if (has_phase_info && !enable_scroll_latching_) {
185 // If a GSB has been sent, generate a synthetic GSB if we have phase 202 // 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 203 // information. This should be removed once crbug.com/526463 is fully
187 // implemented. 204 // implemented.
188 SendScrollBegin(scroll_update, true); 205 SendScrollBegin(scroll_update, true);
189 } 206 }
190 207
191 if (needs_update) { 208 if (needs_update) {
192 ui::LatencyInfo latency = ui::LatencyInfo(ui::SourceEventType::WHEEL); 209 ui::LatencyInfo latency = ui::LatencyInfo(ui::SourceEventType::WHEEL);
193 latency.AddLatencyNumber( 210 latency.AddLatencyNumber(
194 ui::INPUT_EVENT_LATENCY_GENERATE_SCROLL_UPDATE_FROM_MOUSE_WHEEL, 0, 211 ui::INPUT_EVENT_LATENCY_GENERATE_SCROLL_UPDATE_FROM_MOUSE_WHEEL, 0,
195 0); 212 0);
196 client_->ForwardGestureEventWithLatencyInfo(scroll_update, latency); 213 client_->ForwardGestureEventWithLatencyInfo(scroll_update, latency);
197 } 214 }
198 215
199 if (current_phase_ended) { 216 if (current_phase_ended) {
dtapuska 2016/11/22 22:10:34 Can these blocks of code be reduced a bit to be:
sahel 2016/11/24 15:28:55 Done.
200 // Non-synthetic GSEs are sent when the current phase is canceled or 217 // Non-synthetic GSEs are sent when the current phase is canceled or
201 // ended. 218 // ended.
202 SendScrollEnd(scroll_update, false); 219 if (enable_scroll_latching_) {
220 if (momentum_phase_ended) {
221 SendScrollEnd(scroll_update, false, false);
222 } else {
223 // Don't send the ScrollEnd right away, instead set a timer
224 // and wait to see if a MouseWheelEvent with momentum phase (fling)
225 // arrives or not.
226 DCHECK(scroll_phase_ended);
227 scroll_end_timer_.Start(
228 FROM_HERE,
229 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
230 base::Bind(&MouseWheelEventQueue::SendScrollEnd,
231 base::Unretained(this), scroll_update, false,
232 false));
233 }
234
235 } else {
236 SendScrollEnd(scroll_update, false, false);
237 }
203 } else if (has_phase_info) { 238 } else if (has_phase_info) {
204 // Generate a synthetic GSE for every update to force hit testing so 239 // Generate a synthetic GSE for every update to force hit testing so
205 // that the non-latching behavior is preserved. Remove once 240 // that the non-latching behavior is preserved. Remove once
206 // crbug.com/526463 is fully implemented. 241 // crbug.com/526463 is fully implemented.
207 SendScrollEnd(scroll_update, true); 242 if (!enable_scroll_latching_)
243 SendScrollEnd(scroll_update, true, false);
208 } else { 244 } else {
209 scroll_end_timer_.Start( 245 scroll_end_timer_.Start(
210 FROM_HERE, 246 FROM_HERE,
211 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), 247 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
212 base::Bind(&MouseWheelEventQueue::SendScrollEnd, 248 base::Bind(&MouseWheelEventQueue::SendScrollEnd,
213 base::Unretained(this), scroll_update, false)); 249 base::Unretained(this), scroll_update, false, false));
214 } 250 }
215 } 251 }
252 last_scroll_update_ = scroll_update;
216 } 253 }
217 254
218 event_sent_for_gesture_ack_.reset(); 255 event_sent_for_gesture_ack_.reset();
219 TryForwardNextEventToRenderer(); 256 TryForwardNextEventToRenderer();
220 } 257 }
221 258
222 void MouseWheelEventQueue::OnGestureScrollEvent( 259 void MouseWheelEventQueue::OnGestureScrollEvent(
223 const GestureEventWithLatencyInfo& gesture_event) { 260 const GestureEventWithLatencyInfo& gesture_event) {
224 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { 261 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) {
225 // If there is a current scroll going on and a new scroll that isn't 262 // 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_) 285 if (wheel_queue_.empty() || event_sent_for_gesture_ack_)
249 return; 286 return;
250 287
251 event_sent_for_gesture_ack_ = std::move(wheel_queue_.front()); 288 event_sent_for_gesture_ack_ = std::move(wheel_queue_.front());
252 wheel_queue_.pop_front(); 289 wheel_queue_.pop_front();
253 290
254 client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_); 291 client_->SendMouseWheelEventImmediately(*event_sent_for_gesture_ack_);
255 } 292 }
256 293
257 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event, 294 void MouseWheelEventQueue::SendScrollEnd(WebGestureEvent update_event,
258 bool synthetic) { 295 bool synthetic,
296 bool may_precede_fling) {
259 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_); 297 DCHECK((synthetic && !needs_scroll_end_) || needs_scroll_end_);
260 298
261 WebGestureEvent scroll_end(update_event); 299 WebGestureEvent scroll_end(update_event);
262 scroll_end.timeStampSeconds = 300 scroll_end.timeStampSeconds =
263 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 301 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
264 scroll_end.type = WebInputEvent::GestureScrollEnd; 302 scroll_end.type = WebInputEvent::GestureScrollEnd;
265 scroll_end.resendingPluginId = -1; 303 scroll_end.resendingPluginId = -1;
266 scroll_end.data.scrollEnd.synthetic = synthetic; 304 scroll_end.data.scrollEnd.synthetic = synthetic;
305 scroll_end.data.scrollEnd.mayPrecedeFling = may_precede_fling;
267 scroll_end.data.scrollEnd.inertialPhase = 306 scroll_end.data.scrollEnd.inertialPhase =
268 update_event.data.scrollUpdate.inertialPhase; 307 update_event.data.scrollUpdate.inertialPhase;
269 scroll_end.data.scrollEnd.deltaUnits = 308 scroll_end.data.scrollEnd.deltaUnits =
270 update_event.data.scrollUpdate.deltaUnits; 309 update_event.data.scrollUpdate.deltaUnits;
271 310
272 if (!synthetic) { 311 if (!synthetic) {
273 needs_scroll_begin_ = true; 312 needs_scroll_begin_ = true;
274 needs_scroll_end_ = false; 313 needs_scroll_end_ = false;
275 314
276 if (scroll_end_timer_.IsRunning()) 315 if (scroll_end_timer_.IsRunning())
(...skipping 21 matching lines...) Expand all
298 scroll_begin.data.scrollBegin.deltaHintUnits = 337 scroll_begin.data.scrollBegin.deltaHintUnits =
299 gesture_update.data.scrollUpdate.deltaUnits; 338 gesture_update.data.scrollUpdate.deltaUnits;
300 339
301 needs_scroll_begin_ = false; 340 needs_scroll_begin_ = false;
302 needs_scroll_end_ = true; 341 needs_scroll_end_ = true;
303 client_->ForwardGestureEventWithLatencyInfo( 342 client_->ForwardGestureEventWithLatencyInfo(
304 scroll_begin, ui::LatencyInfo(ui::SourceEventType::WHEEL)); 343 scroll_begin, ui::LatencyInfo(ui::SourceEventType::WHEEL));
305 } 344 }
306 345
307 } // namespace content 346 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698