Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(686)

Side by Side Diff: content/renderer/input/main_thread_event_queue_unittest.cc

Issue 2094323002: Ensure acks are sent for all blocking events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix nits Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 22 matching lines...) Expand all
33 void SendEventToMainThread(int routing_id, 33 void SendEventToMainThread(int routing_id,
34 const blink::WebInputEvent* event, 34 const blink::WebInputEvent* event,
35 const ui::LatencyInfo& latency, 35 const ui::LatencyInfo& latency,
36 InputEventDispatchType type) override { 36 InputEventDispatchType type) override {
37 ASSERT_EQ(kTestRoutingID, routing_id); 37 ASSERT_EQ(kTestRoutingID, routing_id);
38 const unsigned char* eventPtr = 38 const unsigned char* eventPtr =
39 reinterpret_cast<const unsigned char*>(event); 39 reinterpret_cast<const unsigned char*>(event);
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,
44 blink::WebInputEvent::Type type,
45 InputEventAckState ack_result,
46 uint32_t touch_event_id) override {
47 additional_acked_events_.push_back(touch_event_id);
48 }
49
43 WebInputEventQueue<PendingMouseWheelEvent>& wheel_event_queue() { 50 WebInputEventQueue<PendingMouseWheelEvent>& wheel_event_queue() {
44 return queue_.wheel_events_; 51 return queue_.wheel_events_;
45 } 52 }
46 53
47 WebInputEventQueue<PendingTouchEvent>& touch_event_queue() { 54 WebInputEventQueue<PendingTouchEvent>& touch_event_queue() {
48 return queue_.touch_events_; 55 return queue_.touch_events_;
49 } 56 }
50 57
51 protected: 58 protected:
52 MainThreadEventQueue queue_; 59 MainThreadEventQueue queue_;
53 std::vector<unsigned char> last_event_; 60 std::vector<unsigned char> last_event_;
61 std::vector<uint32_t> additional_acked_events_;
54 }; 62 };
55 63
56 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) { 64 TEST_F(MainThreadEventQueueTest, NonBlockingWheel) {
57 WebMouseWheelEvent kEvents[4] = { 65 WebMouseWheelEvent kEvents[4] = {
58 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false), 66 SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, 53, 0, false),
59 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false), 67 SyntheticWebMouseWheelEventBuilder::Build(20, 20, 0, 53, 0, false),
60 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 68 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
61 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false), 69 SyntheticWebMouseWheelEventBuilder::Build(30, 30, 0, 53, 1, false),
62 }; 70 };
63 71
64 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, 72 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING,
65 wheel_event_queue().state()); 73 wheel_event_queue().state());
66 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 74 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
67 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 75 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
68 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state()); 76 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state());
69 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 77 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
70 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 78 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
71 ASSERT_EQ(kEvents[0].size, last_event_.size()); 79 ASSERT_EQ(kEvents[0].size, last_event_.size());
72 kEvents[0].dispatchType = 80 kEvents[0].dispatchType =
73 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 81 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
74 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); 82 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0);
75 queue_.EventHandled(blink::WebInputEvent::MouseWheel); 83 queue_.EventHandled(blink::WebInputEvent::MouseWheel,
84 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
76 ASSERT_EQ(kEvents[1].size, last_event_.size()); 85 ASSERT_EQ(kEvents[1].size, last_event_.size());
77 kEvents[1].dispatchType = 86 kEvents[1].dispatchType =
78 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 87 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
79 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); 88 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0);
80 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state()); 89 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, wheel_event_queue().state());
81 queue_.EventHandled(blink::WebInputEvent::MouseWheel); 90 queue_.EventHandled(blink::WebInputEvent::MouseWheel,
91 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
82 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, 92 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING,
83 wheel_event_queue().state()); 93 wheel_event_queue().state());
84 94
85 // Ensure that coalescing takes place. 95 // Ensure that coalescing takes place.
86 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 96 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
87 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 97 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
88 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 98 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
89 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 99 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
90 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 100 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
91 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 101 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
(...skipping 16 matching lines...) Expand all
108 touch_event_queue().state()); 118 touch_event_queue().state());
109 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 119 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
110 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 120 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
111 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); 121 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state());
112 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 122 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
113 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 123 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
114 ASSERT_EQ(kEvents[0].size, last_event_.size()); 124 ASSERT_EQ(kEvents[0].size, last_event_.size());
115 kEvents[0].dispatchType = 125 kEvents[0].dispatchType =
116 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 126 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
117 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0); 127 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[0], kEvents[0].size) == 0);
118 queue_.EventHandled(blink::WebInputEvent::TouchStart); 128 queue_.EventHandled(blink::WebInputEvent::TouchStart,
129 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
119 ASSERT_EQ(kEvents[1].size, last_event_.size()); 130 ASSERT_EQ(kEvents[1].size, last_event_.size());
120 kEvents[1].dispatchType = 131 kEvents[1].dispatchType =
121 WebInputEvent::DispatchType::ListenersNonBlockingPassive; 132 WebInputEvent::DispatchType::ListenersNonBlockingPassive;
122 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0); 133 ASSERT_TRUE(memcmp(&last_event_[0], &kEvents[1], kEvents[1].size) == 0);
123 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); 134 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state());
124 queue_.EventHandled(blink::WebInputEvent::TouchMove); 135 queue_.EventHandled(blink::WebInputEvent::TouchMove,
136 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
125 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING, 137 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING,
126 touch_event_queue().state()); 138 touch_event_queue().state());
127 139
128 // Ensure that coalescing takes place. 140 // Ensure that coalescing takes place.
129 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 141 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
130 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 142 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
131 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 143 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
132 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 144 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
133 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING, 145 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
134 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); 146 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
135 ASSERT_EQ(1u, touch_event_queue().size()); 147 ASSERT_EQ(1u, touch_event_queue().size());
136 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state()); 148 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state());
137 } 149 }
138 150
151 TEST_F(MainThreadEventQueueTest, BlockingTouch) {
152 SyntheticWebTouchEvent kEvents[4];
153 kEvents[0].PressPoint(10, 10);
154 kEvents[1].PressPoint(10, 10);
155 kEvents[1].MovePoint(0, 20, 20);
156 kEvents[2].PressPoint(10, 10);
157 kEvents[2].MovePoint(0, 30, 30);
158 kEvents[3].PressPoint(10, 10);
159 kEvents[3].MovePoint(0, 35, 35);
160
161 ASSERT_EQ(WebInputEventQueueState::ITEM_NOT_PENDING,
162 touch_event_queue().state());
163 // Ensure that coalescing takes place.
164 queue_.HandleEvent(&kEvents[0], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
165 INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING);
166 queue_.HandleEvent(&kEvents[1], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
167 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
168 queue_.HandleEvent(&kEvents[2], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
169 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
170 queue_.HandleEvent(&kEvents[3], ui::LatencyInfo(), DISPATCH_TYPE_BLOCKING,
171 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
172 ASSERT_EQ(1u, touch_event_queue().size());
173 ASSERT_EQ(WebInputEventQueueState::ITEM_PENDING, touch_event_queue().state());
174 queue_.EventHandled(kEvents[0].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
175 ASSERT_EQ(0u, touch_event_queue().size());
176 queue_.EventHandled(kEvents[1].type, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
177 ASSERT_EQ(2u, additional_acked_events_.size());
178 ASSERT_EQ(kEvents[2].uniqueTouchEventId, additional_acked_events_.at(0));
179 ASSERT_EQ(kEvents[3].uniqueTouchEventId, additional_acked_events_.at(1));
180 }
181
139 } // namespace content 182 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698