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

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

Issue 1749343004: Implement Wheel Gesture Scrolling on OSX. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 float global_y, 106 float global_y,
107 float dX, 107 float dX,
108 float dY, 108 float dY,
109 int modifiers, 109 int modifiers,
110 bool high_precision) { 110 bool high_precision) {
111 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( 111 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(
112 SyntheticWebMouseWheelEventBuilder::Build( 112 SyntheticWebMouseWheelEventBuilder::Build(
113 x, y, global_x, global_y, dX, dY, modifiers, high_precision))); 113 x, y, global_x, global_y, dX, dY, modifiers, high_precision)));
114 } 114 }
115 115
116 void SendMouseWheelWithPhase(
117 float x,
118 float y,
119 float global_x,
120 float global_y,
121 float dX,
122 float dY,
123 int modifiers,
124 bool high_precision,
125 blink::WebMouseWheelEvent::Phase phase,
126 blink::WebMouseWheelEvent::Phase momentum_phase) {
127 WebMouseWheelEvent event = SyntheticWebMouseWheelEventBuilder::Build(
128 x, y, global_x, global_y, dX, dY, modifiers, high_precision);
129 event.phase = phase;
130 event.momentumPhase = momentum_phase;
131 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(event));
132 }
133
116 void SendGestureEvent(WebInputEvent::Type type) { 134 void SendGestureEvent(WebInputEvent::Type type) {
117 WebGestureEvent event; 135 WebGestureEvent event;
118 event.type = type; 136 event.type = type;
119 event.sourceDevice = blink::WebGestureDeviceTouchscreen; 137 event.sourceDevice = blink::WebGestureDeviceTouchscreen;
120 queue_->OnGestureScrollEvent( 138 queue_->OnGestureScrollEvent(
121 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); 139 GestureEventWithLatencyInfo(event, ui::LatencyInfo()));
122 } 140 }
123 141
124 static void RunTasksAndWait(base::TimeDelta delay) { 142 static void RunTasksAndWait(base::TimeDelta delay) {
125 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 143 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); 190 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2);
173 EXPECT_EQ(1U, all_sent_events().size()); 191 EXPECT_EQ(1U, all_sent_events().size());
174 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); 192 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
175 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); 193 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits);
176 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x); 194 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x);
177 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y); 195 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y);
178 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX); 196 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX);
179 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY); 197 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY);
180 } 198 }
181 199
200 const uint32_t HAS_SCROLL_UPDATE = 1;
201 const uint32_t HAS_MOUSEWHEEL = 1 << 1;
202 const uint32_t HAS_SYNTHETIC_BEGIN = 1 << 2;
203 const uint32_t HAS_SYNTHETIC_END = 1 << 3;
204 const uint32_t HAS_INERTIAL = 1 << 4;
205
206 void ValidatePhaseSequence(bool high_precision,
207 size_t expect_queue_count,
208 uint32_t flags) {
209 const WebGestureEvent::ScrollUnits scroll_units =
210 high_precision ? WebGestureEvent::PrecisePixels
211 : WebGestureEvent::Pixels;
212 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
213 EXPECT_EQ(expect_queue_count, queued_event_count());
214 EXPECT_EQ((flags & HAS_MOUSEWHEEL) != 0, event_in_flight());
215 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
216
217 size_t expect_event_count = 2;
218 if (flags & HAS_SCROLL_UPDATE)
219 ++expect_event_count;
220 if (flags & HAS_MOUSEWHEEL)
221 ++expect_event_count;
222
223 EXPECT_EQ(1U, GetAndResetAckedEventCount());
224 EXPECT_EQ(expect_event_count, all_sent_events().size());
225 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
226 EXPECT_EQ(scroll_units,
227 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits);
228 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x);
229 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y);
230 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX);
231 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY);
232 EXPECT_EQ((flags & HAS_INERTIAL) != 0,
233 sent_gesture_events()[0].data.scrollBegin.inertial);
234 EXPECT_EQ((flags & HAS_SYNTHETIC_BEGIN) != 0,
235 sent_gesture_events()[0].data.scrollBegin.synthetic);
236 size_t index = 1;
237 if (flags & HAS_SCROLL_UPDATE) {
238 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
239 EXPECT_EQ(scroll_units,
240 sent_gesture_events()[1].data.scrollUpdate.deltaUnits);
241 EXPECT_EQ((flags & HAS_INERTIAL) != 0,
242 sent_gesture_events()[1].data.scrollUpdate.inertial);
243 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[1].x);
244 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[1].y);
245 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[1].globalX);
246 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[1].globalY);
247 ++index;
248 }
249
250 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[index].type);
251 EXPECT_EQ(scroll_units,
252 sent_gesture_events()[index].data.scrollEnd.deltaUnits);
253 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[index].x);
254 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[index].y);
255 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[index].globalX);
256 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[index].globalY);
257 EXPECT_EQ((flags & HAS_INERTIAL) != 0,
258 sent_gesture_events()[index].data.scrollEnd.inertial);
259 EXPECT_EQ((flags & HAS_SYNTHETIC_END) != 0,
260 sent_gesture_events()[index].data.scrollEnd.synthetic);
261 ++index;
262 if (flags & HAS_MOUSEWHEEL)
263 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[index].type);
264 EXPECT_EQ(expect_event_count, GetAndResetSentEventCount());
265 }
266
267 void PhaseGestureSendingTest(bool high_precision) {
268 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
269 kWheelScrollGlobalY, 1, 1, 0, high_precision,
270 WebMouseWheelEvent::PhaseBegan,
271 WebMouseWheelEvent::PhaseNone);
272 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
273 kWheelScrollGlobalY, 5, 5, 0, high_precision,
274 WebMouseWheelEvent::PhaseChanged,
275 WebMouseWheelEvent::PhaseNone);
276 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
277 kWheelScrollGlobalY, 0, 0, 0, high_precision,
278 WebMouseWheelEvent::PhaseEnded,
279 WebMouseWheelEvent::PhaseNone);
280 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
281 kWheelScrollGlobalY, 5, 5, 0, high_precision,
282 WebMouseWheelEvent::PhaseNone,
283 WebMouseWheelEvent::PhaseBegan);
284 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
285 kWheelScrollGlobalY, 5, 5, 0, high_precision,
286 WebMouseWheelEvent::PhaseNone,
287 WebMouseWheelEvent::PhaseChanged);
288 SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
289 kWheelScrollGlobalY, 0, 0, 0, high_precision,
290 WebMouseWheelEvent::PhaseNone,
291 WebMouseWheelEvent::PhaseEnded);
292
293 EXPECT_EQ(5U, queued_event_count());
294 EXPECT_TRUE(event_in_flight());
295 EXPECT_EQ(1U, GetAndResetSentEventCount());
296
297 // Receive an ACK for the mouse wheel event and release the next
298 // mouse wheel event.
299 ValidatePhaseSequence(high_precision, 4U, HAS_SCROLL_UPDATE |
300 HAS_MOUSEWHEEL |
301 HAS_SYNTHETIC_END);
tdresser 2016/03/08 14:28:53 The distance between sending the mousewheel and de
dtapuska 2016/03/08 20:31:49 I've replaced it with macros that I find much easi
302 ValidatePhaseSequence(high_precision, 3U,
303 HAS_SCROLL_UPDATE | HAS_MOUSEWHEEL |
304 HAS_SYNTHETIC_BEGIN | HAS_SYNTHETIC_END);
305 ValidatePhaseSequence(high_precision, 2U,
306 HAS_SYNTHETIC_BEGIN | HAS_MOUSEWHEEL);
307 ValidatePhaseSequence(
308 high_precision, 1U,
309 HAS_SCROLL_UPDATE | HAS_MOUSEWHEEL | HAS_SYNTHETIC_END | HAS_INERTIAL);
310 ValidatePhaseSequence(high_precision, 0U,
311 HAS_SCROLL_UPDATE | HAS_MOUSEWHEEL |
312 HAS_SYNTHETIC_BEGIN | HAS_SYNTHETIC_END |
313 HAS_INERTIAL);
314 ValidatePhaseSequence(high_precision, 0U,
315 HAS_SYNTHETIC_BEGIN | HAS_INERTIAL);
316 }
317
182 scoped_ptr<MouseWheelEventQueue> queue_; 318 scoped_ptr<MouseWheelEventQueue> queue_;
183 std::vector<WebInputEvent> sent_events_; 319 std::vector<WebInputEvent> sent_events_;
184 std::vector<WebGestureEvent> sent_gesture_events_; 320 std::vector<WebGestureEvent> sent_gesture_events_;
185 size_t acked_event_count_; 321 size_t acked_event_count_;
186 InputEventAckState last_acked_event_state_; 322 InputEventAckState last_acked_event_state_;
187 base::MessageLoopForUI message_loop_; 323 base::MessageLoopForUI message_loop_;
188 WebMouseWheelEvent last_acked_event_; 324 WebMouseWheelEvent last_acked_event_;
189 }; 325 };
190 326
191 // Tests that mouse wheel events are queued properly. 327 // Tests that mouse wheel events are queued properly.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 TEST_F(MouseWheelEventQueueTest, GestureSending) { 359 TEST_F(MouseWheelEventQueueTest, GestureSending) {
224 SetUpForGestureTesting(true); 360 SetUpForGestureTesting(true);
225 GestureSendingTest(false); 361 GestureSendingTest(false);
226 } 362 }
227 363
228 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { 364 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) {
229 SetUpForGestureTesting(true); 365 SetUpForGestureTesting(true);
230 GestureSendingTest(false); 366 GestureSendingTest(false);
231 } 367 }
232 368
369 TEST_F(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) {
tdresser 2016/03/08 14:28:53 You could use TEST_P here, but I don't think it ha
dtapuska 2016/03/08 20:31:49 For two parameters; true vs false it is much more
370 SetUpForGestureTesting(true);
371 PhaseGestureSendingTest(false);
372 }
373
374 TEST_F(MouseWheelEventQueueTest,
375 GestureSendingWithPhaseInformationPrecisePixels) {
376 SetUpForGestureTesting(true);
377 PhaseGestureSendingTest(true);
378 }
379
233 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { 380 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) {
234 SetUpForGestureTesting(true); 381 SetUpForGestureTesting(true);
235 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX, 382 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
236 kWheelScrollGlobalY, 1, 1, 0, false); 383 kWheelScrollGlobalY, 1, 1, 0, false);
237 EXPECT_EQ(0U, queued_event_count()); 384 EXPECT_EQ(0U, queued_event_count());
238 EXPECT_TRUE(event_in_flight()); 385 EXPECT_TRUE(event_in_flight());
239 EXPECT_EQ(1U, GetAndResetSentEventCount()); 386 EXPECT_EQ(1U, GetAndResetSentEventCount());
240 387
241 // Receive an ACK for the mouse wheel event. 388 // Receive an ACK for the mouse wheel event.
242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 389 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 EXPECT_FALSE(event_in_flight()); 432 EXPECT_FALSE(event_in_flight());
286 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 433 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
287 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 434 EXPECT_EQ(1U, GetAndResetAckedEventCount());
288 EXPECT_EQ(2U, all_sent_events().size()); 435 EXPECT_EQ(2U, all_sent_events().size());
289 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); 436 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
290 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); 437 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
291 EXPECT_EQ(2U, GetAndResetSentEventCount()); 438 EXPECT_EQ(2U, GetAndResetSentEventCount());
292 } 439 }
293 440
294 } // namespace content 441 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698