| Index: Source/web/tests/WebFrameTest.cpp
|
| diff --git a/Source/web/tests/WebFrameTest.cpp b/Source/web/tests/WebFrameTest.cpp
|
| index a9b8a62910172d7c6ce7b7f96546b23979721e0e..226863795b43d19779bd8a184b02f4ce6bf70361 100644
|
| --- a/Source/web/tests/WebFrameTest.cpp
|
| +++ b/Source/web/tests/WebFrameTest.cpp
|
| @@ -152,6 +152,12 @@ const int touchPointPadding = 32;
|
| EXPECT_FLOAT_EQ(expected.y(), actual.y()); \
|
| } while (false)
|
|
|
| +#define EXPECT_FLOAT_SIZE_EQ(expected, actual) \
|
| + do { \
|
| + EXPECT_FLOAT_EQ(expected.width(), actual.width()); \
|
| + EXPECT_FLOAT_EQ(expected.height(), actual.height()); \
|
| + } while (false)
|
| +
|
| class WebFrameTest : public ::testing::Test {
|
| protected:
|
| WebFrameTest()
|
| @@ -7341,4 +7347,222 @@ TEST_F(WebFrameTest, CreateLocalChildWithPreviousSibling)
|
| view->close();
|
| }
|
|
|
| +class WebFrameOverscrollTest : public WebFrameTest {
|
| +protected:
|
| + WebGestureEvent generateEvent(WebInputEvent::Type type, int deltaX = 0, int deltaY = 0)
|
| + {
|
| + WebGestureEvent event;
|
| + event.type = type;
|
| + event.x = 100;
|
| + event.y = 100;
|
| + if (type == WebInputEvent::GestureScrollUpdate) {
|
| + event.data.scrollUpdate.deltaX = deltaX;
|
| + event.data.scrollUpdate.deltaY = deltaY;
|
| + }
|
| + return event;
|
| + }
|
| +
|
| + void ScrollBegin(FrameTestHelpers::WebViewHelper* webViewHelper)
|
| + {
|
| + webViewHelper->webViewImpl()->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin));
|
| + }
|
| +
|
| + void ScrollUpdate(FrameTestHelpers::WebViewHelper* webViewHelper, float deltaX, float deltaY)
|
| + {
|
| + webViewHelper->webViewImpl()->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate, deltaX, deltaY));
|
| + }
|
| +
|
| + void ScrollEnd(FrameTestHelpers::WebViewHelper* webViewHelper)
|
| + {
|
| + webViewHelper->webViewImpl()->handleInputEvent(generateEvent(WebInputEvent::GestureScrollEnd));
|
| + }
|
| + FloatSize AccumulatedRootOverscroll(FrameTestHelpers::WebViewHelper* webViewHelper)
|
| + {
|
| + return webViewHelper->webViewImpl()->mainFrameImpl()->frame()->eventHandler().accumulatedRootOverscrollForTesting();
|
| + }
|
| +
|
| + FloatSize UnusedDelta(FrameTestHelpers::WebViewHelper* webViewHelper)
|
| + {
|
| + return webViewHelper->webViewImpl()->mainFrameImpl()->frame()->eventHandler().unusedDeltaForTesting();
|
| + }
|
| +
|
| +};
|
| +
|
| +TEST_F(WebFrameOverscrollTest, AccumulatedRootOverscrollAndUnsedDeltaSetAndUnset)
|
| +{
|
| + FakeCompositingWebViewClient client;
|
| + registerMockedHttpURLLoad("overscroll/overscroll.html");
|
| + FrameTestHelpers::WebViewHelper webViewHelper;
|
| + WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(m_baseURL + "overscroll/overscroll.html", true, 0, &client, configureAndroid);
|
| + webViewImpl->layout();
|
| +
|
| + // Resets accumulatedRootOverscroll and unusedDelta on scroll end.
|
| + ScrollBegin(&webViewHelper);
|
| + ScrollUpdate(&webViewHelper, 0, -13);
|
| + ScrollEnd(&webViewHelper);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Calculation of accumulatedRootOverscroll and unusedDelta on Single scrollUpdate.
|
| + ScrollBegin(&webViewHelper);
|
| + ScrollUpdate(&webViewHelper, 0, -13);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| + ScrollEnd(&webViewHelper);
|
| +
|
| + // Calculation of accumulatedRootOverscroll and unusedDelta on multiple scrollUpdate.
|
| + ScrollBegin(&webViewHelper);
|
| + ScrollUpdate(&webViewHelper, -400, -400);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 0, -13);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 13), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 13), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, -20, -13);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(20, 13), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(20, 26), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 0, 1);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(20, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 1, 0);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollEnd(&webViewHelper);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +}
|
| +
|
| +TEST_F(WebFrameOverscrollTest, AccumulatedOverscrollAndUnusedDeltaReset)
|
| +{
|
| + FakeCompositingWebViewClient client;
|
| + registerMockedHttpURLLoad("overscroll/div-overscroll.html");
|
| + FrameTestHelpers::WebViewHelper webViewHelper;
|
| + WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(m_baseURL + "overscroll/div-overscroll.html", true, 0, &client, configureAndroid);
|
| + webViewImpl->layout();
|
| +
|
| + ScrollBegin(&webViewHelper);
|
| +
|
| + // Scroll the Div to the end.
|
| + ScrollUpdate(&webViewHelper, 0, -316);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled.
|
| + ScrollUpdate(&webViewHelper, 0, -50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 50), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 50), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Resets the Accumulated and unusedDelta on scrolling up.
|
| + ScrollUpdate(&webViewHelper, 0, 50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 0, -50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled.
|
| + ScrollUpdate(&webViewHelper, 0, -100);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 100), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 100), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Page scrolls vertically, but over-scrolls horizontally.
|
| + ScrollUpdate(&webViewHelper, 100, 50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-100, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-100, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 0, -50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-100, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Page scrolls horizontally, but over-scrolls vertically.
|
| + ScrollUpdate(&webViewHelper, -100, -100);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 100), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 100), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollEnd(&webViewHelper);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +}
|
| +
|
| +TEST_F(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerDivOverScroll)
|
| +{
|
| + FakeCompositingWebViewClient client;
|
| + registerMockedHttpURLLoad("overscroll/div-overscroll.html");
|
| + FrameTestHelpers::WebViewHelper webViewHelper;
|
| + WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(m_baseURL + "overscroll/div-overscroll.html", true, 0, &client, configureAndroid);
|
| + webViewImpl->layout();
|
| +
|
| + ScrollBegin(&webViewHelper);
|
| +
|
| + // Scroll the Div to the end.
|
| + ScrollUpdate(&webViewHelper, 0, -316);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled.
|
| + ScrollUpdate(&webViewHelper, 0, -50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 50), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 50), AccumulatedRootOverscroll(&webViewHelper));
|
| +}
|
| +
|
| +TEST_F(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerIFrameOverScroll)
|
| +{
|
| + FakeCompositingWebViewClient client;
|
| + registerMockedHttpURLLoad("overscroll/iframe-overscroll.html");
|
| + registerMockedHttpURLLoad("overscroll/scrollable-iframe.html");
|
| + FrameTestHelpers::WebViewHelper webViewHelper;
|
| + WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(m_baseURL + "overscroll/iframe-overscroll.html", true, 0, &client, configureAndroid);
|
| + webViewImpl->layout();
|
| +
|
| + ScrollBegin(&webViewHelper);
|
| +
|
| + // Scroll the IFrame to the end.
|
| + ScrollUpdate(&webViewHelper, 0, -320);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + // Now On Scrolling IFrame, scroll is bubbled and root layer is over-scrolled.
|
| + ScrollUpdate(&webViewHelper, 0, -50);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 50), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 50), AccumulatedRootOverscroll(&webViewHelper));
|
| +}
|
| +
|
| +TEST_F(WebFrameOverscrollTest, ScaledPageRootLayerOverscrolled)
|
| +{
|
| + FakeCompositingWebViewClient client;
|
| + registerMockedHttpURLLoad("overscroll/overscroll.html");
|
| + FrameTestHelpers::WebViewHelper webViewHelper;
|
| + WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(m_baseURL + "overscroll/overscroll.html", true, 0, &client, configureAndroid);
|
| + webViewImpl->setPageScaleFactor(3.f);
|
| + webViewImpl->layout();
|
| +
|
| + // Calculation of accumulatedRootOverscroll and unusedDelta on scaled page.
|
| + ScrollBegin(&webViewHelper);
|
| + ScrollUpdate(&webViewHelper, 0, 30);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, -10), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, -10), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 0, 30);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, -10), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, -20), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 30, 30);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-10, -10), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-10, -30), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollUpdate(&webViewHelper, 30, 0);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-10, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(-20, -30), AccumulatedRootOverscroll(&webViewHelper));
|
| +
|
| + ScrollEnd(&webViewHelper);
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), UnusedDelta(&webViewHelper));
|
| + EXPECT_FLOAT_SIZE_EQ(FloatSize(0, 0), AccumulatedRootOverscroll(&webViewHelper));
|
| +}
|
| +
|
| } // namespace blink
|
|
|