| Index: third_party/WebKit/Source/core/frame/FrameView.cpp
|
| diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp
|
| index d7af7ba56a5426ac3ae365a376c9ffdab5dac2b4..bfb6a6b1c35d061bca81b00efe0d62f30baae28b 100644
|
| --- a/third_party/WebKit/Source/core/frame/FrameView.cpp
|
| +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
|
| @@ -89,6 +89,7 @@
|
| #include "core/page/FocusController.h"
|
| #include "core/page/FrameTree.h"
|
| #include "core/page/Page.h"
|
| +#include "core/page/scrolling/RootScrollerUtil.h"
|
| #include "core/page/scrolling/ScrollingCoordinator.h"
|
| #include "core/page/scrolling/TopDocumentRootScrollerController.h"
|
| #include "core/paint/FramePainter.h"
|
| @@ -1967,18 +1968,18 @@ void FrameView::scrollbarExistenceDidChange() {
|
| if (!frame().view())
|
| return;
|
|
|
| - bool hasOverlayScrollbars = this->hasOverlayScrollbars();
|
| + bool usesOverlayScrollbars = ScrollbarTheme::theme().usesOverlayScrollbars();
|
|
|
| // FIXME: this call to layout() could be called within FrameView::layout(),
|
| // but before performLayout(), causing double-layout. See also
|
| // crbug.com/429242.
|
| - if (!hasOverlayScrollbars && needsLayout())
|
| + if (!usesOverlayScrollbars && needsLayout())
|
| layout();
|
|
|
| if (!layoutViewItem().isNull() && layoutViewItem().usesCompositing()) {
|
| layoutViewItem().compositor()->frameViewScrollbarsExistenceDidChange();
|
|
|
| - if (!hasOverlayScrollbars)
|
| + if (!usesOverlayScrollbars)
|
| layoutViewItem().compositor()->frameViewDidChangeSize();
|
| }
|
| }
|
| @@ -2667,6 +2668,25 @@ FrameView* FrameView::parentFrameView() const {
|
| return nullptr;
|
| }
|
|
|
| +void FrameView::didChangeGlobalRootScroller() {
|
| + if (!m_frame->settings() || !m_frame->settings()->viewportEnabled())
|
| + return;
|
| +
|
| + // Avoid drawing two sets of scrollbars when visual viewport is enabled.
|
| + bool hasHorizontalScrollbar = horizontalScrollbar();
|
| + bool hasVerticalScrollbar = verticalScrollbar();
|
| + bool shouldHaveHorizontalScrollbar = false;
|
| + bool shouldHaveVerticalScrollbar = false;
|
| + computeScrollbarExistence(shouldHaveHorizontalScrollbar,
|
| + shouldHaveVerticalScrollbar, contentsSize());
|
| + m_scrollbarManager.setHasHorizontalScrollbar(shouldHaveHorizontalScrollbar);
|
| + m_scrollbarManager.setHasVerticalScrollbar(shouldHaveVerticalScrollbar);
|
| +
|
| + if (hasHorizontalScrollbar != shouldHaveHorizontalScrollbar ||
|
| + hasVerticalScrollbar != shouldHaveVerticalScrollbar)
|
| + scrollbarExistenceDidChange();
|
| +}
|
| +
|
| void FrameView::updateWidgetGeometriesIfNeeded() {
|
| if (!m_needsUpdateWidgetGeometries)
|
| return;
|
| @@ -3491,9 +3511,21 @@ void FrameView::removeChild(Widget* child) {
|
| m_children.remove(child);
|
| }
|
|
|
| -bool FrameView::visualViewportSuppliesScrollbars() const {
|
| - return m_frame->isMainFrame() && m_frame->settings() &&
|
| - m_frame->settings()->viewportEnabled();
|
| +bool FrameView::visualViewportSuppliesScrollbars() {
|
| + // On desktop, we always use the layout viewport's scrollbars.
|
| + if (!m_frame->settings() || !m_frame->settings()->viewportEnabled() ||
|
| + !m_frame->document() || !m_frame->host())
|
| + return false;
|
| +
|
| + const TopDocumentRootScrollerController& controller =
|
| + m_frame->host()->globalRootScrollerController();
|
| +
|
| + if (!controller.globalRootScroller())
|
| + return false;
|
| +
|
| + return RootScrollerUtil::scrollableAreaFor(
|
| + *controller.globalRootScroller()) ==
|
| + layoutViewportScrollableArea();
|
| }
|
|
|
| AXObjectCache* FrameView::axObjectCache() const {
|
| @@ -3742,8 +3774,9 @@ void FrameView::computeScrollbarExistence(
|
| bool& newHasHorizontalScrollbar,
|
| bool& newHasVerticalScrollbar,
|
| const IntSize& docSize,
|
| - ComputeScrollbarExistenceOption option) const {
|
| - if (m_frame->settings() && m_frame->settings()->hideScrollbars()) {
|
| + ComputeScrollbarExistenceOption option) {
|
| + if ((m_frame->settings() && m_frame->settings()->hideScrollbars()) ||
|
| + visualViewportSuppliesScrollbars()) {
|
| newHasHorizontalScrollbar = false;
|
| newHasVerticalScrollbar = false;
|
| return;
|
|
|