Bug 1905247 - Clamp scroll-snap-align: start snap points inside the scroll range. r=emilio

This change is basically equivalent with what we did for bug 1788029 but for
`scroll-snap-align: start` cases.

The test case was originally written by Daniel Holbert.

Differential Revision: https://phabricator.services.mozilla.com/D215315
This commit is contained in:
Hiroyuki Ikezoe
2024-07-02 21:53:14 +00:00
parent 44d88fd9fa
commit 022e99a431
3 changed files with 93 additions and 8 deletions

View File

@@ -7328,11 +7328,14 @@ static void AppendScrollPositionsForSnap(
switch (styleDisplay->mScrollSnapAlign.block) {
case StyleScrollSnapAlignKeyword::None:
break;
case StyleScrollSnapAlignKeyword::Start:
blockDirectionPosition.emplace(
writingMode.IsVerticalRL() ? -logicalTargetRect.BStart(writingMode)
: logicalTargetRect.BStart(writingMode));
case StyleScrollSnapAlignKeyword::Start: {
nscoord candidate = std::clamp(logicalTargetRect.BStart(writingMode),
logicalScrollRange.BStart(writingMode),
logicalScrollRange.BEnd(writingMode));
blockDirectionPosition.emplace(writingMode.IsVerticalRL() ? -candidate
: candidate);
break;
}
case StyleScrollSnapAlignKeyword::End: {
nscoord candidate = std::clamp(
// What we need here is the scroll position instead of the snap
@@ -7369,12 +7372,14 @@ static void AppendScrollPositionsForSnap(
switch (styleDisplay->mScrollSnapAlign.inline_) {
case StyleScrollSnapAlignKeyword::None:
break;
case StyleScrollSnapAlignKeyword::Start:
case StyleScrollSnapAlignKeyword::Start: {
nscoord candidate = std::clamp(logicalTargetRect.IStart(writingMode),
logicalScrollRange.IStart(writingMode),
logicalScrollRange.IEnd(writingMode));
inlineDirectionPosition.emplace(
writingMode.IsInlineReversed()
? -logicalTargetRect.IStart(writingMode)
: logicalTargetRect.IStart(writingMode));
writingMode.IsInlineReversed() ? -candidate : candidate);
break;
}
case StyleScrollSnapAlignKeyword::End: {
nscoord candidate = std::clamp(
// Same as above BEnd case, we subtract containerISize.