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

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

Issue 1710033002: Add scrollDelta units to GestureScrollEnd. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_wheel_passive_listeners_3
Patch Set: Add precise pixels unit test 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"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 ~MouseWheelEventQueueTest() override {} 44 ~MouseWheelEventQueueTest() override {}
45 45
46 // MouseWheelEventQueueClient 46 // MouseWheelEventQueueClient
47 void SendMouseWheelEventImmediately( 47 void SendMouseWheelEventImmediately(
48 const MouseWheelEventWithLatencyInfo& event) override { 48 const MouseWheelEventWithLatencyInfo& event) override {
49 sent_events_.push_back(event.event); 49 sent_events_.push_back(event.event);
50 } 50 }
51 51
52 void SendGestureEvent(const GestureEventWithLatencyInfo& event) override { 52 void SendGestureEvent(const GestureEventWithLatencyInfo& event) override {
53 sent_events_.push_back(event.event); 53 sent_events_.push_back(event.event);
54 sent_gesture_events_.push_back(event.event);
54 } 55 }
55 56
56 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, 57 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event,
57 InputEventAckState ack_result) override { 58 InputEventAckState ack_result) override {
58 ++acked_event_count_; 59 ++acked_event_count_;
59 last_acked_event_ = event.event; 60 last_acked_event_ = event.event;
60 last_acked_event_state_ = ack_result; 61 last_acked_event_state_ = ack_result;
61 } 62 }
62 63
63 protected: 64 protected:
64 void SetUpForGestureTesting(bool send_gestures) { 65 void SetUpForGestureTesting(bool send_gestures) {
65 queue_.reset( 66 queue_.reset(
66 new MouseWheelEventQueue(this, send_gestures, kScrollEndTimeoutMs)); 67 new MouseWheelEventQueue(this, send_gestures, kScrollEndTimeoutMs));
67 } 68 }
68 69
69 size_t queued_event_count() const { return queue_->queued_size(); } 70 size_t queued_event_count() const { return queue_->queued_size(); }
70 71
71 bool event_in_flight() const { return queue_->event_in_flight(); } 72 bool event_in_flight() const { return queue_->event_in_flight(); }
72 73
73 std::vector<WebInputEvent>& all_sent_events() { return sent_events_; } 74 std::vector<WebInputEvent>& all_sent_events() { return sent_events_; }
74 75
76 std::vector<WebGestureEvent>& sent_gesture_events() {
77 return sent_gesture_events_;
78 }
79
75 const WebMouseWheelEvent& acked_event() const { return last_acked_event_; } 80 const WebMouseWheelEvent& acked_event() const { return last_acked_event_; }
76 81
77 size_t GetAndResetSentEventCount() { 82 size_t GetAndResetSentEventCount() {
78 size_t count = sent_events_.size(); 83 size_t count = sent_events_.size();
79 sent_events_.clear(); 84 sent_events_.clear();
85 sent_gesture_events_.clear();
80 return count; 86 return count;
81 } 87 }
82 88
83 size_t GetAndResetAckedEventCount() { 89 size_t GetAndResetAckedEventCount() {
84 size_t count = acked_event_count_; 90 size_t count = acked_event_count_;
85 acked_event_count_ = 0; 91 acked_event_count_ = 0;
86 return count; 92 return count;
87 } 93 }
88 94
89 void SendMouseWheelEventAck(InputEventAckState ack_result) { 95 void SendMouseWheelEventAck(InputEventAckState ack_result) {
90 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo()); 96 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo());
91 } 97 }
92 98
93 void SendMouseWheel(float x, float y, float dX, float dY, int modifiers) { 99 void SendMouseWheel(float x,
100 float y,
101 float dX,
102 float dY,
103 int modifiers,
104 bool high_precision) {
94 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( 105 queue_->QueueEvent(MouseWheelEventWithLatencyInfo(
95 SyntheticWebMouseWheelEventBuilder::Build(x, y, dX, dY, modifiers, 106 SyntheticWebMouseWheelEventBuilder::Build(x, y, dX, dY, modifiers,
96 false))); 107 high_precision)));
97 } 108 }
98 109
99 void SendGestureEvent(WebInputEvent::Type type) { 110 void SendGestureEvent(WebInputEvent::Type type) {
100 WebGestureEvent event; 111 WebGestureEvent event;
101 event.type = type; 112 event.type = type;
102 event.sourceDevice = blink::WebGestureDeviceTouchscreen; 113 event.sourceDevice = blink::WebGestureDeviceTouchscreen;
103 queue_->OnGestureScrollEvent( 114 queue_->OnGestureScrollEvent(
104 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); 115 GestureEventWithLatencyInfo(event, ui::LatencyInfo()));
105 } 116 }
106 117
107 static void RunTasksAndWait(base::TimeDelta delay) { 118 static void RunTasksAndWait(base::TimeDelta delay) {
108 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 119 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
109 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); 120 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay);
110 base::MessageLoop::current()->Run(); 121 base::MessageLoop::current()->Run();
111 } 122 }
112 123
124 void GestureSendingTest(bool high_precision) {
125 const WebGestureEvent::ScrollUnits scroll_units =
126 high_precision ? WebGestureEvent::PrecisePixels
127 : WebGestureEvent::Pixels;
128 SendMouseWheel(10, 10, 1, 1, 0, high_precision);
129 EXPECT_EQ(0U, queued_event_count());
130 EXPECT_TRUE(event_in_flight());
131 EXPECT_EQ(1U, GetAndResetSentEventCount());
132
133 // The second mouse wheel should not be sent since one is already in queue.
134 SendMouseWheel(10, 10, 5, 5, 0, high_precision);
135 EXPECT_EQ(1U, queued_event_count());
136 EXPECT_TRUE(event_in_flight());
137 EXPECT_EQ(0U, GetAndResetSentEventCount());
138
139 // Receive an ACK for the mouse wheel event and release the next
140 // mouse wheel event.
141 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
142 EXPECT_EQ(0U, queued_event_count());
143 EXPECT_TRUE(event_in_flight());
144 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
145 EXPECT_EQ(1U, GetAndResetAckedEventCount());
146 EXPECT_EQ(3U, all_sent_events().size());
147 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
148 EXPECT_EQ(scroll_units,
149 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits);
150 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
151 EXPECT_EQ(scroll_units,
152 sent_gesture_events()[1].data.scrollUpdate.deltaUnits);
153 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type);
154 EXPECT_EQ(3U, GetAndResetSentEventCount());
155
156 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2);
157 EXPECT_EQ(1U, all_sent_events().size());
158 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
159 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits);
160 }
161
113 scoped_ptr<MouseWheelEventQueue> queue_; 162 scoped_ptr<MouseWheelEventQueue> queue_;
114 std::vector<WebInputEvent> sent_events_; 163 std::vector<WebInputEvent> sent_events_;
164 std::vector<WebGestureEvent> sent_gesture_events_;
115 size_t acked_event_count_; 165 size_t acked_event_count_;
116 InputEventAckState last_acked_event_state_; 166 InputEventAckState last_acked_event_state_;
117 base::MessageLoopForUI message_loop_; 167 base::MessageLoopForUI message_loop_;
118 WebMouseWheelEvent last_acked_event_; 168 WebMouseWheelEvent last_acked_event_;
119 }; 169 };
120 170
121 // Tests that mouse wheel events are queued properly. 171 // Tests that mouse wheel events are queued properly.
122 TEST_F(MouseWheelEventQueueTest, Basic) { 172 TEST_F(MouseWheelEventQueueTest, Basic) {
123 SendMouseWheel(10, 10, 1, 1, 0); 173 SendMouseWheel(10, 10, 1, 1, 0, false);
124 EXPECT_EQ(0U, queued_event_count()); 174 EXPECT_EQ(0U, queued_event_count());
125 EXPECT_TRUE(event_in_flight()); 175 EXPECT_TRUE(event_in_flight());
126 EXPECT_EQ(1U, GetAndResetSentEventCount()); 176 EXPECT_EQ(1U, GetAndResetSentEventCount());
127 177
128 // The second mouse wheel should not be sent since one is already in queue. 178 // The second mouse wheel should not be sent since one is already in queue.
129 SendMouseWheel(10, 10, 5, 5, 0); 179 SendMouseWheel(10, 10, 5, 5, 0, false);
130 EXPECT_EQ(1U, queued_event_count()); 180 EXPECT_EQ(1U, queued_event_count());
131 EXPECT_TRUE(event_in_flight()); 181 EXPECT_TRUE(event_in_flight());
132 EXPECT_EQ(0U, GetAndResetSentEventCount()); 182 EXPECT_EQ(0U, GetAndResetSentEventCount());
133 183
134 // Receive an ACK for the first mouse wheel event. 184 // Receive an ACK for the first mouse wheel event.
135 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 185 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
136 EXPECT_EQ(0U, queued_event_count()); 186 EXPECT_EQ(0U, queued_event_count());
137 EXPECT_TRUE(event_in_flight()); 187 EXPECT_TRUE(event_in_flight());
138 EXPECT_EQ(1U, GetAndResetSentEventCount()); 188 EXPECT_EQ(1U, GetAndResetSentEventCount());
139 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 189 EXPECT_EQ(1U, GetAndResetAckedEventCount());
140 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 190 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
141 191
142 // Receive an ACK for the second mouse wheel event. 192 // Receive an ACK for the second mouse wheel event.
143 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); 193 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
144 EXPECT_EQ(0U, queued_event_count()); 194 EXPECT_EQ(0U, queued_event_count());
145 EXPECT_FALSE(event_in_flight()); 195 EXPECT_FALSE(event_in_flight());
146 EXPECT_EQ(0U, GetAndResetSentEventCount()); 196 EXPECT_EQ(0U, GetAndResetSentEventCount());
147 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 197 EXPECT_EQ(1U, GetAndResetAckedEventCount());
148 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 198 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
149 } 199 }
150 200
151 TEST_F(MouseWheelEventQueueTest, GestureSending) { 201 TEST_F(MouseWheelEventQueueTest, GestureSending) {
152 SetUpForGestureTesting(true); 202 SetUpForGestureTesting(true);
153 SendMouseWheel(10, 10, 1, 1, 0); 203 GestureSendingTest(false);
154 EXPECT_EQ(0U, queued_event_count()); 204 }
155 EXPECT_TRUE(event_in_flight());
156 EXPECT_EQ(1U, GetAndResetSentEventCount());
157 205
158 // The second mouse wheel should not be sent since one is already in queue. 206 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) {
159 SendMouseWheel(10, 10, 5, 5, 0); 207 SetUpForGestureTesting(true);
160 EXPECT_EQ(1U, queued_event_count()); 208 GestureSendingTest(false);
161 EXPECT_TRUE(event_in_flight());
162 EXPECT_EQ(0U, GetAndResetSentEventCount());
163
164 // Receive an ACK for the mouse wheel event and release the next
165 // mouse wheel event.
166 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
167 EXPECT_EQ(0U, queued_event_count());
168 EXPECT_TRUE(event_in_flight());
169 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
170 EXPECT_EQ(1U, GetAndResetAckedEventCount());
171 EXPECT_EQ(3U, all_sent_events().size());
172 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
173 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
174 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type);
175 EXPECT_EQ(3U, GetAndResetSentEventCount());
176
177 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2);
178 EXPECT_EQ(1U, all_sent_events().size());
179 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
180 } 209 }
181 210
182 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { 211 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) {
183 SetUpForGestureTesting(true); 212 SetUpForGestureTesting(true);
184 SendMouseWheel(10, 10, 1, 1, 0); 213 SendMouseWheel(10, 10, 1, 1, 0, false);
185 EXPECT_EQ(0U, queued_event_count()); 214 EXPECT_EQ(0U, queued_event_count());
186 EXPECT_TRUE(event_in_flight()); 215 EXPECT_TRUE(event_in_flight());
187 EXPECT_EQ(1U, GetAndResetSentEventCount()); 216 EXPECT_EQ(1U, GetAndResetSentEventCount());
188 217
189 // Receive an ACK for the mouse wheel event. 218 // Receive an ACK for the mouse wheel event.
190 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 219 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
191 EXPECT_EQ(0U, queued_event_count()); 220 EXPECT_EQ(0U, queued_event_count());
192 EXPECT_FALSE(event_in_flight()); 221 EXPECT_FALSE(event_in_flight());
193 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 222 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
194 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 223 EXPECT_EQ(1U, GetAndResetAckedEventCount());
195 EXPECT_EQ(2U, all_sent_events().size()); 224 EXPECT_EQ(2U, all_sent_events().size());
196 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); 225 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
197 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); 226 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
198 EXPECT_EQ(2U, GetAndResetSentEventCount()); 227 EXPECT_EQ(2U, GetAndResetSentEventCount());
199 228
200 // Ensure that a gesture scroll begin terminates the current scroll event. 229 // Ensure that a gesture scroll begin terminates the current scroll event.
201 SendGestureEvent(WebInputEvent::GestureScrollBegin); 230 SendGestureEvent(WebInputEvent::GestureScrollBegin);
202 EXPECT_EQ(1U, all_sent_events().size()); 231 EXPECT_EQ(1U, all_sent_events().size());
203 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); 232 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
204 EXPECT_EQ(1U, GetAndResetSentEventCount()); 233 EXPECT_EQ(1U, GetAndResetSentEventCount());
205 234
206 SendMouseWheel(10, 10, 1, 1, 0); 235 SendMouseWheel(10, 10, 1, 1, 0, false);
207 EXPECT_EQ(0U, queued_event_count()); 236 EXPECT_EQ(0U, queued_event_count());
208 EXPECT_TRUE(event_in_flight()); 237 EXPECT_TRUE(event_in_flight());
209 EXPECT_EQ(1U, GetAndResetSentEventCount()); 238 EXPECT_EQ(1U, GetAndResetSentEventCount());
210 239
211 // New mouse wheel events won't cause gestures because a scroll 240 // New mouse wheel events won't cause gestures because a scroll
212 // is already in progress by another device. 241 // is already in progress by another device.
213 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
214 EXPECT_EQ(0U, queued_event_count()); 243 EXPECT_EQ(0U, queued_event_count());
215 EXPECT_FALSE(event_in_flight()); 244 EXPECT_FALSE(event_in_flight());
216 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 245 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
217 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 246 EXPECT_EQ(1U, GetAndResetAckedEventCount());
218 EXPECT_EQ(0U, all_sent_events().size()); 247 EXPECT_EQ(0U, all_sent_events().size());
219 248
220 SendGestureEvent(WebInputEvent::GestureScrollEnd); 249 SendGestureEvent(WebInputEvent::GestureScrollEnd);
221 EXPECT_EQ(0U, all_sent_events().size()); 250 EXPECT_EQ(0U, all_sent_events().size());
222 251
223 SendMouseWheel(10, 10, 1, 1, 0); 252 SendMouseWheel(10, 10, 1, 1, 0, false);
224 EXPECT_EQ(0U, queued_event_count()); 253 EXPECT_EQ(0U, queued_event_count());
225 EXPECT_TRUE(event_in_flight()); 254 EXPECT_TRUE(event_in_flight());
226 EXPECT_EQ(1U, GetAndResetSentEventCount()); 255 EXPECT_EQ(1U, GetAndResetSentEventCount());
227 256
228 // Receive an ACK for the mouse wheel event. 257 // Receive an ACK for the mouse wheel event.
229 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 258 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
230 EXPECT_EQ(0U, queued_event_count()); 259 EXPECT_EQ(0U, queued_event_count());
231 EXPECT_FALSE(event_in_flight()); 260 EXPECT_FALSE(event_in_flight());
232 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); 261 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
233 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 262 EXPECT_EQ(1U, GetAndResetAckedEventCount());
234 EXPECT_EQ(2U, all_sent_events().size()); 263 EXPECT_EQ(2U, all_sent_events().size());
235 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); 264 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
236 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); 265 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
237 EXPECT_EQ(2U, GetAndResetSentEventCount()); 266 EXPECT_EQ(2U, GetAndResetSentEventCount());
238 } 267 }
239 268
240 } // namespace content 269 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/input/mouse_wheel_event_queue.cc ('k') | third_party/WebKit/public/web/WebInputEvent.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698