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

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: 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() {
dtapuska 2016/08/23 16:18:29 should be a const function
tdresser 2016/08/23 17:25:32 Done.
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 return nullptr;
117 }
118
119 const WebMouseWheelEvent* first_wheel_event() {
dtapuska 2016/08/23 16:18:29 ditto
tdresser 2016/08/23 17:25:33 Done.
120 for (auto i = handled_events_.begin(); i != handled_events_.end(); ++i) {
121 if (i->get()->type == WebInputEvent::MouseWheel)
122 return static_cast<const WebMouseWheelEvent*>(i->get());
123 }
124 return nullptr;
125 }
126
127 const WebMouseWheelEvent* last_wheel_event() {
dtapuska 2016/08/23 16:18:29 ditto
tdresser 2016/08/23 17:25:33 Done.
128 for (auto i = handled_events_.rbegin(); i != handled_events_.rend(); ++i) {
129 if (i->get()->type == WebInputEvent::MouseWheel)
130 return static_cast<const WebMouseWheelEvent*>(i->get());
131 }
132 return nullptr;
133 }
134
88 protected: 135 protected:
89 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; 136 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_;
90 blink::scheduler::MockRendererScheduler renderer_scheduler_; 137 blink::scheduler::MockRendererScheduler renderer_scheduler_;
91 scoped_refptr<MainThreadEventQueue> queue_; 138 scoped_refptr<MainThreadEventQueue> queue_;
92 std::vector<ui::ScopedWebInputEvent> handled_events_; 139 std::vector<ui::ScopedWebInputEvent> handled_events_;
93 std::vector<uint32_t> additional_acked_events_; 140 std::vector<uint32_t> additional_acked_events_;
94 }; 141 };
95 142
96 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { 143 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) {
97 WebMouseWheelEvent kEvents[4] = { 144 WebMouseWheelEvent kEvents[4] = {
(...skipping 10 matching lines...) Expand all
108 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 155 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
109 156
110 EXPECT_EQ(2u, event_queue().size()); 157 EXPECT_EQ(2u, event_queue().size());
111 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 158 EXPECT_TRUE(main_task_runner_->HasPendingTask());
112 main_task_runner_->RunUntilIdle(); 159 main_task_runner_->RunUntilIdle();
113 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 160 EXPECT_FALSE(main_task_runner_->HasPendingTask());
114 EXPECT_EQ(0u, event_queue().size()); 161 EXPECT_EQ(0u, event_queue().size());
115 EXPECT_EQ(2u, handled_events_.size()); 162 EXPECT_EQ(2u, handled_events_.size());
116 163
117 { 164 {
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, 165 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
123 last_wheel_event->dispatchType); 166 last_wheel_event()->dispatchType);
124 WebMouseWheelEvent coalesced_event = kEvents[0]; 167 WebMouseWheelEvent coalesced_event = kEvents[0];
125 internal::Coalesce(kEvents[1], &coalesced_event); 168 internal::Coalesce(kEvents[1], &coalesced_event);
126 coalesced_event.dispatchType = 169 coalesced_event.dispatchType =
127 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 170 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
128 EXPECT_EQ(coalesced_event, *last_wheel_event); 171 EXPECT_TRUE(AreEqual(coalesced_event, *first_wheel_event()));
dtapuska 2016/08/23 16:18:29 Isn't this a null deref?
tdresser 2016/08/23 17:25:33 Added CHECK to ensure that these methods never ret
129 } 172 }
130 173
131 { 174 {
132 const WebMouseWheelEvent* last_wheel_event =
133 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get());
134 WebMouseWheelEvent coalesced_event = kEvents[2]; 175 WebMouseWheelEvent coalesced_event = kEvents[2];
135 internal::Coalesce(kEvents[3], &coalesced_event); 176 internal::Coalesce(kEvents[3], &coalesced_event);
136 coalesced_event.dispatchType = 177 coalesced_event.dispatchType =
137 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 178 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
138 EXPECT_EQ(coalesced_event, *last_wheel_event); 179 EXPECT_TRUE(AreEqual(coalesced_event, *last_wheel_event()));
139 } 180 }
140 } 181 }
141 182
142 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { 183 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) {
143 SyntheticWebTouchEvent kEvents[4]; 184 SyntheticWebTouchEvent kEvents[4];
144 kEvents[0].PressPoint(10, 10); 185 kEvents[0].PressPoint(10, 10);
145 kEvents[1].PressPoint(10, 10); 186 kEvents[1].PressPoint(10, 10);
146 kEvents[1].modifiers = 1; 187 kEvents[1].modifiers = 1;
147 kEvents[1].MovePoint(0, 20, 20); 188 kEvents[1].MovePoint(0, 20, 20);
148 kEvents[2].PressPoint(10, 10); 189 kEvents[2].PressPoint(10, 10);
149 kEvents[2].MovePoint(0, 30, 30); 190 kEvents[2].MovePoint(0, 30, 30);
150 kEvents[3].PressPoint(10, 10); 191 kEvents[3].PressPoint(10, 10);
151 kEvents[3].MovePoint(0, 35, 35); 192 kEvents[3].MovePoint(0, 35, 35);
152 193
153 for (SyntheticWebTouchEvent& event : kEvents) 194 for (SyntheticWebTouchEvent& event : kEvents)
154 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 195 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
155 196
156 EXPECT_EQ(3u, event_queue().size()); 197 EXPECT_EQ(3u, event_queue().size());
157 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 198 EXPECT_TRUE(main_task_runner_->HasPendingTask());
158 main_task_runner_->RunUntilIdle(); 199 main_task_runner_->RunUntilIdle();
159 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 200 EXPECT_FALSE(main_task_runner_->HasPendingTask());
160 EXPECT_EQ(0u, event_queue().size()); 201 EXPECT_EQ(0u, event_queue().size());
161 EXPECT_EQ(3u, handled_events_.size()); 202 EXPECT_EQ(3u, handled_events_.size());
162 203
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 = 204 kEvents[0].dispatchType =
168 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 205 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
169 EXPECT_EQ(kEvents[0], *last_touch_event); 206 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
170 207
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 = 208 kEvents[1].dispatchType =
176 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 209 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
177 EXPECT_EQ(kEvents[1], *last_touch_event); 210 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
178 211
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]; 212 WebTouchEvent coalesced_event = kEvents[2];
184 internal::Coalesce(kEvents[3], &coalesced_event); 213 internal::Coalesce(kEvents[3], &coalesced_event);
185 coalesced_event.dispatchType = 214 coalesced_event.dispatchType =
186 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 215 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
187 EXPECT_EQ(coalesced_event, *last_touch_event); 216 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
188 } 217 }
189 218
190 TEST_F(MainThreadEventQueueTest, BlockingTouch) { 219 TEST_F(MainThreadEventQueueTest, BlockingTouch) {
191 SyntheticWebTouchEvent kEvents[4]; 220 SyntheticWebTouchEvent kEvents[4];
192 kEvents[0].PressPoint(10, 10); 221 kEvents[0].PressPoint(10, 10);
193 kEvents[1].PressPoint(10, 10); 222 kEvents[1].PressPoint(10, 10);
194 kEvents[1].MovePoint(0, 20, 20); 223 kEvents[1].MovePoint(0, 20, 20);
195 kEvents[2].PressPoint(10, 10); 224 kEvents[2].PressPoint(10, 10);
196 kEvents[2].MovePoint(0, 30, 30); 225 kEvents[2].MovePoint(0, 30, 30);
197 kEvents[3].PressPoint(10, 10); 226 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); 262 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
234 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 263 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
235 264
236 EXPECT_EQ(2u, event_queue().size()); 265 EXPECT_EQ(2u, event_queue().size());
237 EXPECT_TRUE(main_task_runner_->HasPendingTask()); 266 EXPECT_TRUE(main_task_runner_->HasPendingTask());
238 main_task_runner_->RunUntilIdle(); 267 main_task_runner_->RunUntilIdle();
239 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 268 EXPECT_FALSE(main_task_runner_->HasPendingTask());
240 EXPECT_EQ(0u, event_queue().size()); 269 EXPECT_EQ(0u, event_queue().size());
241 EXPECT_EQ(2u, handled_events_.size()); 270 EXPECT_EQ(2u, handled_events_.size());
242 { 271 {
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, 272 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive,
248 last_wheel_event->dispatchType); 273 last_wheel_event()->dispatchType);
249 WebMouseWheelEvent coalesced_event = kWheelEvents[0]; 274 WebMouseWheelEvent coalesced_event = kWheelEvents[0];
250 internal::Coalesce(kWheelEvents[1], &coalesced_event); 275 internal::Coalesce(kWheelEvents[1], &coalesced_event);
251 coalesced_event.dispatchType = 276 coalesced_event.dispatchType =
252 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 277 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
253 EXPECT_EQ(coalesced_event, *last_wheel_event); 278 EXPECT_TRUE(AreEqual(coalesced_event, *last_wheel_event()));
254 } 279 }
255 { 280 {
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]; 281 WebTouchEvent coalesced_event = kTouchEvents[0];
261 internal::Coalesce(kTouchEvents[1], &coalesced_event); 282 internal::Coalesce(kTouchEvents[1], &coalesced_event);
262 coalesced_event.dispatchType = 283 coalesced_event.dispatchType =
263 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 284 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
264 EXPECT_EQ(coalesced_event, *last_touch_event); 285 EXPECT_TRUE(AreEqual(coalesced_event, *last_touch_event()));
265 } 286 }
266 } 287 }
267 288
268 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) { 289 TEST_F(MainThreadEventQueueTest, BlockingTouchesDuringFling) {
269 SyntheticWebTouchEvent kEvents[1]; 290 SyntheticWebTouchEvent kEvents[1];
270 kEvents[0].PressPoint(10, 10); 291 kEvents[0].PressPoint(10, 10);
271 kEvents[0].touchStartOrFirstTouchMove = true; 292 kEvents[0].touchStartOrFirstTouchMove = true;
272 set_is_flinging(true); 293 set_is_flinging(true);
273 set_enable_fling_passive_listener_flag(true); 294 set_enable_fling_passive_listener_flag(true);
274 295
275 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling()); 296 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
276 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 297 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
277 main_task_runner_->RunUntilIdle(); 298 main_task_runner_->RunUntilIdle();
278 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 299 EXPECT_FALSE(main_task_runner_->HasPendingTask());
279 EXPECT_EQ(0u, event_queue().size()); 300 EXPECT_EQ(0u, event_queue().size());
280 EXPECT_EQ(1u, handled_events_.size()); 301 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()); 302 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; 303 kEvents[0].dispatchedDuringFling = true;
287 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; 304 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
288 EXPECT_EQ(kEvents[0], *last_touch_event); 305 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
289 306
290 kEvents[0].MovePoint(0, 30, 30); 307 kEvents[0].MovePoint(0, 30, 30);
291 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 308 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
292 main_task_runner_->RunUntilIdle(); 309 main_task_runner_->RunUntilIdle();
293 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 310 EXPECT_FALSE(main_task_runner_->HasPendingTask());
294 EXPECT_EQ(0u, event_queue().size()); 311 EXPECT_EQ(0u, event_queue().size());
295 EXPECT_EQ(2u, handled_events_.size()); 312 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()); 313 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; 314 kEvents[0].dispatchedDuringFling = true;
302 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling; 315 kEvents[0].dispatchType = WebInputEvent::ListenersForcedNonBlockingDueToFling;
303 EXPECT_EQ(kEvents[0], *last_touch_event); 316 EXPECT_TRUE(AreEqual(kEvents[0], *last_touch_event()));
304 317
305 kEvents[0].MovePoint(0, 50, 50); 318 kEvents[0].MovePoint(0, 50, 50);
306 kEvents[0].touchStartOrFirstTouchMove = false; 319 kEvents[0].touchStartOrFirstTouchMove = false;
307 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 320 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
308 main_task_runner_->RunUntilIdle(); 321 main_task_runner_->RunUntilIdle();
309 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 322 EXPECT_FALSE(main_task_runner_->HasPendingTask());
310 EXPECT_EQ(0u, event_queue().size()); 323 EXPECT_EQ(0u, event_queue().size());
311 EXPECT_EQ(3u, handled_events_.size()); 324 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); 325 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
315 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 326 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
316 last_touch_event = 327 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 328
320 kEvents[0].ReleasePoint(0); 329 kEvents[0].ReleasePoint(0);
321 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 330 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
322 main_task_runner_->RunUntilIdle(); 331 main_task_runner_->RunUntilIdle();
323 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 332 EXPECT_FALSE(main_task_runner_->HasPendingTask());
324 EXPECT_EQ(0u, event_queue().size()); 333 EXPECT_EQ(0u, event_queue().size());
325 EXPECT_EQ(4u, handled_events_.size()); 334 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); 335 EXPECT_TRUE(kEvents[0].dispatchedDuringFling);
329 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking); 336 EXPECT_EQ(kEvents[0].dispatchType, WebInputEvent::Blocking);
330 last_touch_event = 337 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 } 338 }
334 339
335 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) { 340 TEST_F(MainThreadEventQueueTest, BlockingTouchesOutsideFling) {
336 SyntheticWebTouchEvent kEvents[1]; 341 SyntheticWebTouchEvent kEvent;
337 kEvents[0].PressPoint(10, 10); 342 kEvent.PressPoint(10, 10);
338 kEvents[0].touchStartOrFirstTouchMove = true; 343 kEvent.touchStartOrFirstTouchMove = true;
339 set_is_flinging(false); 344 set_is_flinging(false);
340 set_enable_fling_passive_listener_flag(false); 345 set_enable_fling_passive_listener_flag(false);
341 346
342 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 347 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
343 main_task_runner_->RunUntilIdle(); 348 main_task_runner_->RunUntilIdle();
344 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 349 EXPECT_FALSE(main_task_runner_->HasPendingTask());
345 EXPECT_EQ(0u, event_queue().size()); 350 EXPECT_EQ(0u, event_queue().size());
346 EXPECT_EQ(1u, handled_events_.size()); 351 EXPECT_EQ(1u, handled_events_.size());
347 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); 352 EXPECT_FALSE(kEvent.dispatchedDuringFling);
348 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); 353 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()); 354 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
352 const WebTouchEvent* last_touch_event = 355 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 356
356 set_is_flinging(true); 357 set_is_flinging(true);
357 set_enable_fling_passive_listener_flag(false); 358 set_enable_fling_passive_listener_flag(false);
358 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 359 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
359 main_task_runner_->RunUntilIdle(); 360 main_task_runner_->RunUntilIdle();
360 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 361 EXPECT_FALSE(main_task_runner_->HasPendingTask());
361 EXPECT_EQ(0u, event_queue().size()); 362 EXPECT_EQ(0u, event_queue().size());
362 EXPECT_EQ(2u, handled_events_.size()); 363 EXPECT_EQ(2u, handled_events_.size());
363 EXPECT_EQ(kEvents[0].size, handled_events_.at(1)->size); 364 EXPECT_FALSE(kEvent.dispatchedDuringFling);
364 EXPECT_EQ(kEvents[0].type, handled_events_.at(1)->type); 365 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()); 366 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
368 last_touch_event = 367 kEvent.dispatchedDuringFling = true;
369 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); 368 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
370 kEvents[0].dispatchedDuringFling = true;
371 EXPECT_EQ(kEvents[0], *last_touch_event);
372 369
373 set_is_flinging(false); 370 set_is_flinging(false);
374 set_enable_fling_passive_listener_flag(true); 371 set_enable_fling_passive_listener_flag(true);
375 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 372 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
376 main_task_runner_->RunUntilIdle(); 373 main_task_runner_->RunUntilIdle();
377 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 374 EXPECT_FALSE(main_task_runner_->HasPendingTask());
378 EXPECT_EQ(0u, event_queue().size()); 375 EXPECT_EQ(0u, event_queue().size());
379 EXPECT_EQ(3u, handled_events_.size()); 376 EXPECT_EQ(3u, handled_events_.size());
380 EXPECT_EQ(kEvents[0].size, handled_events_.at(2)->size); 377 EXPECT_TRUE(kEvent.dispatchedDuringFling);
381 EXPECT_EQ(kEvents[0].type, handled_events_.at(2)->type); 378 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()); 379 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
385 last_touch_event = 380 kEvent.dispatchedDuringFling = false;
386 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); 381 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
387 kEvents[0].dispatchedDuringFling = false;
388 EXPECT_EQ(kEvents[0], *last_touch_event);
389 382
390 kEvents[0].MovePoint(0, 30, 30); 383 kEvent.MovePoint(0, 30, 30);
391 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 384 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
392 main_task_runner_->RunUntilIdle(); 385 main_task_runner_->RunUntilIdle();
393 EXPECT_FALSE(main_task_runner_->HasPendingTask()); 386 EXPECT_FALSE(main_task_runner_->HasPendingTask());
394 EXPECT_EQ(0u, event_queue().size()); 387 EXPECT_EQ(0u, event_queue().size());
395 EXPECT_EQ(4u, handled_events_.size()); 388 EXPECT_EQ(4u, handled_events_.size());
396 EXPECT_EQ(kEvents[0].size, handled_events_.at(3)->size); 389 EXPECT_FALSE(kEvent.dispatchedDuringFling);
397 EXPECT_EQ(kEvents[0].type, handled_events_.at(3)->type); 390 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()); 391 EXPECT_FALSE(last_touch_start_forced_nonblocking_due_to_fling());
401 last_touch_event = 392 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 } 393 }
405 394
406 } // namespace content 395 TEST_F(MainThreadEventQueueTest, ForcedNonBlockingDueToUnresponsiveMainThread) {
396 SyntheticWebTouchEvent kEvent;
397 kEvent.PressPoint(10, 10);
398 kEvent.touchStartOrFirstTouchMove = true;
399 set_enable_non_blocking_due_to_main_thread_responsiveness_flag(true);
400
401 EXPECT_CALL(renderer_scheduler_,
402 ShouldForceEventsNonBlockingForUnresponsiveMainThread())
403 .Times(4)
404 .WillRepeatedly(testing::Return(true));
405
406 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
407 main_task_runner_->RunUntilIdle();
408 EXPECT_FALSE(main_task_runner_->HasPendingTask());
409 EXPECT_EQ(0u, event_queue().size());
410 EXPECT_EQ(1u, handled_events_.size());
411 kEvent.dispatchType =
412 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
413 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
414
415 kEvent.MovePoint(0, 30, 30);
416 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
417 main_task_runner_->RunUntilIdle();
418 EXPECT_FALSE(main_task_runner_->HasPendingTask());
419 EXPECT_EQ(0u, event_queue().size());
420 EXPECT_EQ(2u, handled_events_.size());
421 kEvent.dispatchType =
422 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
423 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
424
425 kEvent.MovePoint(0, 50, 50);
426 kEvent.touchStartOrFirstTouchMove = false;
427 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
428 main_task_runner_->RunUntilIdle();
429 EXPECT_FALSE(main_task_runner_->HasPendingTask());
430 EXPECT_EQ(0u, event_queue().size());
431 EXPECT_EQ(3u, handled_events_.size());
432 kEvent.dispatchType =
433 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
434 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
435
436 kEvent.ReleasePoint(0);
437 HandleEvent(kEvent, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
438 main_task_runner_->RunUntilIdle();
439 EXPECT_FALSE(main_task_runner_->HasPendingTask());
440 EXPECT_EQ(0u, event_queue().size());
441 EXPECT_EQ(4u, handled_events_.size());
442 kEvent.dispatchType =
443 WebInputEvent::ListenersForcedNonBlockingDueToMainThreadResponsiveness;
444 EXPECT_TRUE(AreEqual(kEvent, *last_touch_event()));
445 }
446
447 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698