Index: third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
index a7f8e65fea310bcb907693b82ea68472ce516063..676f6d6ac30b0f28c2dd8a3d4d7caf43757960a9 100644 |
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp |
@@ -86,6 +86,7 @@ |
#include "platform/geometry/FloatRect.h" |
#include "platform/network/ResourceError.h" |
#include "platform/scroll/ScrollbarTheme.h" |
+#include "platform/scroll/ScrollbarThemeOverlayMock.h" |
#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" |
#include "platform/testing/URLTestHelpers.h" |
#include "platform/testing/UnitTestHelpers.h" |
@@ -10345,6 +10346,89 @@ TEST_F(WebFrameTest, HidingScrollbarsOnScrollableAreaDisablesScrollbars) { |
EXPECT_TRUE(scrollerArea->verticalScrollbar()->enabled()); |
} |
+static void disableCompositing(WebSettings* settings) { |
+ settings->setAcceleratedCompositingEnabled(false); |
+ settings->setPreferCompositingToLCDTextEnabled(false); |
+} |
+ |
+// Make sure overlay scrollbars on non-composited scrollers fade out and set |
+// the hidden bit as needed. |
+TEST_F(WebFrameTest, TestNonCompositedOverlayScrollbarsFade) { |
+ FrameTestHelpers::WebViewHelper webViewHelper; |
+ WebViewImpl* webViewImpl = webViewHelper.initialize( |
+ true, nullptr, nullptr, nullptr, &disableCompositing); |
+ |
+ constexpr double kMockOverlayFadeOutDelayMs = 5.0; |
+ |
+ ScrollbarTheme& theme = ScrollbarTheme::theme(); |
+ // This test relies on mock overlay scrollbars. |
+ ASSERT_TRUE(theme.isMockTheme()); |
+ ASSERT_TRUE(theme.usesOverlayScrollbars()); |
+ ScrollbarThemeOverlayMock& mockOverlayTheme = |
+ (ScrollbarThemeOverlayMock&)theme; |
+ mockOverlayTheme.setOverlayScrollbarFadeOutDelay(kMockOverlayFadeOutDelayMs / |
+ 1000.0); |
+ |
+ webViewImpl->resizeWithBrowserControls(WebSize(640, 480), 0, false); |
+ |
+ WebURL baseURL = URLTestHelpers::toKURL("http://example.com/"); |
+ FrameTestHelpers::loadHTMLString(webViewImpl->mainFrame(), |
+ "<!DOCTYPE html>" |
+ "<style>" |
+ " #space {" |
+ " width: 1000px;" |
+ " height: 1000px;" |
+ " }" |
+ " #container {" |
+ " width: 200px;" |
+ " height: 200px;" |
+ " overflow: scroll;" |
+ " }" |
+ " div { height:1000px; width: 200px; }" |
+ "</style>" |
+ "<div id='container'>" |
+ " <div id='space'></div>" |
+ "</div>", |
+ baseURL); |
+ webViewImpl->updateAllLifecyclePhases(); |
+ |
+ WebLocalFrameImpl* frame = webViewHelper.webView()->mainFrameImpl(); |
+ Document* document = |
+ toLocalFrame(webViewImpl->page()->mainFrame())->document(); |
+ Element* container = document->getElementById("container"); |
+ ScrollableArea* scrollableArea = |
+ toLayoutBox(container->layoutObject())->getScrollableArea(); |
+ |
+ EXPECT_FALSE(scrollableArea->scrollbarsHidden()); |
+ testing::runDelayedTasks(kMockOverlayFadeOutDelayMs); |
+ EXPECT_TRUE(scrollableArea->scrollbarsHidden()); |
+ |
+ scrollableArea->setScrollOffset(ScrollOffset(10, 10), ProgrammaticScroll, |
+ ScrollBehaviorInstant); |
+ |
+ EXPECT_FALSE(scrollableArea->scrollbarsHidden()); |
+ testing::runDelayedTasks(kMockOverlayFadeOutDelayMs); |
+ EXPECT_TRUE(scrollableArea->scrollbarsHidden()); |
+ |
+ frame->executeScript(WebScriptSource( |
+ "document.getElementById('space').style.height = '500px';")); |
+ frame->view()->updateAllLifecyclePhases(); |
+ |
+ EXPECT_FALSE(scrollableArea->scrollbarsHidden()); |
+ testing::runDelayedTasks(kMockOverlayFadeOutDelayMs); |
+ EXPECT_TRUE(scrollableArea->scrollbarsHidden()); |
+ |
+ frame->executeScript(WebScriptSource( |
+ "document.getElementById('container').style.height = '300px';")); |
+ frame->view()->updateAllLifecyclePhases(); |
+ |
+ EXPECT_FALSE(scrollableArea->scrollbarsHidden()); |
+ testing::runDelayedTasks(kMockOverlayFadeOutDelayMs); |
+ EXPECT_TRUE(scrollableArea->scrollbarsHidden()); |
+ |
+ mockOverlayTheme.setOverlayScrollbarFadeOutDelay(0.0); |
+} |
+ |
TEST_F(WebFrameTest, UniqueNames) { |
registerMockedHttpURLLoad("frameset-repeated-name.html"); |
registerMockedHttpURLLoad("frameset-dest.html"); |