Chromium Code Reviews| 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |