Chromium Code Reviews| Index: content/renderer/input/main_thread_event_queue_unittest.cc |
| diff --git a/content/renderer/input/main_thread_event_queue_unittest.cc b/content/renderer/input/main_thread_event_queue_unittest.cc |
| index 9cf7b0227fc5a3bf5d3dbef7f394649001dca522..bf8b9fee19a7750143f475582a969d5749acf693 100644 |
| --- a/content/renderer/input/main_thread_event_queue_unittest.cc |
| +++ b/content/renderer/input/main_thread_event_queue_unittest.cc |
| @@ -9,6 +9,7 @@ |
| #include <vector> |
| #include "base/macros.h" |
| +#include "base/test/test_simple_task_runner.h" |
| #include "build/build_config.h" |
| #include "content/common/input/synthetic_web_input_event_builders.h" |
| #include "content/renderer/input/main_thread_event_queue.h" |
| @@ -28,16 +29,17 @@ const int kTestRoutingID = 13; |
| class MainThreadEventQueueTest : public testing::Test, |
| public MainThreadEventQueueClient { |
| public: |
| - MainThreadEventQueueTest() : queue_(kTestRoutingID, this) {} |
| + MainThreadEventQueueTest() |
| + : main_task_runner_(new base::TestSimpleTaskRunner()), |
| + queue_(kTestRoutingID, this, main_task_runner_) {} |
| - void SendEventToMainThread(int routing_id, |
| - const blink::WebInputEvent* event, |
| - const ui::LatencyInfo& latency, |
| - InputEventDispatchType type) override { |
| + void HandleEventOnMainThread(int routing_id, |
| + const blink::WebInputEvent* event, |
| + const ui::LatencyInfo& latency, |
| + InputEventDispatchType type) override { |
| ASSERT_EQ(kTestRoutingID, routing_id); |
| - const unsigned char* eventPtr = |
| - reinterpret_cast<const unsigned char*>(event); |
| - last_event_.assign(eventPtr, eventPtr + event->size); |
| + last_event_ = WebInputEventTraits::Clone(*event); |
| + queue_.EventHandled(event->type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| } |
| void SendInputEventAck(int routing_id, |
| @@ -54,8 +56,9 @@ class MainThreadEventQueueTest : public testing::Test, |
| bool eventPendingToMain() const { return queue_.sent_notification_to_main_; } |
| protected: |
| + scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
| MainThreadEventQueue queue_; |
| - std::vector<unsigned char> last_event_; |
| + ScopedWebInputEvent last_event_; |
| std::vector<uint32_t> additional_acked_events_; |
| }; |
| @@ -67,36 +70,50 @@ TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { |
| SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), |
| }; |
| - ASSERT_FALSE(eventPendingToMain()); |
| + 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.
|
| + ASSERT_EQ(0u, event_queue().size()); |
| queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| - ASSERT_TRUE(eventPendingToMain()); |
| queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| - ASSERT_EQ(kEvents[0].size, last_event_.size()); |
| - kEvents[0].dispatchType = |
| - WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| - ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); |
| - queue_.EventHandled(blink::WebInputEvent::MouseWheel, |
| - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - ASSERT_EQ(kEvents[1].size, last_event_.size()); |
| - kEvents[1].dispatchType = |
| - WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| - ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); |
| - ASSERT_TRUE(eventPendingToMain()); |
| - queue_.EventHandled(blink::WebInputEvent::MouseWheel, |
| - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - ASSERT_FALSE(eventPendingToMain()); |
| - |
| - // Ensure that coalescing takes place. |
| - queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| - INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| - ASSERT_EQ(1u, event_queue().size()); |
| - ASSERT_TRUE(eventPendingToMain()); |
| + ASSERT_EQ(2u, event_queue().size()); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + |
| + { |
| + ASSERT_EQ(kEvents[0].size, last_event_->size); |
| + ASSERT_EQ(kEvents[0].type, last_event_->type); |
| + const WebMouseWheelEvent* last_wheel_event = |
| + static_cast<const WebMouseWheelEvent*>(last_event_.get()); |
| + ASSERT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, |
| + last_wheel_event->dispatchType); |
| + WebMouseWheelEvent coalesced_event = kEvents[0]; |
| + internal::Coalesce(kEvents[1], &coalesced_event); |
| + coalesced_event.dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE( |
| + 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
|
| + } |
| + |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_FALSE(main_task_runner_->HasPendingTask()); |
| + ASSERT_EQ(0u, event_queue().size()); |
| + { |
| + const WebMouseWheelEvent* last_wheel_event = |
| + static_cast<const WebMouseWheelEvent*>(last_event_.get()); |
| + WebMouseWheelEvent coalesced_event = kEvents[2]; |
| + internal::Coalesce(kEvents[3], &coalesced_event); |
| + coalesced_event.dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE( |
| + memcmp(&coalesced_event, last_wheel_event, coalesced_event.size) == 0); |
| + } |
| } |
| TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { |
| @@ -109,37 +126,50 @@ TEST_F(MainThreadEventQueueTest, NonBlockingTouch) { |
| kEvents[2].MovePoint(0, 30, 30); |
| kEvents[3].PressPoint(10, 10); |
| kEvents[3].MovePoint(0, 35, 35); |
| - |
| - ASSERT_FALSE(eventPendingToMain()); |
| queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| - ASSERT_TRUE(eventPendingToMain()); |
| queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| - ASSERT_EQ(kEvents[0].size, last_event_.size()); |
| - kEvents[0].dispatchType = |
| - WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| - ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); |
| - queue_.EventHandled(blink::WebInputEvent::TouchStart, |
| - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - ASSERT_EQ(kEvents[1].size, last_event_.size()); |
| - kEvents[1].dispatchType = |
| - WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| - ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); |
| - ASSERT_TRUE(eventPendingToMain()); |
| - queue_.EventHandled(blink::WebInputEvent::TouchMove, |
| - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| - ASSERT_FALSE(eventPendingToMain()); |
| - |
| - // Ensure that coalescing takes place. |
| - queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| - INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| + |
| + ASSERT_EQ(3u, event_queue().size()); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + ASSERT_EQ(2u, event_queue().size()); |
| + |
| + ASSERT_EQ(kEvents[0].size, last_event_->size); |
| + kEvents[0].dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE(memcmp(&kEvents[0], last_event_.get(), kEvents[0].size) == 0); |
| + |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| ASSERT_EQ(1u, event_queue().size()); |
| - ASSERT_TRUE(eventPendingToMain()); |
| + |
| + ASSERT_EQ(kEvents[1].size, last_event_->size); |
| + kEvents[1].dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE(memcmp(&kEvents[1], last_event_.get(), kEvents[1].size) == 0); |
| + |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_FALSE(main_task_runner_->HasPendingTask()); |
| + ASSERT_EQ(0u, event_queue().size()); |
| + { |
| + ASSERT_EQ(kEvents[2].size, last_event_->size); |
| + ASSERT_EQ(kEvents[2].type, last_event_->type); |
| + const WebTouchEvent* last_touch_event = |
| + static_cast<const WebTouchEvent*>(last_event_.get()); |
| + WebTouchEvent coalesced_event = kEvents[2]; |
| + internal::Coalesce(kEvents[3], &coalesced_event); |
| + coalesced_event.dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE( |
| + memcmp(&coalesced_event, last_touch_event, coalesced_event.size) == 0); |
| + } |
| } |
| TEST_F(MainThreadEventQueueTest, BlockingTouch) { |
| @@ -151,8 +181,6 @@ TEST_F(MainThreadEventQueueTest, BlockingTouch) { |
| kEvents[2].MovePoint(0, 30, 30); |
| kEvents[3].PressPoint(10, 10); |
| kEvents[3].MovePoint(0, 35, 35); |
| - |
| - ASSERT_FALSE(eventPendingToMain()); |
| // Ensure that coalescing takes place. |
| queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| @@ -162,14 +190,79 @@ TEST_F(MainThreadEventQueueTest, BlockingTouch) { |
| INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, |
| INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| + ASSERT_EQ(2u, event_queue().size()); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| ASSERT_EQ(1u, event_queue().size()); |
| - ASSERT_TRUE(eventPendingToMain()); |
| - queue_.EventHandled(kEvents[0].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| + main_task_runner_->RunPendingTasks(); |
| ASSERT_EQ(0u, event_queue().size()); |
| - queue_.EventHandled(kEvents[1].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| ASSERT_EQ(2u, additional_acked_events_.size()); |
| ASSERT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0)); |
| ASSERT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1)); |
| } |
| +TEST_F(MainThreadEventQueueTest, InterleavedEvents) { |
| + WebMouseWheelEvent kWheelEvents[2] = { |
| + SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), |
| + SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), |
| + }; |
| + SyntheticWebTouchEvent kTouchEvents[2]; |
| + kTouchEvents[0].PressPoint(10, 10); |
| + kTouchEvents[0].MovePoint(0, 20, 20); |
| + kTouchEvents[1].PressPoint(10, 10); |
| + kTouchEvents[1].MovePoint(0, 30, 30); |
| + |
| + ASSERT_FALSE(main_task_runner_->HasPendingTask()); |
| + ASSERT_EQ(0u, event_queue().size()); |
| + queue_.HandleEvent(&kWheelEvents[0], ui::LatencyInfo(), |
| + DISPATCH_TYPE_BLOCKING, |
| + INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| + queue_.HandleEvent(&kTouchEvents[0], ui::LatencyInfo(), |
| + DISPATCH_TYPE_BLOCKING, |
| + INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| + queue_.HandleEvent(&kWheelEvents[1], ui::LatencyInfo(), |
| + DISPATCH_TYPE_BLOCKING, |
| + INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| + queue_.HandleEvent(&kTouchEvents[1], ui::LatencyInfo(), |
| + DISPATCH_TYPE_BLOCKING, |
| + INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); |
| + ASSERT_EQ(2u, event_queue().size()); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + |
| + { |
| + ASSERT_EQ(kWheelEvents[0].size, last_event_->size); |
| + ASSERT_EQ(kWheelEvents[0].type, last_event_->type); |
| + const WebMouseWheelEvent* last_wheel_event = |
| + static_cast<const WebMouseWheelEvent*>(last_event_.get()); |
| + ASSERT_EQ(WebInputEvent::DispatchType::ListenersNonBlockingPassive, |
| + last_wheel_event->dispatchType); |
| + WebMouseWheelEvent coalesced_event = kWheelEvents[0]; |
| + internal::Coalesce(kWheelEvents[1], &coalesced_event); |
| + coalesced_event.dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE( |
| + memcmp(&coalesced_event, last_wheel_event, coalesced_event.size) == 0); |
| + } |
| + |
| + ASSERT_TRUE(main_task_runner_->HasPendingTask()); |
| + main_task_runner_->RunPendingTasks(); |
| + ASSERT_FALSE(main_task_runner_->HasPendingTask()); |
| + ASSERT_EQ(0u, event_queue().size()); |
| + { |
| + ASSERT_EQ(kTouchEvents[0].size, last_event_->size); |
| + ASSERT_EQ(kTouchEvents[0].type, last_event_->type); |
| + const WebTouchEvent* last_touch_event = |
| + static_cast<const WebTouchEvent*>(last_event_.get()); |
| + WebTouchEvent coalesced_event = kTouchEvents[0]; |
| + internal::Coalesce(kTouchEvents[1], &coalesced_event); |
| + coalesced_event.dispatchType = |
| + WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + ASSERT_TRUE( |
| + memcmp(&coalesced_event, last_touch_event, coalesced_event.size) == 0); |
| + } |
| +} |
| + |
| } // namespace content |