Index: Source/web/tests/WebFrameTest.cpp |
diff --git a/Source/web/tests/WebFrameTest.cpp b/Source/web/tests/WebFrameTest.cpp |
index 9e48b3385b43c931398739f86008b1903ea39a11..e8d51d1c82fec4171c615a8d857c56b07834fe84 100644 |
--- a/Source/web/tests/WebFrameTest.cpp |
+++ b/Source/web/tests/WebFrameTest.cpp |
@@ -119,6 +119,7 @@ |
#include "web/tests/FrameTestHelpers.h" |
#include "wtf/Forward.h" |
#include "wtf/dtoa/utils.h" |
+#include <gmock/gmock.h> |
#include <gtest/gtest.h> |
#include <map> |
#include <v8.h> |
@@ -127,9 +128,22 @@ using blink::URLTestHelpers::toKURL; |
using blink::FrameTestHelpers::UseMockScrollbarSettings; |
using blink::testing::runPendingTasks; |
using testing::ElementsAre; |
+using ::testing::Mock; |
namespace blink { |
+::std::ostream& operator<<(::std::ostream& os, const WebFloatSize& size) |
+{ |
+ return os << "WebFloatSize: [" |
+ << size.width<< ", " << size.height<< "]"; |
+} |
+ |
+::std::ostream& operator<<(::std::ostream& os, const WebFloatPoint& point) |
+{ |
+ return os << "WebFloatPoint: [" |
+ << point.x<< ", " << point.y<< "]"; |
+} |
+ |
const int touchPointPadding = 32; |
#define EXPECT_RECT_EQ(expected, actual) \ |
@@ -7471,4 +7485,234 @@ TEST_P(ParameterizedWebFrameTest, CreateLocalChildWithPreviousSibling) |
view->close(); |
} |
+class OverscrollWebViewClient : public FrameTestHelpers::TestWebViewClient { |
+public: |
+ MOCK_METHOD4(didOverscroll, void(const WebFloatSize&, const WebFloatSize&, const WebFloatPoint&, const WebFloatSize&)); |
+}; |
+ |
+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)); |
+ } |
+}; |
+ |
+TEST_F(WebFrameOverscrollTest, AccumulatedRootOverscrollAndUnsedDeltaValuesOnOverscroll) |
+{ |
+ OverscrollWebViewClient client; |
+ registerMockedHttpURLLoad("overscroll/overscroll.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "overscroll/overscroll.html", true, 0, &client, configureAndroid); |
+ |
+ // Calculation of accumulatedRootOverscroll and unusedDelta on multiple scrollUpdate. |
+ ScrollBegin(&webViewHelper); |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(8, 16), WebFloatSize(8, 16), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, -308, -316); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, 13), WebFloatSize(8, 29), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, -13); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(20, 13), WebFloatSize(28, 42), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, -20, -13); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Overscroll is not reported. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, 1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 1, 0); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Overscroll is reported. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, -701), WebFloatSize(0, -701), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, 1000); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Overscroll is not reported. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollEnd(&webViewHelper); |
+ Mock::VerifyAndClearExpectations(&client); |
+} |
+ |
+TEST_F(WebFrameOverscrollTest, AccumulatedOverscrollAndUnusedDeltaValuesOnDifferentAxesOverscroll) |
+{ |
+ OverscrollWebViewClient client; |
+ registerMockedHttpURLLoad("overscroll/div-overscroll.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "overscroll/div-overscroll.html", true, 0, &client, configureAndroid); |
+ |
+ ScrollBegin(&webViewHelper); |
+ |
+ // Scroll the Div to the end. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, -316); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, 100), WebFloatSize(0, 100), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, -100); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Page scrolls vertically, but over-scrolls horizontally. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(-100, 0), WebFloatSize(-100, 0), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 100, 50); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Scrolling up, Overscroll is not reported. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, -50); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Page scrolls horizontally, but over-scrolls vertically. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, 100), WebFloatSize(0, 100), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, -100, -100); |
+ Mock::VerifyAndClearExpectations(&client); |
+} |
+ |
+TEST_F(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerDivOverScroll) |
+{ |
+ OverscrollWebViewClient client; |
+ registerMockedHttpURLLoad("overscroll/div-overscroll.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "overscroll/div-overscroll.html", true, 0, &client, configureAndroid); |
+ |
+ ScrollBegin(&webViewHelper); |
+ |
+ // Scroll the Div to the end. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, -316); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Now On Scrolling DIV, scroll is bubbled and root layer is over-scrolled. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, 50), WebFloatSize(0, 50), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, -50); |
+ Mock::VerifyAndClearExpectations(&client); |
+} |
+ |
+TEST_F(WebFrameOverscrollTest, RootLayerOverscrolledOnInnerIFrameOverScroll) |
+{ |
+ OverscrollWebViewClient client; |
+ registerMockedHttpURLLoad("overscroll/iframe-overscroll.html"); |
+ registerMockedHttpURLLoad("overscroll/scrollable-iframe.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "overscroll/iframe-overscroll.html", true, 0, &client, configureAndroid); |
+ |
+ ScrollBegin(&webViewHelper); |
+ // Scroll the IFrame to the end. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, -320); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Now On Scrolling IFrame, scroll is bubbled and root layer is over-scrolled. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, 50), WebFloatSize(0, 50), WebFloatPoint(100, 100), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, -50); |
+ Mock::VerifyAndClearExpectations(&client); |
+} |
+ |
+TEST_F(WebFrameOverscrollTest, NoOverscrollOnNonScrollableaxes) |
+{ |
+ OverscrollWebViewClient client; |
+ registerMockedHttpURLLoad("overscroll/no-overscroll-on-nonscrollable-axes.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ webViewHelper.initializeAndLoad(m_baseURL + "overscroll/no-overscroll-on-nonscrollable-axes.html", true, 0, &client, configureAndroid); |
+ |
+ // Overscroll is not reported in all the directions. |
+ ScrollBegin(&webViewHelper); |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, -1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 0, 1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 1, 0); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, -1, 0); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 1, 1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, -1, 1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, 1, -1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollUpdate(&webViewHelper, -1, -1); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(100, 100), WebFloatSize())).Times(0); |
+ ScrollEnd(&webViewHelper); |
+ Mock::VerifyAndClearExpectations(&client); |
+} |
+ |
+TEST_F(WebFrameOverscrollTest, ScaledPageRootLayerOverscrolled) |
+{ |
+ OverscrollWebViewClient client; |
+ registerMockedHttpURLLoad("overscroll/overscroll.html"); |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ WebViewImpl* webViewImpl = webViewHelper.initializeAndLoad(m_baseURL + "overscroll/overscroll.html", true, 0, &client, configureAndroid); |
+ webViewImpl->setPageScaleFactor(3.0); |
+ |
+ // Calculation of accumulatedRootOverscroll and unusedDelta on scaled page. |
+ ScrollBegin(&webViewHelper); |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, -10), WebFloatSize(0, -10), WebFloatPoint(33, 33), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, 30); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(0, -10), WebFloatSize(0, -20), WebFloatPoint(33, 33), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 0, 30); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(-10, -10), WebFloatSize(-10, -30), WebFloatPoint(33, 33), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 30, 30); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(-10, 0), WebFloatSize(-20, -30), WebFloatPoint(33, 33), WebFloatSize())); |
+ ScrollUpdate(&webViewHelper, 30, 0); |
+ Mock::VerifyAndClearExpectations(&client); |
+ |
+ // Overscroll is not reported. |
+ EXPECT_CALL(client, didOverscroll(WebFloatSize(), WebFloatSize(), WebFloatPoint(33, 33), WebFloatSize())).Times(0); |
+ ScrollEnd(&webViewHelper); |
+ Mock::VerifyAndClearExpectations(&client); |
+} |
+ |
} // namespace blink |