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

Unified Diff: content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc

Issue 1749343004: Implement Wheel Gesture Scrolling on OSX. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ensure only high precision scroll begins are used Created 4 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
diff --git a/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc b/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
index f9e10a901301818fb9270dc1fc3056c222353374..f14b6e6e2aabb6a2e6c1ed38a9b74a04ec81151f 100644
--- a/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
+++ b/content/browser/renderer_host/input/mouse_wheel_event_queue_unittest.cc
@@ -34,6 +34,81 @@ base::TimeDelta DefaultScrollEndTimeoutDelay() {
return base::TimeDelta::FromMilliseconds(kScrollEndTimeoutMs);
}
+#define EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event) \
+ EXPECT_EQ(WebInputEvent::GestureScrollBegin, event->type); \
+ EXPECT_EQ(kWheelScrollX, event->x); \
+ EXPECT_EQ(kWheelScrollY, event->y); \
+ EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \
+ EXPECT_EQ(kWheelScrollGlobalY, event->globalY); \
+ EXPECT_EQ(scroll_units, event->data.scrollBegin.deltaHintUnits);
+
+#define EXPECT_GESTURE_SCROLL_BEGIN(event) \
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \
+ EXPECT_FALSE(event->data.scrollBegin.synthetic); \
+ EXPECT_FALSE(event->data.scrollBegin.inertial);
+
+#define EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(event) \
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \
+ EXPECT_TRUE(event->data.scrollBegin.synthetic); \
+ EXPECT_FALSE(event->data.scrollBegin.inertial);
+
+#define EXPECT_INERTIAL_GESTURE_SCROLL_BEGIN(event) \
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \
+ EXPECT_FALSE(event->data.scrollBegin.synthetic); \
+ EXPECT_TRUE(event->data.scrollBegin.inertial);
+
+#define EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_BEGIN(event) \
+ EXPECT_GESTURE_SCROLL_BEGIN_IMPL(event); \
+ EXPECT_TRUE(event->data.scrollBegin.synthetic); \
+ EXPECT_TRUE(event->data.scrollBegin.inertial);
+
+#define EXPECT_GESTURE_SCROLL_UPDATE_IMPL(event) \
+ EXPECT_EQ(WebInputEvent::GestureScrollUpdate, event->type); \
+ EXPECT_EQ(scroll_units, event->data.scrollUpdate.deltaUnits); \
+ EXPECT_EQ(kWheelScrollX, event->x); \
+ EXPECT_EQ(kWheelScrollY, event->y); \
+ EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \
+ EXPECT_EQ(kWheelScrollGlobalY, event->globalY);
+
+#define EXPECT_GESTURE_SCROLL_UPDATE(event) \
+ EXPECT_GESTURE_SCROLL_UPDATE_IMPL(event); \
+ EXPECT_FALSE(event->data.scrollUpdate.inertial);
+
+#define EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(event) \
+ EXPECT_GESTURE_SCROLL_UPDATE_IMPL(event); \
+ EXPECT_TRUE(event->data.scrollUpdate.inertial);
+
+#define EXPECT_GESTURE_SCROLL_END_IMPL(event) \
+ EXPECT_EQ(WebInputEvent::GestureScrollEnd, event->type); \
+ EXPECT_EQ(scroll_units, event->data.scrollEnd.deltaUnits); \
+ EXPECT_EQ(kWheelScrollX, event->x); \
+ EXPECT_EQ(kWheelScrollY, event->y); \
+ EXPECT_EQ(kWheelScrollGlobalX, event->globalX); \
+ EXPECT_EQ(kWheelScrollGlobalY, event->globalY);
+
+#define EXPECT_GESTURE_SCROLL_END(event) \
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \
+ EXPECT_FALSE(event->data.scrollEnd.synthetic); \
+ EXPECT_FALSE(event->data.scrollEnd.inertial);
+
+#define EXPECT_SYNTHETIC_GESTURE_SCROLL_END(event) \
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \
+ EXPECT_TRUE(event->data.scrollEnd.synthetic); \
+ EXPECT_FALSE(event->data.scrollEnd.inertial);
+
+#define EXPECT_INERTIAL_GESTURE_SCROLL_END(event) \
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \
+ EXPECT_FALSE(event->data.scrollEnd.synthetic); \
+ EXPECT_TRUE(event->data.scrollEnd.inertial);
+
+#define EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(event) \
+ EXPECT_GESTURE_SCROLL_END_IMPL(event); \
+ EXPECT_TRUE(event->data.scrollEnd.synthetic); \
+ EXPECT_TRUE(event->data.scrollEnd.inertial);
+
+#define EXPECT_MOUSE_WHEEL(event) \
+ EXPECT_EQ(WebInputEvent::MouseWheel, event->type);
+
} // namespace
class MouseWheelEventQueueTest : public testing::Test,
@@ -50,12 +125,17 @@ class MouseWheelEventQueueTest : public testing::Test,
// MouseWheelEventQueueClient
void SendMouseWheelEventImmediately(
const MouseWheelEventWithLatencyInfo& event) override {
- sent_events_.push_back(event.event);
+ WebMouseWheelEvent* cloned_event = new WebMouseWheelEvent();
+ scoped_ptr<WebInputEvent> cloned_event_holder(cloned_event);
+ *cloned_event = event.event;
+ sent_events_.push_back(std::move(cloned_event_holder));
}
void SendGestureEvent(const GestureEventWithLatencyInfo& event) override {
- sent_events_.push_back(event.event);
- sent_gesture_events_.push_back(event.event);
+ WebGestureEvent* cloned_event = new WebGestureEvent();
+ scoped_ptr<WebInputEvent> cloned_event_holder(cloned_event);
+ *cloned_event = event.event;
+ sent_events_.push_back(std::move(cloned_event_holder));
}
void OnMouseWheelEventAck(const MouseWheelEventWithLatencyInfo& event,
@@ -75,10 +155,15 @@ class MouseWheelEventQueueTest : public testing::Test,
bool event_in_flight() const { return queue_->event_in_flight(); }
- std::vector<WebInputEvent>& all_sent_events() { return sent_events_; }
+ std::vector<scoped_ptr<WebInputEvent>>& all_sent_events() {
+ return sent_events_;
+ }
- std::vector<WebGestureEvent>& sent_gesture_events() {
- return sent_gesture_events_;
+ const scoped_ptr<WebInputEvent>& sent_input_event(size_t index) {
+ return sent_events_[index];
+ }
+ const WebGestureEvent* sent_gesture_event(size_t index) {
+ return static_cast<WebGestureEvent*>(sent_events_[index].get());
}
const WebMouseWheelEvent& acked_event() const { return last_acked_event_; }
@@ -86,7 +171,6 @@ class MouseWheelEventQueueTest : public testing::Test,
size_t GetAndResetSentEventCount() {
size_t count = sent_events_.size();
sent_events_.clear();
- sent_gesture_events_.clear();
return count;
}
@@ -113,6 +197,24 @@ class MouseWheelEventQueueTest : public testing::Test,
x, y, global_x, global_y, dX, dY, modifiers, high_precision)));
}
+ void SendMouseWheelWithPhase(
+ float x,
+ float y,
+ float global_x,
+ float global_y,
+ float dX,
+ float dY,
+ int modifiers,
+ bool high_precision,
+ blink::WebMouseWheelEvent::Phase phase,
+ blink::WebMouseWheelEvent::Phase momentum_phase) {
+ WebMouseWheelEvent event = SyntheticWebMouseWheelEventBuilder::Build(
+ x, y, global_x, global_y, dX, dY, modifiers, high_precision);
+ event.phase = phase;
+ event.momentumPhase = momentum_phase;
+ queue_->QueueEvent(MouseWheelEventWithLatencyInfo(event));
+ }
+
void SendGestureEvent(WebInputEvent::Type type) {
WebGestureEvent event;
event.type = type;
@@ -137,7 +239,8 @@ class MouseWheelEventQueueTest : public testing::Test,
EXPECT_TRUE(event_in_flight());
EXPECT_EQ(1U, GetAndResetSentEventCount());
- // The second mouse wheel should not be sent since one is already in queue.
+ // The second mouse wheel should not be sent since one is already in
+ // queue.
SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
kWheelScrollGlobalY, 5, 5, 0, high_precision);
EXPECT_EQ(1U, queued_event_count());
@@ -152,36 +255,104 @@ class MouseWheelEventQueueTest : public testing::Test,
EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
EXPECT_EQ(3U, all_sent_events().size());
- EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
- EXPECT_EQ(scroll_units,
- sent_gesture_events()[0].data.scrollBegin.deltaHintUnits);
- EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x);
- EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y);
- EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX);
- EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY);
- EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
- EXPECT_EQ(scroll_units,
- sent_gesture_events()[1].data.scrollUpdate.deltaUnits);
- EXPECT_EQ(kWheelScrollX, sent_gesture_events()[1].x);
- EXPECT_EQ(kWheelScrollY, sent_gesture_events()[1].y);
- EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[1].globalX);
- EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[1].globalY);
- EXPECT_EQ(WebInputEvent::MouseWheel, all_sent_events()[2].type);
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
+ EXPECT_MOUSE_WHEEL(sent_input_event(2));
EXPECT_EQ(3U, GetAndResetSentEventCount());
RunTasksAndWait(DefaultScrollEndTimeoutDelay() * 2);
EXPECT_EQ(1U, all_sent_events().size());
- EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
- EXPECT_EQ(scroll_units, sent_gesture_events()[0].data.scrollEnd.deltaUnits);
- EXPECT_EQ(kWheelScrollX, sent_gesture_events()[0].x);
- EXPECT_EQ(kWheelScrollY, sent_gesture_events()[0].y);
- EXPECT_EQ(kWheelScrollGlobalX, sent_gesture_events()[0].globalX);
- EXPECT_EQ(kWheelScrollGlobalY, sent_gesture_events()[0].globalY);
+ EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0));
+ }
+
+ void PhaseGestureSendingTest(bool high_precision) {
+ const WebGestureEvent::ScrollUnits scroll_units =
+ high_precision ? WebGestureEvent::PrecisePixels
+ : WebGestureEvent::Pixels;
+
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 1, 1, 0, high_precision,
+ WebMouseWheelEvent::PhaseBegan,
+ WebMouseWheelEvent::PhaseNone);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(3U, all_sent_events().size());
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_END(sent_gesture_event(2));
+ EXPECT_EQ(3U, GetAndResetSentEventCount());
+
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 5, 5, 0, high_precision,
+ WebMouseWheelEvent::PhaseChanged,
+ WebMouseWheelEvent::PhaseNone);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(3U, all_sent_events().size());
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_END(sent_gesture_event(2));
+ EXPECT_EQ(3U, GetAndResetSentEventCount());
+
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 0, 0, 0, high_precision,
+ WebMouseWheelEvent::PhaseEnded,
+ WebMouseWheelEvent::PhaseNone);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(2U, all_sent_events().size());
+ EXPECT_SYNTHETIC_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_GESTURE_SCROLL_END(sent_gesture_event(1));
+ EXPECT_EQ(2U, GetAndResetSentEventCount());
+
+ // Send a double phase end; OSX does it consistently.
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 0, 0, 0, high_precision,
+ WebMouseWheelEvent::PhaseEnded,
+ WebMouseWheelEvent::PhaseNone);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(0U, all_sent_events().size());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 5, 5, 0, high_precision,
+ WebMouseWheelEvent::PhaseNone,
+ WebMouseWheelEvent::PhaseBegan);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(3U, all_sent_events().size());
+ EXPECT_INERTIAL_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(2));
+ EXPECT_EQ(3U, GetAndResetSentEventCount());
+
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 5, 5, 0, high_precision,
+ WebMouseWheelEvent::PhaseNone,
+ WebMouseWheelEvent::PhaseChanged);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(3U, all_sent_events().size());
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_INERTIAL_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(2));
+ EXPECT_EQ(3U, GetAndResetSentEventCount());
+
+ SendMouseWheelWithPhase(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
+ kWheelScrollGlobalY, 0, 0, 0, high_precision,
+ WebMouseWheelEvent::PhaseNone,
+ WebMouseWheelEvent::PhaseEnded);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ SendMouseWheelEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(2U, all_sent_events().size());
+ EXPECT_SYNTHETIC_INERTIAL_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_INERTIAL_GESTURE_SCROLL_END(sent_gesture_event(1));
+ EXPECT_EQ(2U, GetAndResetSentEventCount());
}
scoped_ptr<MouseWheelEventQueue> queue_;
- std::vector<WebInputEvent> sent_events_;
- std::vector<WebGestureEvent> sent_gesture_events_;
+ std::vector<scoped_ptr<WebInputEvent>> sent_events_;
size_t acked_event_count_;
InputEventAckState last_acked_event_state_;
base::MessageLoopForUI message_loop_;
@@ -230,8 +401,21 @@ TEST_F(MouseWheelEventQueueTest, GestureSendingPrecisePixels) {
GestureSendingTest(false);
}
+TEST_F(MouseWheelEventQueueTest, GestureSendingWithPhaseInformation) {
+ SetUpForGestureTesting(true);
+ PhaseGestureSendingTest(false);
+}
+
+TEST_F(MouseWheelEventQueueTest,
+ GestureSendingWithPhaseInformationPrecisePixels) {
+ SetUpForGestureTesting(true);
+ PhaseGestureSendingTest(true);
+}
+
TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) {
SetUpForGestureTesting(true);
+ const WebGestureEvent::ScrollUnits scroll_units = WebGestureEvent::Pixels;
+
SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
kWheelScrollGlobalY, 1, 1, 0, false);
EXPECT_EQ(0U, queued_event_count());
@@ -245,14 +429,14 @@ TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) {
EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
EXPECT_EQ(2U, all_sent_events().size());
- EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
- EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
EXPECT_EQ(2U, GetAndResetSentEventCount());
// Ensure that a gesture scroll begin terminates the current scroll event.
SendGestureEvent(WebInputEvent::GestureScrollBegin);
EXPECT_EQ(1U, all_sent_events().size());
- EXPECT_EQ(WebInputEvent::GestureScrollEnd, all_sent_events()[0].type);
+ EXPECT_GESTURE_SCROLL_END(sent_gesture_event(0));
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendMouseWheel(kWheelScrollX, kWheelScrollY, kWheelScrollGlobalX,
@@ -286,8 +470,8 @@ TEST_F(MouseWheelEventQueueTest, GestureSendingInterrupted) {
EXPECT_EQ(WebInputEvent::MouseWheel, acked_event().type);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
EXPECT_EQ(2U, all_sent_events().size());
- EXPECT_EQ(WebInputEvent::GestureScrollBegin, all_sent_events()[0].type);
- EXPECT_EQ(WebInputEvent::GestureScrollUpdate, all_sent_events()[1].type);
+ EXPECT_GESTURE_SCROLL_BEGIN(sent_gesture_event(0));
+ EXPECT_GESTURE_SCROLL_UPDATE(sent_gesture_event(1));
EXPECT_EQ(2U, GetAndResetSentEventCount());
}

Powered by Google App Engine
This is Rietveld 408576698