Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <new> | 7 #include <new> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 feature_list_.InitFromCommandLine(base::JoinString(features, ","), | 63 feature_list_.InitFromCommandLine(base::JoinString(features, ","), |
| 64 std::string()); | 64 std::string()); |
| 65 } | 65 } |
| 66 | 66 |
| 67 void SetUp() override { | 67 void SetUp() override { |
| 68 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_, | 68 queue_ = new MainThreadEventQueue(kTestRoutingID, this, main_task_runner_, |
| 69 &renderer_scheduler_); | 69 &renderer_scheduler_); |
| 70 } | 70 } |
| 71 | 71 |
| 72 void HandleEventOnMainThread(int routing_id, | 72 void HandleEventOnMainThread(int routing_id, |
| 73 const blink::WebInputEvent* event, | 73 const blink::WebCoalescedInputEvent* event, |
| 74 const ui::LatencyInfo& latency, | 74 const ui::LatencyInfo& latency, |
| 75 InputEventDispatchType type) override { | 75 InputEventDispatchType type) override { |
| 76 EXPECT_EQ(kTestRoutingID, routing_id); | 76 EXPECT_EQ(kTestRoutingID, routing_id); |
| 77 handled_events_.push_back(ui::WebInputEventTraits::Clone(*event)); | 77 handled_events_.push_back(ui::WebInputEventTraits::Clone(event->event())); |
| 78 queue_->EventHandled(event->type(), INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 78 std::vector<blink::WebScopedInputEvent> coalescedEvents; |
|
dtapuska
2017/01/13 18:56:23
Is it not possible to just update the handled_even
Navid Zolghadr
2017/01/13 19:02:10
Yeah. I didn't like what I did either. Only when I
dtapuska
2017/01/13 19:10:23
I'd prefer to have cleaner code than minimizing th
Navid Zolghadr
2017/01/16 18:01:55
Done.
| |
| 79 for (size_t i = 0; i < event->coalescedEventSize(); i++) { | |
| 80 coalescedEvents.push_back( | |
| 81 ui::WebInputEventTraits::Clone(event->coalescedEvent(i))); | |
| 82 } | |
| 83 handled_coalesced_events_.push_back(std::move(coalescedEvents)); | |
| 84 | |
| 85 queue_->EventHandled(event->event().type(), | |
| 86 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 79 } | 87 } |
| 80 | 88 |
| 81 void SendInputEventAck(int routing_id, | 89 void SendInputEventAck(int routing_id, |
| 82 blink::WebInputEvent::Type type, | 90 blink::WebInputEvent::Type type, |
| 83 InputEventAckState ack_result, | 91 InputEventAckState ack_result, |
| 84 uint32_t touch_event_id) override { | 92 uint32_t touch_event_id) override { |
| 85 additional_acked_events_.push_back(touch_event_id); | 93 additional_acked_events_.push_back(touch_event_id); |
| 86 } | 94 } |
| 87 | 95 |
| 88 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { | 96 bool HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 119 queue_->DispatchRafAlignedInput(); | 127 queue_->DispatchRafAlignedInput(); |
| 120 } | 128 } |
| 121 } | 129 } |
| 122 | 130 |
| 123 protected: | 131 protected: |
| 124 base::test::ScopedFeatureList feature_list_; | 132 base::test::ScopedFeatureList feature_list_; |
| 125 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; | 133 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
| 126 blink::scheduler::MockRendererScheduler renderer_scheduler_; | 134 blink::scheduler::MockRendererScheduler renderer_scheduler_; |
| 127 scoped_refptr<MainThreadEventQueue> queue_; | 135 scoped_refptr<MainThreadEventQueue> queue_; |
| 128 std::vector<blink::WebScopedInputEvent> handled_events_; | 136 std::vector<blink::WebScopedInputEvent> handled_events_; |
| 137 std::vector<std::vector<blink::WebScopedInputEvent>> | |
| 138 handled_coalesced_events_; | |
| 139 | |
| 129 std::vector<uint32_t> additional_acked_events_; | 140 std::vector<uint32_t> additional_acked_events_; |
| 130 int raf_aligned_input_setting_; | 141 int raf_aligned_input_setting_; |
| 131 bool needs_main_frame_; | 142 bool needs_main_frame_; |
| 132 }; | 143 }; |
| 133 | 144 |
| 134 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { | 145 TEST_P(MainThreadEventQueueTest, NonBlockingWheel) { |
| 135 base::HistogramTester histogram_tester; | 146 base::HistogramTester histogram_tester; |
| 136 | 147 |
| 137 WebMouseWheelEvent kEvents[4] = { | 148 WebMouseWheelEvent kEvents[4] = { |
| 138 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 149 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 139 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 150 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| 140 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 151 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 141 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 152 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 142 }; | 153 }; |
| 143 | 154 |
| 144 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 155 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 145 EXPECT_EQ(0u, event_queue().size()); | 156 EXPECT_EQ(0u, event_queue().size()); |
| 146 | 157 |
| 147 for (WebMouseWheelEvent& event : kEvents) | 158 for (WebMouseWheelEvent& event : kEvents) |
| 148 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 159 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 149 | 160 |
| 150 EXPECT_EQ(2u, event_queue().size()); | 161 EXPECT_EQ(2u, event_queue().size()); |
| 151 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledMouse) == 0, | 162 EXPECT_EQ((raf_aligned_input_setting_ & kRafAlignedEnabledMouse) == 0, |
| 152 main_task_runner_->HasPendingTask()); | 163 main_task_runner_->HasPendingTask()); |
| 153 RunPendingTasksWithSimulatedRaf(); | 164 RunPendingTasksWithSimulatedRaf(); |
| 154 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 165 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 155 EXPECT_EQ(0u, event_queue().size()); | 166 EXPECT_EQ(0u, event_queue().size()); |
| 156 EXPECT_EQ(2u, handled_events_.size()); | 167 EXPECT_EQ(2u, handled_events_.size()); |
| 168 for (const auto& coalescedEvents : handled_coalesced_events_) { | |
| 169 EXPECT_EQ(2u, coalescedEvents.size()); | |
| 170 } | |
| 157 | 171 |
| 158 { | 172 { |
| 159 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size()); | 173 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size()); |
| 160 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type()); | 174 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type()); |
| 161 const WebMouseWheelEvent* last_wheel_event = | 175 const WebMouseWheelEvent* last_wheel_event = |
| 162 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); | 176 static_cast<const WebMouseWheelEvent*>(handled_events_.at(0).get()); |
| 163 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, | 177 EXPECT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, |
| 164 last_wheel_event->dispatchType); | 178 last_wheel_event->dispatchType); |
| 165 WebMouseWheelEvent coalesced_event = kEvents[0]; | 179 WebMouseWheelEvent coalesced_event = kEvents[0]; |
| 166 ui::Coalesce(kEvents[1], &coalesced_event); | 180 ui::Coalesce(kEvents[1], &coalesced_event); |
| 167 coalesced_event.dispatchType = | 181 coalesced_event.dispatchType = |
| 168 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 182 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 169 EXPECT_EQ(coalesced_event, *last_wheel_event); | 183 EXPECT_EQ(coalesced_event, *last_wheel_event); |
| 170 } | 184 } |
| 171 | 185 |
| 172 { | 186 { |
| 187 WebMouseWheelEvent coalesced_event = kEvents[0]; | |
| 188 const WebMouseWheelEvent* coalesced_wheel_event0 = | |
| 189 static_cast<const WebMouseWheelEvent*>( | |
| 190 handled_coalesced_events_[0][0].get()); | |
| 191 coalesced_event.dispatchType = | |
| 192 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 193 EXPECT_EQ(coalesced_event, *coalesced_wheel_event0); | |
| 194 | |
| 195 coalesced_event = kEvents[1]; | |
| 196 const WebMouseWheelEvent* coalesced_wheel_event1 = | |
| 197 static_cast<const WebMouseWheelEvent*>( | |
| 198 handled_coalesced_events_[0][1].get()); | |
| 199 coalesced_event.dispatchType = | |
| 200 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 201 EXPECT_EQ(coalesced_event, *coalesced_wheel_event1); | |
| 202 } | |
| 203 | |
| 204 { | |
| 173 const WebMouseWheelEvent* last_wheel_event = | 205 const WebMouseWheelEvent* last_wheel_event = |
| 174 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get()); | 206 static_cast<const WebMouseWheelEvent*>(handled_events_.at(1).get()); |
| 175 WebMouseWheelEvent coalesced_event = kEvents[2]; | 207 WebMouseWheelEvent coalesced_event = kEvents[2]; |
| 176 ui::Coalesce(kEvents[3], &coalesced_event); | 208 ui::Coalesce(kEvents[3], &coalesced_event); |
| 177 coalesced_event.dispatchType = | 209 coalesced_event.dispatchType = |
| 178 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 210 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 179 EXPECT_EQ(coalesced_event, *last_wheel_event); | 211 EXPECT_EQ(coalesced_event, *last_wheel_event); |
| 180 } | 212 } |
| 213 | |
| 214 { | |
| 215 WebMouseWheelEvent coalesced_event = kEvents[2]; | |
| 216 const WebMouseWheelEvent* coalesced_wheel_event0 = | |
| 217 static_cast<const WebMouseWheelEvent*>( | |
| 218 handled_coalesced_events_[1][0].get()); | |
| 219 coalesced_event.dispatchType = | |
| 220 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 221 EXPECT_EQ(coalesced_event, *coalesced_wheel_event0); | |
| 222 | |
| 223 coalesced_event = kEvents[3]; | |
| 224 const WebMouseWheelEvent* coalesced_wheel_event1 = | |
| 225 static_cast<const WebMouseWheelEvent*>( | |
| 226 handled_coalesced_events_[1][1].get()); | |
| 227 coalesced_event.dispatchType = | |
| 228 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 229 EXPECT_EQ(coalesced_event, *coalesced_wheel_event1); | |
| 230 } | |
| 231 | |
| 181 histogram_tester.ExpectUniqueSample(kCoalescedCountHistogram, 1, 2); | 232 histogram_tester.ExpectUniqueSample(kCoalescedCountHistogram, 1, 2); |
| 182 } | 233 } |
| 183 | 234 |
| 184 TEST_P(MainThreadEventQueueTest, NonBlockingTouch) { | 235 TEST_P(MainThreadEventQueueTest, NonBlockingTouch) { |
| 185 base::HistogramTester histogram_tester; | 236 base::HistogramTester histogram_tester; |
| 186 | 237 |
| 187 SyntheticWebTouchEvent kEvents[4]; | 238 SyntheticWebTouchEvent kEvents[4]; |
| 188 kEvents[0].PressPoint(10, 10); | 239 kEvents[0].PressPoint(10, 10); |
| 189 kEvents[1].PressPoint(10, 10); | 240 kEvents[1].PressPoint(10, 10); |
| 190 kEvents[1].setModifiers(1); | 241 kEvents[1].setModifiers(1); |
| 191 kEvents[1].MovePoint(0, 20, 20); | 242 kEvents[1].MovePoint(0, 20, 20); |
| 192 kEvents[2].PressPoint(10, 10); | 243 kEvents[2].PressPoint(10, 10); |
| 193 kEvents[2].MovePoint(0, 30, 30); | 244 kEvents[2].MovePoint(0, 30, 30); |
| 194 kEvents[3].PressPoint(10, 10); | 245 kEvents[3].PressPoint(10, 10); |
| 195 kEvents[3].MovePoint(0, 35, 35); | 246 kEvents[3].MovePoint(0, 35, 35); |
| 196 | 247 |
| 197 for (SyntheticWebTouchEvent& event : kEvents) | 248 for (SyntheticWebTouchEvent& event : kEvents) |
| 198 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 249 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 199 | 250 |
| 200 EXPECT_EQ(3u, event_queue().size()); | 251 EXPECT_EQ(3u, event_queue().size()); |
| 201 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 252 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 202 RunPendingTasksWithSimulatedRaf(); | 253 RunPendingTasksWithSimulatedRaf(); |
| 203 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 254 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 204 EXPECT_EQ(0u, event_queue().size()); | 255 EXPECT_EQ(0u, event_queue().size()); |
| 205 EXPECT_EQ(3u, handled_events_.size()); | 256 EXPECT_EQ(3u, handled_events_.size()); |
| 257 EXPECT_EQ(3u, handled_coalesced_events_.size()); | |
| 206 | 258 |
| 207 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size()); | 259 EXPECT_EQ(kEvents[0].size(), handled_events_.at(0)->size()); |
| 208 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type()); | 260 EXPECT_EQ(kEvents[0].type(), handled_events_.at(0)->type()); |
| 209 const WebTouchEvent* last_touch_event = | 261 const WebTouchEvent* last_touch_event = |
| 210 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); | 262 static_cast<const WebTouchEvent*>(handled_events_.at(0).get()); |
| 211 kEvents[0].dispatchType = | 263 kEvents[0].dispatchType = |
| 212 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 264 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 213 EXPECT_EQ(kEvents[0], *last_touch_event); | 265 EXPECT_EQ(kEvents[0], *last_touch_event); |
| 266 EXPECT_EQ(1u, handled_coalesced_events_[0].size()); | |
| 267 | |
| 268 { | |
| 269 EXPECT_EQ(1u, handled_coalesced_events_[0].size()); | |
| 270 const WebTouchEvent* coalesced_touch_event = | |
| 271 static_cast<const WebTouchEvent*>( | |
| 272 handled_coalesced_events_[0][0].get()); | |
| 273 EXPECT_EQ(kEvents[0], *coalesced_touch_event); | |
| 274 } | |
| 214 | 275 |
| 215 EXPECT_EQ(kEvents[1].size(), handled_events_.at(1)->size()); | 276 EXPECT_EQ(kEvents[1].size(), handled_events_.at(1)->size()); |
| 216 EXPECT_EQ(kEvents[1].type(), handled_events_.at(1)->type()); | 277 EXPECT_EQ(kEvents[1].type(), handled_events_.at(1)->type()); |
| 217 last_touch_event = | 278 last_touch_event = |
| 218 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); | 279 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
| 219 kEvents[1].dispatchType = | 280 kEvents[1].dispatchType = |
| 220 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 281 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 221 EXPECT_EQ(kEvents[1], *last_touch_event); | 282 EXPECT_EQ(kEvents[1], *last_touch_event); |
| 222 | 283 |
| 284 { | |
| 285 EXPECT_EQ(1u, handled_coalesced_events_[1].size()); | |
| 286 const WebTouchEvent* coalesced_touch_event = | |
| 287 static_cast<const WebTouchEvent*>( | |
| 288 handled_coalesced_events_[1][0].get()); | |
| 289 EXPECT_EQ(kEvents[1], *coalesced_touch_event); | |
| 290 } | |
| 291 | |
| 223 EXPECT_EQ(kEvents[2].size(), handled_events_.at(1)->size()); | 292 EXPECT_EQ(kEvents[2].size(), handled_events_.at(1)->size()); |
| 224 EXPECT_EQ(kEvents[2].type(), handled_events_.at(2)->type()); | 293 EXPECT_EQ(kEvents[2].type(), handled_events_.at(2)->type()); |
| 225 last_touch_event = | 294 last_touch_event = |
| 226 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); | 295 static_cast<const WebTouchEvent*>(handled_events_.at(2).get()); |
| 227 WebTouchEvent coalesced_event = kEvents[2]; | 296 WebTouchEvent coalesced_event = kEvents[2]; |
| 228 ui::Coalesce(kEvents[3], &coalesced_event); | 297 ui::Coalesce(kEvents[3], &coalesced_event); |
| 229 coalesced_event.dispatchType = | 298 coalesced_event.dispatchType = |
| 230 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 299 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 231 EXPECT_EQ(coalesced_event, *last_touch_event); | 300 EXPECT_EQ(coalesced_event, *last_touch_event); |
| 301 | |
| 302 { | |
| 303 EXPECT_EQ(2u, handled_coalesced_events_[2].size()); | |
| 304 WebTouchEvent coalesced_event = kEvents[2]; | |
| 305 const WebTouchEvent* coalesced_touch_event0 = | |
| 306 static_cast<const WebTouchEvent*>( | |
| 307 handled_coalesced_events_[2][0].get()); | |
| 308 coalesced_event.dispatchType = | |
| 309 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 310 EXPECT_EQ(coalesced_event, *coalesced_touch_event0); | |
| 311 | |
| 312 coalesced_event = kEvents[3]; | |
| 313 const WebTouchEvent* coalesced_touch_event1 = | |
| 314 static_cast<const WebTouchEvent*>( | |
| 315 handled_coalesced_events_[2][1].get()); | |
| 316 coalesced_event.dispatchType = | |
| 317 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 318 EXPECT_EQ(coalesced_event, *coalesced_touch_event1); | |
| 319 } | |
| 320 | |
| 232 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 0, 1); | 321 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 0, 1); |
| 233 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 1, 1); | 322 histogram_tester.ExpectBucketCount(kCoalescedCountHistogram, 1, 1); |
| 234 } | 323 } |
| 235 | 324 |
| 236 TEST_P(MainThreadEventQueueTest, BlockingTouch) { | 325 TEST_P(MainThreadEventQueueTest, BlockingTouch) { |
| 237 base::HistogramTester histogram_tester; | 326 base::HistogramTester histogram_tester; |
| 238 SyntheticWebTouchEvent kEvents[4]; | 327 SyntheticWebTouchEvent kEvents[4]; |
| 239 kEvents[0].PressPoint(10, 10); | 328 kEvents[0].PressPoint(10, 10); |
| 240 kEvents[1].PressPoint(10, 10); | 329 kEvents[1].PressPoint(10, 10); |
| 241 kEvents[1].MovePoint(0, 20, 20); | 330 kEvents[1].MovePoint(0, 20, 20); |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 620 | 709 |
| 621 // The boolean parameterized test varies whether rAF aligned input | 710 // The boolean parameterized test varies whether rAF aligned input |
| 622 // is enabled or not. | 711 // is enabled or not. |
| 623 INSTANTIATE_TEST_CASE_P( | 712 INSTANTIATE_TEST_CASE_P( |
| 624 MainThreadEventQueueTests, | 713 MainThreadEventQueueTests, |
| 625 MainThreadEventQueueTest, | 714 MainThreadEventQueueTest, |
| 626 testing::Range(0u, | 715 testing::Range(0u, |
| 627 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); | 716 (kRafAlignedEnabledTouch | kRafAlignedEnabledMouse) + 1)); |
| 628 | 717 |
| 629 } // namespace content | 718 } // namespace content |
| OLD | NEW |