| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <new> | 7 #include <new> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "base/strings/string_util.h" |
| 12 #include "base/test/histogram_tester.h" | 13 #include "base/test/histogram_tester.h" |
| 13 #include "base/test/scoped_feature_list.h" | 14 #include "base/test/scoped_feature_list.h" |
| 14 #include "base/test/test_simple_task_runner.h" | 15 #include "base/test/test_simple_task_runner.h" |
| 15 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 16 #include "content/common/input/synthetic_web_input_event_builders.h" | 17 #include "content/common/input/synthetic_web_input_event_builders.h" |
| 17 #include "content/renderer/input/main_thread_event_queue.h" | 18 #include "content/renderer/input/main_thread_event_queue.h" |
| 18 #include "content/renderer/render_thread_impl.h" | 19 #include "content/renderer/render_thread_impl.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "third_party/WebKit/public/platform/scheduler/test/mock_renderer_schedu
ler.h" | 21 #include "third_party/WebKit/public/platform/scheduler/test/mock_renderer_schedu
ler.h" |
| 21 | 22 |
| 22 using blink::WebInputEvent; | 23 using blink::WebInputEvent; |
| 23 using blink::WebMouseEvent; | 24 using blink::WebMouseEvent; |
| 24 using blink::WebMouseWheelEvent; | 25 using blink::WebMouseWheelEvent; |
| 25 using blink::WebTouchEvent; | 26 using blink::WebTouchEvent; |
| 26 | 27 |
| 27 namespace blink { | 28 namespace blink { |
| 28 bool operator==(const WebMouseWheelEvent& lhs, const WebMouseWheelEvent& rhs) { | 29 bool operator==(const WebMouseWheelEvent& lhs, const WebMouseWheelEvent& rhs) { |
| 29 return memcmp(&lhs, &rhs, lhs.size) == 0; | 30 return memcmp(&lhs, &rhs, lhs.size) == 0; |
| 30 } | 31 } |
| 31 | 32 |
| 32 bool operator==(const WebTouchEvent& lhs, const WebTouchEvent& rhs) { | 33 bool operator==(const WebTouchEvent& lhs, const WebTouchEvent& rhs) { |
| 33 return memcmp(&lhs, &rhs, lhs.size) == 0; | 34 return memcmp(&lhs, &rhs, lhs.size) == 0; |
| 34 } | 35 } |
| 35 } // namespace blink | 36 } // namespace blink |
| 36 | 37 |
| 37 namespace content { | 38 namespace content { |
| 38 namespace { | 39 namespace { |
| 39 | 40 |
| 41 const unsigned kRafAlignedEnabledTouch = 1; |
| 42 const unsigned kRafAlignedEnabledMouse = 1 << 1; |
| 43 |
| 40 const int kTestRoutingID = 13; | 44 const int kTestRoutingID = 13; |
| 41 const char* kCoalescedCountHistogram = | 45 const char* kCoalescedCountHistogram = |
| 42 "Event.MainThreadEventQueue.CoalescedCount"; | 46 "Event.MainThreadEventQueue.CoalescedCount"; |
| 43 | 47 |
| 44 } // namespace | 48 } // namespace |
| 45 | 49 |
| 46 class MainThreadEventQueueTest : public testing::TestWithParam<bool>, | 50 class MainThreadEventQueueTest : public testing::TestWithParam<unsigned>, |
| 47 public MainThreadEventQueueClient { | 51 public MainThreadEventQueueClient { |
| 48 public: | 52 public: |
| 49 MainThreadEventQueueTest() | 53 MainThreadEventQueueTest() |
| 50 : main_task_runner_(new base::TestSimpleTaskRunner()), | 54 : main_task_runner_(new base::TestSimpleTaskRunner()), |
| 51 handle_raf_aligned_input_(GetParam()), | 55 raf_aligned_input_setting_(GetParam()), |
| 52 needs_main_frame_(false) { | 56 needs_main_frame_(false) { |
| 53 if (handle_raf_aligned_input_) | 57 std::vector<std::string> features; |
| 54 feature_list_.InitAndEnableFeature(features::kRafAlignedInputEvents); | 58 if (raf_aligned_input_setting_ & kRafAlignedEnabledTouch) |
| 59 features.push_back(features::kRafAlignedTouchInputEvents.name); |
| 60 if (raf_aligned_input_setting_ & kRafAlignedEnabledMouse) |
| 61 features.push_back(features::kRafAlignedMouseInputEvents.name); |
| 62 |
| 63 feature_list_.InitFromCommandLine(base::JoinString(features, ","), |
| 64 std::string()); |
| 55 } | 65 } |
| 56 | 66 |
| 57 void SetUp() override { | 67 void SetUp() override { |
| 58 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_, | 68 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_, |
| 59 &renderer_scheduler_); | 69 &renderer_scheduler_); |
| 60 } | 70 } |
| 61 | 71 |
| 62 void HandleEventOnMainThread(int routing_id, | 72 void HandleEventOnMainThread(int routing_id, |
| 63 const blink::WebInputEvent* event, | 73 const blink::WebInputEvent* event, |
| 64 const ui::LatencyInfo& latency, | 74 const ui::LatencyInfo& latency, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 } | 123 } |
| 114 } | 124 } |
| 115 | 125 |
| 116 protected: | 126 protected: |
| 117 base::test::ScopedFeatureList feature_list_; | 127 base::test::ScopedFeatureList feature_list_; |
| 118 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; | 128 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
| 119 blink::scheduler::MockRendererScheduler renderer_scheduler_; | 129 blink::scheduler::MockRendererScheduler renderer_scheduler_; |
| 120 scoped_refptr<MainThreadEventQueue> queue_; | 130 scoped_refptr<MainThreadEventQueue> queue_; |
| 121 std::vector<ui::ScopedWebInputEvent> handled_events_; | 131 std::vector<ui::ScopedWebInputEvent> handled_events_; |
| 122 std::vector<uint32_t> additional_acked_events_; | 132 std::vector<uint32_t> additional_acked_events_; |
| 123 bool handle_raf_aligned_input_; | 133 int raf_aligned_input_setting_; |
| 124 bool needs_main_frame_; | 134 bool needs_main_frame_; |
| 125 }; | 135 }; |
| 126 | 136 |
| 127 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { | 137 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
| 128 base::HistogramTester histogram_tester; | 138 base::HistogramTester histogram_tester; |
| 129 | 139 |
| 130 WebMouseWheelEvent kEvents[4] = { | 140 WebMouseWheelEvent kEvents[4] = { |
| 131 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 141 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 132 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 142 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| 133 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 143 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 134 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 144 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 135 }; | 145 }; |
| 136 | 146 |
| 137 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 147 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 138 EXPECT_EQ(0u, event_queue().size()); | 148 EXPECT_EQ(0u, event_queue().size()); |
| 139 | 149 |
| 140 for (WebMouseWheelEvent& event : kEvents) | 150 for (WebMouseWheelEvent& event : kEvents) |
| 141 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 151 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 142 | 152 |
| 143 EXPECT_EQ(2u, event_queue().size()); | 153 EXPECT_EQ(2u, event_queue().size()); |
| 144 EXPECT_EQ(handle_raf_aligned_input_, !main_task_runner_->HasPendingTask()); | 154 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledMouse) == 0, |
| 155 main_task_runner_->HasPendingTask()); |
| 145 RunPendingTasksWithSimulatedRaf(); | 156 RunPendingTasksWithSimulatedRaf(); |
| 146 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 157 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 147 EXPECT_EQ(0u, event_queue().size()); | 158 EXPECT_EQ(0u, event_queue().size()); |
| 148 EXPECT_EQ(2u, handled_events_.size()); | 159 EXPECT_EQ(2u, handled_events_.size()); |
| 149 | 160 |
| 150 { | 161 { |
| 151 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); | 162 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); |
| 152 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); | 163 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); |
| 153 const WebMouseWheelEvent* last_wheel_event = | 164 const WebMouseWheelEvent* last_wheel_event = |
| 154 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); | 165 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 | 285 |
| 275 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 286 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 276 EXPECT_EQ(0u, event_queue().size()); | 287 EXPECT_EQ(0u, event_queue().size()); |
| 277 | 288 |
| 278 HandleEvent(kWheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 289 HandleEvent(kWheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 279 HandleEvent(kTouchEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 290 HandleEvent(kTouchEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 280 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 291 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 281 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 292 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 282 | 293 |
| 283 EXPECT_EQ(2u, event_queue().size()); | 294 EXPECT_EQ(2u, event_queue().size()); |
| 284 EXPECT_EQ(handle_raf_aligned_input_, !main_task_runner_->HasPendingTask()); | 295 EXPECT_EQ(raf_aligned_input_setting_ != |
| 296 (kRafAlignedEnabledMouse | kRafAlignedEnabledTouch), |
| 297 main_task_runner_->HasPendingTask()); |
| 285 RunPendingTasksWithSimulatedRaf(); | 298 RunPendingTasksWithSimulatedRaf(); |
| 286 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 299 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 287 EXPECT_EQ(0u, event_queue().size()); | 300 EXPECT_EQ(0u, event_queue().size()); |
| 288 EXPECT_EQ(2u, handled_events_.size()); | 301 EXPECT_EQ(2u, handled_events_.size()); |
| 289 { | 302 { |
| 290 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size); | 303 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size); |
| 291 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type); | 304 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type); |
| 292 const WebMouseWheelEvent* last_wheel_event = | 305 const WebMouseWheelEvent* last_wheel_event = |
| 293 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); | 306 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); |
| 294 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, | 307 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 307 WebTouchEvent coalesced_event = kTouchEvents[0]; | 320 WebTouchEvent coalesced_event = kTouchEvents[0]; |
| 308 internal::Coalesce(kTouchEvents[1], &coalesced_event); | 321 internal::Coalesce(kTouchEvents[1], &coalesced_event); |
| 309 coalesced_event.dispatchType = | 322 coalesced_event.dispatchType = |
| 310 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 323 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 311 EXPECT_EQ(coalesced_event, *last_touch_event); | 324 EXPECT_EQ(coalesced_event, *last_touch_event); |
| 312 } | 325 } |
| 313 } | 326 } |
| 314 | 327 |
| 315 TEST_P(MainThreadEventQueueTest, RafAlignedMouseInput) { | 328 TEST_P(MainThreadEventQueueTest, RafAlignedMouseInput) { |
| 316 // Don't run the test when we aren't supporting rAF aligned input. | 329 // Don't run the test when we aren't supporting rAF aligned input. |
| 317 if (!handle_raf_aligned_input_) | 330 if ((raf_aligned_input_setting_ & kRafAlignedEnabledMouse) == 0) |
| 318 return; | 331 return; |
| 319 | 332 |
| 320 WebMouseEvent mouseDown = | 333 WebMouseEvent mouseDown = |
| 321 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseDown, 10, 10, 0); | 334 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseDown, 10, 10, 0); |
| 322 | 335 |
| 323 WebMouseEvent mouseMove = | 336 WebMouseEvent mouseMove = |
| 324 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove, 10, 10, 0); | 337 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove, 10, 10, 0); |
| 325 | 338 |
| 326 WebMouseEvent mouseUp = | 339 WebMouseEvent mouseUp = |
| 327 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseUp, 10, 10, 0); | 340 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseUp, 10, 10, 0); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 EXPECT_EQ(2u, event_queue().size()); | 375 EXPECT_EQ(2u, event_queue().size()); |
| 363 main_task_runner_->RunUntilIdle(); | 376 main_task_runner_->RunUntilIdle(); |
| 364 EXPECT_TRUE(needs_main_frame_); | 377 EXPECT_TRUE(needs_main_frame_); |
| 365 EXPECT_EQ(1u, event_queue().size()); | 378 EXPECT_EQ(1u, event_queue().size()); |
| 366 RunPendingTasksWithSimulatedRaf(); | 379 RunPendingTasksWithSimulatedRaf(); |
| 367 EXPECT_EQ(0u, event_queue().size()); | 380 EXPECT_EQ(0u, event_queue().size()); |
| 368 } | 381 } |
| 369 | 382 |
| 370 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { | 383 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) { |
| 371 // Don't run the test when we aren't supporting rAF aligned input. | 384 // Don't run the test when we aren't supporting rAF aligned input. |
| 372 if (!handle_raf_aligned_input_) | 385 if ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0) |
| 373 return; | 386 return; |
| 374 | 387 |
| 375 SyntheticWebTouchEvent kEvents[3]; | 388 SyntheticWebTouchEvent kEvents[3]; |
| 376 kEvents[0].PressPoint(10, 10); | 389 kEvents[0].PressPoint(10, 10); |
| 377 kEvents[1].PressPoint(10, 10); | 390 kEvents[1].PressPoint(10, 10); |
| 378 kEvents[1].MovePoint(0, 50, 50); | 391 kEvents[1].MovePoint(0, 50, 50); |
| 379 kEvents[2].PressPoint(10, 10); | 392 kEvents[2].PressPoint(10, 10); |
| 380 kEvents[2].ReleasePoint(0); | 393 kEvents[2].ReleasePoint(0); |
| 381 | 394 |
| 382 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 395 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); | 450 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); |
| 438 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); | 451 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); |
| 439 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); | 452 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 440 const WebTouchEvent* last_touch_event = | 453 const WebTouchEvent* last_touch_event = |
| 441 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); | 454 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); |
| 442 kEvents[0].dispatchedDuringFling = true; | 455 kEvents[0].dispatchedDuringFling = true; |
| 443 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; | 456 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; |
| 444 EXPECT_EQ(kEvents[0], *last_touch_event); | 457 EXPECT_EQ(kEvents[0], *last_touch_event); |
| 445 | 458 |
| 446 kEvents[0].MovePoint(0, 30, 30); | 459 kEvents[0].MovePoint(0, 30, 30); |
| 460 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 447 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 461 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 448 EXPECT_EQ(handle_raf_aligned_input_, !main_task_runner_->HasPendingTask()); | 462 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledTouch) == 0, |
| 463 main_task_runner_->HasPendingTask()); |
| 449 RunPendingTasksWithSimulatedRaf(); | 464 RunPendingTasksWithSimulatedRaf(); |
| 450 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 465 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 451 EXPECT_EQ(0u, event_queue().size()); | 466 EXPECT_EQ(0u, event_queue().size()); |
| 452 EXPECT_EQ(2u, handled_events_.size()); | 467 EXPECT_EQ(2u, handled_events_.size()); |
| 453 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); | 468 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); |
| 454 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); | 469 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); |
| 455 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); | 470 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 456 last_touch_event = | 471 last_touch_event = |
| 457 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); | 472 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
| 458 kEvents[0].dispatchedDuringFling = true; | 473 kEvents[0].dispatchedDuringFling = true; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); | 570 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); |
| 556 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); | 571 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); |
| 557 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); | 572 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); |
| 558 last_touch_event = | 573 last_touch_event = |
| 559 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); | 574 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); |
| 560 EXPECT_EQ(kEvents[0], *last_touch_event); | 575 EXPECT_EQ(kEvents[0], *last_touch_event); |
| 561 } | 576 } |
| 562 | 577 |
| 563 // The boolean parameterized test varies whether rAF aligned input | 578 // The boolean parameterized test varies whether rAF aligned input |
| 564 // is enabled or not. | 579 // is enabled or not. |
| 565 INSTANTIATE_TEST_CASE_P(MainThreadEventQueueTests, | 580 INSTANTIATE_TEST_CASE_P( |
| 566 MainThreadEventQueueTest, | 581 MainThreadEventQueueTests, |
| 567 testing::Bool()); | 582 MainThreadEventQueueTest, |
| 583 testing::Range(0u, |
| 584 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); |
| 568 | 585 |
| 569 } // namespace content | 586 } // namespace content |
| OLD | NEW |