-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[anchor] Anchor recalculation point when switching fallbacks.
The spec says that an anchor recalculation point occurs when switching to a different anchor positioning option, and not just when the element gets displayed for the first time. In order to support this, we need to stay at the same position option as long as it fits, rather than considering all fallback alternatives every time an anchor-positioned box is being laid out. Only do that when the current option doesn't fit. See https://drafts.csswg.org/css-anchor-position/#fallback-apply This will introduce some statefulness, in that the current scroll offset alone doesn't determine which position option is used: It depends on how we got to that scroll offset, i.e. where we came from. Add a test to demonstrate this, and fix some existing tests to pass with the new behavior. Behavior behind runtime flag CSSAnchorPositionAreaVisualPosition. Bug: 391907168, 373874012 Change-Id: I7b7f81d5d7a9009508eda03234f760bdfb7cd6f9 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6198263 Reviewed-by: Rune Lillesveen <futhark@chromium.org> Commit-Queue: Morten Stenshorne <mstensho@chromium.org> Reviewed-by: David Grogan <dgrogan@chromium.org> Cr-Commit-Position: refs/heads/main@{#1424129}
- Loading branch information
1 parent
48a0138
commit 62e3659
Showing
13 changed files
with
422 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,6 +34,5 @@ | |
</div> | ||
|
||
<script> | ||
scroller.scrollTop = 150; | ||
scroller.scrollTop = 250; | ||
</script> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
127 changes: 127 additions & 0 deletions
127
css/css-anchor-position/position-area-scrolling-005.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
<!DOCTYPE html> | ||
<title>position-area with fallback and scrolling</title> | ||
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> | ||
<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#scroll"> | ||
<script src="/resources/testharness.js"></script> | ||
<script src="/resources/testharnessreport.js"></script> | ||
<script src="support/test-common.js"></script> | ||
<style> | ||
#anchored { | ||
position: absolute; | ||
box-sizing: border-box; | ||
border: solid; | ||
position-anchor: --anchor; | ||
position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline; | ||
width: 50%; | ||
height: 50%; | ||
background: cyan; | ||
} | ||
#container.thicker > .pos { | ||
border-width: thick; | ||
} | ||
</style> | ||
<div id="scrollable" style="position:relative; overflow:hidden; width:500px; height:500px; background:yellow;"> | ||
<div style="width:2000px; height:2000px;"> | ||
<div id="container"> | ||
<div style="anchor-name:--anchor; margin:200px; width:50px; height:50px; background:gray;"></div> | ||
<div id="anchored" style="position-area:top left;"></div> | ||
</div> | ||
</div> | ||
</div> | ||
<script> | ||
function assert_rects_equal(elm, x, y, width, height) { | ||
assert_equals(elm.offsetLeft, x, (elm.id + " x")); | ||
assert_equals(elm.offsetTop, y, (elm.id + " y")); | ||
assert_equals(elm.offsetWidth, width, (elm.id + " width")); | ||
assert_equals(elm.offsetHeight, height, (elm.id + " height")); | ||
} | ||
|
||
async function redisplay(elm) { | ||
elm.style.display = "none"; | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
elm.style.display = "block"; | ||
} | ||
|
||
promise_test(async() => { | ||
// Start at top left. | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 100, 100, 100, 100); | ||
}, "Initial scroll position"); | ||
|
||
promise_test(async() => { | ||
scrollable.scrollTo(40, 60); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 100, 100, 100, 100); | ||
}, "Scroll to 40,60"); | ||
|
||
promise_test(async() => { | ||
// Switch to bottom left. | ||
scrollable.scrollTo(100, 150); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 150, 250, 50, 200); | ||
}, "Scroll to 100,150"); | ||
|
||
promise_test(async() => { | ||
scrollable.scrollTo(0, 0); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 150, 250, 50, 200); | ||
}, "Scroll to 0,0"); | ||
|
||
promise_test(async() => { | ||
// Switch back to top left. | ||
await redisplay(anchored); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 100, 100, 100, 100); | ||
}, "Redisplay at 0,0"); | ||
|
||
promise_test(async() => { | ||
// Switch to top right. | ||
scrollable.scrollTo(750, 100); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 250, 150, 500, 50); | ||
}, "Scroll to 750,100"); | ||
|
||
promise_test(async() => { | ||
// Switch to bottom right. | ||
scrollable.scrollTo(750, 196); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 250, 250, 500, 223); | ||
}, "Scroll to 750,196"); | ||
|
||
promise_test(async() => { | ||
scrollable.scrollTo(195, 196); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 250, 250, 500, 223); | ||
}, "Scroll to 195,196"); | ||
|
||
promise_test(async() => { | ||
// Switch to top left. | ||
scrollable.scrollTo(194, 196); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 194, 250, 6, 223); | ||
}, "Scroll to 194,195"); | ||
|
||
promise_test(async() => { | ||
scrollable.scrollTo(194, 194); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 194, 250, 6, 223); | ||
}, "Scroll to 194,194"); | ||
|
||
promise_test(async() => { | ||
await redisplay(anchored); | ||
await waitUntilNextAnimationFrame(); | ||
await waitUntilNextAnimationFrame(); | ||
assert_rects_equal(anchored, 194, 194, 6, 6); | ||
}, "Redisplay at 194,194"); | ||
</script> |
Oops, something went wrong.