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 |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "base/test/test_simple_task_runner.h" | |
| 12 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 13 #include "content/common/input/synthetic_web_input_event_builders.h" | 14 #include "content/common/input/synthetic_web_input_event_builders.h" |
| 14 #include "content/renderer/input/main_thread_event_queue.h" | 15 #include "content/renderer/input/main_thread_event_queue.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 17 |
| 17 using blink::WebInputEvent; | 18 using blink::WebInputEvent; |
| 18 using blink::WebMouseEvent; | 19 using blink::WebMouseEvent; |
| 19 using blink::WebMouseWheelEvent; | 20 using blink::WebMouseWheelEvent; |
| 20 using blink::WebTouchEvent; | 21 using blink::WebTouchEvent; |
| 21 | 22 |
| 22 namespace content { | 23 namespace content { |
| 23 namespace { | 24 namespace { |
| 24 | 25 |
| 25 const int kTestRoutingID = 13; | 26 const int kTestRoutingID = 13; |
| 26 } | 27 } |
| 27 | 28 |
| 28 class MainThreadEventQueueTest : public testing::Test, | 29 class MainThreadEventQueueTest : public testing::Test, |
| 29 public MainThreadEventQueueClient { | 30 public MainThreadEventQueueClient { |
| 30 public: | 31 public: |
| 31 MainThreadEventQueueTest() : queue_(kTestRoutingID, this) {} | 32 MainThreadEventQueueTest() |
| 33 : main_task_runner_(new base::TestSimpleTaskRunner()), | |
| 34 queue_(kTestRoutingID, this, main_task_runner_) {} | |
| 32 | 35 |
| 33 void SendEventToMainThread(int routing_id, | 36 void HandleEventOnMainThread(int routing_id, |
| 34 const blink::WebInputEvent* event, | 37 const blink::WebInputEvent* event, |
| 35 const ui::LatencyInfo& latency, | 38 const ui::LatencyInfo& latency, |
| 36 InputEventDispatchType type) override { | 39 InputEventDispatchType type) override { |
| 37 ASSERT_EQ(kTestRoutingID, routing_id); | 40 ASSERT_EQ(kTestRoutingID, routing_id); |
| 38 const unsigned char* eventPtr = | 41 last_event_ = WebInputEventTraits::Clone(*event); |
| 39 reinterpret_cast<const unsigned char*>(event); | 42 queue_.EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 40 last_event_.assign(eventPtr, eventPtr + event->size); | |
| 41 } | 43 } |
| 42 | 44 |
| 43 void SendInputEventAck(int routing_id, | 45 void SendInputEventAck(int routing_id, |
| 44 blink::WebInputEvent::Type type, | 46 blink::WebInputEvent::Type type, |
| 45 InputEventAckState ack_result, | 47 InputEventAckState ack_result, |
| 46 uint32_t touch_event_id) override { | 48 uint32_t touch_event_id) override { |
| 47 additional_acked_events_.push_back(touch_event_id); | 49 additional_acked_events_.push_back(touch_event_id); |
| 48 } | 50 } |
| 49 | 51 |
| 50 WebInputEventQueue<EventWithDispatchType>& event_queue() { | 52 WebInputEventQueue<EventWithDispatchType>& event_queue() { |
| 51 return queue_.events_; | 53 return queue_.events_; |
| 52 } | 54 } |
| 53 | 55 |
| 54 bool eventPendingToMain() const { return queue_.sent_notification_to_main_; } | 56 bool eventPendingToMain() const { return queue_.sent_notification_to_main_; } |
| 55 | 57 |
| 56 protected: | 58 protected: |
| 59 scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; | |
| 57 MainThreadEventQueue queue_; | 60 MainThreadEventQueue queue_; |
| 58 std::vector<unsigned char> last_event_; | 61 ScopedWebInputEvent last_event_; |
| 59 std::vector<uint32_t> additional_acked_events_; | 62 std::vector<uint32_t> additional_acked_events_; |
| 60 }; | 63 }; |
| 61 | 64 |
| 62 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { | 65 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { |
| 63 WebMouseWheelEvent kEvents[4] = { | 66 WebMouseWheelEvent kEvents[4] = { |
| 64 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | 67 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| 65 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | 68 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, 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 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| 68 }; | 71 }; |
| 69 | 72 |
| 70 ASSERT_FALSE(eventPendingToMain()); | 73 ASSERT_FALSE(main_task_runner_->HasPendingTask()); |
|
tdresser
2016/07/27 13:51:51
Why are we using ASSERT instead of EXPECT througho
dtapuska
2016/08/03 20:20:54
Done.
| |
| 74 ASSERT_EQ(0u, event_queue().size()); | |
| 71 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 75 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 72 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 76 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 73 ASSERT_TRUE(eventPendingToMain()); | |
| 74 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 77 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 75 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 78 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 76 ASSERT_EQ(kEvents[0].size, last_event_.size()); | |
| 77 kEvents[0].dispatchType = | |
| 78 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 79 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); | |
| 80 queue_.EventHandled(blink::WebInputEvent::MouseWheel, | |
| 81 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 82 ASSERT_EQ(kEvents[1].size, last_event_.size()); | |
| 83 kEvents[1].dispatchType = | |
| 84 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 85 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); | |
| 86 ASSERT_TRUE(eventPendingToMain()); | |
| 87 queue_.EventHandled(blink::WebInputEvent::MouseWheel, | |
| 88 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 89 ASSERT_FALSE(eventPendingToMain()); | |
| 90 | |
| 91 // Ensure that coalescing takes place. | |
| 92 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 93 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 94 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 79 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 95 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 80 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 96 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 81 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 97 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 82 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 98 ASSERT_EQ(1u, event_queue().size()); | 83 ASSERT_EQ(2u, event_queue().size()); |
| 99 ASSERT_TRUE(eventPendingToMain()); | 84 ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| 85 main_task_runner_->RunPendingTasks(); | |
| 86 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 87 | |
| 88 { | |
| 89 ASSERT_EQ(kEvents[0].size, last_event_->size); | |
| 90 ASSERT_EQ(kEvents[0].type, last_event_->type); | |
| 91 const WebMouseWheelEvent* last_wheel_event = | |
| 92 static_cast<const WebMouseWheelEvent*>(last_event_.get()); | |
| 93 ASSERT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, | |
| 94 last_wheel_event->dispatchType); | |
| 95 WebMouseWheelEvent coalesced_event = kEvents[0]; | |
| 96 internal::Coalesce(kEvents[1], &coalesced_event); | |
| 97 coalesced_event.dispatchType = | |
| 98 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 99 ASSERT_TRUE( | |
| 100 memcmp(&coalesced_event, last_wheel_event, coalesced_event.size) == 0); | |
|
tdresser
2016/07/27 13:51:51
Do we not have a usable equality check? We could d
dtapuska
2016/08/03 20:20:54
Done
| |
| 101 } | |
| 102 | |
| 103 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 104 main_task_runner_->RunPendingTasks(); | |
| 105 ASSERT_FALSE(main_task_runner_->HasPendingTask()); | |
| 106 ASSERT_EQ(0u, event_queue().size()); | |
| 107 { | |
| 108 const WebMouseWheelEvent* last_wheel_event = | |
| 109 static_cast<const WebMouseWheelEvent*>(last_event_.get()); | |
| 110 WebMouseWheelEvent coalesced_event = kEvents[2]; | |
| 111 internal::Coalesce(kEvents[3], &coalesced_event); | |
| 112 coalesced_event.dispatchType = | |
| 113 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 114 ASSERT_TRUE( | |
| 115 memcmp(&coalesced_event, last_wheel_event, coalesced_event.size) == 0); | |
| 116 } | |
| 100 } | 117 } |
| 101 | 118 |
| 102 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { | 119 TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { |
| 103 SyntheticWebTouchEvent kEvents[4]; | 120 SyntheticWebTouchEvent kEvents[4]; |
| 104 kEvents[0].PressPoint(10, 10); | 121 kEvents[0].PressPoint(10, 10); |
| 105 kEvents[1].PressPoint(10, 10); | 122 kEvents[1].PressPoint(10, 10); |
| 106 kEvents[1].modifiers = 1; | 123 kEvents[1].modifiers = 1; |
| 107 kEvents[1].MovePoint(0, 20, 20); | 124 kEvents[1].MovePoint(0, 20, 20); |
| 108 kEvents[2].PressPoint(10, 10); | 125 kEvents[2].PressPoint(10, 10); |
| 109 kEvents[2].MovePoint(0, 30, 30); | 126 kEvents[2].MovePoint(0, 30, 30); |
| 110 kEvents[3].PressPoint(10, 10); | 127 kEvents[3].PressPoint(10, 10); |
| 111 kEvents[3].MovePoint(0, 35, 35); | 128 kEvents[3].MovePoint(0, 35, 35); |
| 112 | |
| 113 ASSERT_FALSE(eventPendingToMain()); | |
| 114 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 129 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 115 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 130 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 116 ASSERT_TRUE(eventPendingToMain()); | |
| 117 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 131 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 118 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 132 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 119 ASSERT_EQ(kEvents[0].size, last_event_.size()); | |
| 120 kEvents[0].dispatchType = | |
| 121 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 122 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); | |
| 123 queue_.EventHandled(blink::WebInputEvent::TouchStart, | |
| 124 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 125 ASSERT_EQ(kEvents[1].size, last_event_.size()); | |
| 126 kEvents[1].dispatchType = | |
| 127 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 128 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); | |
| 129 ASSERT_TRUE(eventPendingToMain()); | |
| 130 queue_.EventHandled(blink::WebInputEvent::TouchMove, | |
| 131 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 132 ASSERT_FALSE(eventPendingToMain()); | |
| 133 | |
| 134 // Ensure that coalescing takes place. | |
| 135 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | |
| 136 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 137 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 133 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 138 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 134 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 139 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 135 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 140 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 136 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 137 | |
| 138 ASSERT_EQ(3u, event_queue().size()); | |
| 139 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 140 main_task_runner_->RunPendingTasks(); | |
| 141 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 142 ASSERT_EQ(2u, event_queue().size()); | |
| 143 | |
| 144 ASSERT_EQ(kEvents[0].size, last_event_->size); | |
| 145 kEvents[0].dispatchType = | |
| 146 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 147 ASSERT_TRUE(memcmp(&kEvents[0], last_event_.get(), kEvents[0].size) == 0); | |
| 148 | |
| 149 main_task_runner_->RunPendingTasks(); | |
| 150 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 141 ASSERT_EQ(1u, event_queue().size()); | 151 ASSERT_EQ(1u, event_queue().size()); |
| 142 ASSERT_TRUE(eventPendingToMain()); | 152 |
| 153 ASSERT_EQ(kEvents[1].size, last_event_->size); | |
| 154 kEvents[1].dispatchType = | |
| 155 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 156 ASSERT_TRUE(memcmp(&kEvents[1], last_event_.get(), kEvents[1].size) == 0); | |
| 157 | |
| 158 main_task_runner_->RunPendingTasks(); | |
| 159 ASSERT_FALSE(main_task_runner_->HasPendingTask()); | |
| 160 ASSERT_EQ(0u, event_queue().size()); | |
| 161 { | |
| 162 ASSERT_EQ(kEvents[2].size, last_event_->size); | |
| 163 ASSERT_EQ(kEvents[2].type, last_event_->type); | |
| 164 const WebTouchEvent* last_touch_event = | |
| 165 static_cast<const WebTouchEvent*>(last_event_.get()); | |
| 166 WebTouchEvent coalesced_event = kEvents[2]; | |
| 167 internal::Coalesce(kEvents[3], &coalesced_event); | |
| 168 coalesced_event.dispatchType = | |
| 169 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 170 ASSERT_TRUE( | |
| 171 memcmp(&coalesced_event, last_touch_event, coalesced_event.size) == 0); | |
| 172 } | |
| 143 } | 173 } |
| 144 | 174 |
| 145 TEST_F(MainThreadEventQueueTest, BlockingTouch) { | 175 TEST_F(MainThreadEventQueueTest, BlockingTouch) { |
| 146 SyntheticWebTouchEvent kEvents[4]; | 176 SyntheticWebTouchEvent kEvents[4]; |
| 147 kEvents[0].PressPoint(10, 10); | 177 kEvents[0].PressPoint(10, 10); |
| 148 kEvents[1].PressPoint(10, 10); | 178 kEvents[1].PressPoint(10, 10); |
| 149 kEvents[1].MovePoint(0, 20, 20); | 179 kEvents[1].MovePoint(0, 20, 20); |
| 150 kEvents[2].PressPoint(10, 10); | 180 kEvents[2].PressPoint(10, 10); |
| 151 kEvents[2].MovePoint(0, 30, 30); | 181 kEvents[2].MovePoint(0, 30, 30); |
| 152 kEvents[3].PressPoint(10, 10); | 182 kEvents[3].PressPoint(10, 10); |
| 153 kEvents[3].MovePoint(0, 35, 35); | 183 kEvents[3].MovePoint(0, 35, 35); |
| 154 | |
| 155 ASSERT_FALSE(eventPendingToMain()); | |
| 156 // Ensure that coalescing takes place. | 184 // Ensure that coalescing takes place. |
| 157 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 185 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 158 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | 186 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| 159 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 187 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 160 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 188 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 161 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 189 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 162 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 190 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 163 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, | 191 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| 164 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 192 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 193 ASSERT_EQ(2u, event_queue().size()); | |
| 194 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 195 main_task_runner_->RunPendingTasks(); | |
| 196 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 165 ASSERT_EQ(1u, event_queue().size()); | 197 ASSERT_EQ(1u, event_queue().size()); |
| 166 ASSERT_TRUE(eventPendingToMain()); | 198 main_task_runner_->RunPendingTasks(); |
| 167 queue_.EventHandled(kEvents[0].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 168 ASSERT_EQ(0u, event_queue().size()); | 199 ASSERT_EQ(0u, event_queue().size()); |
| 169 queue_.EventHandled(kEvents[1].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | |
| 170 ASSERT_EQ(2u, additional_acked_events_.size()); | 200 ASSERT_EQ(2u, additional_acked_events_.size()); |
| 171 ASSERT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); | 201 ASSERT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); |
| 172 ASSERT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); | 202 ASSERT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); |
| 173 } | 203 } |
| 174 | 204 |
| 205 TEST_F(MainThreadEventQueueTest, InterleavedEvents) { | |
| 206 WebMouseWheelEvent kWheelEvents[2] = { | |
| 207 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), | |
| 208 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), | |
| 209 }; | |
| 210 SyntheticWebTouchEvent kTouchEvents[2]; | |
| 211 kTouchEvents[0].PressPoint(10, 10); | |
| 212 kTouchEvents[0].MovePoint(0, 20, 20); | |
| 213 kTouchEvents[1].PressPoint(10, 10); | |
| 214 kTouchEvents[1].MovePoint(0, 30, 30); | |
| 215 | |
| 216 ASSERT_FALSE(main_task_runner_->HasPendingTask()); | |
| 217 ASSERT_EQ(0u, event_queue().size()); | |
| 218 queue_.HandleEvent(&kWheelEvents[0], ui::LatencyInfo(), | |
| 219 DISPATCH_TYPE_BLOCKING, | |
| 220 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 221 queue_.HandleEvent(&kTouchEvents[0], ui::LatencyInfo(), | |
| 222 DISPATCH_TYPE_BLOCKING, | |
| 223 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); | |
| 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 ASSERT_EQ(2u, event_queue().size()); | |
| 231 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 232 main_task_runner_->RunPendingTasks(); | |
| 233 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 234 | |
| 235 { | |
| 236 ASSERT_EQ(kWheelEvents[0].size, last_event_->size); | |
| 237 ASSERT_EQ(kWheelEvents[0].type, last_event_->type); | |
| 238 const WebMouseWheelEvent* last_wheel_event = | |
| 239 static_cast<const WebMouseWheelEvent*>(last_event_.get()); | |
| 240 ASSERT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, | |
| 241 last_wheel_event->dispatchType); | |
| 242 WebMouseWheelEvent coalesced_event = kWheelEvents[0]; | |
| 243 internal::Coalesce(kWheelEvents[1], &coalesced_event); | |
| 244 coalesced_event.dispatchType = | |
| 245 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 246 ASSERT_TRUE( | |
| 247 memcmp(&coalesced_event, last_wheel_event, coalesced_event.size) == 0); | |
| 248 } | |
| 249 | |
| 250 ASSERT_TRUE(main_task_runner_->HasPendingTask()); | |
| 251 main_task_runner_->RunPendingTasks(); | |
| 252 ASSERT_FALSE(main_task_runner_->HasPendingTask()); | |
| 253 ASSERT_EQ(0u, event_queue().size()); | |
| 254 { | |
| 255 ASSERT_EQ(kTouchEvents[0].size, last_event_->size); | |
| 256 ASSERT_EQ(kTouchEvents[0].type, last_event_->type); | |
| 257 const WebTouchEvent* last_touch_event = | |
| 258 static_cast<const WebTouchEvent*>(last_event_.get()); | |
| 259 WebTouchEvent coalesced_event = kTouchEvents[0]; | |
| 260 internal::Coalesce(kTouchEvents[1], &coalesced_event); | |
| 261 coalesced_event.dispatchType = | |
| 262 WebInputEvent::DispatchType::ListenersNonBlockingPassive; | |
| 263 ASSERT_TRUE( | |
| 264 memcmp(&coalesced_event, last_touch_event, coalesced_event.size) == 0); | |
| 265 } | |
| 266 } | |
| 267 | |
| 175 } // namespace content | 268 } // namespace content |
| OLD | NEW |