Index: Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp |
diff --git a/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp b/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp |
index 75b2999646e092109c931114f7a27add34ba4c50..853f6f0853950a55524eb84125d4c8d1b02c66f2 100644 |
--- a/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp |
+++ b/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp |
@@ -646,6 +646,13 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout() |
{ |
ASSERT(box().hasOverflowClip()); |
+ if (needsScrollbarReconstruction()) { |
+ if (m_hBar) |
+ destroyScrollbar(HorizontalScrollbar); |
+ if (m_vBar) |
+ destroyScrollbar(VerticalScrollbar); |
+ } |
+ |
DoubleSize originalScrollOffset = adjustedScrollOffset(); |
computeScrollDimensions(); |
@@ -673,21 +680,18 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout() |
if (box().style()->overflowY() == OSCROLL && verticalScrollbar()) |
verticalScrollbar()->setEnabled(hasVerticalOverflow); |
} |
- if (hasOverlayScrollbars()) { |
- if (!scrollSize(HorizontalScrollbar)) |
- setHasHorizontalScrollbar(false); |
- if (!scrollSize(VerticalScrollbar)) |
- setHasVerticalScrollbar(false); |
- } |
- // overflow:auto may need to lay out again if scrollbars got added/removed. |
- bool autoHorizontalScrollBarChanged = box().hasAutoHorizontalScrollbar() && (hasHorizontalScrollbar() != hasHorizontalOverflow); |
- bool autoVerticalScrollBarChanged = box().hasAutoVerticalScrollbar() && (hasVerticalScrollbar() != hasVerticalOverflow); |
- if (!visualViewportSuppliesScrollbars() && (autoHorizontalScrollBarChanged || autoVerticalScrollBarChanged)) { |
- if (box().hasAutoHorizontalScrollbar()) |
- setHasHorizontalScrollbar(hasHorizontalOverflow); |
- if (box().hasAutoVerticalScrollbar()) |
- setHasVerticalScrollbar(hasVerticalOverflow); |
+ // We need to layout again if scrollbars are added or removed by overflow:auto, |
+ // or by changing between native and custom. |
+ bool horizontalScrollBarChanged = (box().hasAutoHorizontalScrollbar() && (hasHorizontalScrollbar() != hasHorizontalOverflow)) |
+ || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar()); |
+ bool verticalScrollBarChanged = (box().hasAutoVerticalScrollbar() && (hasVerticalScrollbar() != hasVerticalOverflow)) |
+ || (box().style()->overflowY() == OSCROLL && !verticalScrollbar()); |
+ if (!visualViewportSuppliesScrollbars() && (horizontalScrollBarChanged || verticalScrollBarChanged)) { |
+ if (box().hasAutoHorizontalScrollbar() || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar())) |
+ setHasHorizontalScrollbar(box().style()->overflowX() == OSCROLL ? true : hasHorizontalOverflow); |
+ if (box().hasAutoVerticalScrollbar() || (box().style()->overflowY() == OSCROLL && !verticalScrollbar())) |
+ setHasVerticalScrollbar(box().style()->overflowY() == OSCROLL ? true : hasVerticalOverflow); |
if (hasVerticalOverflow || hasHorizontalOverflow) |
updateScrollCornerStyle(); |
@@ -698,15 +702,15 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout() |
if (box().document().hasAnnotatedRegions()) |
box().document().setAnnotatedRegionsDirty(true); |
- if (box().style()->overflowX() == OAUTO || box().style()->overflowY() == OAUTO) { |
+ // Our proprietary overflow: overlay value doesn't trigger a layout. |
+ if ((horizontalScrollBarChanged && box().style()->overflowX() != OOVERLAY) || (verticalScrollBarChanged && box().style()->overflowY() != OOVERLAY)) { |
if (!m_inOverflowRelayout) { |
- // Our proprietary overflow: overlay value doesn't trigger a layout. |
m_inOverflowRelayout = true; |
SubtreeLayoutScope layoutScope(box()); |
layoutScope.setNeedsLayout(&box(), LayoutInvalidationReason::ScrollbarChanged); |
if (box().isLayoutBlock()) { |
LayoutBlock& block = toLayoutBlock(box()); |
- block.scrollbarsChanged(autoHorizontalScrollBarChanged, autoVerticalScrollBarChanged); |
+ block.scrollbarsChanged(horizontalScrollBarChanged, verticalScrollBarChanged); |
block.layoutBlock(true); |
} else { |
box().layout(); |
@@ -731,6 +735,13 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout() |
} |
} |
+ if (hasOverlayScrollbars()) { |
+ if (!scrollSize(HorizontalScrollbar)) |
+ setHasHorizontalScrollbar(false); |
+ if (!scrollSize(VerticalScrollbar)) |
+ setHasVerticalScrollbar(false); |
+ } |
+ |
bool hasOverflow = hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow(); |
updateScrollableAreaSet(hasOverflow); |
@@ -958,6 +969,15 @@ static inline LayoutObject* layoutObjectForScrollbar(LayoutObject& layoutObject) |
return &layoutObject; |
} |
+bool DeprecatedPaintLayerScrollableArea::needsScrollbarReconstruction() const |
+{ |
+ LayoutObject* actualLayoutObject = layoutObjectForScrollbar(box()); |
+ bool shouldUseCustom = actualLayoutObject->isBox() && actualLayoutObject->style()->hasPseudoStyle(SCROLLBAR); |
+ bool hasAnyScrollbar = hasScrollbar(); |
+ bool hasCustom = (m_hBar && m_hBar->isCustomScrollbar()) || (m_vBar && m_vBar->isCustomScrollbar()); |
+ return hasAnyScrollbar && (shouldUseCustom != hasCustom); |
+} |
+ |
PassRefPtrWillBeRawPtr<Scrollbar> DeprecatedPaintLayerScrollableArea::createScrollbar(ScrollbarOrientation orientation) |
{ |
RefPtrWillBeRawPtr<Scrollbar> widget = nullptr; |