| 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 29 matching lines...) Expand all Loading... |
| 40 last_event_.assign(eventPtr, eventPtr + event->size); | 40 last_event_.assign(eventPtr, eventPtr + event->size); |
| 41 } | 41 } |
| 42 | 42 |
| 43 void SendInputEventAck(int routing_id, | 43 void SendInputEventAck(int routing_id, |
| 44 blink::WebInputEvent::Type type, | 44 blink::WebInputEvent::Type type, |
| 45 InputEventAckState ack_result, | 45 InputEventAckState ack_result, |
| 46 uint32_t touch_event_id) override { | 46 uint32_t touch_event_id) override { |
| 47 additional_acked_events_.push_back(touch_event_id); | 47 additional_acked_events_.push_back(touch_event_id); |
| 48 } | 48 } |
| 49 | 49 |
| 50 WebInputEventQueue<PendingMouseWheelEvent>& wheel_event_queue() { | 50 WebInputEventQueue<EventWithDispatchType>& event_queue() { |
| 51 return queue_.wheel_events_; | 51 return queue_.events_; |
| 52 } | 52 } |
| 53 | 53 |
| 54 WebInputEventQueue<PendingTouchEvent>& touch_event_queue() { | 54 bool eventPendingToMain() const { return queue_.sent_notification_to_main_; } |
| 55 return queue_.touch_events_; | |
| 56 } | |
| 57 | 55 |
| 58 protected: | 56 protected: |
| 59 MainThreadEventQueue queue_; | 57 MainThreadEventQueue queue_; |
| 60 std::vector<unsigned char> last_event_; | 58 std::vector<unsigned char> last_event_; |
| 61 std::vector<uint32_t> additional_acked_events_; | 59 std::vector<uint32_t> additional_acked_events_; |
| 62 }; | 60 }; |
| 63 | 61 |
| 64 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { | 62 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { |
| 65 WebMouseWheelEvent kEvents[4] = { | 63 WebMouseWheelEvent kEvents[4] = { |
| 66 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 64 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 67 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 65 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| 68 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 66 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 69 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), | 67 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 70 }; | 68 }; |
| 71 | 69 |
| 72 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, | 70 ASSERT_FALSE(eventPendingToMain()); |
| 73 wheel_event_queue().state()); | |
| 74 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 71 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 75 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 72 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 76 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state()); | 73 ASSERT_TRUE(eventPendingToMain()); |
| 77 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 74 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 78 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 75 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 79 ASSERT_EQ(kEvents[0].size, last_event_.size()); | 76 ASSERT_EQ(kEvents[0].size, last_event_.size()); |
| 80 kEvents[0].dispatchType = | 77 kEvents[0].dispatchType = |
| 81 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 78 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 82 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); | 79 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); |
| 83 queue_.EventHandled(blink::WebInputEvent::MouseWheel, | 80 queue_.EventHandled(blink::WebInputEvent::MouseWheel, |
| 84 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 81 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 85 ASSERT_EQ(kEvents[1].size, last_event_.size()); | 82 ASSERT_EQ(kEvents[1].size, last_event_.size()); |
| 86 kEvents[1].dispatchType = | 83 kEvents[1].dispatchType = |
| 87 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 84 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 88 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); | 85 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); |
| 89 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state()); | 86 ASSERT_TRUE(eventPendingToMain()); |
| 90 queue_.EventHandled(blink::WebInputEvent::MouseWheel, | 87 queue_.EventHandled(blink::WebInputEvent::MouseWheel, |
| 91 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 88 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 92 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, | 89 ASSERT_FALSE(eventPendingToMain()); |
| 93 wheel_event_queue().state()); | |
| 94 | 90 |
| 95 // Ensure that coalescing takes place. | 91 // Ensure that coalescing takes place. |
| 96 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 92 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 97 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 93 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 98 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 94 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 99 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 95 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 100 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 96 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 101 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 97 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 102 ASSERT_EQ(1u, wheel_event_queue().size()); | 98 ASSERT_EQ(1u, event_queue().size()); |
| 103 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state()); | 99 ASSERT_TRUE(eventPendingToMain()); |
| 104 } | 100 } |
| 105 | 101 |
| 106 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { | 102 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { |
| 107 SyntheticWebTouchEvent kEvents[4]; | 103 SyntheticWebTouchEvent kEvents[4]; |
| 108 kEvents[0].PressPoint(10, 10); | 104 kEvents[0].PressPoint(10, 10); |
| 109 kEvents[1].PressPoint(10, 10); | 105 kEvents[1].PressPoint(10, 10); |
| 110 kEvents[1].modifiers = 1; | 106 kEvents[1].modifiers = 1; |
| 111 kEvents[1].MovePoint(0, 20, 20); | 107 kEvents[1].MovePoint(0, 20, 20); |
| 112 kEvents[2].PressPoint(10, 10); | 108 kEvents[2].PressPoint(10, 10); |
| 113 kEvents[2].MovePoint(0, 30, 30); | 109 kEvents[2].MovePoint(0, 30, 30); |
| 114 kEvents[3].PressPoint(10, 10); | 110 kEvents[3].PressPoint(10, 10); |
| 115 kEvents[3].MovePoint(0, 35, 35); | 111 kEvents[3].MovePoint(0, 35, 35); |
| 116 | 112 |
| 117 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, | 113 ASSERT_FALSE(eventPendingToMain()); |
| 118 touch_event_queue().state()); | |
| 119 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 114 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 120 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 115 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 121 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); | 116 ASSERT_TRUE(eventPendingToMain()); |
| 122 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 117 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 123 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 118 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 124 ASSERT_EQ(kEvents[0].size, last_event_.size()); | 119 ASSERT_EQ(kEvents[0].size, last_event_.size()); |
| 125 kEvents[0].dispatchType = | 120 kEvents[0].dispatchType = |
| 126 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 121 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 127 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); | 122 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); |
| 128 queue_.EventHandled(blink::WebInputEvent::TouchStart, | 123 queue_.EventHandled(blink::WebInputEvent::TouchStart, |
| 129 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 124 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 130 ASSERT_EQ(kEvents[1].size, last_event_.size()); | 125 ASSERT_EQ(kEvents[1].size, last_event_.size()); |
| 131 kEvents[1].dispatchType = | 126 kEvents[1].dispatchType = |
| 132 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | 127 WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| 133 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); | 128 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); |
| 134 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); | 129 ASSERT_TRUE(eventPendingToMain()); |
| 135 queue_.EventHandled(blink::WebInputEvent::TouchMove, | 130 queue_.EventHandled(blink::WebInputEvent::TouchMove, |
| 136 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 131 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 137 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, | 132 ASSERT_FALSE(eventPendingToMain()); |
| 138 touch_event_queue().state()); | |
| 139 | 133 |
| 140 // Ensure that coalescing takes place. | 134 // Ensure that coalescing takes place. |
| 141 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 135 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 142 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 136 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 143 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 137 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 144 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 138 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 145 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 139 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 146 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 140 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 147 ASSERT_EQ(1u, touch_event_queue().size()); | 141 ASSERT_EQ(1u, event_queue().size()); |
| 148 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); | 142 ASSERT_TRUE(eventPendingToMain()); |
| 149 } | 143 } |
| 150 | 144 |
| 151 TEST_F(MainThreadEventQueueTest, BlockingTouch) { | 145 TEST_F(MainThreadEventQueueTest, BlockingTouch) { |
| 152 SyntheticWebTouchEvent kEvents[4]; | 146 SyntheticWebTouchEvent kEvents[4]; |
| 153 kEvents[0].PressPoint(10, 10); | 147 kEvents[0].PressPoint(10, 10); |
| 154 kEvents[1].PressPoint(10, 10); | 148 kEvents[1].PressPoint(10, 10); |
| 155 kEvents[1].MovePoint(0, 20, 20); | 149 kEvents[1].MovePoint(0, 20, 20); |
| 156 kEvents[2].PressPoint(10, 10); | 150 kEvents[2].PressPoint(10, 10); |
| 157 kEvents[2].MovePoint(0, 30, 30); | 151 kEvents[2].MovePoint(0, 30, 30); |
| 158 kEvents[3].PressPoint(10, 10); | 152 kEvents[3].PressPoint(10, 10); |
| 159 kEvents[3].MovePoint(0, 35, 35); | 153 kEvents[3].MovePoint(0, 35, 35); |
| 160 | 154 |
| 161 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, | 155 ASSERT_FALSE(eventPendingToMain()); |
| 162 touch_event_queue().state()); | |
| 163 // Ensure that coalescing takes place. | 156 // Ensure that coalescing takes place. |
| 164 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 157 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 165 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 158 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 166 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 159 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 167 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 160 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 168 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 161 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 169 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 162 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 170 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 163 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 171 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 164 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 172 ASSERT_EQ(1u, touch_event_queue().size()); | 165 ASSERT_EQ(1u, event_queue().size()); |
| 173 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); | 166 ASSERT_TRUE(eventPendingToMain()); |
| 174 queue_.EventHandled(kEvents[0].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 167 queue_.EventHandled(kEvents[0].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 175 ASSERT_EQ(0u, touch_event_queue().size()); | 168 ASSERT_EQ(0u, event_queue().size()); |
| 176 queue_.EventHandled(kEvents[1].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 169 queue_.EventHandled(kEvents[1].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 177 ASSERT_EQ(2u, additional_acked_events_.size()); | 170 ASSERT_EQ(2u, additional_acked_events_.size()); |
| 178 ASSERT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); | 171 ASSERT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); |
| 179 ASSERT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); | 172 ASSERT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); |
| 180 } | 173 } |
| 181 | 174 |
| 182 } // namespace content | 175 } // namespace content |
| OLD | NEW |