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 |