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

Unified Diff: third_party/WebKit/Source/web/tests/VisualViewportTest.cpp

Issue 1844013002: Fix main thread top controls scrolling to mirror CC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@propertyTreesBoundsDelta
Patch Set: Build fix after rebase Created 4 years, 8 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: third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
diff --git a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
index 3fcbdea4a3fd283b09320316ac1a7567c3a97aa4..138c55a338b1be3246d57313f1abcdcdf77e0c94 100644
--- a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
+++ b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
@@ -8,6 +8,7 @@
#include "core/frame/FrameHost.h"
#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
+#include "core/frame/TopControls.h"
#include "core/html/HTMLBodyElement.h"
#include "core/html/HTMLElement.h"
#include "core/input/EventHandler.h"
@@ -1177,16 +1178,15 @@ TEST_P(ParameterizedVisualViewportTest, ScrollIntoViewFractionalOffset)
// crbug.com/437620
TEST_F(VisualViewportTest, TestResizeDoesntChangeScrollOffset)
{
+ RuntimeEnabledFeatures::setInertTopControlsEnabled(false);
initializeWithAndroidSettings();
- webViewImpl()->resize(IntSize(980, 650));
+ webViewImpl()->resizeWithTopControls(IntSize(980, 650), 20, false);
navigateTo("about:blank");
VisualViewport& visualViewport = frame()->page()->frameHost().visualViewport();
FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView();
- webViewImpl()->setTopControlsHeight(20, false);
-
// Outer viewport isn't scrollable
EXPECT_SIZE_EQ(IntSize(980, 650), frameView.visibleContentRect().size());
@@ -1198,8 +1198,7 @@ TEST_F(VisualViewportTest, TestResizeDoesntChangeScrollOffset)
EXPECT_EQ(20, frameView.layoutViewportScrollableArea()->scrollPosition().y());
- webViewImpl()->setTopControlsHeight(20, true);
- webViewImpl()->resize(WebSize(980, 630));
+ webViewImpl()->resizeWithTopControls(WebSize(980, 630), 20, true);
EXPECT_EQ(0, frameView.layoutViewportScrollableArea()->scrollPosition().y());
EXPECT_EQ(60, visualViewport.location().y());
@@ -1217,7 +1216,7 @@ static IntPoint expectedMaxFrameViewScrollOffset(VisualViewport& visualViewport,
TEST_F(VisualViewportTest, TestTopControlsAdjustment)
{
initializeWithAndroidSettings();
- webViewImpl()->resize(IntSize(500, 450));
+ webViewImpl()->resizeWithTopControls(IntSize(500, 450), 20, false);
registerMockedHttpURLLoad("content-width-1000.html");
navigateTo(m_baseURL + "content-width-1000.html");
@@ -1225,8 +1224,6 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustment)
VisualViewport& visualViewport = frame()->page()->frameHost().visualViewport();
FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView();
- webViewImpl()->setTopControlsHeight(20, false);
-
visualViewport.setScale(1);
EXPECT_SIZE_EQ(IntSize(500, 450), visualViewport.visibleRect().size());
EXPECT_SIZE_EQ(IntSize(1000, 900), frameView.frameRect().size());
@@ -1251,9 +1248,9 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustment)
webViewImpl()->applyViewportDeltas(WebFloatSize(), WebFloatSize(), WebFloatSize(), 1, -10.5f / 20);
EXPECT_FLOAT_SIZE_EQ(FloatSize(500, 440.5f), visualViewport.visibleRect().size());
- // maximumScrollPosition floors the final values.
+ // maximumScrollPosition |ceil|s the top controls adjustment.
visualViewport.move(FloatPoint(10000, 10000));
- EXPECT_FLOAT_POINT_EQ(FloatPoint(500, 881 - 440.5f), visualViewport.location());
+ EXPECT_FLOAT_POINT_EQ(FloatPoint(500, 881 - 441), visualViewport.location());
// The outer viewport (FrameView) should be affected as well.
frameView.scrollBy(IntSize(10000, 10000), UserScroll);
@@ -1265,7 +1262,7 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustment)
TEST_F(VisualViewportTest, TestTopControlsAdjustmentWithScale)
{
initializeWithAndroidSettings();
- webViewImpl()->resize(IntSize(500, 450));
+ webViewImpl()->resizeWithTopControls(IntSize(500, 450), 20, false);
registerMockedHttpURLLoad("content-width-1000.html");
navigateTo(m_baseURL + "content-width-1000.html");
@@ -1273,8 +1270,6 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustmentWithScale)
VisualViewport& visualViewport = frame()->page()->frameHost().visualViewport();
FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView();
- webViewImpl()->setTopControlsHeight(20, false);
-
visualViewport.setScale(2);
EXPECT_SIZE_EQ(IntSize(250, 225), visualViewport.visibleRect().size());
EXPECT_SIZE_EQ(IntSize(1000, 900), frameView.frameRect().size());
@@ -1325,10 +1320,25 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustmentWithScale)
}
+// Tests that a scroll all the way to the bottom of the page, while hiding the
+// top controls doesn't cause a clamp in the viewport scroll offset when the
+// top controls initiated resize occurs.
TEST_F(VisualViewportTest, TestTopControlsAdjustmentAndResize)
{
+ int topControlsHeight = 20;
+ int visualViewportHeight = 450;
+ int layoutViewportHeight = 900;
+ float pageScale = 2;
+ float minPageScale = 0.5;
+
initializeWithAndroidSettings();
- webViewImpl()->resize(IntSize(500, 450));
+
+ // Initialize with top controls showing and shrinking the Blink size.
+ webViewImpl()->resizeWithTopControls(
+ WebSize(500, visualViewportHeight - topControlsHeight),
+ 20,
+ true);
+ webViewImpl()->topControls().setShownRatio(1);
registerMockedHttpURLLoad("content-width-1000.html");
navigateTo(m_baseURL + "content-width-1000.html");
@@ -1336,35 +1346,140 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustmentAndResize)
VisualViewport& visualViewport = frame()->page()->frameHost().visualViewport();
FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView();
- visualViewport.setScale(2);
- EXPECT_SIZE_EQ(IntSize(250, 225), visualViewport.visibleRect().size());
- EXPECT_SIZE_EQ(IntSize(1000, 900), frameView.frameRect().size());
+ visualViewport.setScale(pageScale);
+ EXPECT_SIZE_EQ(
+ IntSize(250, (visualViewportHeight - topControlsHeight) / pageScale),
+ visualViewport.visibleRect().size());
+ EXPECT_SIZE_EQ(
+ IntSize(1000, layoutViewportHeight - topControlsHeight / minPageScale),
+ frameView.frameRect().size());
+ EXPECT_SIZE_EQ(
+ IntSize(500, visualViewportHeight - topControlsHeight),
+ visualViewport.size());
+
+ // Scroll all the way to the bottom, hiding the top controls in the process.
+ visualViewport.move(FloatPoint(10000, 10000));
+ frameView.scrollBy(IntSize(10000, 10000), UserScroll);
+ webViewImpl()->topControls().setShownRatio(0);
- webViewImpl()->setTopControlsHeight(20, false);
+ EXPECT_SIZE_EQ(
+ IntSize(250, visualViewportHeight / pageScale),
+ visualViewport.visibleRect().size());
- webViewImpl()->applyViewportDeltas(WebFloatSize(), WebFloatSize(), WebFloatSize(), 1, 1);
- EXPECT_SIZE_EQ(IntSize(500, 450), visualViewport.size());
- EXPECT_SIZE_EQ(IntSize(250, 215), visualViewport.visibleRect().size());
+ IntPoint frameViewExpected =
+ expectedMaxFrameViewScrollOffset(visualViewport, frameView);
+ FloatPoint visualViewportExpected =
+ FloatPoint(
+ 750,
+ layoutViewportHeight - visualViewportHeight / pageScale);
- // Scroll all the way to the bottom.
- visualViewport.move(FloatPoint(10000, 10000));
- frameView.scrollBy(IntSize(10000, 10000), UserScroll);
- IntPoint frameViewExpected = expectedMaxFrameViewScrollOffset(visualViewport, frameView);
- FloatPoint visualViewportExpected = FloatPoint(750, 860 - 215);
EXPECT_POINT_EQ(visualViewportExpected, visualViewport.location());
EXPECT_POINT_EQ(frameViewExpected, frameView.scrollPosition());
- // Resize the widget to match the top controls adjustment. Ensure that scroll
- // offsets don't get clamped in the the process.
- webViewImpl()->setTopControlsHeight(20, true);
- webViewImpl()->resize(WebSize(500, 430));
+ FloatPoint totalExpected = visualViewportExpected + frameViewExpected;
+
+ // Resize the widget to match the top controls adjustment. Ensure that the
+ // total offset (i.e. what the user sees) doesn't change because of clamping
+ // the offsets to valid values.
+ webViewImpl()->resizeWithTopControls(
+ WebSize(500, visualViewportHeight),
+ 20,
+ false);
+
+ EXPECT_SIZE_EQ(IntSize(500, visualViewportHeight), visualViewport.size());
+ EXPECT_SIZE_EQ(
+ IntSize(250, visualViewportHeight / pageScale),
+ visualViewport.visibleRect().size());
+ EXPECT_SIZE_EQ(
+ IntSize(1000, layoutViewportHeight),
+ frameView.frameRect().size());
+ EXPECT_POINT_EQ(
+ totalExpected,
+ frameView.scrollPosition() + visualViewport.location());
+}
- EXPECT_SIZE_EQ(IntSize(500, 430), visualViewport.size());
- EXPECT_SIZE_EQ(IntSize(250, 215), visualViewport.visibleRect().size());
- EXPECT_SIZE_EQ(IntSize(1000, 860), frameView.frameRect().size());
+// Tests that a scroll all the way to the bottom while showing the top controls
+// doesn't cause a clamp to the viewport scroll offset when the top controls
+// initiated resize occurs.
+TEST_F(VisualViewportTest, TestTopControlsShrinkAdjustmentAndResize)
+{
+ int topControlsHeight = 20;
+ int visualViewportHeight = 500;
+ int layoutViewportHeight = 1000;
+ int contentHeight = 2000;
+ float pageScale = 2;
+ float minPageScale = 0.5;
+
+ initializeWithAndroidSettings();
+
+ // Initialize with top controls hidden and not shrinking the Blink size.
+ webViewImpl()->resizeWithTopControls(
+ IntSize(500, visualViewportHeight),
+ 20,
+ false);
+ webViewImpl()->topControls().setShownRatio(0);
+
+ registerMockedHttpURLLoad("content-width-1000.html");
+ navigateTo(m_baseURL + "content-width-1000.html");
+
+ VisualViewport& visualViewport = frame()->page()->frameHost().visualViewport();
+ FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView();
+
+ visualViewport.setScale(pageScale);
+ EXPECT_SIZE_EQ(
+ IntSize(250, visualViewportHeight / pageScale),
+ visualViewport.visibleRect().size());
+ EXPECT_SIZE_EQ(
+ IntSize(1000, layoutViewportHeight),
+ frameView.frameRect().size());
+ EXPECT_SIZE_EQ(
+ IntSize(500, visualViewportHeight),
+ visualViewport.size());
+
+ // Scroll all the way to the bottom, showing the the top controls in the
+ // process. (This could happen via window.scrollTo during a scroll, for
+ // example).
+ webViewImpl()->topControls().setShownRatio(1);
+ visualViewport.move(FloatPoint(10000, 10000));
+ frameView.scrollBy(IntSize(10000, 10000), UserScroll);
+
+ EXPECT_SIZE_EQ(
+ IntSize(250, (visualViewportHeight - topControlsHeight) / pageScale),
+ visualViewport.visibleRect().size());
+
+ IntPoint frameViewExpected = IntPoint(0,
+ contentHeight
+ - (layoutViewportHeight - topControlsHeight / minPageScale));
+ FloatPoint visualViewportExpected =
+ FloatPoint(750,
+ (layoutViewportHeight - topControlsHeight / minPageScale
+ - visualViewport.visibleRect().height()));
- EXPECT_POINT_EQ(frameViewExpected, frameView.scrollPosition());
EXPECT_POINT_EQ(visualViewportExpected, visualViewport.location());
+ EXPECT_POINT_EQ(frameViewExpected, frameView.scrollPosition());
+
+ FloatPoint totalExpected = visualViewportExpected + frameViewExpected;
+
+ // Resize the widget to match the top controls adjustment. Ensure that the
+ // total offset (i.e. what the user sees) doesn't change because of clamping
+ // the offsets to valid values.
+ webViewImpl()->resizeWithTopControls(
+ WebSize(500, visualViewportHeight - topControlsHeight),
+ 20,
+ true);
+
+ EXPECT_SIZE_EQ(
+ IntSize(500, visualViewportHeight - topControlsHeight),
+ visualViewport.size());
+ EXPECT_SIZE_EQ(
+ IntSize(250, (visualViewportHeight - topControlsHeight) / pageScale),
+ visualViewport.visibleRect().size());
+ EXPECT_SIZE_EQ(
+ IntSize(1000, layoutViewportHeight - topControlsHeight / minPageScale),
+ frameView.frameRect().size());
+ EXPECT_POINT_EQ(
+ totalExpected,
+ frameView.scrollPosition() + visualViewport.location());
}
// Tests that a resize due to top controls hiding doesn't incorrectly clamp the
@@ -1372,10 +1487,9 @@ TEST_F(VisualViewportTest, TestTopControlsAdjustmentAndResize)
TEST_F(VisualViewportTest, TestTopControlHidingResizeDoesntClampMainFrame)
{
initializeWithAndroidSettings();
- webViewImpl()->setTopControlsHeight(500, false);
+ webViewImpl()->resizeWithTopControls(webViewImpl()->size(), 500, false);
webViewImpl()->applyViewportDeltas(WebFloatSize(), WebFloatSize(), WebFloatSize(), 1, 1);
- webViewImpl()->setTopControlsHeight(500, true);
- webViewImpl()->resize(IntSize(1000, 1000));
+ webViewImpl()->resizeWithTopControls(WebSize(1000, 1000), 500, true);
registerMockedHttpURLLoad("content-width-1000.html");
navigateTo(m_baseURL + "content-width-1000.html");
@@ -1389,8 +1503,7 @@ TEST_F(VisualViewportTest, TestTopControlHidingResizeDoesntClampMainFrame)
EXPECT_EQ(500, frameView.scrollPositionDouble().y());
// Now send the resize, make sure the scroll offset doesn't change.
- webViewImpl()->setTopControlsHeight(500, false);
- webViewImpl()->resize(IntSize(1000, 1500));
+ webViewImpl()->resizeWithTopControls(WebSize(1000, 1500), 500, false);
EXPECT_EQ(500, frameView.scrollPositionDouble().y());
}
« no previous file with comments | « third_party/WebKit/Source/web/tests/TopControlsTest.cpp ('k') | third_party/WebKit/Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698