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

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

Issue 2273703002: Force events to be non blocking if main thread is unresponsive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Dave's comments. Created 4 years, 4 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/test_simple_task_runner.h" 12 #include "base/test/test_simple_task_runner.h"
13 #include "build/build_config.h" 13 #include "build/build_config.h"
14 #include "content/common/input/synthetic_web_input_event_builders.h" 14 #include "content/common/input/synthetic_web_input_event_builders.h"
15 #include "content/renderer/input/main_thread_event_queue.h" 15 #include "content/renderer/input/main_thread_event_queue.h"
16 #include "content/renderer/render_thread_impl.h" 16 #include "content/renderer/render_thread_impl.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "third_party/WebKit/public/platform/scheduler/test/mock_renderer_schedu ler.h" 18 #include "third_party/WebKit/public/platform/scheduler/test/mock_renderer_schedu ler.h"
19 19
20 using blink::WebInputEvent; 20 using blink::WebInputEvent;
21 using blink::WebMouseEvent; 21 using blink::WebMouseEvent;
22 using blink::WebMouseWheelEvent; 22 using blink::WebMouseWheelEvent;
23 using blink::WebTouchEvent; 23 using blink::WebTouchEvent;
24 24
25 namespace blink { 25 namespace blink {
26 bool operator==(const WebMouseWheelEvent& lhs, const WebMouseWheelEvent& rhs) { 26
27 return memcmp(&lhs, &rhs, lhs.size) == 0; 27 ::testing::AssertionResult AreEqual(const WebMouseWheelEvent& lhs,
28 const WebMouseWheelEvent& rhs) {
29 if (lhs.size != rhs.size)
30 return ::testing::AssertionSuccess() << "Sizes aren't equal";
31 if (lhs.type != rhs.type)
32 return ::testing::AssertionSuccess() << "Types aren't equal";
33 if (memcmp(&lhs, &rhs, lhs.size) == 0)
34 return ::testing::AssertionSuccess();
35 else
36 return ::testing::AssertionFailure();
28 } 37 }
29 38
30 bool operator==(const WebTouchEvent& lhs, const WebTouchEvent& rhs) { 39 ::testing::AssertionResult AreEqual(const WebTouchEvent& lhs,
31 return memcmp(&lhs, &rhs, lhs.size) == 0; 40 const WebTouchEvent& rhs) {
41 if (lhs.size != rhs.size)
42 return ::testing::AssertionSuccess() << "Sizes aren't equal";
43 if (lhs.type != rhs.type)
44 return ::testing::AssertionSuccess() << "Types aren't equal";
45 if (memcmp(&lhs, &rhs, lhs.size) == 0)
46 return ::testing::AssertionSuccess();
47 else
48 return ::testing::AssertionFailure();
32 } 49 }
50
33 } // namespace blink 51 } // namespace blink
34 52
35 namespace content { 53 namespace content {
36 namespace { 54 namespace {
37 55
38 const int kTestRoutingID = 13; 56 const int kTestRoutingID = 13;
39 } 57 }
40 58
41 class MainThreadEventQueueTest : public testing::Test, 59 class MainThreadEventQueueTest : public testing::Test,
42 public MainThreadEventQueueClient { 60 public MainThreadEventQueueClient {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 } 96 }
79 97
80 bool last_touch_start_forced_nonblocking_due_to_fling() { 98 bool last_touch_start_forced_nonblocking_due_to_fling() {
81 return queue_->last_touch_start_forced_nonblocking_due_to_fling_; 99 return queue_->last_touch_start_forced_nonblocking_due_to_fling_;
82 } 100 }
83 101
84 void set_enable_fling_passive_listener_flag(bool enable_flag) { 102 void set_enable_fling_passive_listener_flag(bool enable_flag) {
85 queue_->enable_fling_passive_listener_flag_ = enable_flag; 103 queue_->enable_fling_passive_listener_flag_ = enable_flag;
86 } 104 }
87 105
106 void set_enable_non_blocking_due_to_main_thread_responsiveness_flag(bool enabl e_flag) {
107 queue_->enable_non_blocking_due_to_main_thread_responsiveness_flag_ =
108 enable_flag;
109 }
110
111 const WebTouchEvent* last_touch_event() const {
112 for (auto i = handled_events_.rbegin(); i != handled_events_.rend(); ++i) {
113 if (WebInputEvent::isTouchEventType(i->get()->type))
114 return static_cast<const WebTouchEvent*>(i->get());
115 }
116 CHECK(false);
117 return nullptr;
118 }
119
120 const WebMouseWheelEvent* first_wheel_event() const {
121 for (auto i = handled_events_.begin(); i != handled_events_.end(); ++i) {
122 if (i->get()->type == WebInputEvent::MouseWheel)
123 return static_cast<const WebMouseWheelEvent*>(i->get());
124 }
125 CHECK(false);
126 return nullptr;
127 }
128
129 const WebMouseWheelEvent* last_wheel_event() const {
130 for (auto i = handled_events_.rbegin(); i != handled_events_.rend(); ++i) {
131 if (i->get()->type == WebInputEvent::MouseWheel)
132 return static_cast<const WebMouseWheelEvent*>(i->get());
133 }
134 CHECK(false);
135 return nullptr;
136 }
137
88 protected: 138 protected:
89 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 139 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
90 blink::scheduler::MockRendererScheduler renderer_scheduler_; 140 blink::scheduler::MockRendererScheduler renderer_scheduler_;
91 scoped_refptr<MainThreadEventQueue> queue_; 141 scoped_refptr<MainThreadEventQueue> queue_;
92 std::vector<ui::ScopedWebInputEvent> handled_events_; 142 std::vector<ui::ScopedWebInputEvent> handled_events_;
93 std::vector<uint32_t> additional_acked_events_; 143 std::vector<uint32_t> additional_acked_events_;
94 }; 144 };
95 145
96 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { 146 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) {
97 WebMouseWheelEvent kEvents[4] = { 147 WebMouseWheelEvent kEvents[4] = {
(...skipping 10 matching lines...) Expand all
108 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 158 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
109 159
110 EXPECT_EQ(2u, event_queue().size()); 160 EXPECT_EQ(2u, event_queue().size());
111 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 161 EXPECT_TRUE(main_task_runner_->HasPendingTask());
112 main_task_runner_->RunUntilIdle(); 162 main_task_runner_->RunUntilIdle();
113 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 163 EXPECT_FALSE(main_task_runner_->HasPendingTask());
114 EXPECT_EQ(0u, event_queue().size()); 164 EXPECT_EQ(0u, event_queue().size());
115 EXPECT_EQ(2u, handled_events_.size()); 165 EXPECT_EQ(2u, handled_events_.size());
116 166
117 { 167 {
118 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
119 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
120 const WebMouseWheelEvent* last_wheel_event =
121 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get());
122 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, 168 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
123 last_wheel_event->dispatchType); 169 last_wheel_event()->dispatchType);
124 WebMouseWheelEvent coalesced_event = kEvents[0]; 170 WebMouseWheelEvent coalesced_event = kEvents[0];
125 internal::Coalesce(kEvents[1], &coalesced_event); 171 internal::Coalesce(kEvents[1], &coalesced_event);
126 coalesced_event.dispatchType = 172 coalesced_event.dispatchType =
127 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 173 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
128 EXPECT_EQ(coalesced_event, *last_wheel_event); 174 EXPECT_TRUE(AreEqual(coalesced_event, *first_wheel_event()));
129 } 175 }
130 176
131 { 177 {
132 const WebMouseWheelEvent* last_wheel_event =
133 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get());
134 WebMouseWheelEvent coalesced_event = kEvents[2]; 178 WebMouseWheelEvent coalesced_event = kEvents[2];
135 internal::Coalesce(kEvents[3], &coalesced_event); 179 internal::Coalesce(kEvents[3], &coalesced_event);
136 coalesced_event.dispatchType = 180 coalesced_event.dispatchType =
137 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 181 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
138 EXPECT_EQ(coalesced_event, *last_wheel_event); 182 EXPECT_TRUE(AreEqual(coalesced_event, *last_wheel_event()));
139 } 183 }
140 } 184 }
141 185
142 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { 186 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) {
143 SyntheticWebTouchEvent kEvents[4]; 187 SyntheticWebTouchEvent kEvents[4];
144 kEvents[0].PressPoint(10, 10); 188 kEvents[0].PressPoint(10, 10);
145 kEvents[1].PressPoint(10, 10); 189 kEvents[1].PressPoint(10, 10);
146 kEvents[1].modifiers = 1; 190 kEvents[1].modifiers = 1;
147 kEvents[1].MovePoint(0, 20, 20); 191 kEvents[1].MovePoint(0, 20, 20);
148 kEvents[2].PressPoint(10, 10); 192 kEvents[2].PressPoint(10, 10);
149 kEvents[2].MovePoint(0, 30, 30); 193 kEvents[2].MovePoint(0, 30, 30);
150 kEvents[3].PressPoint(10, 10); 194 kEvents[3].PressPoint(10, 10);
151 kEvents[3].MovePoint(0, 35, 35); 195 kEvents[3].MovePoint(0, 35, 35);
152 196
153 for (SyntheticWebTouchEvent& event : kEvents) 197 for (SyntheticWebTouchEvent& event : kEvents)
154 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 198 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
155 199
156 EXPECT_EQ(3u, event_queue().size()); 200 EXPECT_EQ(3u, event_queue().size());
157 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 201 EXPECT_TRUE(main_task_runner_->HasPendingTask());
158 main_task_runner_->RunUntilIdle(); 202 main_task_runner_->RunUntilIdle();
159 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 203 EXPECT_FALSE(main_task_runner_->HasPendingTask());
160 EXPECT_EQ(0u, event_queue().size()); 204 EXPECT_EQ(0u, event_queue().size());
161 EXPECT_EQ(3u, handled_events_.size()); 205 EXPECT_EQ(3u, handled_events_.size());
162 206
163 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
164 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
165 const WebTouchEvent* last_touch_event =
166 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
167 kEvents[0].dispatchType = 207 kEvents[0].dispatchType =
168 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 208 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
169 EXPECT_EQ(kEvents[0], *last_touch_event); 209 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
170 210
171 EXPECT_EQ(kEvents[1].size, handled_events_.at(1)->size);
172 EXPECT_EQ(kEvents[1].type, handled_events_.at(1)->type);
173 last_touch_event =
174 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_TRUE(AreEqual(kEvents[0], *last_touch_event()));
178 214
179 EXPECT_EQ(kEvents[2].size, handled_events_.at(1)->size);
180 EXPECT_EQ(kEvents[2].type, handled_events_.at(2)->type);
181 last_touch_event =
182 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
183 WebTouchEvent coalesced_event = kEvents[2]; 215 WebTouchEvent coalesced_event = kEvents[2];
184 internal::Coalesce(kEvents[3], &coalesced_event); 216 internal::Coalesce(kEvents[3], &coalesced_event);
185 coalesced_event.dispatchType = 217 coalesced_event.dispatchType =
186 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 218 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
187 EXPECT_EQ(coalesced_event, *last_touch_event); 219 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
188 } 220 }
189 221
190 TEST_F(MainThreadEventQueueTest, BlockingTouch) { 222 TEST_F(MainThreadEventQueueTest, BlockingTouch) {
191 SyntheticWebTouchEvent kEvents[4]; 223 SyntheticWebTouchEvent kEvents[4];
192 kEvents[0].PressPoint(10, 10); 224 kEvents[0].PressPoint(10, 10);
193 kEvents[1].PressPoint(10, 10); 225 kEvents[1].PressPoint(10, 10);
194 kEvents[1].MovePoint(0, 20, 20); 226 kEvents[1].MovePoint(0, 20, 20);
195 kEvents[2].PressPoint(10, 10); 227 kEvents[2].PressPoint(10, 10);
196 kEvents[2].MovePoint(0, 30, 30); 228 kEvents[2].MovePoint(0, 30, 30);
197 kEvents[3].PressPoint(10, 10); 229 kEvents[3].PressPoint(10, 10);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 265 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
234 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 266 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
235 267
236 EXPECT_EQ(2u, event_queue().size()); 268 EXPECT_EQ(2u, event_queue().size());
237 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 269 EXPECT_TRUE(main_task_runner_->HasPendingTask());
238 main_task_runner_->RunUntilIdle(); 270 main_task_runner_->RunUntilIdle();
239 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 271 EXPECT_FALSE(main_task_runner_->HasPendingTask());
240 EXPECT_EQ(0u, event_queue().size()); 272 EXPECT_EQ(0u, event_queue().size());
241 EXPECT_EQ(2u, handled_events_.size()); 273 EXPECT_EQ(2u, handled_events_.size());
242 { 274 {
243 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size);
244 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type);
245 const WebMouseWheelEvent* last_wheel_event =
246 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get());
247 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, 275 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
248 last_wheel_event->dispatchType); 276 last_wheel_event()->dispatchType);
249 WebMouseWheelEvent coalesced_event = kWheelEvents[0]; 277 WebMouseWheelEvent coalesced_event = kWheelEvents[0];
250 internal::Coalesce(kWheelEvents[1], &coalesced_event); 278 internal::Coalesce(kWheelEvents[1], &coalesced_event);
251 coalesced_event.dispatchType = 279 coalesced_event.dispatchType =
252 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 280 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
253 EXPECT_EQ(coalesced_event, *last_wheel_event); 281 EXPECT_TRUE(AreEqual(coalesced_event, *last_wheel_event()));
254 } 282 }
255 { 283 {
256 EXPECT_EQ(kTouchEvents[0].size, handled_events_.at(1)->size);
257 EXPECT_EQ(kTouchEvents[0].type, handled_events_.at(1)->type);
258 const WebTouchEvent* last_touch_event =
259 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
260 WebTouchEvent coalesced_event = kTouchEvents[0]; 284 WebTouchEvent coalesced_event = kTouchEvents[0];
261 internal::Coalesce(kTouchEvents[1], &coalesced_event); 285 internal::Coalesce(kTouchEvents[1], &coalesced_event);
262 coalesced_event.dispatchType = 286 coalesced_event.dispatchType =
263 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 287 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
264 EXPECT_EQ(coalesced_event, *last_touch_event); 288 EXPECT_TRUE(AreEqual(coalesced_event, *last_touch_event()));
265 } 289 }
266 } 290 }
267 291
268 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) { 292 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
269 SyntheticWebTouchEvent kEvents[1]; 293 SyntheticWebTouchEvent kEvents[1];
270 kEvents[0].PressPoint(10, 10); 294 kEvents[0].PressPoint(10, 10);
271 kEvents[0].touchStartOrFirstTouchMove = true; 295 kEvents[0].touchStartOrFirstTouchMove = true;
272 set_is_flinging(true); 296 set_is_flinging(true);
273 set_enable_fling_passive_listener_flag(true); 297 set_enable_fling_passive_listener_flag(true);
274 298
275 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 299 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
276 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 300 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
277 main_task_runner_->RunUntilIdle(); 301 main_task_runner_->RunUntilIdle();
278 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 302 EXPECT_FALSE(main_task_runner_->HasPendingTask());
279 EXPECT_EQ(0u, event_queue().size()); 303 EXPECT_EQ(0u, event_queue().size());
280 EXPECT_EQ(1u, handled_events_.size()); 304 EXPECT_EQ(1u, handled_events_.size());
281 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size);
282 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type);
283 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); 305 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling());
284 const WebTouchEvent* last_touch_event =
285 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
286 kEvents[0].dispatchedDuringFling = true; 306 kEvents[0].dispatchedDuringFling = true;
287 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; 307 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
288 EXPECT_EQ(kEvents[0], *last_touch_event); 308 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
289 309
290 kEvents[0].MovePoint(0, 30, 30); 310 kEvents[0].MovePoint(0, 30, 30);
291 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 311 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
292 main_task_runner_->RunUntilIdle(); 312 main_task_runner_->RunUntilIdle();
293 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 313 EXPECT_FALSE(main_task_runner_->HasPendingTask());
294 EXPECT_EQ(0u, event_queue().size()); 314 EXPECT_EQ(0u, event_queue().size());
295 EXPECT_EQ(2u, handled_events_.size()); 315 EXPECT_EQ(2u, handled_events_.size());
296 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size);
297 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type);
298 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling()); 316 EXPECT_TRUE(last_touch_start_forced_nonblocking_due_to_fling());
299 last_touch_event =
300 static_cast<const WebTouchEvent*>(handled_events_.at(1).get());
301 kEvents[0].dispatchedDuringFling = true; 317 kEvents[0].dispatchedDuringFling = true;
302 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; 318 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
303 EXPECT_EQ(kEvents[0], *last_touch_event); 319 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
304 320
305 kEvents[0].MovePoint(0, 50, 50); 321 kEvents[0].MovePoint(0, 50, 50);
306 kEvents[0].touchStartOrFirstTouchMove = false; 322 kEvents[0].touchStartOrFirstTouchMove = false;
307 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 323 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
308 main_task_runner_->RunUntilIdle(); 324 main_task_runner_->RunUntilIdle();
309 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 325 EXPECT_FALSE(main_task_runner_->HasPendingTask());
310 EXPECT_EQ(0u, event_queue().size()); 326 EXPECT_EQ(0u, event_queue().size());
311 EXPECT_EQ(3u, handled_events_.size()); 327 EXPECT_EQ(3u, handled_events_.size());
312 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size);
313 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type);
314 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); 328 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
315 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 329 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
316 last_touch_event = 330 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
317 static_cast<const WebTouchEvent*>(handled_events_.at(2).get());
318 EXPECT_EQ(kEvents[0], *last_touch_event);
319 331
320 kEvents[0].ReleasePoint(0); 332 kEvents[0].ReleasePoint(0);
321 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 333 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
322 main_task_runner_->RunUntilIdle(); 334 main_task_runner_->RunUntilIdle();
323 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 335 EXPECT_FALSE(main_task_runner_->HasPendingTask());
324 EXPECT_EQ(0u, event_queue().size()); 336 EXPECT_EQ(0u, event_queue().size());
325 EXPECT_EQ(4u, handled_events_.size()); 337 EXPECT_EQ(4u, handled_events_.size());
326 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size);
327 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type);
328 EXPECT_TRUE(kEvents[0].dispatchedDuringFling); 338 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
329 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 339 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
330 last_touch_event = 340 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
331 static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
332 EXPECT_EQ(kEvents[0], *last_touch_event);
333 } 341 }
334 342
335 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { 343 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) {
336 SyntheticWebTouchEvent kEvents[1]; 344 SyntheticWebTouchEvent kEvent;
337 kEvents[0].PressPoint(10, 10); 345 kEvent.PressPoint(10, 10);
338 kEvents[0].touchStartOrFirstTouchMove = true; 346 kEvent.touchStartOrFirstTouchMove = true;
339 set_is_flinging(false); 347 set_is_flinging(false);
340 set_enable_fling_passive_listener_flag(false); 348 set_enable_fling_passive_listener_flag(false);
341 349
342 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 350 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
343 main_task_runner_->RunUntilIdle(); 351 main_task_runner_->RunUntilIdle();
344 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 352 EXPECT_FALSE(main_task_runner_->HasPendingTask());
345 EXPECT_EQ(0u, event_queue().size()); 353 EXPECT_EQ(0u, event_queue().size());
346 EXPECT_EQ(1u, handled_events_.size()); 354 EXPECT_EQ(1u, handled_events_.size());
347 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); 355 EXPECT_FALSE(kEvent.dispatchedDuringFling);
348 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); 356 EXPECT_EQ(kEvent.dispatchType, WebInputEvent::Blocking);
349 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
350 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
351 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 357 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
352 const WebTouchEvent* last_touch_event = 358 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
353 static_cast<const WebTouchEvent*>(handled_events_.at(0).get());
354 EXPECT_EQ(kEvents[0], *last_touch_event);
355 359
356 set_is_flinging(true); 360 set_is_flinging(true);
357 set_enable_fling_passive_listener_flag(false); 361 set_enable_fling_passive_listener_flag(false);
358 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 362 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
359 main_task_runner_->RunUntilIdle(); 363 main_task_runner_->RunUntilIdle();
360 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 364 EXPECT_FALSE(main_task_runner_->HasPendingTask());
361 EXPECT_EQ(0u, event_queue().size()); 365 EXPECT_EQ(0u, event_queue().size());
362 EXPECT_EQ(2u, handled_events_.size()); 366 EXPECT_EQ(2u, handled_events_.size());
363 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); 367 EXPECT_FALSE(kEvent.dispatchedDuringFling);
364 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); 368 EXPECT_EQ(kEvent.dispatchType, WebInputEvent::Blocking);
365 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
366 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
367 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 369 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
368 last_touch_event = 370 kEvent.dispatchedDuringFling = true;
369 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 371 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
370 kEvents[0].dispatchedDuringFling = true;
371 EXPECT_EQ(kEvents[0], *last_touch_event);
372 372
373 set_is_flinging(false); 373 set_is_flinging(false);
374 set_enable_fling_passive_listener_flag(true); 374 set_enable_fling_passive_listener_flag(true);
375 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 375 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
376 main_task_runner_->RunUntilIdle(); 376 main_task_runner_->RunUntilIdle();
377 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 377 EXPECT_FALSE(main_task_runner_->HasPendingTask());
378 EXPECT_EQ(0u, event_queue().size()); 378 EXPECT_EQ(0u, event_queue().size());
379 EXPECT_EQ(3u, handled_events_.size()); 379 EXPECT_EQ(3u, handled_events_.size());
380 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); 380 EXPECT_TRUE(kEvent.dispatchedDuringFling);
381 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); 381 EXPECT_EQ(kEvent.dispatchType, WebInputEvent::Blocking);
382 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
383 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
384 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 382 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
385 last_touch_event = 383 kEvent.dispatchedDuringFling = false;
386 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); 384 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
387 kEvents[0].dispatchedDuringFling = false;
388 EXPECT_EQ(kEvents[0], *last_touch_event);
389 385
390 kEvents[0].MovePoint(0, 30, 30); 386 kEvent.MovePoint(0, 30, 30);
391 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 387 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
392 main_task_runner_->RunUntilIdle(); 388 main_task_runner_->RunUntilIdle();
393 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 389 EXPECT_FALSE(main_task_runner_->HasPendingTask());
394 EXPECT_EQ(0u, event_queue().size()); 390 EXPECT_EQ(0u, event_queue().size());
395 EXPECT_EQ(4u, handled_events_.size()); 391 EXPECT_EQ(4u, handled_events_.size());
396 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); 392 EXPECT_FALSE(kEvent.dispatchedDuringFling);
397 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); 393 EXPECT_EQ(kEvent.dispatchType, WebInputEvent::Blocking);
398 EXPECT_FALSE(kEvents[0].dispatchedDuringFling);
399 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
400 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 394 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
401 last_touch_event = 395 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
402 static_cast<const WebTouchEvent*>(handled_events_.at(3).get());
403 EXPECT_EQ(kEvents[0], *last_touch_event);
404 } 396 }
405 397
406 } // namespace content 398 TEST_F(MainThreadEventQueueTest, ForcedNonBlockingDueToUnresponsiveMainThread) {
399 SyntheticWebTouchEvent kEvent;
400 kEvent.PressPoint(10, 10);
401 kEvent.touchStartOrFirstTouchMove = true;
402 set_enable_non_blocking_due_to_main_thread_responsiveness_flag(true);
403
404 EXPECT_CALL(renderer_scheduler_,
405 ShouldForceEventsNonBlockingForUnresponsiveMainThread())
406 .Times(4)
407 .WillRepeatedly(testing::Return(true));
408
409 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
410 main_task_runner_->RunUntilIdle();
411 EXPECT_FALSE(main_task_runner_->HasPendingTask());
412 EXPECT_EQ(0u, event_queue().size());
413 EXPECT_EQ(1u, handled_events_.size());
414 kEvent.dispatchType =
415 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
416 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
417
418 kEvent.MovePoint(0, 30, 30);
419 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
420 main_task_runner_->RunUntilIdle();
421 EXPECT_FALSE(main_task_runner_->HasPendingTask());
422 EXPECT_EQ(0u, event_queue().size());
423 EXPECT_EQ(2u, handled_events_.size());
424 kEvent.dispatchType =
425 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
426 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
427
428 kEvent.MovePoint(0, 50, 50);
429 kEvent.touchStartOrFirstTouchMove = false;
430 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
431 main_task_runner_->RunUntilIdle();
432 EXPECT_FALSE(main_task_runner_->HasPendingTask());
433 EXPECT_EQ(0u, event_queue().size());
434 EXPECT_EQ(3u, handled_events_.size());
435 kEvent.dispatchType =
436 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
437 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
438
439 kEvent.ReleasePoint(0);
440 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
441 main_task_runner_->RunUntilIdle();
442 EXPECT_FALSE(main_task_runner_->HasPendingTask());
443 EXPECT_EQ(0u, event_queue().size());
444 EXPECT_EQ(4u, handled_events_.size());
445 kEvent.dispatchType =
446 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
447 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
448 }
449
450 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698