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

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: addressed review comments 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..f7f23f79bc10af40d01c98fd5125cc20acd816ec 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 && !horizontalScrollbar()))
setHasHorizontalScrollbar(hasHorizontalOverflow);
skobes 2015/08/17 22:59:01 This seems wrong for OSCROLL, which should show th
- if (box().hasAutoVerticalScrollbar())
+ if (box().hasAutoVerticalScrollbar() || (box().style()->overflowY() == OSCROLL && !verticalScrollbar()))
setHasVerticalScrollbar(hasVerticalOverflow);
if (hasVerticalOverflow || hasHorizontalOverflow)
@@ -698,7 +705,7 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout()
if (box().document().hasAnnotatedRegions())
box().document().setAnnotatedRegionsDirty(true);
- if (box().style()->overflowX() == OAUTO || box().style()->overflowY() == OAUTO) {
+ if (box().style()->overflowX() == OAUTO || box().style()->overflowY() == OAUTO || box().style()->overflowX() == OSCROLL || box().style()->overflowY() == OSCROLL) {
skobes 2015/08/17 22:59:01 Is this if statement even needed? We are already
MuVen 2015/08/18 14:38:53 We may need this statement. Technically if we see,
if (!m_inOverflowRelayout) {
// Our proprietary overflow: overlay value doesn't trigger a layout.
m_inOverflowRelayout = true;
@@ -706,7 +713,7 @@ void DeprecatedPaintLayerScrollableArea::updateAfterLayout()
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 +965,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