diff options
author | Moonchild <moonchild@palemoon.org> | 2021-01-06 12:47:56 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2021-01-06 12:48:38 +0000 |
commit | 4681e04dc5263a6cbb3f76ae20b0e44509bfee7b (patch) | |
tree | f81d96cd75530809f24a171340e846b7713edd12 /layout/generic | |
parent | e16ed489a4236ce1cb724c8e276400ddf3f74262 (diff) | |
download | uxp-4681e04dc5263a6cbb3f76ae20b0e44509bfee7b.tar.gz |
Issue #1705 - Part 2: Add a ShowScrollbar enum to be used in ScrollReflowInput.
Overflow properties have two purposes:
1. controlling whether the scrollbar should be shown;
2. controlling whether the content is scrollable.
However, with the scrollbar-width property being added, scrollability and
presence of a scrollbar are no longer tied together.
This patch makes a separation between the value of overflow and the presence of
a scrollbar by making it clear that for ScrollReflowInput, we only care about
whether scrollbar should be shown.
This should make it easier to write the logic involving presence of the
scrollbar based on webdev choice.
Diffstat (limited to 'layout/generic')
-rw-r--r-- | layout/generic/nsGfxScrollFrame.cpp | 86 |
1 files changed, 57 insertions, 29 deletions
diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 5c316b8b5e..95e4b9bf4c 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -211,10 +211,32 @@ nsHTMLScrollFrame::GetType() const namespace mozilla { +enum class ShowScrollbar : uint8_t +{ + Auto, + Always, + Never, +}; + +static ShowScrollbar +ShouldShowScrollbar(uint8_t aOverflow) +{ + switch (aOverflow) { + case NS_STYLE_OVERFLOW_SCROLL: + return ShowScrollbar::Always; + case NS_STYLE_OVERFLOW_HIDDEN: + return ShowScrollbar::Never; + default: + case NS_STYLE_OVERFLOW_AUTO: + return ShowScrollbar::Auto; + } +} + struct MOZ_STACK_CLASS ScrollReflowInput { const ReflowInput& mReflowInput; nsBoxLayoutState mBoxState; - ScrollbarStyles mStyles; + ShowScrollbar mHScrollbar; + ShowScrollbar mVScrollbar; nsMargin mComputedBorder; // === Filled in by ReflowScrolledFrame === @@ -235,12 +257,15 @@ struct MOZ_STACK_CLASS ScrollReflowInput { bool mShowVScrollbar; ScrollReflowInput(nsIScrollableFrame* aFrame, - const ReflowInput& aState) : - mReflowInput(aState), + const ReflowInput& aState) + : mReflowInput(aState) // mBoxState is just used for scrollbars so we don't need to // worry about the reflow depth here - mBoxState(aState.mFrame->PresContext(), aState.mRenderingContext, 0), - mStyles(aFrame->GetScrollbarStyles()) { + , mBoxState(aState.mFrame->PresContext(), aState.mRenderingContext, 0) + { + ScrollbarStyles styles = aFrame->GetScrollbarStyles(); + mHScrollbar = ShouldShowScrollbar(styles.mHorizontal); + mVScrollbar = ShouldShowScrollbar(styles.mVertical); } }; @@ -328,8 +353,8 @@ nsHTMLScrollFrame::TryLayout(ScrollReflowInput* aState, bool aAssumeHScroll, bool aAssumeVScroll, bool aForce) { - if ((aState->mStyles.mVertical == NS_STYLE_OVERFLOW_HIDDEN && aAssumeVScroll) || - (aState->mStyles.mHorizontal == NS_STYLE_OVERFLOW_HIDDEN && aAssumeHScroll)) { + if ((aState->mVScrollbar == ShowScrollbar::Never && aAssumeVScroll) || + (aState->mHScrollbar == ShowScrollbar::Never && aAssumeHScroll)) { NS_ASSERTION(!aForce, "Shouldn't be forcing a hidden scrollbar to show!"); return false; } @@ -399,9 +424,9 @@ nsHTMLScrollFrame::TryLayout(ScrollReflowInput* aState, nscoord oneDevPixel = aState->mBoxState.PresContext()->DevPixelsToAppUnits(1); // If the style is HIDDEN then we already know that aAssumeHScroll is false - if (aState->mStyles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN) { + if (aState->mHScrollbar != ShowScrollbar::Never) { bool wantHScrollbar = - aState->mStyles.mHorizontal == NS_STYLE_OVERFLOW_SCROLL || + aState->mHScrollbar == ShowScrollbar::Always || scrolledRect.XMost() >= visualScrollPortSize.width + oneDevPixel || scrolledRect.x <= -oneDevPixel; if (scrollPortSize.width < hScrollbarMinSize.width) @@ -411,9 +436,9 @@ nsHTMLScrollFrame::TryLayout(ScrollReflowInput* aState, } // If the style is HIDDEN then we already know that aAssumeVScroll is false - if (aState->mStyles.mVertical != NS_STYLE_OVERFLOW_HIDDEN) { + if (aState->mVScrollbar != ShowScrollbar::Never) { bool wantVScrollbar = - aState->mStyles.mVertical == NS_STYLE_OVERFLOW_SCROLL || + aState->mVScrollbar == ShowScrollbar::Always || scrolledRect.YMost() >= visualScrollPortSize.height + oneDevPixel || scrolledRect.y <= -oneDevPixel; if (scrollPortSize.height < vScrollbarMinSize.height) @@ -597,19 +622,20 @@ nsHTMLScrollFrame::ReflowScrolledFrame(ScrollReflowInput* aState, bool nsHTMLScrollFrame::GuessHScrollbarNeeded(const ScrollReflowInput& aState) { - if (aState.mStyles.mHorizontal != NS_STYLE_OVERFLOW_AUTO) - // no guessing required - return aState.mStyles.mHorizontal == NS_STYLE_OVERFLOW_SCROLL; - + if (aState.mHScrollbar != ShowScrollbar::Auto) { + // No guessing required + return aState.mHScrollbar == ShowScrollbar::Always; + } return mHelper.mHasHorizontalScrollbar; } bool nsHTMLScrollFrame::GuessVScrollbarNeeded(const ScrollReflowInput& aState) { - if (aState.mStyles.mVertical != NS_STYLE_OVERFLOW_AUTO) - // no guessing required - return aState.mStyles.mVertical == NS_STYLE_OVERFLOW_SCROLL; + if (aState.mVScrollbar != ShowScrollbar::Auto) { + // No guessing required + return aState.mVScrollbar == ShowScrollbar::Always; + } // If we've had at least one non-initial reflow, then just assume // the state of the vertical scrollbar will be what we determined @@ -684,8 +710,8 @@ nsHTMLScrollFrame::ReflowContents(ScrollReflowInput* aState, // XXX Is this check really sufficient to catch all the incremental cases // where the ideal case doesn't have a scrollbar? if ((aState->mReflowedContentsWithHScrollbar || aState->mReflowedContentsWithVScrollbar) && - aState->mStyles.mVertical != NS_STYLE_OVERFLOW_SCROLL && - aState->mStyles.mHorizontal != NS_STYLE_OVERFLOW_SCROLL) { + aState->mVScrollbar != ShowScrollbar::Always && + aState->mHScrollbar != ShowScrollbar::Always) { nsSize insideBorderSize = ComputeInsideBorderSize(aState, nsSize(kidDesiredSize.Width(), kidDesiredSize.Height())); @@ -725,8 +751,8 @@ nsHTMLScrollFrame::ReflowContents(ScrollReflowInput* aState, // enable and force the layout to stick even if it's inconsistent. // This just happens sometimes. TryLayout(aState, &kidDesiredSize, - aState->mStyles.mHorizontal != NS_STYLE_OVERFLOW_HIDDEN, - aState->mStyles.mVertical != NS_STYLE_OVERFLOW_HIDDEN, + aState->mHScrollbar != ShowScrollbar::Never, + aState->mVScrollbar != ShowScrollbar::Never, true); } @@ -982,10 +1008,10 @@ nsHTMLScrollFrame::AdjustForPerspective(nsRect& aScrollableOverflow) } void -nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, - ReflowOutput& aDesiredSize, +nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, - nsReflowStatus& aStatus) + nsReflowStatus& aStatus) { MarkInReflow(); DO_GLOBAL_REFLOW_COUNT("nsHTMLScrollFrame"); @@ -996,10 +1022,12 @@ nsHTMLScrollFrame::Reflow(nsPresContext* aPresContext, ScrollReflowInput state(this, aReflowInput); // sanity check: ensure that if we have no scrollbar, we treat it // as hidden. - if (!mHelper.mVScrollbarBox || mHelper.mNeverHasVerticalScrollbar) - state.mStyles.mVertical = NS_STYLE_OVERFLOW_HIDDEN; - if (!mHelper.mHScrollbarBox || mHelper.mNeverHasHorizontalScrollbar) - state.mStyles.mHorizontal = NS_STYLE_OVERFLOW_HIDDEN; + if (!mHelper.mVScrollbarBox || mHelper.mNeverHasVerticalScrollbar) { + state.mVScrollbar = ShowScrollbar::Never; + } + if (!mHelper.mHScrollbarBox || mHelper.mNeverHasHorizontalScrollbar) { + state.mHScrollbar = ShowScrollbar::Never; + } //------------ Handle Incremental Reflow ----------------- bool reflowHScrollbar = true; |