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

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

Issue 2166703003: Implement Main Thread RAF Aligned Input (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master_main_thread_queue
Patch Set: Fix up tdresser's comments Created 4 years, 3 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 <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/test/histogram_tester.h"
13 #include "base/test/scoped_feature_list.h"
12 #include "base/test/test_simple_task_runner.h" 14 #include "base/test/test_simple_task_runner.h"
13 #include "build/build_config.h" 15 #include "build/build_config.h"
14 #include "content/common/input/synthetic_web_input_event_builders.h" 16 #include "content/common/input/synthetic_web_input_event_builders.h"
15 #include "content/renderer/input/main_thread_event_queue.h" 17 #include "content/renderer/input/main_thread_event_queue.h"
16 #include "content/renderer/render_thread_impl.h" 18 #include "content/renderer/render_thread_impl.h"
17 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
18 #include "third_party/WebKit/public/platform/scheduler/test/mock_renderer_schedu ler.h" 20 #include "third_party/WebKit/public/platform/scheduler/test/mock_renderer_schedu ler.h"
19 21
20 using blink::WebInputEvent; 22 using blink::WebInputEvent;
21 using blink::WebMouseEvent; 23 using blink::WebMouseEvent;
22 using blink::WebMouseWheelEvent; 24 using blink::WebMouseWheelEvent;
23 using blink::WebTouchEvent; 25 using blink::WebTouchEvent;
24 26
25 namespace blink { 27 namespace blink {
26 bool operator==(const WebMouseWheelEvent& lhs, const WebMouseWheelEvent& rhs) { 28 bool operator==(const WebMouseWheelEvent& lhs, const WebMouseWheelEvent& rhs) {
27 return memcmp(&lhs, &rhs, lhs.size) == 0; 29 return memcmp(&lhs, &rhs, lhs.size) == 0;
28 } 30 }
29 31
30 bool operator==(const WebTouchEvent& lhs, const WebTouchEvent& rhs) { 32 bool operator==(const WebTouchEvent& lhs, const WebTouchEvent& rhs) {
31 return memcmp(&lhs, &rhs, lhs.size) == 0; 33 return memcmp(&lhs, &rhs, lhs.size) == 0;
32 } 34 }
33 } // namespace blink 35 } // namespace blink
34 36
35 namespace content { 37 namespace content {
36 namespace { 38 namespace {
37 39
38 const int kTestRoutingID = 13; 40 const int kTestRoutingID = 13;
39 } 41 const char* kCoalescedCountHistogram =
42 "Event.MainThreadEventQueue.CoalescedCount";
40 43
41 class MainThreadEventQueueTest : public testing::Test, 44 } // namespace
45
46 class MainThreadEventQueueTest : public testing::TestWithParam<bool>,
42 public MainThreadEventQueueClient { 47 public MainThreadEventQueueClient {
43 public: 48 public:
44 MainThreadEventQueueTest() 49 MainThreadEventQueueTest()
45 : main_task_runner_(new base::TestSimpleTaskRunner()), 50 : main_task_runner_(new base::TestSimpleTaskRunner()),
46 queue_(new MainThreadEventQueue(kTestRoutingID, 51 handle_raf_aligned_input_(GetParam()),
47 this, 52 needs_main_frame_(false) {
48 main_task_runner_, 53 if (handle_raf_aligned_input_)
49 &renderer_scheduler_)) {} 54 feature_list_.InitAndEnableFeature(features::kRafAlignedInputEvents);
55 }
56
57 void SetUp() override {
58 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_,
59 &renderer_scheduler_);
60 }
50 61
51 void HandleEventOnMainThread(int routing_id, 62 void HandleEventOnMainThread(int routing_id,
52 const blink::WebInputEvent* event, 63 const blink::WebInputEvent* event,
53 const ui::LatencyInfo& latency, 64 const ui::LatencyInfo& latency,
54 InputEventDispatchType type) override { 65 InputEventDispatchType type) override {
55 EXPECT_EQ(kTestRoutingID, routing_id); 66 EXPECT_EQ(kTestRoutingID, routing_id);
56 handled_events_.push_back(ui::WebInputEventTraits::Clone(*event)); 67 handled_events_.push_back(ui::WebInputEventTraits::Clone(*event));
57 queue_->EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 68 queue_->EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
58 } 69 }
59 70
60 void SendInputEventAck(int routing_id, 71 void SendInputEventAck(int routing_id,
61 blink::WebInputEvent::Type type, 72 blink::WebInputEvent::Type type,
62 InputEventAckState ack_result, 73 InputEventAckState ack_result,
63 uint32_t touch_event_id) override { 74 uint32_t touch_event_id) override {
64 additional_acked_events_.push_back(touch_event_id); 75 additional_acked_events_.push_back(touch_event_id);
65 } 76 }
66 77
67 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { 78 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) {
68 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event), 79 queue_->HandleEvent(ui::WebInputEventTraits::Clone(event),
69 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result); 80 ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, ack_result);
70 } 81 }
71 82
83 void NeedsMainFrame(int routing_id) override { needs_main_frame_ = true; }
84
72 WebInputEventQueue<EventWithDispatchType>& event_queue() { 85 WebInputEventQueue<EventWithDispatchType>& event_queue() {
73 return queue_->events_; 86 return queue_->shared_state_.events_;
74 } 87 }
75 88
76 void set_is_flinging(bool is_flinging) { 89 void set_is_flinging(bool is_flinging) {
77 queue_->set_is_flinging(is_flinging); 90 queue_->set_is_flinging(is_flinging);
78 } 91 }
79 92
80 bool last_touch_start_forced_nonblocking_due_to_fling() { 93 bool last_touch_start_forced_nonblocking_due_to_fling() {
81 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; 94 return queue_->last_touch_start_forced_nonblocking_due_to_fling_;
82 } 95 }
83 96
84 void set_enable_fling_passive_listener_flag(bool enable_flag) { 97 void set_enable_fling_passive_listener_flag(bool enable_flag) {
85 queue_->enable_fling_passive_listener_flag_ = enable_flag; 98 queue_->enable_fling_passive_listener_flag_ = enable_flag;
86 } 99 }
87 100
101 void RunPendingTasksWithSimulatedRaf() {
102 while (needs_main_frame_ || main_task_runner_->HasPendingTask()) {
103 main_task_runner_->RunUntilIdle();
104 needs_main_frame_ = false;
105 queue_->DispatchRafAlignedInput();
106 }
107 }
108
109 void RunSimulatedRafOnce() {
110 if (needs_main_frame_) {
111 needs_main_frame_ = false;
112 queue_->DispatchRafAlignedInput();
113 }
114 }
115
88 protected: 116 protected:
117 base::test::ScopedFeatureList feature_list_;
89 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 118 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
90 blink::scheduler::MockRendererScheduler renderer_scheduler_; 119 blink::scheduler::MockRendererScheduler renderer_scheduler_;
91 scoped_refptr<MainThreadEventQueue> queue_; 120 scoped_refptr<MainThreadEventQueue> queue_;
92 std::vector<ui::ScopedWebInputEvent> handled_events_; 121 std::vector<ui::ScopedWebInputEvent> handled_events_;
93 std::vector<uint32_t> additional_acked_events_; 122 std::vector<uint32_t> additional_acked_events_;
123 bool handle_raf_aligned_input_;
124 bool needs_main_frame_;
94 }; 125 };
95 126
96 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { 127 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) {
128 base::HistogramTester histogram_tester;
129
97 WebMouseWheelEvent kEvents[4] = { 130 WebMouseWheelEvent kEvents[4] = {
98 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 131 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
99 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), 132 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false),
100 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 133 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
101 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 134 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
102 }; 135 };
103 136
104 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 137 EXPECT_FALSE(main_task_runner_->HasPendingTask());
105 EXPECT_EQ(0u, event_queue().size()); 138 EXPECT_EQ(0u, event_queue().size());
106 139
107 for (WebMouseWheelEvent& event : kEvents) 140 for (WebMouseWheelEvent& event : kEvents)
108 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 141 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
109 142
110 EXPECT_EQ(2u, event_queue().size()); 143 EXPECT_EQ(2u, event_queue().size());
111 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 144 EXPECT_EQ(handle_raf_aligned_input_, !main_task_runner_->HasPendingTask());
112 main_task_runner_->RunUntilIdle(); 145 RunPendingTasksWithSimulatedRaf();
113 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 146 EXPECT_FALSE(main_task_runner_->HasPendingTask());
114 EXPECT_EQ(0u, event_queue().size()); 147 EXPECT_EQ(0u, event_queue().size());
115 EXPECT_EQ(2u, handled_events_.size()); 148 EXPECT_EQ(2u, handled_events_.size());
116 149
117 { 150 {
118 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); 151 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
119 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); 152 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
120 const WebMouseWheelEvent* last_wheel_event = 153 const WebMouseWheelEvent* last_wheel_event =
121 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); 154 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get());
122 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, 155 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
123 last_wheel_event->dispatchType); 156 last_wheel_event->dispatchType);
124 WebMouseWheelEvent coalesced_event = kEvents[0]; 157 WebMouseWheelEvent coalesced_event = kEvents[0];
125 internal::Coalesce(kEvents[1], &coalesced_event); 158 internal::Coalesce(kEvents[1], &coalesced_event);
126 coalesced_event.dispatchType = 159 coalesced_event.dispatchType =
127 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 160 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
128 EXPECT_EQ(coalesced_event, *last_wheel_event); 161 EXPECT_EQ(coalesced_event, *last_wheel_event);
129 } 162 }
130 163
131 { 164 {
132 const WebMouseWheelEvent* last_wheel_event = 165 const WebMouseWheelEvent* last_wheel_event =
133 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get()); 166 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get());
134 WebMouseWheelEvent coalesced_event = kEvents[2]; 167 WebMouseWheelEvent coalesced_event = kEvents[2];
135 internal::Coalesce(kEvents[3], &coalesced_event); 168 internal::Coalesce(kEvents[3], &coalesced_event);
136 coalesced_event.dispatchType = 169 coalesced_event.dispatchType =
137 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 170 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
138 EXPECT_EQ(coalesced_event, *last_wheel_event); 171 EXPECT_EQ(coalesced_event, *last_wheel_event);
139 } 172 }
173 histogram_tester.ExpectUniqueSample(kCoalescedCountHistogram, 1, 2);
140 } 174 }
141 175
142 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { 176 TEST_P(MainThreadEventQueueTest, NonBlockingTouch) {
177 base::HistogramTester histogram_tester;
178
143 SyntheticWebTouchEvent kEvents[4]; 179 SyntheticWebTouchEvent kEvents[4];
144 kEvents[0].PressPoint(10, 10); 180 kEvents[0].PressPoint(10, 10);
145 kEvents[1].PressPoint(10, 10); 181 kEvents[1].PressPoint(10, 10);
146 kEvents[1].modifiers = 1; 182 kEvents[1].modifiers = 1;
147 kEvents[1].MovePoint(0, 20, 20); 183 kEvents[1].MovePoint(0, 20, 20);
148 kEvents[2].PressPoint(10, 10); 184 kEvents[2].PressPoint(10, 10);
149 kEvents[2].MovePoint(0, 30, 30); 185 kEvents[2].MovePoint(0, 30, 30);
150 kEvents[3].PressPoint(10, 10); 186 kEvents[3].PressPoint(10, 10);
151 kEvents[3].MovePoint(0, 35, 35); 187 kEvents[3].MovePoint(0, 35, 35);
152 188
153 for (SyntheticWebTouchEvent& event : kEvents) 189 for (SyntheticWebTouchEvent& event : kEvents)
154 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 190 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
155 191
156 EXPECT_EQ(3u, event_queue().size()); 192 EXPECT_EQ(3u, event_queue().size());
157 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 193 EXPECT_TRUE(main_task_runner_->HasPendingTask());
158 main_task_runner_->RunUntilIdle(); 194 RunPendingTasksWithSimulatedRaf();
159 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 195 EXPECT_FALSE(main_task_runner_->HasPendingTask());
160 EXPECT_EQ(0u, event_queue().size()); 196 EXPECT_EQ(0u, event_queue().size());
161 EXPECT_EQ(3u, handled_events_.size()); 197 EXPECT_EQ(3u, handled_events_.size());
162 198
163 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); 199 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
164 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); 200 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
165 const WebTouchEvent* last_touch_event = 201 const WebTouchEvent* last_touch_event =
166 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); 202 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
167 kEvents[0].dispatchType = 203 kEvents[0].dispatchType =
168 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 204 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
169 EXPECT_EQ(kEvents[0], *last_touch_event); 205 EXPECT_EQ(kEvents[0], *last_touch_event);
170 206
171 EXPECT_EQ(kEvents[1].size, handled_events_.at(1)->size); 207 EXPECT_EQ(kEvents[1].size, handled_events_.at(1)->size);
172 EXPECT_EQ(kEvents[1].type, handled_events_.at(1)->type); 208 EXPECT_EQ(kEvents[1].type, handled_events_.at(1)->type);
173 last_touch_event = 209 last_touch_event =
174 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 210 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
175 kEvents[1].dispatchType = 211 kEvents[1].dispatchType =
176 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 212 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
177 EXPECT_EQ(kEvents[1], *last_touch_event); 213 EXPECT_EQ(kEvents[1], *last_touch_event);
178 214
179 EXPECT_EQ(kEvents[2].size, handled_events_.at(1)->size); 215 EXPECT_EQ(kEvents[2].size, handled_events_.at(1)->size);
180 EXPECT_EQ(kEvents[2].type, handled_events_.at(2)->type); 216 EXPECT_EQ(kEvents[2].type, handled_events_.at(2)->type);
181 last_touch_event = 217 last_touch_event =
182 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); 218 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
183 WebTouchEvent coalesced_event = kEvents[2]; 219 WebTouchEvent coalesced_event = kEvents[2];
184 internal::Coalesce(kEvents[3], &coalesced_event); 220 internal::Coalesce(kEvents[3], &coalesced_event);
185 coalesced_event.dispatchType = 221 coalesced_event.dispatchType =
186 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 222 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
187 EXPECT_EQ(coalesced_event, *last_touch_event); 223 EXPECT_EQ(coalesced_event, *last_touch_event);
224 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 0, 1);
225 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 1, 1);
188 } 226 }
189 227
190 TEST_F(MainThreadEventQueueTest, BlockingTouch) { 228 TEST_P(MainThreadEventQueueTest, BlockingTouch) {
229 base::HistogramTester histogram_tester;
230
191 SyntheticWebTouchEvent kEvents[4]; 231 SyntheticWebTouchEvent kEvents[4];
192 kEvents[0].PressPoint(10, 10); 232 kEvents[0].PressPoint(10, 10);
193 kEvents[1].PressPoint(10, 10); 233 kEvents[1].PressPoint(10, 10);
194 kEvents[1].MovePoint(0, 20, 20); 234 kEvents[1].MovePoint(0, 20, 20);
195 kEvents[2].PressPoint(10, 10); 235 kEvents[2].PressPoint(10, 10);
196 kEvents[2].MovePoint(0, 30, 30); 236 kEvents[2].MovePoint(0, 30, 30);
197 kEvents[3].PressPoint(10, 10); 237 kEvents[3].PressPoint(10, 10);
198 kEvents[3].MovePoint(0, 35, 35); 238 kEvents[3].MovePoint(0, 35, 35);
199 239
200 EXPECT_CALL(renderer_scheduler_, DidHandleInputEventOnMainThread(testing::_)) 240 EXPECT_CALL(renderer_scheduler_, DidHandleInputEventOnMainThread(testing::_))
201 .Times(2); 241 .Times(2);
202 // Ensure that coalescing takes place. 242 // Ensure that coalescing takes place.
203 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 243 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
204 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 244 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
205 HandleEvent(kEvents[2], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 245 HandleEvent(kEvents[2], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
206 HandleEvent(kEvents[3], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 246 HandleEvent(kEvents[3], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
207 247
208 EXPECT_EQ(2u, event_queue().size()); 248 EXPECT_EQ(2u, event_queue().size());
209 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 249 EXPECT_TRUE(main_task_runner_->HasPendingTask());
210 main_task_runner_->RunUntilIdle(); 250 RunPendingTasksWithSimulatedRaf();
251
211 EXPECT_EQ(0u, event_queue().size()); 252 EXPECT_EQ(0u, event_queue().size());
212 EXPECT_EQ(2u, additional_acked_events_.size()); 253 EXPECT_EQ(2u, additional_acked_events_.size());
213 EXPECT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); 254 EXPECT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0));
214 EXPECT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); 255 EXPECT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1));
256
257 histogram_tester.ExpectUniqueSample(kCoalescedCountHistogram, 2, 1);
215 } 258 }
216 259
217 TEST_F(MainThreadEventQueueTest, InterleavedEvents) { 260 TEST_P(MainThreadEventQueueTest, InterleavedEvents) {
218 WebMouseWheelEvent kWheelEvents[2] = { 261 WebMouseWheelEvent kWheelEvents[2] = {
219 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 262 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
220 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), 263 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false),
221 }; 264 };
222 SyntheticWebTouchEvent kTouchEvents[2]; 265 SyntheticWebTouchEvent kTouchEvents[2];
223 kTouchEvents[0].PressPoint(10, 10); 266 kTouchEvents[0].PressPoint(10, 10);
224 kTouchEvents[0].MovePoint(0, 20, 20); 267 kTouchEvents[0].MovePoint(0, 20, 20);
225 kTouchEvents[1].PressPoint(10, 10); 268 kTouchEvents[1].PressPoint(10, 10);
226 kTouchEvents[1].MovePoint(0, 30, 30); 269 kTouchEvents[1].MovePoint(0, 30, 30);
227 270
228 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 271 EXPECT_FALSE(main_task_runner_->HasPendingTask());
229 EXPECT_EQ(0u, event_queue().size()); 272 EXPECT_EQ(0u, event_queue().size());
230 273
231 HandleEvent(kWheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 274 HandleEvent(kWheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
232 HandleEvent(kTouchEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 275 HandleEvent(kTouchEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
233 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 276 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
234 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 277 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
235 278
236 EXPECT_EQ(2u, event_queue().size()); 279 EXPECT_EQ(2u, event_queue().size());
237 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 280 EXPECT_EQ(handle_raf_aligned_input_, !main_task_runner_->HasPendingTask());
238 main_task_runner_->RunUntilIdle(); 281 RunPendingTasksWithSimulatedRaf();
239 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 282 EXPECT_FALSE(main_task_runner_->HasPendingTask());
240 EXPECT_EQ(0u, event_queue().size()); 283 EXPECT_EQ(0u, event_queue().size());
241 EXPECT_EQ(2u, handled_events_.size()); 284 EXPECT_EQ(2u, handled_events_.size());
242 { 285 {
243 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size); 286 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size);
244 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type); 287 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type);
245 const WebMouseWheelEvent* last_wheel_event = 288 const WebMouseWheelEvent* last_wheel_event =
246 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); 289 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get());
247 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, 290 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
248 last_wheel_event->dispatchType); 291 last_wheel_event->dispatchType);
249 WebMouseWheelEvent coalesced_event = kWheelEvents[0]; 292 WebMouseWheelEvent coalesced_event = kWheelEvents[0];
250 internal::Coalesce(kWheelEvents[1], &coalesced_event); 293 internal::Coalesce(kWheelEvents[1], &coalesced_event);
251 coalesced_event.dispatchType = 294 coalesced_event.dispatchType =
252 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 295 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
253 EXPECT_EQ(coalesced_event, *last_wheel_event); 296 EXPECT_EQ(coalesced_event, *last_wheel_event);
254 } 297 }
255 { 298 {
256 EXPECT_EQ(kTouchEvents[0].size, handled_events_.at(1)->size); 299 EXPECT_EQ(kTouchEvents[0].size, handled_events_.at(1)->size);
257 EXPECT_EQ(kTouchEvents[0].type, handled_events_.at(1)->type); 300 EXPECT_EQ(kTouchEvents[0].type, handled_events_.at(1)->type);
258 const WebTouchEvent* last_touch_event = 301 const WebTouchEvent* last_touch_event =
259 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 302 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
260 WebTouchEvent coalesced_event = kTouchEvents[0]; 303 WebTouchEvent coalesced_event = kTouchEvents[0];
261 internal::Coalesce(kTouchEvents[1], &coalesced_event); 304 internal::Coalesce(kTouchEvents[1], &coalesced_event);
262 coalesced_event.dispatchType = 305 coalesced_event.dispatchType =
263 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 306 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
264 EXPECT_EQ(coalesced_event, *last_touch_event); 307 EXPECT_EQ(coalesced_event, *last_touch_event);
265 } 308 }
266 } 309 }
267 310
268 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) { 311 TEST_P(MainThreadEventQueueTest, RafAlignedMouseInput) {
312 // Don't run the test when we aren't supporting rAF aligned input.
313 if (!handle_raf_aligned_input_)
314 return;
315
316 WebMouseEvent mouseDown =
317 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseDown, 10, 10, 0);
318
319 WebMouseEvent mouseMove =
320 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseMove, 10, 10, 0);
321
322 WebMouseEvent mouseUp =
323 SyntheticWebMouseEventBuilder::Build(WebInputEvent::MouseUp, 10, 10, 0);
324
325 WebMouseWheelEvent wheelEvents[2] = {
326 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
327 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false),
328 };
329
330 EXPECT_FALSE(main_task_runner_->HasPendingTask());
331 EXPECT_EQ(0u, event_queue().size());
332
333 // Simulate enqueing a discrete event, followed by continuous events and
334 // then a discrete event. The last discrete event should flush the
335 // continuous events so the aren't aligned to rAF and are processed
336 // immediately.
337 HandleEvent(mouseDown, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
338 HandleEvent(mouseMove, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
339 HandleEvent(wheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
340 HandleEvent(wheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
341 HandleEvent(mouseUp, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
342
343 EXPECT_EQ(4u, event_queue().size());
344 EXPECT_TRUE(main_task_runner_->HasPendingTask());
345 EXPECT_TRUE(needs_main_frame_);
346 main_task_runner_->RunUntilIdle();
347 EXPECT_EQ(0u, event_queue().size());
348 RunPendingTasksWithSimulatedRaf();
349
350 // Simulate the rAF running before the PostTask occurs. The first rAF
351 // shouldn't do anything.
352 HandleEvent(kMouseEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
353 HandleEvent(kWheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
354 EXPECT_EQ(2u, event_queue().size());
355 EXPECT_TRUE(needs_main_frame_);
356 RunSimulatedRafOnce();
357 EXPECT_FALSE(needs_main_frame_);
358 EXPECT_EQ(2u, event_queue().size());
359 main_task_runner_->RunUntilIdle();
360 EXPECT_TRUE(needs_main_frame_);
361 EXPECT_EQ(1u, event_queue().size());
362 RunPendingTasksWithSimulatedRaf();
363 EXPECT_EQ(0u, event_queue().size());
364 }
365
366 TEST_P(MainThreadEventQueueTest, RafAlignedTouchInput) {
367 // Don't run the test when we aren't supporting rAF aligned input.
368 if (!handle_raf_aligned_input_)
369 return;
370
371 SyntheticWebTouchEvent kEvents[3];
372 kEvents[0].PressPoint(10, 10);
373 kEvents[1].PressPoint(10, 10);
374 kEvents[1].MovePoint(0, 50, 50);
375 kEvents[2].PressPoint(10, 10);
376 kEvents[2].ReleasePoint(0);
377
378 EXPECT_FALSE(main_task_runner_->HasPendingTask());
379 EXPECT_EQ(0u, event_queue().size());
380
381 // Simulate enqueing a discrete event, followed by continuous events and
382 // then a discrete event. The last discrete event should flush the
383 // continuous events so the aren't aligned to rAF and are processed
384 // immediately.
385 for (SyntheticWebTouchEvent& event : kEvents)
386 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
387
388 EXPECT_EQ(3u, event_queue().size());
389 EXPECT_TRUE(main_task_runner_->HasPendingTask());
390 EXPECT_TRUE(needs_main_frame_);
391 main_task_runner_->RunUntilIdle();
392 EXPECT_EQ(0u, event_queue().size());
393 RunPendingTasksWithSimulatedRaf();
394
395 // Simulate the rAF running before the PostTask occurs. The first rAF
396 // shouldn't do anything.
397 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
398 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
399 EXPECT_EQ(2u, event_queue().size());
400 EXPECT_TRUE(needs_main_frame_);
401 RunSimulatedRafOnce();
402 EXPECT_FALSE(needs_main_frame_);
403 EXPECT_EQ(2u, event_queue().size());
404 RunPendingTasksWithSimulatedRaf();
405 EXPECT_EQ(0u, event_queue().size());
406 }
407
408 TEST_P(MainThreadEventQueueTest, RafAlignedMaxSize) {
409 // Don't run the test when we aren't supporting rAF aligned input.
410 if (!handle_raf_aligned_input_)
411 return;
412
413 const size_t kNumEventsToQueue = 16;
414 WebMouseWheelEvent mouseEvent =
415 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false);
416
417 EXPECT_FALSE(main_task_runner_->HasPendingTask());
418 EXPECT_EQ(0u, event_queue().size());
419
420 for (size_t i = 0; i < kNumEventsToQueue; ++i) {
421 mouseEvent.modifiers = i;
422 HandleEvent(mouseEvent, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
423 }
424
425 // There is a maximum number of events we handle in a rAF. kNumEventsToQueue
426 // exceeds that. Ensure that two rAF calls need to run.
427 EXPECT_EQ(kNumEventsToQueue, event_queue().size());
428 EXPECT_FALSE(main_task_runner_->HasPendingTask());
429 EXPECT_TRUE(needs_main_frame_);
430 RunSimulatedRafOnce();
431 EXPECT_TRUE(needs_main_frame_);
432 EXPECT_FALSE(main_task_runner_->HasPendingTask());
433 RunSimulatedRafOnce();
434 EXPECT_EQ(0u, event_queue().size());
435 EXPECT_FALSE(main_task_runner_->HasPendingTask());
436 }
437
438 TEST_P(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
269 SyntheticWebTouchEvent kEvents[1]; 439 SyntheticWebTouchEvent kEvents[1];
270 kEvents[0].PressPoint(10, 10); 440 kEvents[0].PressPoint(10, 10);
271 kEvents[0].touchStartOrFirstTouchMove = true; 441 kEvents[0].touchStartOrFirstTouchMove = true;
272 set_is_flinging(true); 442 set_is_flinging(true);
273 set_enable_fling_passive_listener_flag(true); 443 set_enable_fling_passive_listener_flag(true);
274 444
275 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 445 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
276 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 446 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
277 main_task_runner_->RunUntilIdle(); 447 RunPendingTasksWithSimulatedRaf();
278 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 448 EXPECT_FALSE(main_task_runner_->HasPendingTask());
279 EXPECT_EQ(0u, event_queue().size()); 449 EXPECT_EQ(0u, event_queue().size());
280 EXPECT_EQ(1u, handled_events_.size()); 450 EXPECT_EQ(1u, handled_events_.size());
281 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); 451 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
282 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); 452 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
283 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); 453 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling());
284 const WebTouchEvent* last_touch_event = 454 const WebTouchEvent* last_touch_event =
285 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); 455 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
286 kEvents[0].dispatchedDuringFling = true; 456 kEvents[0].dispatchedDuringFling = true;
287 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; 457 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
288 EXPECT_EQ(kEvents[0], *last_touch_event); 458 EXPECT_EQ(kEvents[0], *last_touch_event);
289 459
290 kEvents[0].MovePoint(0, 30, 30); 460 kEvents[0].MovePoint(0, 30, 30);
291 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 461 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
292 main_task_runner_->RunUntilIdle(); 462 RunPendingTasksWithSimulatedRaf();
293 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 463 EXPECT_FALSE(main_task_runner_->HasPendingTask());
294 EXPECT_EQ(0u, event_queue().size()); 464 EXPECT_EQ(0u, event_queue().size());
295 EXPECT_EQ(2u, handled_events_.size()); 465 EXPECT_EQ(2u, handled_events_.size());
296 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); 466 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
297 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); 467 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
298 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); 468 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling());
299 last_touch_event = 469 last_touch_event =
300 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 470 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
301 kEvents[0].dispatchedDuringFling = true; 471 kEvents[0].dispatchedDuringFling = true;
302 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; 472 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
303 EXPECT_EQ(kEvents[0], *last_touch_event); 473 EXPECT_EQ(kEvents[0], *last_touch_event);
304 474
305 kEvents[0].MovePoint(0, 50, 50); 475 kEvents[0].MovePoint(0, 50, 50);
306 kEvents[0].touchStartOrFirstTouchMove = false; 476 kEvents[0].touchStartOrFirstTouchMove = false;
307 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 477 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
308 main_task_runner_->RunUntilIdle(); 478 RunPendingTasksWithSimulatedRaf();
309 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 479 EXPECT_FALSE(main_task_runner_->HasPendingTask());
310 EXPECT_EQ(0u, event_queue().size()); 480 EXPECT_EQ(0u, event_queue().size());
311 EXPECT_EQ(3u, handled_events_.size()); 481 EXPECT_EQ(3u, handled_events_.size());
312 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); 482 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size);
313 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); 483 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type);
314 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); 484 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
315 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 485 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
316 last_touch_event = 486 last_touch_event =
317 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); 487 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
318 EXPECT_EQ(kEvents[0], *last_touch_event); 488 EXPECT_EQ(kEvents[0], *last_touch_event);
319 489
320 kEvents[0].ReleasePoint(0); 490 kEvents[0].ReleasePoint(0);
321 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 491 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
322 main_task_runner_->RunUntilIdle(); 492 RunPendingTasksWithSimulatedRaf();
323 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 493 EXPECT_FALSE(main_task_runner_->HasPendingTask());
324 EXPECT_EQ(0u, event_queue().size()); 494 EXPECT_EQ(0u, event_queue().size());
325 EXPECT_EQ(4u, handled_events_.size()); 495 EXPECT_EQ(4u, handled_events_.size());
326 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); 496 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size);
327 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); 497 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type);
328 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); 498 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
329 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 499 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
330 last_touch_event = 500 last_touch_event =
331 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); 501 static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
332 EXPECT_EQ(kEvents[0], *last_touch_event); 502 EXPECT_EQ(kEvents[0], *last_touch_event);
333 } 503 }
334 504
335 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { 505 TEST_P(MainThreadEventQueueTest, BlockingTouchesOutsideFling) {
336 SyntheticWebTouchEvent kEvents[1]; 506 SyntheticWebTouchEvent kEvents[1];
337 kEvents[0].PressPoint(10, 10); 507 kEvents[0].PressPoint(10, 10);
338 kEvents[0].touchStartOrFirstTouchMove = true; 508 kEvents[0].touchStartOrFirstTouchMove = true;
339 set_is_flinging(false); 509 set_is_flinging(false);
340 set_enable_fling_passive_listener_flag(false); 510 set_enable_fling_passive_listener_flag(false);
341 511
342 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 512 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
343 main_task_runner_->RunUntilIdle(); 513 RunPendingTasksWithSimulatedRaf();
344 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 514 EXPECT_FALSE(main_task_runner_->HasPendingTask());
345 EXPECT_EQ(0u, event_queue().size()); 515 EXPECT_EQ(0u, event_queue().size());
346 EXPECT_EQ(1u, handled_events_.size()); 516 EXPECT_EQ(1u, handled_events_.size());
347 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); 517 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
348 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); 518 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
349 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); 519 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
350 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 520 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
351 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 521 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
352 const WebTouchEvent* last_touch_event = 522 const WebTouchEvent* last_touch_event =
353 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); 523 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
354 EXPECT_EQ(kEvents[0], *last_touch_event); 524 EXPECT_EQ(kEvents[0], *last_touch_event);
355 525
356 set_is_flinging(true); 526 set_is_flinging(true);
357 set_enable_fling_passive_listener_flag(false); 527 set_enable_fling_passive_listener_flag(false);
358 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 528 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
359 main_task_runner_->RunUntilIdle(); 529 RunPendingTasksWithSimulatedRaf();
360 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 530 EXPECT_FALSE(main_task_runner_->HasPendingTask());
361 EXPECT_EQ(0u, event_queue().size()); 531 EXPECT_EQ(0u, event_queue().size());
362 EXPECT_EQ(2u, handled_events_.size()); 532 EXPECT_EQ(2u, handled_events_.size());
363 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); 533 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
364 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); 534 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
365 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); 535 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
366 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 536 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
367 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 537 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
368 last_touch_event = 538 last_touch_event =
369 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 539 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
370 kEvents[0].dispatchedDuringFling = true; 540 kEvents[0].dispatchedDuringFling = true;
371 EXPECT_EQ(kEvents[0], *last_touch_event); 541 EXPECT_EQ(kEvents[0], *last_touch_event);
372 542
373 set_is_flinging(false); 543 set_is_flinging(false);
374 set_enable_fling_passive_listener_flag(true); 544 set_enable_fling_passive_listener_flag(true);
375 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 545 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
376 main_task_runner_->RunUntilIdle(); 546 RunPendingTasksWithSimulatedRaf();
377 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 547 EXPECT_FALSE(main_task_runner_->HasPendingTask());
378 EXPECT_EQ(0u, event_queue().size()); 548 EXPECT_EQ(0u, event_queue().size());
379 EXPECT_EQ(3u, handled_events_.size()); 549 EXPECT_EQ(3u, handled_events_.size());
380 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); 550 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size);
381 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); 551 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type);
382 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); 552 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
383 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 553 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
384 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 554 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
385 last_touch_event = 555 last_touch_event =
386 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); 556 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
387 kEvents[0].dispatchedDuringFling = false; 557 kEvents[0].dispatchedDuringFling = false;
388 EXPECT_EQ(kEvents[0], *last_touch_event); 558 EXPECT_EQ(kEvents[0], *last_touch_event);
389 559
390 kEvents[0].MovePoint(0, 30, 30); 560 kEvents[0].MovePoint(0, 30, 30);
391 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 561 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
392 main_task_runner_->RunUntilIdle(); 562 RunPendingTasksWithSimulatedRaf();
393 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 563 EXPECT_FALSE(main_task_runner_->HasPendingTask());
394 EXPECT_EQ(0u, event_queue().size()); 564 EXPECT_EQ(0u, event_queue().size());
395 EXPECT_EQ(4u, handled_events_.size()); 565 EXPECT_EQ(4u, handled_events_.size());
396 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); 566 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size);
397 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); 567 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type);
398 EXPECT_FALSE(kEvents[0].dispatchedDuringFling); 568 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
399 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 569 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
400 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 570 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
401 last_touch_event = 571 last_touch_event =
402 static_cast<const WebTouchEvent*>(handled_events_.at(3).get()); 572 static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
403 EXPECT_EQ(kEvents[0], *last_touch_event); 573 EXPECT_EQ(kEvents[0], *last_touch_event);
404 } 574 }
405 575
406 } // namespace content 576 // The boolean parameterized test varies whether rAF aligned input
577 // is enabled or not.
578 INSTANTIATE_TEST_CASE_P(MainThreadEventQueueTests,
579 MainThreadEventQueueTest,
580 testing::Bool());
581
582 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698