OLD | NEW |
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 Loading... |
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 |
OLD | NEW |