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:
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);