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

Side by Side Diff: content/renderer/input/main_thread_event_queue_unittest.cc

Issue 2450833003: Separate rAF aligned Touch and Mouse Input settings (Closed)
Patch Set: Fix nits Created 4 years, 1 month 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 <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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/input/main_thread_event_queue.cc ('k') | testing/variations/fieldtrial_testing_config.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698