| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 queue_->EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 54 queue_->EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 55 } | 55 } |
| 56 | 56 |
| 57 void SendInputEventAck(int routing_id, | 57 void SendInputEventAck(int routing_id, |
| 58 blink::WebInputEvent::Type type, | 58 blink::WebInputEvent::Type type, |
| 59 InputEventAckState ack_result, | 59 InputEventAckState ack_result, |
| 60 uint32_t touch_event_id) override { | 60 uint32_t touch_event_id) override { |
| 61 additional_acked_events_.push_back(touch_event_id); | 61 additional_acked_events_.push_back(touch_event_id); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void HandleEvent(WebInputEvent& event, InputEventAckState ack_result) { |
| 65 queue_->HandleEvent(WebInputEventTraits::Clone(event), ui::LatencyInfo(), |
| 66 DISPATCH_TYPE_BLOCKING, |
| 67 ack_result); |
| 68 } |
| 69 |
| 64 WebInputEventQueue<EventWithDispatchType>& event_queue() { | 70 WebInputEventQueue<EventWithDispatchType>& event_queue() { |
| 65 return queue_->events_; | 71 return queue_->events_; |
| 66 } | 72 } |
| 67 | 73 |
| 68 protected: | 74 protected: |
| 69 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; | 75 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
| 70 scoped_refptr<MainThreadEventQueue> queue_; | 76 scoped_refptr<MainThreadEventQueue> queue_; |
| 71 std::vector<ScopedWebInputEvent> handled_events_; | 77 std::vector<ScopedWebInputEvent> handled_events_; |
| 72 std::vector<uint32_t> additional_acked_events_; | 78 std::vector<uint32_t> additional_acked_events_; |
| 73 }; | 79 }; |
| 74 | 80 |
| 75 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { | 81 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { |
| 76 WebMouseWheelEvent kEvents[4] = { | 82 WebMouseWheelEvent kEvents[4] = { |
| 77 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 83 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 78 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 84 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| 79 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 85 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 80 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 86 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 81 }; | 87 }; |
| 82 | 88 |
| 83 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 89 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 84 EXPECT_EQ(0u, event_queue().size()); | 90 EXPECT_EQ(0u, event_queue().size()); |
| 85 queue_->HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 91 |
| 86 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 92 for (WebMouseWheelEvent& event : kEvents) |
| 87 queue_->HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 93 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 88 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 94 |
| 89 queue_->HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 90 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 91 queue_->HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 92 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 93 EXPECT_EQ(2u, event_queue().size()); | 95 EXPECT_EQ(2u, event_queue().size()); |
| 94 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 96 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 95 main_task_runner_->RunUntilIdle(); | 97 main_task_runner_->RunUntilIdle(); |
| 96 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 98 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 97 EXPECT_EQ(0u, event_queue().size()); | 99 EXPECT_EQ(0u, event_queue().size()); |
| 98 EXPECT_EQ(2u, handled_events_.size()); | 100 EXPECT_EQ(2u, handled_events_.size()); |
| 99 | 101 |
| 100 { | 102 { |
| 101 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); | 103 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); |
| 102 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); | 104 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 125 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { | 127 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { |
| 126 SyntheticWebTouchEvent kEvents[4]; | 128 SyntheticWebTouchEvent kEvents[4]; |
| 127 kEvents[0].PressPoint(10, 10); | 129 kEvents[0].PressPoint(10, 10); |
| 128 kEvents[1].PressPoint(10, 10); | 130 kEvents[1].PressPoint(10, 10); |
| 129 kEvents[1].modifiers = 1; | 131 kEvents[1].modifiers = 1; |
| 130 kEvents[1].MovePoint(0, 20, 20); | 132 kEvents[1].MovePoint(0, 20, 20); |
| 131 kEvents[2].PressPoint(10, 10); | 133 kEvents[2].PressPoint(10, 10); |
| 132 kEvents[2].MovePoint(0, 30, 30); | 134 kEvents[2].MovePoint(0, 30, 30); |
| 133 kEvents[3].PressPoint(10, 10); | 135 kEvents[3].PressPoint(10, 10); |
| 134 kEvents[3].MovePoint(0, 35, 35); | 136 kEvents[3].MovePoint(0, 35, 35); |
| 135 queue_->HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 137 |
| 136 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 138 for (SyntheticWebTouchEvent& event : kEvents) |
| 137 queue_->HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 139 HandleEvent(event, INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 138 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 139 queue_->HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 140 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 141 queue_->HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 142 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 143 | 140 |
| 144 EXPECT_EQ(3u, event_queue().size()); | 141 EXPECT_EQ(3u, event_queue().size()); |
| 145 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 142 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 146 main_task_runner_->RunUntilIdle(); | 143 main_task_runner_->RunUntilIdle(); |
| 147 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 144 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 148 EXPECT_EQ(0u, event_queue().size()); | 145 EXPECT_EQ(0u, event_queue().size()); |
| 149 EXPECT_EQ(3u, handled_events_.size()); | 146 EXPECT_EQ(3u, handled_events_.size()); |
| 150 | 147 |
| 151 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); | 148 EXPECT_EQ(kEvents[0].size, handled_events_.at(0)->size); |
| 152 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); | 149 EXPECT_EQ(kEvents[0].type, handled_events_.at(0)->type); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 178 TEST_F(MainThreadEventQueueTest, BlockingTouch) { | 175 TEST_F(MainThreadEventQueueTest, BlockingTouch) { |
| 179 SyntheticWebTouchEvent kEvents[4]; | 176 SyntheticWebTouchEvent kEvents[4]; |
| 180 kEvents[0].PressPoint(10, 10); | 177 kEvents[0].PressPoint(10, 10); |
| 181 kEvents[1].PressPoint(10, 10); | 178 kEvents[1].PressPoint(10, 10); |
| 182 kEvents[1].MovePoint(0, 20, 20); | 179 kEvents[1].MovePoint(0, 20, 20); |
| 183 kEvents[2].PressPoint(10, 10); | 180 kEvents[2].PressPoint(10, 10); |
| 184 kEvents[2].MovePoint(0, 30, 30); | 181 kEvents[2].MovePoint(0, 30, 30); |
| 185 kEvents[3].PressPoint(10, 10); | 182 kEvents[3].PressPoint(10, 10); |
| 186 kEvents[3].MovePoint(0, 35, 35); | 183 kEvents[3].MovePoint(0, 35, 35); |
| 187 // Ensure that coalescing takes place. | 184 // Ensure that coalescing takes place. |
| 188 queue_->HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 185 HandleEvent(kEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 189 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 186 HandleEvent(kEvents[1], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 190 queue_->HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 187 HandleEvent(kEvents[2], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 191 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 188 HandleEvent(kEvents[3], INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 192 queue_->HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 189 |
| 193 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 194 queue_->HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 195 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 196 EXPECT_EQ(2u, event_queue().size()); | 190 EXPECT_EQ(2u, event_queue().size()); |
| 197 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 191 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 198 main_task_runner_->RunUntilIdle(); | 192 main_task_runner_->RunUntilIdle(); |
| 199 EXPECT_EQ(0u, event_queue().size()); | 193 EXPECT_EQ(0u, event_queue().size()); |
| 200 EXPECT_EQ(2u, additional_acked_events_.size()); | 194 EXPECT_EQ(2u, additional_acked_events_.size()); |
| 201 EXPECT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); | 195 EXPECT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); |
| 202 EXPECT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); | 196 EXPECT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); |
| 203 } | 197 } |
| 204 | 198 |
| 205 TEST_F(MainThreadEventQueueTest, InterleavedEvents) { | 199 TEST_F(MainThreadEventQueueTest, InterleavedEvents) { |
| 206 WebMouseWheelEvent kWheelEvents[2] = { | 200 WebMouseWheelEvent kWheelEvents[2] = { |
| 207 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 201 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 208 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 202 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| 209 }; | 203 }; |
| 210 SyntheticWebTouchEvent kTouchEvents[2]; | 204 SyntheticWebTouchEvent kTouchEvents[2]; |
| 211 kTouchEvents[0].PressPoint(10, 10); | 205 kTouchEvents[0].PressPoint(10, 10); |
| 212 kTouchEvents[0].MovePoint(0, 20, 20); | 206 kTouchEvents[0].MovePoint(0, 20, 20); |
| 213 kTouchEvents[1].PressPoint(10, 10); | 207 kTouchEvents[1].PressPoint(10, 10); |
| 214 kTouchEvents[1].MovePoint(0, 30, 30); | 208 kTouchEvents[1].MovePoint(0, 30, 30); |
| 215 | 209 |
| 216 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 210 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 217 EXPECT_EQ(0u, event_queue().size()); | 211 EXPECT_EQ(0u, event_queue().size()); |
| 218 queue_->HandleEvent(&kWheelEvents[0], ui::LatencyInfo(), | 212 |
| 219 DISPATCH_TYPE_BLOCKING, | 213 HandleEvent(kWheelEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 220 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 214 HandleEvent(kTouchEvents[0], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 221 queue_->HandleEvent(&kTouchEvents[0], ui::LatencyInfo(), | 215 HandleEvent(kWheelEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 222 DISPATCH_TYPE_BLOCKING, | 216 HandleEvent(kTouchEvents[1], INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 223 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 217 |
| 224 queue_->HandleEvent(&kWheelEvents[1], ui::LatencyInfo(), | |
| 225 DISPATCH_TYPE_BLOCKING, | |
| 226 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 227 queue_->HandleEvent(&kTouchEvents[1], ui::LatencyInfo(), | |
| 228 DISPATCH_TYPE_BLOCKING, | |
| 229 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 230 EXPECT_EQ(2u, event_queue().size()); | 218 EXPECT_EQ(2u, event_queue().size()); |
| 231 EXPECT_TRUE(main_task_runner_->HasPendingTask()); | 219 EXPECT_TRUE(main_task_runner_->HasPendingTask()); |
| 232 main_task_runner_->RunUntilIdle(); | 220 main_task_runner_->RunUntilIdle(); |
| 233 EXPECT_FALSE(main_task_runner_->HasPendingTask()); | 221 EXPECT_FALSE(main_task_runner_->HasPendingTask()); |
| 234 EXPECT_EQ(0u, event_queue().size()); | 222 EXPECT_EQ(0u, event_queue().size()); |
| 235 EXPECT_EQ(2u, handled_events_.size()); | 223 EXPECT_EQ(2u, handled_events_.size()); |
| 236 { | 224 { |
| 237 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size); | 225 EXPECT_EQ(kWheelEvents[0].size, handled_events_.at(0)->size); |
| 238 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type); | 226 EXPECT_EQ(kWheelEvents[0].type, handled_events_.at(0)->type); |
| 239 const WebMouseWheelEvent* last_wheel_event = | 227 const WebMouseWheelEvent* last_wheel_event = |
| (...skipping 13 matching lines...) Expand all Loading... |
| 253 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); | 241 static_cast<const WebTouchEvent*>(handled_events_.at(1).get()); |
| 254 WebTouchEvent coalesced_event = kTouchEvents[0]; | 242 WebTouchEvent coalesced_event = kTouchEvents[0]; |
| 255 internal::Coalesce(kTouchEvents[1], &coalesced_event); | 243 internal::Coalesce(kTouchEvents[1], &coalesced_event); |
| 256 coalesced_event.dispatchType = | 244 coalesced_event.dispatchType = |
| 257 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 245 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 258 EXPECT_EQ(coalesced_event, *last_touch_event); | 246 EXPECT_EQ(coalesced_event, *last_touch_event); |
| 259 } | 247 } |
| 260 } | 248 } |
| 261 | 249 |
| 262 } // namespace content | 250 } // namespace content |
| OLD | NEW |