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

Side by Side Diff: content/browser/renderer_host/input/input_router_impl_unittest.cc

Issue 1440923002: Convert the coordinates in WebInputEvent To Viewport in InputRouter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <math.h> 5 #include <math.h>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after
1810 1810
1811 client_overscroll = client_->GetAndResetOverscroll(); 1811 client_overscroll = client_->GetAndResetOverscroll();
1812 EXPECT_EQ(wheel_overscroll.accumulated_overscroll, 1812 EXPECT_EQ(wheel_overscroll.accumulated_overscroll,
1813 client_overscroll.accumulated_overscroll); 1813 client_overscroll.accumulated_overscroll);
1814 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta, 1814 EXPECT_EQ(wheel_overscroll.latest_overscroll_delta,
1815 client_overscroll.latest_overscroll_delta); 1815 client_overscroll.latest_overscroll_delta);
1816 EXPECT_EQ(wheel_overscroll.current_fling_velocity, 1816 EXPECT_EQ(wheel_overscroll.current_fling_velocity,
1817 client_overscroll.current_fling_velocity); 1817 client_overscroll.current_fling_velocity);
1818 } 1818 }
1819 1819
1820 namespace {
1821
1822 class InputRouterImplScaleEventTest : public InputRouterImplTest {
1823 public:
1824 InputRouterImplScaleEventTest() {}
1825
1826 void SetUp() override {
1827 InputRouterImplTest::SetUp();
1828 input_router_->SetDeviceScaleFactor(2.f);
1829 }
1830
1831 template <typename T>
1832 const T* GetSentWebInputEvent() const {
1833 EXPECT_EQ(1u, process_->sink().message_count());
1834
1835 InputMsg_HandleInputEvent::Schema::Param param;
1836 InputMsg_HandleInputEvent::Read(process_->sink().GetMessageAt(0), &param);
1837 return static_cast<const T*>(base::get<0>(param));
1838 }
1839
1840 template <typename T>
1841 const T* GetFilterWebInputEvent() const {
1842 return static_cast<const T*>(client_->last_filter_event());
1843 }
1844
1845 private:
1846 DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleEventTest);
1847 };
1848
1849 class InputRouterImplScaleMouseEventTest
1850 : public InputRouterImplScaleEventTest {
1851 public:
1852 InputRouterImplScaleMouseEventTest() {}
1853
1854 void RunMouseEventTest(const std::string& name, WebInputEvent::Type type) {
1855 SCOPED_TRACE(name);
1856 SimulateMouseEvent(type, 10, 10);
1857 const WebMouseEvent* sent_event = GetSentWebInputEvent<WebMouseEvent>();
1858 EXPECT_EQ(20, sent_event->x);
1859 EXPECT_EQ(20, sent_event->y);
1860
1861 const WebMouseEvent* filter_event = GetFilterWebInputEvent<WebMouseEvent>();
1862 EXPECT_EQ(10, filter_event->x);
1863 EXPECT_EQ(10, filter_event->y);
1864
1865 process_->sink().ClearMessages();
1866 }
1867
1868 private:
1869 DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleMouseEventTest);
1870 };
1871
1872 } // namespace
1873
1874 TEST_F(InputRouterImplScaleMouseEventTest, ScaleMouseEventTest) {
1875 RunMouseEventTest("Enter", WebInputEvent::MouseEnter);
1876 RunMouseEventTest("Down", WebInputEvent::MouseDown);
1877 RunMouseEventTest("Move", WebInputEvent::MouseMove);
1878 RunMouseEventTest("Up", WebInputEvent::MouseUp);
1879 }
1880
1881 TEST_F(InputRouterImplScaleEventTest, ScaleMouseWheelEventTest) {
1882 ASSERT_EQ(0u, process_->sink().message_count());
1883 SimulateWheelEvent(10, 10, 0, false);
1884 ASSERT_EQ(1u, process_->sink().message_count());
1885
1886 const WebMouseWheelEvent* sent_event =
1887 GetSentWebInputEvent<WebMouseWheelEvent>();
1888 EXPECT_EQ(20, sent_event->deltaX);
1889 EXPECT_EQ(20, sent_event->deltaY);
1890 EXPECT_EQ(2, sent_event->wheelTicksX);
1891 EXPECT_EQ(2, sent_event->wheelTicksY);
1892
1893 const WebMouseWheelEvent* filter_event =
1894 GetFilterWebInputEvent<WebMouseWheelEvent>();
1895 EXPECT_EQ(10, filter_event->deltaX);
1896 EXPECT_EQ(10, filter_event->deltaY);
1897 EXPECT_EQ(1, filter_event->wheelTicksX);
1898 EXPECT_EQ(1, filter_event->wheelTicksY);
1899
1900 EXPECT_EQ(sent_event->accelerationRatioX, filter_event->accelerationRatioX);
1901 EXPECT_EQ(sent_event->accelerationRatioY, filter_event->accelerationRatioY);
1902 }
1903
1904 namespace {
1905
1906 class InputRouterImplScaleTouchEventTest
1907 : public InputRouterImplScaleEventTest {
1908 public:
1909 InputRouterImplScaleTouchEventTest() {}
1910
1911 // Test tests if two finger touch event at (10, 20) and (100, 200) are
1912 // properly scaled. The touch event must be generated ans flushed into
1913 // the message sink prior to this method.
1914 void RunTouchEventTest(const std::string& name, WebTouchPoint::State state) {
1915 SCOPED_TRACE(name);
1916 ASSERT_EQ(1u, process_->sink().message_count());
1917 const WebTouchEvent* sent_event = GetSentWebInputEvent<WebTouchEvent>();
1918 ASSERT_EQ(2u, sent_event->touchesLength);
1919 EXPECT_EQ(state, sent_event->touches[0].state);
1920 EXPECT_EQ(20, sent_event->touches[0].position.x);
1921 EXPECT_EQ(40, sent_event->touches[0].position.y);
1922 EXPECT_EQ(10, sent_event->touches[0].screenPosition.x);
1923 EXPECT_EQ(20, sent_event->touches[0].screenPosition.y);
1924 EXPECT_EQ(2, sent_event->touches[0].radiusX);
1925 EXPECT_EQ(2, sent_event->touches[0].radiusY);
1926
1927 EXPECT_EQ(200, sent_event->touches[1].position.x);
1928 EXPECT_EQ(400, sent_event->touches[1].position.y);
1929 EXPECT_EQ(100, sent_event->touches[1].screenPosition.x);
1930 EXPECT_EQ(200, sent_event->touches[1].screenPosition.y);
1931 EXPECT_EQ(2, sent_event->touches[1].radiusX);
1932 EXPECT_EQ(2, sent_event->touches[1].radiusY);
1933
1934 const WebTouchEvent* filter_event = GetFilterWebInputEvent<WebTouchEvent>();
1935 ASSERT_EQ(2u, filter_event->touchesLength);
1936 EXPECT_EQ(10, filter_event->touches[0].position.x);
1937 EXPECT_EQ(20, filter_event->touches[0].position.y);
1938 EXPECT_EQ(10, filter_event->touches[0].screenPosition.x);
1939 EXPECT_EQ(20, filter_event->touches[0].screenPosition.y);
1940 EXPECT_EQ(1, filter_event->touches[0].radiusX);
1941 EXPECT_EQ(1, filter_event->touches[0].radiusY);
1942
1943 EXPECT_EQ(100, filter_event->touches[1].position.x);
1944 EXPECT_EQ(200, filter_event->touches[1].position.y);
1945 EXPECT_EQ(100, filter_event->touches[1].screenPosition.x);
1946 EXPECT_EQ(200, filter_event->touches[1].screenPosition.y);
1947 EXPECT_EQ(1, filter_event->touches[1].radiusX);
1948 EXPECT_EQ(1, filter_event->touches[1].radiusY);
1949 }
1950
1951 void FlushTouchEvent(WebInputEvent::Type type) {
1952 uint32 touch_event_id = SendTouchEvent();
1953 SendTouchEventACK(type, INPUT_EVENT_ACK_STATE_CONSUMED, touch_event_id);
1954 ASSERT_TRUE(TouchEventQueueEmpty());
1955 ASSERT_NE(0u, process_->sink().message_count());
1956 }
1957
1958 void ReleaseTouchPointAndAck(int index) {
1959 ReleaseTouchPoint(index);
1960 int release_event_id = SendTouchEvent();
1961 SendTouchEventACK(WebInputEvent::TouchEnd, INPUT_EVENT_ACK_STATE_CONSUMED,
1962 release_event_id);
1963 }
1964
1965 private:
1966 DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleTouchEventTest);
1967 };
1968
1969 } // namespace
1970
1971 TEST_F(InputRouterImplScaleTouchEventTest, ScaleTouchEventTest) {
1972 // Press
1973 PressTouchPoint(10, 20);
1974 PressTouchPoint(100, 200);
1975 FlushTouchEvent(WebInputEvent::TouchStart);
1976
1977 RunTouchEventTest("Press", WebTouchPoint::StatePressed);
1978 ReleaseTouchPointAndAck(1);
1979 ReleaseTouchPointAndAck(0);
1980 EXPECT_EQ(3u, GetSentMessageCountAndResetSink());
1981
1982 // Move
1983 PressTouchPoint(0, 0);
1984 PressTouchPoint(0, 0);
1985 FlushTouchEvent(WebInputEvent::TouchStart);
1986 process_->sink().ClearMessages();
1987
1988 MoveTouchPoint(0, 10, 20);
1989 MoveTouchPoint(1, 100, 200);
1990 FlushTouchEvent(WebInputEvent::TouchMove);
1991 RunTouchEventTest("Move", WebTouchPoint::StateMoved);
1992 ReleaseTouchPointAndAck(1);
1993 ReleaseTouchPointAndAck(0);
1994 EXPECT_EQ(3u, GetSentMessageCountAndResetSink());
1995
1996 // Release
1997 PressTouchPoint(10, 20);
1998 PressTouchPoint(100, 200);
1999 FlushTouchEvent(WebInputEvent::TouchMove);
2000 process_->sink().ClearMessages();
2001
2002 ReleaseTouchPoint(0);
2003 ReleaseTouchPoint(1);
2004 FlushTouchEvent(WebInputEvent::TouchEnd);
2005 RunTouchEventTest("Release", WebTouchPoint::StateReleased);
2006
2007 // Cancel
2008 PressTouchPoint(10, 20);
2009 PressTouchPoint(100, 200);
2010 FlushTouchEvent(WebInputEvent::TouchStart);
2011 process_->sink().ClearMessages();
2012
2013 CancelTouchPoint(0);
2014 CancelTouchPoint(1);
2015 FlushTouchEvent(WebInputEvent::TouchCancel);
2016 RunTouchEventTest("Cancel", WebTouchPoint::StateCancelled);
2017 }
2018
2019 namespace {
2020
2021 class InputRouterImplScaleGestureEventTest
2022 : public InputRouterImplScaleEventTest {
2023 public:
2024 InputRouterImplScaleGestureEventTest() {}
2025
2026 WebGestureEvent BuildGestureEvent(WebInputEvent::Type type,
2027 const gfx::Point& point) {
2028 WebGestureEvent event = SyntheticWebGestureEventBuilder::Build(
2029 type, blink::WebGestureDeviceTouchpad);
2030 event.globalX = event.x = point.x();
2031 event.globalY = event.y = point.y();
2032 return event;
2033 }
2034
2035 void TestTap(const std::string& name, WebInputEvent::Type type) {
2036 SCOPED_TRACE(name);
2037 const gfx::Point orig(10, 20), scaled(20, 40);
2038 WebGestureEvent event = BuildGestureEvent(type, orig);
2039 event.data.tap.width = 30;
2040 event.data.tap.height = 40;
2041 SimulateGestureEvent(event);
2042 FlushGestureEvent(type);
2043
2044 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2045 TestLocationInSentEvent(sent_event, orig, scaled);
2046 EXPECT_EQ(60, sent_event->data.tap.width);
2047 EXPECT_EQ(80, sent_event->data.tap.height);
2048
2049 const WebGestureEvent* filter_event =
2050 GetFilterWebInputEvent<WebGestureEvent>();
2051 TestLocationInFilterEvent(filter_event, orig);
2052 EXPECT_EQ(30, filter_event->data.tap.width);
2053 EXPECT_EQ(40, filter_event->data.tap.height);
2054 process_->sink().ClearMessages();
2055 }
2056
2057 void TestLongPress(const std::string& name, WebInputEvent::Type type) {
2058 const gfx::Point orig(10, 20), scaled(20, 40);
2059 WebGestureEvent event = BuildGestureEvent(type, orig);
2060 event.data.longPress.width = 30;
2061 event.data.longPress.height = 40;
2062 SimulateGestureEvent(event);
2063 FlushGestureEvent(type);
2064 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2065 TestLocationInSentEvent(sent_event, orig, scaled);
2066 EXPECT_EQ(60, sent_event->data.longPress.width);
2067 EXPECT_EQ(80, sent_event->data.longPress.height);
2068
2069 const WebGestureEvent* filter_event =
2070 GetFilterWebInputEvent<WebGestureEvent>();
2071 TestLocationInFilterEvent(filter_event, orig);
2072 EXPECT_EQ(30, filter_event->data.longPress.width);
2073 EXPECT_EQ(40, filter_event->data.longPress.height);
2074 process_->sink().ClearMessages();
2075 }
2076
2077 void FlushGestureEvent(WebInputEvent::Type type) {
2078 SendInputEventACK(type, INPUT_EVENT_ACK_STATE_CONSUMED);
2079 ASSERT_NE(0u, process_->sink().message_count());
2080 }
2081
2082 void TestLocationInSentEvent(const WebGestureEvent* sent_event,
2083 const gfx::Point& orig,
2084 const gfx::Point& scaled) {
2085 EXPECT_EQ(20, sent_event->x);
2086 EXPECT_EQ(40, sent_event->y);
2087 EXPECT_EQ(10, sent_event->globalX);
2088 EXPECT_EQ(20, sent_event->globalY);
2089 }
2090
2091 void TestLocationInFilterEvent(const WebGestureEvent* filter_event,
2092 const gfx::Point& point) {
2093 EXPECT_EQ(10, filter_event->x);
2094 EXPECT_EQ(20, filter_event->y);
2095 EXPECT_EQ(10, filter_event->globalX);
2096 EXPECT_EQ(20, filter_event->globalY);
2097 }
2098
2099 private:
2100 DISALLOW_COPY_AND_ASSIGN(InputRouterImplScaleGestureEventTest);
2101 };
2102
2103 } // namespace
2104
2105 TEST_F(InputRouterImplScaleGestureEventTest, GestureScrollUpdate) {
2106 SimulateGestureScrollUpdateEvent(10.f, 20, 0,
2107 blink::WebGestureDeviceTouchpad);
2108 FlushGestureEvent(WebInputEvent::GestureScrollUpdate);
2109 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2110
2111 EXPECT_EQ(20.f, sent_event->data.scrollUpdate.deltaX);
2112 EXPECT_EQ(40.f, sent_event->data.scrollUpdate.deltaY);
2113
2114 const WebGestureEvent* filter_event =
2115 GetFilterWebInputEvent<WebGestureEvent>();
2116 EXPECT_EQ(10.f, filter_event->data.scrollUpdate.deltaX);
2117 EXPECT_EQ(20.f, filter_event->data.scrollUpdate.deltaY);
2118 }
2119
2120 TEST_F(InputRouterImplScaleGestureEventTest, GestureScrollBegin) {
2121 SimulateGestureEvent(
2122 SyntheticWebGestureEventBuilder::BuildScrollBegin(10.f, 20.f));
2123 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2124 EXPECT_EQ(20.f, sent_event->data.scrollBegin.deltaXHint);
2125 EXPECT_EQ(40.f, sent_event->data.scrollBegin.deltaYHint);
2126
2127 const WebGestureEvent* filter_event =
2128 GetFilterWebInputEvent<WebGestureEvent>();
2129 EXPECT_EQ(10.f, filter_event->data.scrollBegin.deltaXHint);
2130 EXPECT_EQ(20.f, filter_event->data.scrollBegin.deltaYHint);
2131 }
2132
2133 TEST_F(InputRouterImplScaleGestureEventTest, GesturePinchUpdate) {
2134 const gfx::Point orig(10, 20), scaled(20, 40);
2135 SimulateGesturePinchUpdateEvent(1.5f, orig.x(), orig.y(), 0,
2136 blink::WebGestureDeviceTouchpad);
2137 FlushGestureEvent(WebInputEvent::GesturePinchUpdate);
2138 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2139 TestLocationInSentEvent(sent_event, orig, scaled);
2140 EXPECT_EQ(1.5f, sent_event->data.pinchUpdate.scale);
2141
2142 const WebGestureEvent* filter_event =
2143 GetFilterWebInputEvent<WebGestureEvent>();
2144 TestLocationInFilterEvent(filter_event, orig);
2145 EXPECT_EQ(1.5f, filter_event->data.pinchUpdate.scale);
2146 }
2147
2148 TEST_F(InputRouterImplScaleGestureEventTest, GestureTapDown) {
2149 const gfx::Point orig(10, 20), scaled(20, 40);
2150 WebGestureEvent event =
2151 BuildGestureEvent(WebInputEvent::GestureTapDown, orig);
2152 event.data.tapDown.width = 30;
2153 event.data.tapDown.height = 40;
2154 SimulateGestureEvent(event);
2155 // FlushGestureEvent(WebInputEvent::GestureTapDown);
2156 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2157 TestLocationInSentEvent(sent_event, orig, scaled);
2158 EXPECT_EQ(60, sent_event->data.tapDown.width);
2159 EXPECT_EQ(80, sent_event->data.tapDown.height);
2160
2161 const WebGestureEvent* filter_event =
2162 GetFilterWebInputEvent<WebGestureEvent>();
2163 TestLocationInFilterEvent(filter_event, orig);
2164 EXPECT_EQ(30, filter_event->data.tapDown.width);
2165 EXPECT_EQ(40, filter_event->data.tapDown.height);
2166 }
2167
2168 TEST_F(InputRouterImplScaleGestureEventTest, GestureTapOthers) {
2169 TestTap("GestureDoubleTap", WebInputEvent::GestureDoubleTap);
2170 TestTap("GestureTap", WebInputEvent::GestureTap);
2171 TestTap("GestureTapUnconfirmed", WebInputEvent::GestureTapUnconfirmed);
2172 }
2173
2174 TEST_F(InputRouterImplScaleGestureEventTest, GestureShowPress) {
2175 const gfx::Point orig(10, 20), scaled(20, 40);
2176 WebGestureEvent event =
2177 BuildGestureEvent(WebInputEvent::GestureShowPress, orig);
2178 event.data.showPress.width = 30;
2179 event.data.showPress.height = 40;
2180 SimulateGestureEvent(event);
2181
2182 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2183 TestLocationInSentEvent(sent_event, orig, scaled);
2184 EXPECT_EQ(60, sent_event->data.showPress.width);
2185 EXPECT_EQ(80, sent_event->data.showPress.height);
2186
2187 const WebGestureEvent* filter_event =
2188 GetFilterWebInputEvent<WebGestureEvent>();
2189 TestLocationInFilterEvent(filter_event, orig);
2190 EXPECT_EQ(30, filter_event->data.showPress.width);
2191 EXPECT_EQ(40, filter_event->data.showPress.height);
2192 }
2193
2194 TEST_F(InputRouterImplScaleGestureEventTest, GestureLongPress) {
2195 TestLongPress("LongPress", WebInputEvent::GestureLongPress);
2196 TestLongPress("LongPap", WebInputEvent::GestureLongTap);
2197 }
2198
2199 TEST_F(InputRouterImplScaleGestureEventTest, GestureTwoFingerTap) {
2200 WebGestureEvent event =
2201 BuildGestureEvent(WebInputEvent::GestureTwoFingerTap, gfx::Point(10, 20));
2202 event.data.twoFingerTap.firstFingerWidth = 30;
2203 event.data.twoFingerTap.firstFingerHeight = 40;
2204 SimulateGestureEvent(event);
2205
2206 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2207 EXPECT_EQ(20, sent_event->x);
2208 EXPECT_EQ(40, sent_event->y);
2209 EXPECT_EQ(60, sent_event->data.twoFingerTap.firstFingerWidth);
2210 EXPECT_EQ(80, sent_event->data.twoFingerTap.firstFingerHeight);
2211
2212 const WebGestureEvent* filter_event =
2213 GetFilterWebInputEvent<WebGestureEvent>();
2214 EXPECT_EQ(10, filter_event->x);
2215 EXPECT_EQ(20, filter_event->y);
2216 EXPECT_EQ(30, filter_event->data.twoFingerTap.firstFingerWidth);
2217 EXPECT_EQ(40, filter_event->data.twoFingerTap.firstFingerHeight);
2218 }
2219
2220 TEST_F(InputRouterImplScaleGestureEventTest, GestureFlingStart) {
2221 const gfx::Point orig(10, 20), scaled(20, 40);
2222 WebGestureEvent event = BuildGestureEvent(
2223 WebInputEvent::GestureFlingStart, orig);
2224 event.data.flingStart.velocityX = 30;
2225 event.data.flingStart.velocityY = 40;
2226 SimulateGestureEvent(event);
2227
2228 const WebGestureEvent* sent_event = GetSentWebInputEvent<WebGestureEvent>();
2229 TestLocationInSentEvent(sent_event, orig, scaled);
2230 EXPECT_EQ(60, sent_event->data.flingStart.velocityX);
2231 EXPECT_EQ(80, sent_event->data.flingStart.velocityY);
2232
2233 const WebGestureEvent* filter_event =
2234 GetFilterWebInputEvent<WebGestureEvent>();
2235 TestLocationInFilterEvent(filter_event, orig);
2236 EXPECT_EQ(30, filter_event->data.flingStart.velocityX);
2237 EXPECT_EQ(40, filter_event->data.flingStart.velocityY);
2238 }
2239
1820 } // namespace content 2240 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698