| 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 "content/browser/renderer_host/input/mouse_wheel_event_queue.h" | 5 #include "content/browser/renderer_host/input/mouse_wheel_event_queue.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 ~MouseWheelEventQueueTest() override {} | 44 ~MouseWheelEventQueueTest() override {} |
| 45 | 45 |
| 46 // MouseWheelEventQueueClient | 46 // MouseWheelEventQueueClient |
| 47 void SendMouseWheelEventImmediately( | 47 void SendMouseWheelEventImmediately( |
| 48 const MouseWheelEventWithLatencyInfo& event) override { | 48 const MouseWheelEventWithLatencyInfo& event) override { |
| 49 sent_events_.push_back(event.event); | 49 sent_events_.push_back(event.event); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void SendGestureEvent(const GestureEventWithLatencyInfo& event) override { | 52 void SendGestureEvent(const GestureEventWithLatencyInfo& event) override { |
| 53 sent_events_.push_back(event.event); | 53 sent_events_.push_back(event.event); |
| 54 sent_gesture_events_.push_back(event.event); |
| 54 } | 55 } |
| 55 | 56 |
| 56 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, | 57 void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event, |
| 57 InputEventAckState ack_result) override { | 58 InputEventAckState ack_result) override { |
| 58 ++acked_event_count_; | 59 ++acked_event_count_; |
| 59 last_acked_event_ = event.event; | 60 last_acked_event_ = event.event; |
| 60 last_acked_event_state_ = ack_result; | 61 last_acked_event_state_ = ack_result; |
| 61 } | 62 } |
| 62 | 63 |
| 63 protected: | 64 protected: |
| 64 void SetUpForGestureTesting(bool send_gestures) { | 65 void SetUpForGestureTesting(bool send_gestures) { |
| 65 queue_.reset( | 66 queue_.reset( |
| 66 new MouseWheelEventQueue(this, send_gestures, kScrollEndTimeoutMs)); | 67 new MouseWheelEventQueue(this, send_gestures, kScrollEndTimeoutMs)); |
| 67 } | 68 } |
| 68 | 69 |
| 69 size_t queued_event_count() const { return queue_->queued_size(); } | 70 size_t queued_event_count() const { return queue_->queued_size(); } |
| 70 | 71 |
| 71 bool event_in_flight() const { return queue_->event_in_flight(); } | 72 bool event_in_flight() const { return queue_->event_in_flight(); } |
| 72 | 73 |
| 73 std::vector<WebInputEvent>& all_sent_events() { return sent_events_; } | 74 std::vector<WebInputEvent>& all_sent_events() { return sent_events_; } |
| 74 | 75 |
| 76 std::vector<WebGestureEvent>& sent_gesture_events() { |
| 77 return sent_gesture_events_; |
| 78 } |
| 79 |
| 75 const WebMouseWheelEvent& acked_event() const { return last_acked_event_; } | 80 const WebMouseWheelEvent& acked_event() const { return last_acked_event_; } |
| 76 | 81 |
| 77 size_t GetAndResetSentEventCount() { | 82 size_t GetAndResetSentEventCount() { |
| 78 size_t count = sent_events_.size(); | 83 size_t count = sent_events_.size(); |
| 79 sent_events_.clear(); | 84 sent_events_.clear(); |
| 85 sent_gesture_events_.clear(); |
| 80 return count; | 86 return count; |
| 81 } | 87 } |
| 82 | 88 |
| 83 size_t GetAndResetAckedEventCount() { | 89 size_t GetAndResetAckedEventCount() { |
| 84 size_t count = acked_event_count_; | 90 size_t count = acked_event_count_; |
| 85 acked_event_count_ = 0; | 91 acked_event_count_ = 0; |
| 86 return count; | 92 return count; |
| 87 } | 93 } |
| 88 | 94 |
| 89 void SendMouseWheelEventAck(InputEventAckState ack_result) { | 95 void SendMouseWheelEventAck(InputEventAckState ack_result) { |
| 90 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo()); | 96 queue_->ProcessMouseWheelAck(ack_result, ui::LatencyInfo()); |
| 91 } | 97 } |
| 92 | 98 |
| 93 void SendMouseWheel(float x, float y, float dX, float dY, int modifiers) { | 99 void SendMouseWheel(float x, |
| 100 float y, |
| 101 float dX, |
| 102 float dY, |
| 103 int modifiers, |
| 104 bool high_precision) { |
| 94 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( | 105 queue_->QueueEvent(MouseWheelEventWithLatencyInfo( |
| 95 SyntheticWebMouseWheelEventBuilder::Build(x, y, dX, dY, modifiers, | 106 SyntheticWebMouseWheelEventBuilder::Build(x, y, dX, dY, modifiers, |
| 96 false))); | 107 high_precision))); |
| 97 } | 108 } |
| 98 | 109 |
| 99 void SendGestureEvent(WebInputEvent::Type type) { | 110 void SendGestureEvent(WebInputEvent::Type type) { |
| 100 WebGestureEvent event; | 111 WebGestureEvent event; |
| 101 event.type = type; | 112 event.type = type; |
| 102 event.sourceDevice = blink::WebGestureDeviceTouchscreen; | 113 event.sourceDevice = blink::WebGestureDeviceTouchscreen; |
| 103 queue_->OnGestureScrollEvent( | 114 queue_->OnGestureScrollEvent( |
| 104 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); | 115 GestureEventWithLatencyInfo(event, ui::LatencyInfo())); |
| 105 } | 116 } |
| 106 | 117 |
| 107 static void RunTasksAndWait(base::TimeDelta delay) { | 118 static void RunTasksAndWait(base::TimeDelta delay) { |
| 108 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 119 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 109 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); | 120 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), delay); |
| 110 base::MessageLoop::current()->Run(); | 121 base::MessageLoop::current()->Run(); |
| 111 } | 122 } |
| 112 | 123 |
| 124 void GestureSendingTest(bool high_precision) { |
| 125 const WebGestureEvent::ScrollUnits scroll_units = |
| 126 high_precision ? WebGestureEvent::PrecisePixels |
| 127 : WebGestureEvent::Pixels; |
| 128 SendMouseWheel(10, 10, 1, 1, 0, high_precision); |
| 129 EXPECT_EQ(0U, queued_event_count()); |
| 130 EXPECT_TRUE(event_in_flight()); |
| 131 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 132 |
| 133 // The second mouse wheel should not be sent since one is already in queue. |
| 134 SendMouseWheel(10, 10, 5, 5, 0, high_precision); |
| 135 EXPECT_EQ(1U, queued_event_count()); |
| 136 EXPECT_TRUE(event_in_flight()); |
| 137 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 138 |
| 139 // Receive an ACK for the mouse wheel event and release the next |
| 140 // mouse wheel event. |
| 141 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 142 EXPECT_EQ(0U, queued_event_count()); |
| 143 EXPECT_TRUE(event_in_flight()); |
| 144 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
| 145 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 146 EXPECT_EQ(3U, all_sent_events().size()); |
| 147 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
| 148 EXPECT_EQ(scroll_units, |
| 149 sent_gesture_events()[0].data.scrollBegin.deltaHintUnits); |
| 150 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
| 151 EXPECT_EQ(scroll_units, |
| 152 sent_gesture_events()[1].data.scrollUpdate.deltaUnits); |
| 153 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type); |
| 154 EXPECT_EQ(3U, GetAndResetSentEventCount()); |
| 155 |
| 156 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); |
| 157 EXPECT_EQ(1U, all_sent_events().size()); |
| 158 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
| 159 EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits); |
| 160 } |
| 161 |
| 113 scoped_ptr<MouseWheelEventQueue> queue_; | 162 scoped_ptr<MouseWheelEventQueue> queue_; |
| 114 std::vector<WebInputEvent> sent_events_; | 163 std::vector<WebInputEvent> sent_events_; |
| 164 std::vector<WebGestureEvent> sent_gesture_events_; |
| 115 size_t acked_event_count_; | 165 size_t acked_event_count_; |
| 116 InputEventAckState last_acked_event_state_; | 166 InputEventAckState last_acked_event_state_; |
| 117 base::MessageLoopForUI message_loop_; | 167 base::MessageLoopForUI message_loop_; |
| 118 WebMouseWheelEvent last_acked_event_; | 168 WebMouseWheelEvent last_acked_event_; |
| 119 }; | 169 }; |
| 120 | 170 |
| 121 // Tests that mouse wheel events are queued properly. | 171 // Tests that mouse wheel events are queued properly. |
| 122 TEST_F(MouseWheelEventQueueTest, Basic) { | 172 TEST_F(MouseWheelEventQueueTest, Basic) { |
| 123 SendMouseWheel(10, 10, 1, 1, 0); | 173 SendMouseWheel(10, 10, 1, 1, 0, false); |
| 124 EXPECT_EQ(0U, queued_event_count()); | 174 EXPECT_EQ(0U, queued_event_count()); |
| 125 EXPECT_TRUE(event_in_flight()); | 175 EXPECT_TRUE(event_in_flight()); |
| 126 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 176 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 127 | 177 |
| 128 // The second mouse wheel should not be sent since one is already in queue. | 178 // The second mouse wheel should not be sent since one is already in queue. |
| 129 SendMouseWheel(10, 10, 5, 5, 0); | 179 SendMouseWheel(10, 10, 5, 5, 0, false); |
| 130 EXPECT_EQ(1U, queued_event_count()); | 180 EXPECT_EQ(1U, queued_event_count()); |
| 131 EXPECT_TRUE(event_in_flight()); | 181 EXPECT_TRUE(event_in_flight()); |
| 132 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 182 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 133 | 183 |
| 134 // Receive an ACK for the first mouse wheel event. | 184 // Receive an ACK for the first mouse wheel event. |
| 135 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 185 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 136 EXPECT_EQ(0U, queued_event_count()); | 186 EXPECT_EQ(0U, queued_event_count()); |
| 137 EXPECT_TRUE(event_in_flight()); | 187 EXPECT_TRUE(event_in_flight()); |
| 138 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 188 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 139 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 189 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 140 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 190 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
| 141 | 191 |
| 142 // Receive an ACK for the second mouse wheel event. | 192 // Receive an ACK for the second mouse wheel event. |
| 143 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 193 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 144 EXPECT_EQ(0U, queued_event_count()); | 194 EXPECT_EQ(0U, queued_event_count()); |
| 145 EXPECT_FALSE(event_in_flight()); | 195 EXPECT_FALSE(event_in_flight()); |
| 146 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 196 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 147 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 197 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 148 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 198 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
| 149 } | 199 } |
| 150 | 200 |
| 151 TEST_F(MouseWheelEventQueueTest, GestureSending) { | 201 TEST_F(MouseWheelEventQueueTest, GestureSending) { |
| 152 SetUpForGestureTesting(true); | 202 SetUpForGestureTesting(true); |
| 153 SendMouseWheel(10, 10, 1, 1, 0); | 203 GestureSendingTest(false); |
| 154 EXPECT_EQ(0U, queued_event_count()); | 204 } |
| 155 EXPECT_TRUE(event_in_flight()); | |
| 156 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
| 157 | 205 |
| 158 // The second mouse wheel should not be sent since one is already in queue. | 206 TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) { |
| 159 SendMouseWheel(10, 10, 5, 5, 0); | 207 SetUpForGestureTesting(true); |
| 160 EXPECT_EQ(1U, queued_event_count()); | 208 GestureSendingTest(false); |
| 161 EXPECT_TRUE(event_in_flight()); | |
| 162 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
| 163 | |
| 164 // Receive an ACK for the mouse wheel event and release the next | |
| 165 // mouse wheel event. | |
| 166 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 167 EXPECT_EQ(0U, queued_event_count()); | |
| 168 EXPECT_TRUE(event_in_flight()); | |
| 169 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | |
| 170 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
| 171 EXPECT_EQ(3U, all_sent_events().size()); | |
| 172 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | |
| 173 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | |
| 174 EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type); | |
| 175 EXPECT_EQ(3U, GetAndResetSentEventCount()); | |
| 176 | |
| 177 RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2); | |
| 178 EXPECT_EQ(1U, all_sent_events().size()); | |
| 179 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); | |
| 180 } | 209 } |
| 181 | 210 |
| 182 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { | 211 TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) { |
| 183 SetUpForGestureTesting(true); | 212 SetUpForGestureTesting(true); |
| 184 SendMouseWheel(10, 10, 1, 1, 0); | 213 SendMouseWheel(10, 10, 1, 1, 0, false); |
| 185 EXPECT_EQ(0U, queued_event_count()); | 214 EXPECT_EQ(0U, queued_event_count()); |
| 186 EXPECT_TRUE(event_in_flight()); | 215 EXPECT_TRUE(event_in_flight()); |
| 187 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 216 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 188 | 217 |
| 189 // Receive an ACK for the mouse wheel event. | 218 // Receive an ACK for the mouse wheel event. |
| 190 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 219 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 191 EXPECT_EQ(0U, queued_event_count()); | 220 EXPECT_EQ(0U, queued_event_count()); |
| 192 EXPECT_FALSE(event_in_flight()); | 221 EXPECT_FALSE(event_in_flight()); |
| 193 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 222 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
| 194 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 223 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 195 EXPECT_EQ(2U, all_sent_events().size()); | 224 EXPECT_EQ(2U, all_sent_events().size()); |
| 196 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | 225 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
| 197 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | 226 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
| 198 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 227 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 199 | 228 |
| 200 // Ensure that a gesture scroll begin terminates the current scroll event. | 229 // Ensure that a gesture scroll begin terminates the current scroll event. |
| 201 SendGestureEvent(WebInputEvent::GestureScrollBegin); | 230 SendGestureEvent(WebInputEvent::GestureScrollBegin); |
| 202 EXPECT_EQ(1U, all_sent_events().size()); | 231 EXPECT_EQ(1U, all_sent_events().size()); |
| 203 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); | 232 EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type); |
| 204 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 233 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 205 | 234 |
| 206 SendMouseWheel(10, 10, 1, 1, 0); | 235 SendMouseWheel(10, 10, 1, 1, 0, false); |
| 207 EXPECT_EQ(0U, queued_event_count()); | 236 EXPECT_EQ(0U, queued_event_count()); |
| 208 EXPECT_TRUE(event_in_flight()); | 237 EXPECT_TRUE(event_in_flight()); |
| 209 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 238 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 210 | 239 |
| 211 // New mouse wheel events won't cause gestures because a scroll | 240 // New mouse wheel events won't cause gestures because a scroll |
| 212 // is already in progress by another device. | 241 // is already in progress by another device. |
| 213 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 242 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 214 EXPECT_EQ(0U, queued_event_count()); | 243 EXPECT_EQ(0U, queued_event_count()); |
| 215 EXPECT_FALSE(event_in_flight()); | 244 EXPECT_FALSE(event_in_flight()); |
| 216 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 245 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
| 217 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 246 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 218 EXPECT_EQ(0U, all_sent_events().size()); | 247 EXPECT_EQ(0U, all_sent_events().size()); |
| 219 | 248 |
| 220 SendGestureEvent(WebInputEvent::GestureScrollEnd); | 249 SendGestureEvent(WebInputEvent::GestureScrollEnd); |
| 221 EXPECT_EQ(0U, all_sent_events().size()); | 250 EXPECT_EQ(0U, all_sent_events().size()); |
| 222 | 251 |
| 223 SendMouseWheel(10, 10, 1, 1, 0); | 252 SendMouseWheel(10, 10, 1, 1, 0, false); |
| 224 EXPECT_EQ(0U, queued_event_count()); | 253 EXPECT_EQ(0U, queued_event_count()); |
| 225 EXPECT_TRUE(event_in_flight()); | 254 EXPECT_TRUE(event_in_flight()); |
| 226 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 255 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 227 | 256 |
| 228 // Receive an ACK for the mouse wheel event. | 257 // Receive an ACK for the mouse wheel event. |
| 229 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 258 SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 230 EXPECT_EQ(0U, queued_event_count()); | 259 EXPECT_EQ(0U, queued_event_count()); |
| 231 EXPECT_FALSE(event_in_flight()); | 260 EXPECT_FALSE(event_in_flight()); |
| 232 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); | 261 EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type); |
| 233 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 262 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 234 EXPECT_EQ(2U, all_sent_events().size()); | 263 EXPECT_EQ(2U, all_sent_events().size()); |
| 235 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); | 264 EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type); |
| 236 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); | 265 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type); |
| 237 EXPECT_EQ(2U, GetAndResetSentEventCount()); | 266 EXPECT_EQ(2U, GetAndResetSentEventCount()); |
| 238 } | 267 } |
| 239 | 268 |
| 240 } // namespace content | 269 } // namespace content |
| OLD | NEW |