| Index: third_party/WebKit/Source/web/tests/TopControlsTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/tests/TopControlsTest.cpp b/third_party/WebKit/Source/web/tests/TopControlsTest.cpp
|
| index 3785e9b0688e19accb10f0883ccada7669a3ea5a..faf99c2115e1bcbea0780ddba342896b0fe5ef4c 100644
|
| --- a/third_party/WebKit/Source/web/tests/TopControlsTest.cpp
|
| +++ b/third_party/WebKit/Source/web/tests/TopControlsTest.cpp
|
| @@ -158,7 +158,7 @@ TEST_F(TopControlsTest, MAYBE(HideOnScrollDown))
|
| {
|
| WebViewImpl* webView = initialize();
|
| // initialize top controls to be shown.
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
|
|
| webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin));
|
| @@ -185,7 +185,7 @@ TEST_F(TopControlsTest, MAYBE(ShowOnScrollUp))
|
| {
|
| WebViewImpl* webView = initialize();
|
| // initialize top controls to be hidden.
|
| - webView->setTopControlsHeight(50.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, false);
|
| webView->topControls().setShownRatio(0);
|
|
|
| webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin));
|
| @@ -206,7 +206,7 @@ TEST_F(TopControlsTest, MAYBE(ScrollDownThenUp))
|
| {
|
| WebViewImpl* webView = initialize();
|
| // initialize top controls to be shown and position page at 100px.
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
| frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), ProgrammaticScroll);
|
|
|
| @@ -244,7 +244,7 @@ TEST_F(TopControlsTest, MAYBE(ScrollUpThenDown))
|
| {
|
| WebViewImpl* webView = initialize();
|
| // initialize top controls to be hidden and position page at 100px.
|
| - webView->setTopControlsHeight(50.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, false);
|
| webView->topControls().setShownRatio(0);
|
| frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), ProgrammaticScroll);
|
|
|
| @@ -271,7 +271,7 @@ TEST_F(TopControlsTest, MAYBE(HorizontalScroll))
|
| {
|
| WebViewImpl* webView = initialize();
|
| // initialize top controls to be shown.
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
|
|
| webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin));
|
| @@ -295,7 +295,7 @@ TEST_F(TopControlsTest, MAYBE(PageScaleHasNoImpact))
|
| webView->setPageScaleFactor(2.0);
|
|
|
| // Initialize top controls to be shown.
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
|
|
| webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin));
|
| @@ -341,7 +341,7 @@ TEST_F(TopControlsTest, MAYBE(FloatingPointSlippage))
|
| webView->setPageScaleFactor(2.0);
|
|
|
| // Initialize top controls to be shown.
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
|
|
| webView->topControls().scrollBegin();
|
| @@ -358,7 +358,7 @@ TEST_F(TopControlsTest, MAYBE(FloatingPointSlippage))
|
| TEST_F(TopControlsTest, MAYBE(ScrollableSubregionScrollFirst))
|
| {
|
| WebViewImpl* webView = initialize("overflow-scrolling.html");
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
| frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 50), ProgrammaticScroll);
|
|
|
| @@ -400,7 +400,7 @@ TEST_F(TopControlsTest, MAYBE(ScrollableSubregionScrollFirst))
|
| TEST_F(TopControlsTest, MAYBE(ScrollableIframeScrollFirst))
|
| {
|
| WebViewImpl* webView = initialize("iframe-scrolling.html");
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
| frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 50), ProgrammaticScroll);
|
|
|
| @@ -441,13 +441,13 @@ TEST_F(TopControlsTest, MAYBE(ScrollableIframeScrollFirst))
|
| TEST_F(TopControlsTest, MAYBE(HeightChangeMaintainsVisibility))
|
| {
|
| WebViewImpl* webView = initialize();
|
| - webView->setTopControlsHeight(20.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 20.f, false);
|
| webView->topControls().setShownRatio(0);
|
|
|
| - webView->setTopControlsHeight(20.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 20.f, false);
|
| EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset());
|
|
|
| - webView->setTopControlsHeight(40.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 40.f, false);
|
| EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset());
|
|
|
| // Scroll up to show top controls.
|
| @@ -455,7 +455,7 @@ TEST_F(TopControlsTest, MAYBE(HeightChangeMaintainsVisibility))
|
| EXPECT_FLOAT_EQ(40.f, webView->topControls().contentOffset());
|
|
|
| // Changing height of a fully shown top controls should correctly adjust content offset
|
| - webView->setTopControlsHeight(30.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 30.f, false);
|
| EXPECT_FLOAT_EQ(30.f, webView->topControls().contentOffset());
|
| }
|
|
|
| @@ -463,7 +463,7 @@ TEST_F(TopControlsTest, MAYBE(HeightChangeMaintainsVisibility))
|
| TEST_F(TopControlsTest, MAYBE(ZeroHeightMeansNoEffect))
|
| {
|
| WebViewImpl* webView = initialize();
|
| - webView->setTopControlsHeight(0, false);
|
| + webView->resizeWithTopControls(webView->size(), 0, false);
|
| webView->topControls().setShownRatio(0);
|
| frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), ProgrammaticScroll);
|
|
|
| @@ -486,7 +486,7 @@ TEST_F(TopControlsTest, MAYBE(ScrollUpPastLimitDoesNotHide))
|
| {
|
| WebViewImpl* webView = initialize();
|
| // Initialize top controls to be shown
|
| - webView->setTopControlsHeight(50.f, true);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, true);
|
| webView->topControls().setShownRatio(1);
|
| // Use 2x scale so that both visual viewport and frameview are scrollable
|
| webView->setPageScaleFactor(2.0);
|
| @@ -518,7 +518,7 @@ TEST_F(TopControlsTest, MAYBE(ScrollUpPastLimitDoesNotHide))
|
| TEST_F(TopControlsTest, MAYBE(StateConstraints))
|
| {
|
| WebViewImpl* webView = initialize();
|
| - webView->setTopControlsHeight(50.f, false);
|
| + webView->resizeWithTopControls(webView->size(), 50.f, false);
|
| frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), ProgrammaticScroll);
|
|
|
| // Setting permitted state should not change content offset
|
| @@ -567,11 +567,10 @@ TEST_F(TopControlsTest, MAYBE(DontAffectLayoutHeight))
|
| {
|
| // Initialize with the top controls showing.
|
| WebViewImpl* webView = initialize("percent-height.html");
|
| - webView->setTopControlsHeight(100.f, true);
|
| + webView->resizeWithTopControls(WebSize(400, 300), 100.f, true);
|
| webView->updateTopControlsState(
|
| WebTopControlsBoth, WebTopControlsShown, false);
|
| webView->topControls().setShownRatio(1);
|
| - webView->resize(WebSize(400, 300));
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(100.f, webView->topControls().contentOffset());
|
| @@ -591,8 +590,7 @@ TEST_F(TopControlsTest, MAYBE(DontAffectLayoutHeight))
|
|
|
| // Hide the top controls.
|
| verticalScroll(-100.f);
|
| - webView->setTopControlsHeight(100.f, false);
|
| - webView->resize(WebSize(400, 400));
|
| + webView->resizeWithTopControls(WebSize(400, 400), 100.f, false);
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(0.f, webView->topControls().contentOffset());
|
| @@ -612,11 +610,10 @@ TEST_F(TopControlsTest, MAYBE(DontAffectVHUnits))
|
| {
|
| // Initialize with the top controls showing.
|
| WebViewImpl* webView = initialize("vh-height.html");
|
| - webView->setTopControlsHeight(100.f, true);
|
| + webView->resizeWithTopControls(WebSize(400, 300), 100.f, true);
|
| webView->updateTopControlsState(
|
| WebTopControlsBoth, WebTopControlsShown, false);
|
| webView->topControls().setShownRatio(1);
|
| - webView->resize(WebSize(400, 300));
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(100.f, webView->topControls().contentOffset());
|
| @@ -636,8 +633,7 @@ TEST_F(TopControlsTest, MAYBE(DontAffectVHUnits))
|
|
|
| // Hide the top controls.
|
| verticalScroll(-100.f);
|
| - webView->setTopControlsHeight(100.f, false);
|
| - webView->resize(WebSize(400, 400));
|
| + webView->resizeWithTopControls(WebSize(400, 400), 100.f, false);
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(0.f, webView->topControls().contentOffset());
|
| @@ -659,11 +655,10 @@ TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsWithScale))
|
| {
|
| // Initialize with the top controls showing.
|
| WebViewImpl* webView = initialize("vh-height-width-800.html");
|
| - webView->setTopControlsHeight(100.f, true);
|
| + webView->resizeWithTopControls(WebSize(400, 300), 100.f, true);
|
| webView->updateTopControlsState(
|
| WebTopControlsBoth, WebTopControlsShown, false);
|
| webView->topControls().setShownRatio(1);
|
| - webView->resize(WebSize(400, 300));
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(100.f, webView->topControls().contentOffset());
|
| @@ -690,8 +685,7 @@ TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsWithScale))
|
|
|
| // Hide the top controls.
|
| verticalScroll(-100.f);
|
| - webView->setTopControlsHeight(100.f, false);
|
| - webView->resize(WebSize(400, 400));
|
| + webView->resizeWithTopControls(WebSize(400, 400), 100.f, false);
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(0.f, webView->topControls().contentOffset());
|
| @@ -714,11 +708,10 @@ TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsUseLayoutSize))
|
| {
|
| // Initialize with the top controls showing.
|
| WebViewImpl* webView = initialize("vh-height-width-800-extra-wide.html");
|
| - webView->setTopControlsHeight(100.f, true);
|
| + webView->resizeWithTopControls(WebSize(400, 300), 100.f, true);
|
| webView->updateTopControlsState(
|
| WebTopControlsBoth, WebTopControlsShown, false);
|
| webView->topControls().setShownRatio(1);
|
| - webView->resize(WebSize(400, 300));
|
| webView->updateAllLifecyclePhases();
|
|
|
| ASSERT_EQ(100.f, webView->topControls().contentOffset());
|
| @@ -733,4 +726,94 @@ TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsUseLayoutSize))
|
| EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height());
|
| }
|
|
|
| +// This tests that the viewport remains anchored when top controls are brought
|
| +// in while the document is fully scrolled. This normally causes clamping of the
|
| +// visual viewport to keep it bounded by the layout viewport so we're testing
|
| +// that the viewport anchoring logic is working to keep the view unchanged.
|
| +TEST_F(TopControlsTest, MAYBE(AnchorViewportDuringTopControlsAdjustment))
|
| +{
|
| + int contentHeight = 1016;
|
| + int layoutViewportHeight = 500;
|
| + int visualViewportHeight = 500;
|
| + int topControlsHeight = 100;
|
| + int pageScale = 2;
|
| + int minScale = 1;
|
| +
|
| + // Initialize with the top controls showing.
|
| + WebViewImpl* webView = initialize("large-div.html");
|
| + webViewImpl()->setDefaultPageScaleLimits(minScale, 5);
|
| + webView->resizeWithTopControls(
|
| + WebSize(800, layoutViewportHeight),
|
| + topControlsHeight,
|
| + true);
|
| + webView->updateTopControlsState(
|
| + WebTopControlsBoth, WebTopControlsShown, false);
|
| + webView->topControls().setShownRatio(1);
|
| + webView->updateAllLifecyclePhases();
|
| +
|
| + FrameView* view = frame()->view();
|
| + ScrollableArea* rootViewport = frame()->view()->getScrollableArea();
|
| +
|
| + int expectedVisualOffset =
|
| + ((layoutViewportHeight + topControlsHeight / minScale) * pageScale
|
| + - (visualViewportHeight + topControlsHeight))
|
| + / pageScale;
|
| + int expectedLayoutOffset =
|
| + contentHeight - (layoutViewportHeight + topControlsHeight / minScale);
|
| + int expectedRootOffset = expectedVisualOffset + expectedLayoutOffset;
|
| +
|
| + // Zoom in to 2X and fully scroll both viewports.
|
| + webView->setPageScaleFactor(pageScale);
|
| + {
|
| + webView->handleInputEvent(
|
| + generateEvent(WebInputEvent::GestureScrollBegin));
|
| + webView->handleInputEvent(
|
| + generateEvent(WebInputEvent::GestureScrollUpdate, 0, -10000));
|
| +
|
| + ASSERT_EQ(0.f, webView->topControls().contentOffset());
|
| +
|
| + EXPECT_EQ(expectedVisualOffset, visualViewport().location().y());
|
| + EXPECT_EQ(expectedLayoutOffset,
|
| + view->layoutViewportScrollableArea()->scrollPosition().y());
|
| + EXPECT_EQ(expectedRootOffset, rootViewport->scrollPosition().y());
|
| +
|
| + webView->handleInputEvent(
|
| + generateEvent(WebInputEvent::GestureScrollEnd));
|
| + }
|
| +
|
| + // Commit the top controls resize so that the top controls do not shrink the
|
| + // layout size. This should not have moved any of the viewports.
|
| + webView->resizeWithTopControls(
|
| + WebSize(800, layoutViewportHeight + topControlsHeight),
|
| + topControlsHeight,
|
| + false);
|
| + webView->updateAllLifecyclePhases();
|
| + ASSERT_EQ(expectedVisualOffset, visualViewport().location().y());
|
| + ASSERT_EQ(expectedLayoutOffset,
|
| + view->layoutViewportScrollableArea()->scrollPosition().y());
|
| + ASSERT_EQ(expectedRootOffset, rootViewport->scrollPosition().y());
|
| +
|
| + // Now scroll back up just enough to show the top controls. The top controls
|
| + // should shrink both viewports but the layout viewport by a greater amount.
|
| + // This means the visual viewport's offset must be clamped to keep it within
|
| + // the layout viewport. Make sure we adjust the scroll position to account
|
| + // for this and keep the visual viewport at the same location relative to
|
| + // the document (i.e. the user shouldn't see a movement).
|
| + {
|
| + webView->handleInputEvent(
|
| + generateEvent(WebInputEvent::GestureScrollBegin));
|
| + webView->handleInputEvent(
|
| + generateEvent(WebInputEvent::GestureScrollUpdate, 0, 80));
|
| +
|
| + visualViewport().clampToBoundaries();
|
| + view->setScrollPosition(view->scrollPosition(), ProgrammaticScroll);
|
| +
|
| + ASSERT_EQ(80.f, webView->topControls().contentOffset());
|
| + EXPECT_EQ(expectedRootOffset, rootViewport->scrollPosition().y());
|
| +
|
| + webView->handleInputEvent(
|
| + generateEvent(WebInputEvent::GestureScrollEnd));
|
| + }
|
| +}
|
| +
|
| } // namespace blink
|
|
|