Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1439)

Unified Diff: Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp

Issue 1292513002: Create custom scrollbars when html element has overflow:scroll (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Comment 1's: LayoutTests failures Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/paint/DeprecatedPaintLayerScrollableArea.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp
diff --git a/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp b/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp
index 75b2999646e092109c931114f7a27add34ba4c50..d3d4ae65f767ab64ae883ce64b0e8ab7522ef266 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,14 +686,14 @@ 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())
+ // overflow:auto may need to lay out again if scrollbars got added/removed and even on reconstruction of scrollbars
+ // from native to custom or vice versa also needs to layout again.
+ 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)
MuVen 2015/08/18 13:20:01 in case of overflow-x:scroll and overflow-y:auto,
setHasHorizontalScrollbar(hasHorizontalOverflow);
- if (box().hasAutoVerticalScrollbar())
+ if (box().hasAutoVerticalScrollbar() || box().style()->overflowY() == OSCROLL)
setHasVerticalScrollbar(hasVerticalOverflow);
if (hasVerticalOverflow || hasHorizontalOverflow)
@@ -698,21 +705,19 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout()
if (box().document().hasAnnotatedRegions())
box().document().setAnnotatedRegionsDirty(true);
- if (box().style()->overflowX() == OAUTO || box().style()->overflowY() == OAUTO) {
- 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.layoutBlock(true);
- } else {
- box().layout();
- }
- m_inOverflowRelayout = false;
+ 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(horizontalScrollBarChanged, verticalScrollBarChanged);
+ block.layoutBlock(true);
+ } else {
+ box().layout();
}
+ m_inOverflowRelayout = false;
}
}
@@ -958,6 +963,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;
« no previous file with comments | « Source/core/paint/DeprecatedPaintLayerScrollableArea.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698