tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 52e752321ecc315ca070141c51ec567de2f9d882
parent 433945a2c7e55e2e361b18c76e8d1844838e174f
Author: Botond Ballo <botond@mozilla.com>
Date:   Wed,  3 Dec 2025 20:04:36 +0000

Bug 1999440 - Introduce ScrollContainerFrame::ScrollModeForScrollBehavior(). r=hiro,layout-reviewers

This helper function encapsulates checks in various places which
were of a form similar to:

  sf->IsSmoothScroll(behavior) ? ScrollMode::SmoothMsd
                               : ScrollMode::Instant

Differential Revision: https://phabricator.services.mozilla.com/D272346

Diffstat:
Mdocshell/base/nsDocShell.cpp | 3+--
Mdom/base/Element.cpp | 8++------
Mdom/base/nsGlobalWindowInner.cpp | 16++++------------
Mlayout/base/PresShell.cpp | 9++-------
Mlayout/generic/ScrollContainerFrame.cpp | 6++++++
Mlayout/generic/ScrollContainerFrame.h | 8++++++++
6 files changed, 23 insertions(+), 27 deletions(-)

diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp @@ -5037,8 +5037,7 @@ nsresult nsDocShell::SetCurScrollPosEx(int32_t aCurHorizontalPos, ScrollContainerFrame* sf = GetRootScrollContainerFrame(); NS_ENSURE_TRUE(sf, NS_ERROR_FAILURE); - ScrollMode scrollMode = - sf->IsSmoothScroll() ? ScrollMode::SmoothMsd : ScrollMode::Instant; + ScrollMode scrollMode = sf->ScrollModeForScrollBehavior(); nsPoint targetPos(aCurHorizontalPos, aCurVerticalPos); sf->ScrollTo(targetPos, scrollMode); diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp @@ -899,9 +899,7 @@ void Element::ScrollTo(const ScrollToOptions& aOptions) { scrollPos.y = ToZeroIfNonfinite( frame->Style()->EffectiveZoom().Zoom(aOptions.mTop.Value())); } - ScrollMode scrollMode = sf->IsSmoothScroll(aOptions.mBehavior) - ? ScrollMode::SmoothMsd - : ScrollMode::Instant; + ScrollMode scrollMode = sf->ScrollModeForScrollBehavior(aOptions.mBehavior); sf->ScrollToCSSPixels(scrollPos, scrollMode); } @@ -930,9 +928,7 @@ void Element::ScrollBy(const ScrollToOptions& aOptions) { frame->Style()->EffectiveZoom().Zoom(aOptions.mTop.Value())); } - auto scrollMode = sf->IsSmoothScroll(aOptions.mBehavior) - ? ScrollMode::SmoothMsd - : ScrollMode::Instant; + auto scrollMode = sf->ScrollModeForScrollBehavior(aOptions.mBehavior); sf->ScrollByCSSPixels(scrollDelta, scrollMode); } diff --git a/dom/base/nsGlobalWindowInner.cpp b/dom/base/nsGlobalWindowInner.cpp @@ -3947,9 +3947,7 @@ void nsGlobalWindowInner::ScrollTo(const ScrollToOptions& aOptions) { if (scrollPos.y > maxpx) { scrollPos.y = maxpx; } - auto scrollMode = sf->IsSmoothScroll(aOptions.mBehavior) - ? ScrollMode::SmoothMsd - : ScrollMode::Instant; + auto scrollMode = sf->ScrollModeForScrollBehavior(aOptions.mBehavior); sf->ScrollToCSSPixels(scrollPos, scrollMode); } @@ -3982,9 +3980,7 @@ void nsGlobalWindowInner::ScrollBy(const ScrollToOptions& aOptions) { return; } - auto scrollMode = sf->IsSmoothScroll(aOptions.mBehavior) - ? ScrollMode::SmoothMsd - : ScrollMode::Instant; + auto scrollMode = sf->ScrollModeForScrollBehavior(aOptions.mBehavior); sf->ScrollByCSSPixels(scrollDelta, scrollMode); } @@ -4001,9 +3997,7 @@ void nsGlobalWindowInner::ScrollByLines(int32_t numLines, // It seems like it would make more sense for ScrollByLines to use // SMOOTH mode, but tests seem to depend on the synchronous behaviour. // Perhaps Web content does too. - ScrollMode scrollMode = sf->IsSmoothScroll(aOptions.mBehavior) - ? ScrollMode::SmoothMsd - : ScrollMode::Instant; + ScrollMode scrollMode = sf->ScrollModeForScrollBehavior(aOptions.mBehavior); sf->ScrollBy(nsIntPoint(0, numLines), ScrollUnit::LINES, scrollMode); } @@ -4020,9 +4014,7 @@ void nsGlobalWindowInner::ScrollByPages(int32_t numPages, // It seems like it would make more sense for ScrollByPages to use // SMOOTH mode, but tests seem to depend on the synchronous behaviour. // Perhaps Web content does too. - ScrollMode scrollMode = sf->IsSmoothScroll(aOptions.mBehavior) - ? ScrollMode::SmoothMsd - : ScrollMode::Instant; + ScrollMode scrollMode = sf->ScrollModeForScrollBehavior(aOptions.mBehavior); sf->ScrollBy(nsIntPoint(0, numPages), ScrollUnit::PAGES, scrollMode); } diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp @@ -3267,8 +3267,7 @@ nsresult PresShell::GoToAnchor(const nsAString& aAnchorName, // Check |aScroll| after setting |rv| so we set |rv| to the same // thing whether or not |aScroll| is true. if (aScroll && sf) { - ScrollMode scrollMode = - sf->IsSmoothScroll() ? ScrollMode::SmoothMsd : ScrollMode::Instant; + ScrollMode scrollMode = sf->ScrollModeForScrollBehavior(); // Scroll to the top of the page sf->ScrollTo(nsPoint(0, 0), scrollMode); } @@ -3458,7 +3457,6 @@ static WhereToScroll GetApplicableWhereToScroll( static ScrollMode GetScrollModeForScrollIntoView( const ScrollContainerFrame* aScrollContainerFrame, ScrollFlags aScrollFlags) { - ScrollMode scrollMode = ScrollMode::Instant; // Default to an instant scroll, but if the scroll behavior given is "auto" // or "smooth", use that as the specified behavior. If the user has disabled // smooth scrolls, a given mode of "auto" or "smooth" should not result in @@ -3469,10 +3467,7 @@ static ScrollMode GetScrollModeForScrollIntoView( } else if (aScrollFlags & ScrollFlags::ScrollSmoothAuto) { behavior = ScrollBehavior::Auto; } - if (aScrollContainerFrame->IsSmoothScroll(behavior)) { - scrollMode = ScrollMode::SmoothMsd; - } - return scrollMode; + return aScrollContainerFrame->ScrollModeForScrollBehavior(behavior); } /** diff --git a/layout/generic/ScrollContainerFrame.cpp b/layout/generic/ScrollContainerFrame.cpp @@ -7827,6 +7827,12 @@ bool ScrollContainerFrame::IsSmoothScroll(dom::ScrollBehavior aBehavior) const { StyleScrollBehavior::Smooth); } +ScrollMode ScrollContainerFrame::ScrollModeForScrollBehavior( + dom::ScrollBehavior aBehavior) const { + return IsSmoothScroll(aBehavior) ? ScrollMode::SmoothMsd + : ScrollMode::Instant; +} + nsTArray<ScrollPositionUpdate> ScrollContainerFrame::GetScrollUpdates() const { return mScrollUpdates.Clone(); } diff --git a/layout/generic/ScrollContainerFrame.h b/layout/generic/ScrollContainerFrame.h @@ -862,6 +862,14 @@ class ScrollContainerFrame : public nsContainerFrame, bool IsSmoothScroll( dom::ScrollBehavior aBehavior = dom::ScrollBehavior::Auto) const; + /** + * Returns the ScrollMode that this scroll frame should use for a + * programmatic scroll governed by CSSOM-View `scroll-behavior`. + * This includes most programmatic scrolls but not scroll snapping. + */ + ScrollMode ScrollModeForScrollBehavior( + dom::ScrollBehavior aBehavior = dom::ScrollBehavior::Auto) const; + static nscoord GetNonOverlayScrollbarSize(const nsPresContext*, StyleScrollbarWidth);