- Revision
- 198656
- Author
- [email protected]
- Date
- 2016-03-24 19:03:25 -0700 (Thu, 24 Mar 2016)
Log Message
[OS X] Overflow:scroll scrollbars do not obey overlay/always-on system preference changes
https://bugs.webkit.org/show_bug.cgi?id=155830
Reviewed by Simon Fraser.
When the scrollbar style changes, the available width of all ScrollableAreas change,
and therefore a relayout must occur.
Each ScrollableArea owns its own ScrollAnimator (if necessary). Upon creation, the
ScrollAnimator will start listening for changes to the system preference for
overlay / always-on scrollbars. When notified, the ScrollAnimator tells its owning
ScrollableArea that scrollbarStyleChanged().
For main-frame scrolling, FrameView overrides scrollbarStyleChanged and causes a
relayout. However, for overflow:scroll elements, no relayout is triggered. This
patch overrides availableContentSizeChanged() for RenderLayer (which is used for
overflow:scroll elements). This override triggers a relayout.
It also updates the mechanism in RenderBlock::recomputeLogicalWidth() to ensure that
a change in scrollbar size causes RenderBlockFlow::layoutBlock() to relayout its
children. This is appropriate because block child positioning is affected by
scrollbar size.
No new tests (for now). Presumably we could mock the message we receive when the
system preference is changed. However, I haven't implemented that yet.
* rendering/RenderBlock.cpp: Rename setHasBorderOrPaddingLogicalWidthChanged().
(WebCore::RenderBlock::styleDidChange):
(WebCore::RenderBlock::recomputeLogicalWidth):
* rendering/RenderBlock.h: Ditto.
(WebCore::RenderBlock::setShouldForceRelayoutChildren):
(WebCore::RenderBlock::shouldForceRelayoutChildren):
* rendering/RenderElement.cpp: Ditto.
(WebCore::RenderElement::RenderElement):
* rendering/RenderElement.h: Ditto.
(WebCore::RenderElement::setRenderBlockShouldForceRelayoutChildren):
(WebCore::RenderElement::renderBlockShouldForceRelayoutChildren):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::availableContentSizeChanged): Cause a relayout to occur.
* rendering/RenderLayer.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (198655 => 198656)
--- trunk/Source/WebCore/ChangeLog 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/ChangeLog 2016-03-25 02:03:25 UTC (rev 198656)
@@ -1,3 +1,46 @@
+2016-03-24 Myles C. Maxfield <[email protected]>
+
+ [OS X] Overflow:scroll scrollbars do not obey overlay/always-on system preference changes
+ https://bugs.webkit.org/show_bug.cgi?id=155830
+
+ Reviewed by Simon Fraser.
+
+ When the scrollbar style changes, the available width of all ScrollableAreas change,
+ and therefore a relayout must occur.
+
+ Each ScrollableArea owns its own ScrollAnimator (if necessary). Upon creation, the
+ ScrollAnimator will start listening for changes to the system preference for
+ overlay / always-on scrollbars. When notified, the ScrollAnimator tells its owning
+ ScrollableArea that scrollbarStyleChanged().
+
+ For main-frame scrolling, FrameView overrides scrollbarStyleChanged and causes a
+ relayout. However, for overflow:scroll elements, no relayout is triggered. This
+ patch overrides availableContentSizeChanged() for RenderLayer (which is used for
+ overflow:scroll elements). This override triggers a relayout.
+
+ It also updates the mechanism in RenderBlock::recomputeLogicalWidth() to ensure that
+ a change in scrollbar size causes RenderBlockFlow::layoutBlock() to relayout its
+ children. This is appropriate because block child positioning is affected by
+ scrollbar size.
+
+ No new tests (for now). Presumably we could mock the message we receive when the
+ system preference is changed. However, I haven't implemented that yet.
+
+ * rendering/RenderBlock.cpp: Rename setHasBorderOrPaddingLogicalWidthChanged().
+ (WebCore::RenderBlock::styleDidChange):
+ (WebCore::RenderBlock::recomputeLogicalWidth):
+ * rendering/RenderBlock.h: Ditto.
+ (WebCore::RenderBlock::setShouldForceRelayoutChildren):
+ (WebCore::RenderBlock::shouldForceRelayoutChildren):
+ * rendering/RenderElement.cpp: Ditto.
+ (WebCore::RenderElement::RenderElement):
+ * rendering/RenderElement.h: Ditto.
+ (WebCore::RenderElement::setRenderBlockShouldForceRelayoutChildren):
+ (WebCore::RenderElement::renderBlockShouldForceRelayoutChildren):
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::availableContentSizeChanged): Cause a relayout to occur.
+ * rendering/RenderLayer.h:
+
2016-03-24 Said Abou-Hallawa <sabouhallawa@apple,com>
Change NativeImagePtr for CG to be RetainPtr<CGImageRef>
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (198655 => 198656)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2016-03-25 02:03:25 UTC (rev 198656)
@@ -315,7 +315,7 @@
// It's possible for our border/padding to change, but for the overall logical width of the block to
// end up being the same. We keep track of this change so in layoutBlock, we can know to set relayoutChildren=true.
- setHasBorderOrPaddingLogicalWidthChanged(oldStyle && diff == StyleDifferenceLayout && needsLayout() && borderOrPaddingLogicalWidthChanged(oldStyle, &newStyle));
+ setShouldForceRelayoutChildren(oldStyle && diff == StyleDifferenceLayout && needsLayout() && borderOrPaddingLogicalWidthChanged(oldStyle, &newStyle));
}
RenderBlock* RenderBlock::continuationBefore(RenderObject* beforeChild)
@@ -975,7 +975,7 @@
updateLogicalWidth();
bool hasBorderOrPaddingLogicalWidthChanged = this->hasBorderOrPaddingLogicalWidthChanged();
- setHasBorderOrPaddingLogicalWidthChanged(false);
+ setShouldForceRelayoutChildren(false);
return oldWidth != logicalWidth() || hasBorderOrPaddingLogicalWidthChanged;
}
Modified: trunk/Source/WebCore/rendering/RenderBlock.h (198655 => 198656)
--- trunk/Source/WebCore/rendering/RenderBlock.h 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/rendering/RenderBlock.h 2016-03-25 02:03:25 UTC (rev 198656)
@@ -103,11 +103,11 @@
void setHasMarginBeforeQuirk(bool b) { setRenderBlockHasMarginBeforeQuirk(b); }
void setHasMarginAfterQuirk(bool b) { setRenderBlockHasMarginAfterQuirk(b); }
- void setHasBorderOrPaddingLogicalWidthChanged(bool b) { setRenderBlockHasBorderOrPaddingLogicalWidthChanged(b); }
+ void setShouldForceRelayoutChildren(bool b) { setRenderBlockShouldForceRelayoutChildren(b); }
bool hasMarginBeforeQuirk() const { return renderBlockHasMarginBeforeQuirk(); }
bool hasMarginAfterQuirk() const { return renderBlockHasMarginAfterQuirk(); }
- bool hasBorderOrPaddingLogicalWidthChanged() const { return renderBlockHasBorderOrPaddingLogicalWidthChanged(); }
+ bool hasBorderOrPaddingLogicalWidthChanged() const { return renderBlockShouldForceRelayoutChildren(); }
bool hasMarginBeforeQuirk(const RenderBox& child) const;
bool hasMarginAfterQuirk(const RenderBox& child) const;
Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (198655 => 198656)
--- trunk/Source/WebCore/rendering/RenderElement.cpp 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp 2016-03-25 02:03:25 UTC (rev 198656)
@@ -95,7 +95,7 @@
, m_hasContinuation(false)
, m_renderBlockHasMarginBeforeQuirk(false)
, m_renderBlockHasMarginAfterQuirk(false)
- , m_renderBlockHasBorderOrPaddingLogicalWidthChanged(false)
+ , m_renderBlockShouldForceRelayoutChildren(false)
, m_renderBlockFlowHasMarkupTruncation(false)
, m_renderBlockFlowLineLayoutPath(RenderBlockFlow::UndeterminedPath)
, m_firstChild(nullptr)
Modified: trunk/Source/WebCore/rendering/RenderElement.h (198655 => 198656)
--- trunk/Source/WebCore/rendering/RenderElement.h 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/rendering/RenderElement.h 2016-03-25 02:03:25 UTC (rev 198656)
@@ -264,10 +264,10 @@
void setRenderBlockHasMarginBeforeQuirk(bool b) { m_renderBlockHasMarginBeforeQuirk = b; }
void setRenderBlockHasMarginAfterQuirk(bool b) { m_renderBlockHasMarginAfterQuirk = b; }
- void setRenderBlockHasBorderOrPaddingLogicalWidthChanged(bool b) { m_renderBlockHasBorderOrPaddingLogicalWidthChanged = b; }
+ void setRenderBlockShouldForceRelayoutChildren(bool b) { m_renderBlockShouldForceRelayoutChildren = b; }
bool renderBlockHasMarginBeforeQuirk() const { return m_renderBlockHasMarginBeforeQuirk; }
bool renderBlockHasMarginAfterQuirk() const { return m_renderBlockHasMarginAfterQuirk; }
- bool renderBlockHasBorderOrPaddingLogicalWidthChanged() const { return m_renderBlockHasBorderOrPaddingLogicalWidthChanged; }
+ bool renderBlockShouldForceRelayoutChildren() const { return m_renderBlockShouldForceRelayoutChildren; }
void setRenderBlockFlowLineLayoutPath(unsigned u) { m_renderBlockFlowLineLayoutPath = u; }
void setRenderBlockFlowHasMarkupTruncation(bool b) { m_renderBlockFlowHasMarkupTruncation = b; }
@@ -330,7 +330,7 @@
unsigned m_renderBlockHasMarginBeforeQuirk : 1;
unsigned m_renderBlockHasMarginAfterQuirk : 1;
- unsigned m_renderBlockHasBorderOrPaddingLogicalWidthChanged : 1;
+ unsigned m_renderBlockShouldForceRelayoutChildren : 1;
unsigned m_renderBlockFlowHasMarkupTruncation : 1;
unsigned m_renderBlockFlowLineLayoutPath : 2;
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (198655 => 198656)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2016-03-25 02:03:25 UTC (rev 198656)
@@ -2916,6 +2916,17 @@
return contentsSize;
}
+void RenderLayer::availableContentSizeChanged(AvailableSizeChangeReason reason)
+{
+ ScrollableArea::availableContentSizeChanged(reason);
+
+ if (reason == AvailableSizeChangeReason::ScrollbarsChanged) {
+ if (is<RenderBlock>(renderer()))
+ downcast<RenderBlock>(renderer()).setShouldForceRelayoutChildren(true);
+ renderer().setNeedsLayout();
+ }
+}
+
bool RenderLayer::shouldSuspendScrollAnimations() const
{
return renderer().view().frameView().shouldSuspendScrollAnimations();
Modified: trunk/Source/WebCore/rendering/RenderLayer.h (198655 => 198656)
--- trunk/Source/WebCore/rendering/RenderLayer.h 2016-03-25 01:13:10 UTC (rev 198655)
+++ trunk/Source/WebCore/rendering/RenderLayer.h 2016-03-25 02:03:25 UTC (rev 198656)
@@ -203,6 +203,8 @@
ScrollOffset scrollOffset() const { return scrollOffsetFromPosition(m_scrollPosition); }
IntSize scrollableContentsSize() const;
+ void availableContentSizeChanged(AvailableSizeChangeReason) override;
+
void scrollRectToVisible(const LayoutRect&, const ScrollAlignment& alignX, const ScrollAlignment& alignY);
LayoutRect getRectToExpose(const LayoutRect& visibleRect, const LayoutRect& visibleRectRelativeToDocument, const LayoutRect& exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& alignY);