| Index: third_party/WebKit/Source/web/tests/ScrollbarsTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/tests/ScrollbarsTest.cpp b/third_party/WebKit/Source/web/tests/ScrollbarsTest.cpp
|
| index a97e23189a1e5c67ac13a5393abe715013f503f2..17e1549b0cb421692ce58d2c55547c2945e53655 100644
|
| --- a/third_party/WebKit/Source/web/tests/ScrollbarsTest.cpp
|
| +++ b/third_party/WebKit/Source/web/tests/ScrollbarsTest.cpp
|
| @@ -45,6 +45,65 @@ TEST_F(ScrollbarsTest, DocumentStyleRecalcPreservesScrollbars) {
|
| ASSERT_TRUE(plsa->verticalScrollbar() && plsa->horizontalScrollbar());
|
| }
|
|
|
| +// Ensure that causing a change in scrollbar existence causes a nested layout
|
| +// to recalculate the existence of the opposite scrollbar. The bug here was
|
| +// caused by trying to avoid the layout when overlays are enabled but not
|
| +// checking whether the scrollbars should be custom - which do take up layout
|
| +// space. https://crbug.com/668387.
|
| +TEST_F(ScrollbarsTest, CustomScrollbarsCauseLayoutOnExistenceChange) {
|
| + // The bug reproduces only with RLS off. When RLS ships we can keep the test
|
| + // but remove this setting.
|
| + ScopedRootLayerScrollingForTest turnOffRootLayerScrolling(false);
|
| +
|
| + // This test is specifically checking the behavior when overlay scrollbars
|
| + // are enabled.
|
| + DCHECK(ScrollbarTheme::theme().usesOverlayScrollbars());
|
| +
|
| + webView().resize(WebSize(800, 600));
|
| + SimRequest request("https://example.com/test.html", "text/html");
|
| + loadURL("https://example.com/test.html");
|
| + request.complete(
|
| + "<!DOCTYPE html>"
|
| + "<style>"
|
| + " ::-webkit-scrollbar {"
|
| + " height: 16px;"
|
| + " width: 16px"
|
| + " }"
|
| + " ::-webkit-scrollbar-thumb {"
|
| + " background-color: rgba(0,0,0,.2);"
|
| + " }"
|
| + " html, body{"
|
| + " margin: 0;"
|
| + " height: 100%;"
|
| + " }"
|
| + " .box {"
|
| + " width: 100%;"
|
| + " height: 100%;"
|
| + " }"
|
| + " .transformed {"
|
| + " transform: translateY(100px);"
|
| + " }"
|
| + "</style>"
|
| + "<div id='box' class='box'></div>");
|
| +
|
| + ScrollableArea* layoutViewport =
|
| + document().view()->layoutViewportScrollableArea();
|
| +
|
| + compositor().beginFrame();
|
| + ASSERT_FALSE(layoutViewport->verticalScrollbar());
|
| + ASSERT_FALSE(layoutViewport->horizontalScrollbar());
|
| +
|
| + // Adding translation will cause a vertical scrollbar to appear but not dirty
|
| + // layout otherwise. Ensure the change of scrollbar causes a layout to
|
| + // recalculate the page width with the vertical scrollbar added.
|
| + mainFrame().executeScript(WebScriptSource(
|
| + "document.getElementById('box').className = 'box transformed';"));
|
| + compositor().beginFrame();
|
| +
|
| + ASSERT_TRUE(layoutViewport->verticalScrollbar());
|
| + ASSERT_FALSE(layoutViewport->horizontalScrollbar());
|
| +}
|
| +
|
| typedef bool TestParamOverlayScrollbar;
|
| class ScrollbarAppearanceTest
|
| : public SimTest,
|
|
|