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

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

Issue 1716283002: Fix x/y position of gesture scroll events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_wheel_regression
Patch Set: Add globalX/globalY tests Created 4 years, 10 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"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/thread_task_runner_handle.h" 14 #include "base/thread_task_runner_handle.h"
15 #include "content/browser/renderer_host/input/timeout_monitor.h" 15 #include "content/browser/renderer_host/input/timeout_monitor.h"
16 #include "content/common/input/synthetic_web_input_event_builders.h" 16 #include "content/common/input/synthetic_web_input_event_builders.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "third_party/WebKit/public/web/WebInputEvent.h" 18 #include "third_party/WebKit/public/web/WebInputEvent.h"
19 19
20 using blink::WebGestureEvent; 20 using blink::WebGestureEvent;
21 using blink::WebInputEvent; 21 using blink::WebInputEvent;
22 using blink::WebMouseWheelEvent; 22 using blink::WebMouseWheelEvent;
23 23
24 namespace content { 24 namespace content {
25 namespace { 25 namespace {
26 26
27 const float kWheelScrollX = 10;
28 const float kWheelScrollY = 12;
29 const float kWheelScrollGlobalX = 50;
30 const float kWheelScrollGlobalY = 72;
27 const int64_t kScrollEndTimeoutMs = 100; 31 const int64_t kScrollEndTimeoutMs = 100;
28 32
29 base::TimeDelta DefaultScrollEndTimeoutDelay() { 33 base::TimeDelta DefaultScrollEndTimeoutDelay() {
30 return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs); 34 return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs);
31 } 35 }
32 36
33 } // namespace 37 } // namespace
34 38
35 class MouseWheelEventQueueTest : public testing::Test, 39 class MouseWheelEventQueueTest : public testing::Test,
36 public MouseWheelEventQueueClient { 40 public MouseWheelEventQueueClient {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 acked_event_count_ = 0; 95 acked_event_count_ = 0;
92 return count; 96 return count;
93 } 97 }
94 98
95 void SendMouseWheelEventAck(InputEventAckState ack_result) { 99 void SendMouseWheelEventAck(InputEventAckState ack_result) {
96 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo()); 100 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo());
97 } 101 }
98 102
99 void SendMouseWheel(float x, 103 void SendMouseWheel(float x,
100 float y, 104 float y,
105 float global_x,
106 float global_y,
101 float dX, 107 float dX,
102 float dY, 108 float dY,
103 int modifiers, 109 int modifiers,
104 bool high_precision) { 110 bool high_precision) {
105 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( 111 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(
106 SyntheticWebMouseWheelEventBuilder::Build(x, y, dX, dY, modifiers, 112 SyntheticWebMouseWheelEventBuilder::Build(
107 high_precision))); 113 x, y, global_x, global_y, dX, dY, modifiers, high_precision)));
108 } 114 }
109 115
110 void SendGestureEvent(WebInputEvent::Type type) { 116 void SendGestureEvent(WebInputEvent::Type type) {
111 WebGestureEvent event; 117 WebGestureEvent event;
112 event.type = type; 118 event.type = type;
113 event.sourceDevice = blink::WebGestureDeviceTouchscreen; 119 event.sourceDevice = blink::WebGestureDeviceTouchscreen;
114 queue_->OnGestureScrollEvent( 120 queue_->OnGestureScrollEvent(
115 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); 121 GestureEventWithLatencyInfo(event, ui::LatencyInfo()));
116 } 122 }
117 123
118 static void RunTasksAndWait(base::TimeDelta delay) { 124 static void RunTasksAndWait(base::TimeDelta delay) {
119 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 125 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
120 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); 126 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay);
121 base::MessageLoop::current()->Run(); 127 base::MessageLoop::current()->Run();
122 } 128 }
123 129
124 void GestureSendingTest(bool high_precision) { 130 void GestureSendingTest(bool high_precision) {
125 const WebGestureEvent::ScrollUnits scroll_units = 131 const WebGestureEvent::ScrollUnits scroll_units =
126 high_precision ? WebGestureEvent::PrecisePixels 132 high_precision ? WebGestureEvent::PrecisePixels
127 : WebGestureEvent::Pixels; 133 : WebGestureEvent::Pixels;
128 SendMouseWheel(10, 10, 1, 1, 0, high_precision); 134 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
135 kWheelScrollGlobalY, 1, 1, 0, high_precision);
129 EXPECT_EQ(0U, queued_event_count()); 136 EXPECT_EQ(0U, queued_event_count());
130 EXPECT_TRUE(event_in_flight()); 137 EXPECT_TRUE(event_in_flight());
131 EXPECT_EQ(1U, GetAndResetSentEventCount()); 138 EXPECT_EQ(1U, GetAndResetSentEventCount());
132 139
133 // The second mouse wheel should not be sent since one is already in queue. 140 // The second mouse wheel should not be sent since one is already in queue.
134 SendMouseWheel(10, 10, 5, 5, 0, high_precision); 141 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
142 kWheelScrollGlobalY, 5, 5, 0, high_precision);
135 EXPECT_EQ(1U, queued_event_count()); 143 EXPECT_EQ(1U, queued_event_count());
136 EXPECT_TRUE(event_in_flight()); 144 EXPECT_TRUE(event_in_flight());
137 EXPECT_EQ(0U, GetAndResetSentEventCount()); 145 EXPECT_EQ(0U, GetAndResetSentEventCount());
138 146
139 // Receive an ACK for the mouse wheel event and release the next 147 // Receive an ACK for the mouse wheel event and release the next
140 // mouse wheel event. 148 // mouse wheel event.
141 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 149 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
142 EXPECT_EQ(0U, queued_event_count()); 150 EXPECT_EQ(0U, queued_event_count());
143 EXPECT_TRUE(event_in_flight()); 151 EXPECT_TRUE(event_in_flight());
144 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 152 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
145 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 153 EXPECT_EQ(1U, GetAndResetAckedEventCount());
146 EXPECT_EQ(3U, all_sent_events().size()); 154 EXPECT_EQ(3U, all_sent_events().size());
147 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); 155 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
148 EXPECT_EQ(scroll_units, 156 EXPECT_EQ(scroll_units,
149 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits); 157 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits);
158 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x);
159 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y);
160 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX);
161 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY);
150 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); 162 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
151 EXPECT_EQ(scroll_units, 163 EXPECT_EQ(scroll_units,
152 sent_gesture_events()[1].data.scrollUpdate.deltaUnits); 164 sent_gesture_events()[1].data.scrollUpdate.deltaUnits);
165 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[1].x);
166 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[1].y);
167 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[1].globalX);
168 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[1].globalY);
153 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type); 169 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type);
154 EXPECT_EQ(3U, GetAndResetSentEventCount()); 170 EXPECT_EQ(3U, GetAndResetSentEventCount());
155 171
156 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); 172 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2);
157 EXPECT_EQ(1U, all_sent_events().size()); 173 EXPECT_EQ(1U, all_sent_events().size());
158 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); 174 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
159 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); 175 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits);
176 EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x);
177 EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y);
178 EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX);
179 EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY);
160 } 180 }
161 181
162 scoped_ptr<MouseWheelEventQueue> queue_; 182 scoped_ptr<MouseWheelEventQueue> queue_;
163 std::vector<WebInputEvent> sent_events_; 183 std::vector<WebInputEvent> sent_events_;
164 std::vector<WebGestureEvent> sent_gesture_events_; 184 std::vector<WebGestureEvent> sent_gesture_events_;
165 size_t acked_event_count_; 185 size_t acked_event_count_;
166 InputEventAckState last_acked_event_state_; 186 InputEventAckState last_acked_event_state_;
167 base::MessageLoopForUI message_loop_; 187 base::MessageLoopForUI message_loop_;
168 WebMouseWheelEvent last_acked_event_; 188 WebMouseWheelEvent last_acked_event_;
169 }; 189 };
170 190
171 // Tests that mouse wheel events are queued properly. 191 // Tests that mouse wheel events are queued properly.
172 TEST_F(MouseWheelEventQueueTest, Basic) { 192 TEST_F(MouseWheelEventQueueTest, Basic) {
173 SendMouseWheel(10, 10, 1, 1, 0, false); 193 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
194 kWheelScrollGlobalY, 1, 1, 0, false);
174 EXPECT_EQ(0U, queued_event_count()); 195 EXPECT_EQ(0U, queued_event_count());
175 EXPECT_TRUE(event_in_flight()); 196 EXPECT_TRUE(event_in_flight());
176 EXPECT_EQ(1U, GetAndResetSentEventCount()); 197 EXPECT_EQ(1U, GetAndResetSentEventCount());
177 198
178 // The second mouse wheel should not be sent since one is already in queue. 199 // The second mouse wheel should not be sent since one is already in queue.
179 SendMouseWheel(10, 10, 5, 5, 0, false); 200 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
201 kWheelScrollGlobalY, 5, 5, 0, false);
180 EXPECT_EQ(1U, queued_event_count()); 202 EXPECT_EQ(1U, queued_event_count());
181 EXPECT_TRUE(event_in_flight()); 203 EXPECT_TRUE(event_in_flight());
182 EXPECT_EQ(0U, GetAndResetSentEventCount()); 204 EXPECT_EQ(0U, GetAndResetSentEventCount());
183 205
184 // Receive an ACK for the first mouse wheel event. 206 // Receive an ACK for the first mouse wheel event.
185 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 207 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
186 EXPECT_EQ(0U, queued_event_count()); 208 EXPECT_EQ(0U, queued_event_count());
187 EXPECT_TRUE(event_in_flight()); 209 EXPECT_TRUE(event_in_flight());
188 EXPECT_EQ(1U, GetAndResetSentEventCount()); 210 EXPECT_EQ(1U, GetAndResetSentEventCount());
189 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 211 EXPECT_EQ(1U, GetAndResetAckedEventCount());
(...skipping 13 matching lines...) Expand all
203 GestureSendingTest(false); 225 GestureSendingTest(false);
204 } 226 }
205 227
206 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { 228 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) {
207 SetUpForGestureTesting(true); 229 SetUpForGestureTesting(true);
208 GestureSendingTest(false); 230 GestureSendingTest(false);
209 } 231 }
210 232
211 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { 233 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) {
212 SetUpForGestureTesting(true); 234 SetUpForGestureTesting(true);
213 SendMouseWheel(10, 10, 1, 1, 0, false); 235 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
236 kWheelScrollGlobalY, 1, 1, 0, false);
214 EXPECT_EQ(0U, queued_event_count()); 237 EXPECT_EQ(0U, queued_event_count());
215 EXPECT_TRUE(event_in_flight()); 238 EXPECT_TRUE(event_in_flight());
216 EXPECT_EQ(1U, GetAndResetSentEventCount()); 239 EXPECT_EQ(1U, GetAndResetSentEventCount());
217 240
218 // Receive an ACK for the mouse wheel event. 241 // Receive an ACK for the mouse wheel event.
219 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
220 EXPECT_EQ(0U, queued_event_count()); 243 EXPECT_EQ(0U, queued_event_count());
221 EXPECT_FALSE(event_in_flight()); 244 EXPECT_FALSE(event_in_flight());
222 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 245 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
223 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 246 EXPECT_EQ(1U, GetAndResetAckedEventCount());
224 EXPECT_EQ(2U, all_sent_events().size()); 247 EXPECT_EQ(2U, all_sent_events().size());
225 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); 248 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
226 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); 249 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
227 EXPECT_EQ(2U, GetAndResetSentEventCount()); 250 EXPECT_EQ(2U, GetAndResetSentEventCount());
228 251
229 // Ensure that a gesture scroll begin terminates the current scroll event. 252 // Ensure that a gesture scroll begin terminates the current scroll event.
230 SendGestureEvent(WebInputEvent::GestureScrollBegin); 253 SendGestureEvent(WebInputEvent::GestureScrollBegin);
231 EXPECT_EQ(1U, all_sent_events().size()); 254 EXPECT_EQ(1U, all_sent_events().size());
232 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); 255 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
233 EXPECT_EQ(1U, GetAndResetSentEventCount()); 256 EXPECT_EQ(1U, GetAndResetSentEventCount());
234 257
235 SendMouseWheel(10, 10, 1, 1, 0, false); 258 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
259 kWheelScrollGlobalY, 1, 1, 0, false);
236 EXPECT_EQ(0U, queued_event_count()); 260 EXPECT_EQ(0U, queued_event_count());
237 EXPECT_TRUE(event_in_flight()); 261 EXPECT_TRUE(event_in_flight());
238 EXPECT_EQ(1U, GetAndResetSentEventCount()); 262 EXPECT_EQ(1U, GetAndResetSentEventCount());
239 263
240 // New mouse wheel events won't cause gestures because a scroll 264 // New mouse wheel events won't cause gestures because a scroll
241 // is already in progress by another device. 265 // is already in progress by another device.
242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 266 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
243 EXPECT_EQ(0U, queued_event_count()); 267 EXPECT_EQ(0U, queued_event_count());
244 EXPECT_FALSE(event_in_flight()); 268 EXPECT_FALSE(event_in_flight());
245 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 269 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
246 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 270 EXPECT_EQ(1U, GetAndResetAckedEventCount());
247 EXPECT_EQ(0U, all_sent_events().size()); 271 EXPECT_EQ(0U, all_sent_events().size());
248 272
249 SendGestureEvent(WebInputEvent::GestureScrollEnd); 273 SendGestureEvent(WebInputEvent::GestureScrollEnd);
250 EXPECT_EQ(0U, all_sent_events().size()); 274 EXPECT_EQ(0U, all_sent_events().size());
251 275
252 SendMouseWheel(10, 10, 1, 1, 0, false); 276 SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
277 kWheelScrollGlobalY, 1, 1, 0, false);
253 EXPECT_EQ(0U, queued_event_count()); 278 EXPECT_EQ(0U, queued_event_count());
254 EXPECT_TRUE(event_in_flight()); 279 EXPECT_TRUE(event_in_flight());
255 EXPECT_EQ(1U, GetAndResetSentEventCount()); 280 EXPECT_EQ(1U, GetAndResetSentEventCount());
256 281
257 // Receive an ACK for the mouse wheel event. 282 // Receive an ACK for the mouse wheel event.
258 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 283 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
259 EXPECT_EQ(0U, queued_event_count()); 284 EXPECT_EQ(0U, queued_event_count());
260 EXPECT_FALSE(event_in_flight()); 285 EXPECT_FALSE(event_in_flight());
261 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 286 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
262 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 287 EXPECT_EQ(1U, GetAndResetAckedEventCount());
263 EXPECT_EQ(2U, all_sent_events().size()); 288 EXPECT_EQ(2U, all_sent_events().size());
264 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); 289 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
265 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); 290 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
266 EXPECT_EQ(2U, GetAndResetSentEventCount()); 291 EXPECT_EQ(2U, GetAndResetSentEventCount());
267 } 292 }
268 293
269 } // namespace content 294 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698