Chromium Code Reviews| Index: Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp |
| diff --git a/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp b/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp |
| index 75b2999646e092109c931114f7a27add34ba4c50..b87e15cbed28e44fec7c60dd1dafdf0fa7a12af2 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(); |
| @@ -679,15 +686,17 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout() |
| 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); |
| + // overflow:auto may need to lay out again if scrollbars got added/removed and even on reconstruction of scrollbars |
|
skobes
2015/08/19 19:40:18
Rephrase this comment:
// We need to layout a
MuVen
2015/08/19 20:37:33
Done.
|
| + // from native to custom or vice versa also needs to layout again. |
| + bool horizontalScrollBarChanged = (box().hasAutoHorizontalScrollbar() && (hasHorizontalScrollbar() != hasHorizontalOverflow)) |
| + || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar()); |
|
skobes
2015/08/19 19:40:17
fix indentation
MuVen
2015/08/19 20:37:33
Done.
|
| + bool verticalScrollBarChanged = (box().hasAutoVerticalScrollbar() && (hasVerticalScrollbar() != hasVerticalOverflow)) |
| + || (box().style()->overflowY() == OSCROLL && !verticalScrollbar()); |
| + if (!visualViewportSuppliesScrollbars() && (horizontalScrollBarChanged || verticalScrollBarChanged)) { |
| + if (box().hasAutoHorizontalScrollbar() || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar())) |
| + setHasHorizontalScrollbar(true); |
|
skobes
2015/08/19 19:40:18
This still looks wrong. Auto and OSCROLL are sepa
MuVen
2015/08/19 20:37:33
True, Miss-read your previous comment, Even i was
|
| + if (box().hasAutoVerticalScrollbar() || (box().style()->overflowY() == OSCROLL && !verticalScrollbar())) |
| + setHasVerticalScrollbar(true); |
| if (hasVerticalOverflow || hasHorizontalOverflow) |
| updateScrollCornerStyle(); |
| @@ -698,15 +707,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(); |
| @@ -958,6 +967,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; |