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

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

Issue 1749343004: Implement Wheel Gesture Scrolling on OSX. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix non mac builds Created 4 years, 9 months 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/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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 78
79 event_sent_for_gesture_ack_->latency.AddNewLatencyFrom(latency_info); 79 event_sent_for_gesture_ack_->latency.AddNewLatencyFrom(latency_info);
80 client_->OnMouseWheelEventAck(*event_sent_for_gesture_ack_, ack_result); 80 client_->OnMouseWheelEventAck(*event_sent_for_gesture_ack_, ack_result);
81 81
82 // If event wasn't consumed then generate a gesture scroll for it. 82 // If event wasn't consumed then generate a gesture scroll for it.
83 if (send_gestures_ && ack_result != INPUT_EVENT_ACK_STATE_CONSUMED && 83 if (send_gestures_ && ack_result != INPUT_EVENT_ACK_STATE_CONSUMED &&
84 event_sent_for_gesture_ack_->event.canScroll && 84 event_sent_for_gesture_ack_->event.canScroll &&
85 (scrolling_device_ == blink::WebGestureDeviceUninitialized || 85 (scrolling_device_ == blink::WebGestureDeviceUninitialized ||
86 scrolling_device_ == blink::WebGestureDeviceTouchpad)) { 86 scrolling_device_ == blink::WebGestureDeviceTouchpad)) {
87 GestureEventWithLatencyInfo scroll_update; 87 GestureEventWithLatencyInfo scroll_update;
88 scroll_update.event.timeStampSeconds =
89 (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.
90
88 scroll_update.event.x = event_sent_for_gesture_ack_->event.x; 91 scroll_update.event.x = event_sent_for_gesture_ack_->event.x;
89 scroll_update.event.y = event_sent_for_gesture_ack_->event.y; 92 scroll_update.event.y = event_sent_for_gesture_ack_->event.y;
90 scroll_update.event.globalX = event_sent_for_gesture_ack_->event.globalX; 93 scroll_update.event.globalX = event_sent_for_gesture_ack_->event.globalX;
91 scroll_update.event.globalY = event_sent_for_gesture_ack_->event.globalY; 94 scroll_update.event.globalY = event_sent_for_gesture_ack_->event.globalY;
92 scroll_update.event.type = WebInputEvent::GestureScrollUpdate; 95 scroll_update.event.type = WebInputEvent::GestureScrollUpdate;
93 scroll_update.event.sourceDevice = blink::WebGestureDeviceTouchpad; 96 scroll_update.event.sourceDevice = blink::WebGestureDeviceTouchpad;
94 scroll_update.event.resendingPluginId = -1; 97 scroll_update.event.resendingPluginId = -1;
95 scroll_update.event.data.scrollUpdate.deltaX = 98 scroll_update.event.data.scrollUpdate.deltaX =
96 event_sent_for_gesture_ack_->event.deltaX; 99 event_sent_for_gesture_ack_->event.deltaX;
97 scroll_update.event.data.scrollUpdate.deltaY = 100 scroll_update.event.data.scrollUpdate.deltaY =
98 event_sent_for_gesture_ack_->event.deltaY; 101 event_sent_for_gesture_ack_->event.deltaY;
102 scroll_update.event.data.scrollUpdate.inertial =
103 event_sent_for_gesture_ack_->event.momentumPhase !=
104 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.
99 if (event_sent_for_gesture_ack_->event.scrollByPage) { 105 if (event_sent_for_gesture_ack_->event.scrollByPage) {
100 scroll_update.event.data.scrollUpdate.deltaUnits = 106 scroll_update.event.data.scrollUpdate.deltaUnits =
101 blink::WebGestureEvent::Page; 107 blink::WebGestureEvent::Page;
102 108
103 // Turn page scrolls into a *single* page scroll because 109 // Turn page scrolls into a *single* page scroll because
104 // the magnitude the number of ticks is lost when coalescing. 110 // the magnitude the number of ticks is lost when coalescing.
105 if (scroll_update.event.data.scrollUpdate.deltaX) 111 if (scroll_update.event.data.scrollUpdate.deltaX)
106 scroll_update.event.data.scrollUpdate.deltaX = 112 scroll_update.event.data.scrollUpdate.deltaX =
107 scroll_update.event.data.scrollUpdate.deltaX > 0 ? 1 : -1; 113 scroll_update.event.data.scrollUpdate.deltaX > 0 ? 1 : -1;
108 if (scroll_update.event.data.scrollUpdate.deltaY) 114 if (scroll_update.event.data.scrollUpdate.deltaY)
109 scroll_update.event.data.scrollUpdate.deltaY = 115 scroll_update.event.data.scrollUpdate.deltaY =
110 scroll_update.event.data.scrollUpdate.deltaY > 0 ? 1 : -1; 116 scroll_update.event.data.scrollUpdate.deltaY > 0 ? 1 : -1;
111 } else { 117 } else {
112 scroll_update.event.data.scrollUpdate.deltaUnits = 118 scroll_update.event.data.scrollUpdate.deltaUnits =
113 event_sent_for_gesture_ack_->event.hasPreciseScrollingDeltas 119 event_sent_for_gesture_ack_->event.hasPreciseScrollingDeltas
114 ? blink::WebGestureEvent::PrecisePixels 120 ? blink::WebGestureEvent::PrecisePixels
115 : blink::WebGestureEvent::Pixels; 121 : blink::WebGestureEvent::Pixels;
116 } 122 }
117 SendGesture(scroll_update); 123
124 bool send_end_now = false;
125 bool schedule_end = true;
126
127 if (event_sent_for_gesture_ack_->event.phase !=
128 blink::WebMouseWheelEvent::PhaseNone ||
129 event_sent_for_gesture_ack_->event.momentumPhase !=
130 blink::WebMouseWheelEvent::PhaseNone) {
131 schedule_end = false;
132 send_end_now = event_sent_for_gesture_ack_->event.phase ==
133 blink::WebMouseWheelEvent::PhaseEnded ||
134 event_sent_for_gesture_ack_->event.phase ==
135 blink::WebMouseWheelEvent::PhaseCancelled ||
136 event_sent_for_gesture_ack_->event.momentumPhase ==
137 blink::WebMouseWheelEvent::PhaseEnded ||
138 event_sent_for_gesture_ack_->event.momentumPhase ==
139 blink::WebMouseWheelEvent::PhaseCancelled;
140 }
141
142 if (scroll_update.event.data.scrollUpdate.deltaX != 0 ||
143 scroll_update.event.data.scrollUpdate.deltaY != 0)
144 SendGesture(scroll_update, schedule_end);
145 if (send_end_now)
146 SendScrollEnd(scroll_update.event);
118 } 147 }
119 148
120 event_sent_for_gesture_ack_.reset(); 149 event_sent_for_gesture_ack_.reset();
121 TryForwardNextEventToRenderer(); 150 TryForwardNextEventToRenderer();
122 } 151 }
123 152
124 void MouseWheelEventQueue::OnGestureScrollEvent( 153 void MouseWheelEventQueue::OnGestureScrollEvent(
125 const GestureEventWithLatencyInfo& gesture_event) { 154 const GestureEventWithLatencyInfo& gesture_event) {
126 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) { 155 if (gesture_event.event.type == blink::WebInputEvent::GestureScrollBegin) {
127 // If there is a current scroll going on and a new scroll that isn't 156 // If there is a current scroll going on and a new scroll that isn't
(...skipping 25 matching lines...) Expand all
153 182
154 MouseWheelEventWithLatencyInfo send_event(*event_sent_for_gesture_ack_); 183 MouseWheelEventWithLatencyInfo send_event(*event_sent_for_gesture_ack_);
155 if (send_gestures_) 184 if (send_gestures_)
156 send_event.event.canScroll = false; 185 send_event.event.canScroll = false;
157 186
158 client_->SendMouseWheelEventImmediately(send_event); 187 client_->SendMouseWheelEventImmediately(send_event);
159 } 188 }
160 189
161 void MouseWheelEventQueue::SendScrollEnd(blink::WebGestureEvent update_event) { 190 void MouseWheelEventQueue::SendScrollEnd(blink::WebGestureEvent update_event) {
162 GestureEventWithLatencyInfo scroll_end; 191 GestureEventWithLatencyInfo scroll_end;
192 scroll_end.event.timeStampSeconds =
193 (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.
163 scroll_end.event.type = WebInputEvent::GestureScrollEnd; 194 scroll_end.event.type = WebInputEvent::GestureScrollEnd;
164 scroll_end.event.sourceDevice = blink::WebGestureDeviceTouchpad; 195 scroll_end.event.sourceDevice = blink::WebGestureDeviceTouchpad;
165 scroll_end.event.resendingPluginId = -1; 196 scroll_end.event.resendingPluginId = -1;
166 scroll_end.event.data.scrollEnd.deltaUnits = 197 scroll_end.event.data.scrollEnd.deltaUnits =
167 update_event.data.scrollUpdate.deltaUnits; 198 update_event.data.scrollUpdate.deltaUnits;
168 scroll_end.event.x = update_event.x; 199 scroll_end.event.x = update_event.x;
169 scroll_end.event.y = update_event.y; 200 scroll_end.event.y = update_event.y;
170 scroll_end.event.globalX = update_event.globalX; 201 scroll_end.event.globalX = update_event.globalX;
171 scroll_end.event.globalY = update_event.globalY; 202 scroll_end.event.globalY = update_event.globalY;
172 203
173 SendGesture(scroll_end); 204 SendGesture(scroll_end, false);
174 } 205 }
175 206
176 void MouseWheelEventQueue::SendGesture( 207 void MouseWheelEventQueue::SendGesture(
177 const GestureEventWithLatencyInfo& gesture) { 208 const GestureEventWithLatencyInfo& gesture,
209 bool generate_end) {
178 switch (gesture.event.type) { 210 switch (gesture.event.type) {
179 case WebInputEvent::GestureScrollUpdate: 211 case WebInputEvent::GestureScrollUpdate:
180 if (needs_scroll_begin_) { 212 if (needs_scroll_begin_) {
181 GestureEventWithLatencyInfo scroll_begin(gesture); 213 GestureEventWithLatencyInfo scroll_begin(gesture);
214 scroll_begin.event.timeStampSeconds = gesture.event.timeStampSeconds;
182 scroll_begin.event.x = gesture.event.x; 215 scroll_begin.event.x = gesture.event.x;
183 scroll_begin.event.y = gesture.event.y; 216 scroll_begin.event.y = gesture.event.y;
184 scroll_begin.event.globalX = gesture.event.globalX; 217 scroll_begin.event.globalX = gesture.event.globalX;
185 scroll_begin.event.globalY = gesture.event.globalY; 218 scroll_begin.event.globalY = gesture.event.globalY;
186 scroll_begin.event.type = WebInputEvent::GestureScrollBegin; 219 scroll_begin.event.type = WebInputEvent::GestureScrollBegin;
220 scroll_begin.event.data.scrollBegin.inertial =
221 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
187 scroll_begin.event.data.scrollBegin.deltaXHint = 222 scroll_begin.event.data.scrollBegin.deltaXHint =
188 gesture.event.data.scrollUpdate.deltaX; 223 gesture.event.data.scrollUpdate.deltaX;
189 scroll_begin.event.data.scrollBegin.deltaYHint = 224 scroll_begin.event.data.scrollBegin.deltaYHint =
190 gesture.event.data.scrollUpdate.deltaY; 225 gesture.event.data.scrollUpdate.deltaY;
191 scroll_begin.event.data.scrollBegin.targetViewport = false; 226 scroll_begin.event.data.scrollBegin.targetViewport = false;
192 scroll_begin.event.data.scrollBegin.deltaHintUnits = 227 scroll_begin.event.data.scrollBegin.deltaHintUnits =
193 gesture.event.data.scrollUpdate.deltaUnits; 228 gesture.event.data.scrollUpdate.deltaUnits;
194 229
195 SendGesture(scroll_begin); 230 SendGesture(scroll_begin, false);
196 } 231 }
197 if (scroll_end_timer_.IsRunning()) { 232 if (scroll_end_timer_.IsRunning())
198 scroll_end_timer_.Reset(); 233 scroll_end_timer_.Reset();
199 } else { 234
235 if (generate_end) {
200 scroll_end_timer_.Start( 236 scroll_end_timer_.Start(
201 FROM_HERE, 237 FROM_HERE,
202 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_), 238 base::TimeDelta::FromMilliseconds(scroll_transaction_ms_),
203 base::Bind(&MouseWheelEventQueue::SendScrollEnd, 239 base::Bind(&MouseWheelEventQueue::SendScrollEnd,
204 base::Unretained(this), gesture.event)); 240 base::Unretained(this), gesture.event));
205 } 241 }
206 break; 242 break;
207 case WebInputEvent::GestureScrollEnd: 243 case WebInputEvent::GestureScrollEnd:
208 needs_scroll_begin_ = true; 244 needs_scroll_begin_ = true;
209 break; 245 break;
210 case WebInputEvent::GestureScrollBegin: 246 case WebInputEvent::GestureScrollBegin:
211 needs_scroll_begin_ = false; 247 needs_scroll_begin_ = false;
212 break; 248 break;
213 default: 249 default:
214 return; 250 return;
215 } 251 }
216 client_->SendGestureEvent(gesture); 252 client_->SendGestureEvent(gesture);
217 } 253 }
218 254
219 } // namespace content 255 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698