Bug 1594757 [wpt PR 20151] - Reassign snap areas when adding snap container, a=testonly

Automatic update from web-platform-tests
Reassign snap areas when adding snap container

Making a container scrollable should make it a valid snap container.
In doing so, any descendant snap area that should be assigned to the
container should be reassigned as such.

Bug: 1007456
Change-Id: Iccd220311ce592f921dc8424780632e499d3201c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1900920
Reviewed-by: David Bokan <bokan@chromium.org>
Reviewed-by: Majid Valipour <majidvp@chromium.org>
Reviewed-by: Yi Gu <yigu@chromium.org>
Commit-Queue: Kaan Alsan <alsan@google.com>
Cr-Commit-Position: refs/heads/master@{#717011}

--

wpt-commits: 5b9f9a0d1be1e14cc222cfbc6069fc70cd5d2f8e
wpt-pr: 20151
This commit is contained in:
Kaan Alsan 2019-11-26 11:26:13 +00:00 коммит произвёл moz-wptsync-bot
Родитель 58372018f0
Коммит 30542cc4d1
2 изменённых файлов: 177 добавлений и 28 удалений

Просмотреть файл

@ -76,54 +76,54 @@ body {
// its snap areas to the next scrollable ancestor, per spec [1].
// [1] https://drafts.csswg.org/css-scroll-snap/#captures-snap-positions
test(() => {
const innerscroller = document.getElementById("inner-scroller");
const middlescroller = document.getElementById("middle-scroller");
const documentscroller = document.scrollingElement;
const inner_scroller = document.getElementById("inner-scroller");
const middle_scroller = document.getElementById("middle-scroller");
const document_scroller = document.scrollingElement;
// Middle scroller doesn't snap.
// Document scroller should snap to its only captured area.
documentscroller.scrollBy(0, 100);
middlescroller.scrollBy(0, 10);
assert_equals(innerscroller.scrollTop, 0);
assert_equals(middlescroller.scrollTop, 10);
assert_equals(documentscroller.scrollTop, 500);
document_scroller.scrollBy(0, 100);
middle_scroller.scrollBy(0, 10);
assert_equals(inner_scroller.scrollTop, 0);
assert_equals(middle_scroller.scrollTop, 10);
assert_equals(document_scroller.scrollTop, 500);
// Inner scroller snaps.
innerscroller.scrollBy(0, 10);
assert_equals(innerscroller.scrollTop, 300);
assert_equals(middlescroller.scrollTop, 10);
assert_equals(documentscroller.scrollTop, 500);
inner_scroller.scrollBy(0, 10);
assert_equals(inner_scroller.scrollTop, 300);
assert_equals(middle_scroller.scrollTop, 10);
assert_equals(document_scroller.scrollTop, 500);
// Inner scroller is no longer a scroll container.
innerscroller.style.setProperty("overflow", "visible");
assert_equals(innerscroller.scrollTop, 0);
assert_equals(middlescroller.scrollTop, 10);
assert_equals(documentscroller.scrollTop, 500);
inner_scroller.style.setProperty("overflow", "visible");
assert_equals(inner_scroller.scrollTop, 0);
assert_equals(middle_scroller.scrollTop, 10);
assert_equals(document_scroller.scrollTop, 500);
// The new snap container is the middle scroller, which has snap-type 'none'.
// Per spec, the scroll container should capture snap positions even if it has
// snap-type 'none'.
// The middle scroller should not snap.
// The document scroller should still only snap to its captured snap area.
documentscroller.scrollBy(0, 100);
middlescroller.scrollBy(0, 10);
assert_equals(innerscroller.scrollTop, 0);
assert_equals(middlescroller.scrollTop, 20);
assert_equals(documentscroller.scrollTop, 500);
document_scroller.scrollBy(0, 100);
middle_scroller.scrollBy(0, 10);
assert_equals(inner_scroller.scrollTop, 0);
assert_equals(middle_scroller.scrollTop, 20);
assert_equals(document_scroller.scrollTop, 500);
// The scroll container should now be at the document level.
middlescroller.style.setProperty("overflow", "visible");
documentscroller.scrollBy(0, -10);
assert_equals(innerscroller.scrollTop, 0);
assert_equals(middlescroller.scrollTop, 0);
middle_scroller.style.setProperty("overflow", "visible");
document_scroller.scrollBy(0, -10);
assert_equals(inner_scroller.scrollTop, 0);
assert_equals(middle_scroller.scrollTop, 0);
// Check that the existing snap area did not get removed when reassigning
// the inner snap area.
assert_equals(documentscroller.scrollTop, 500);
assert_equals(document_scroller.scrollTop, 500);
// Check that the inner snap area got reassigned to the document.
documentscroller.scrollBy(0, 150);
assert_equals(documentscroller.scrollTop, 600);
document_scroller.scrollBy(0, 150);
assert_equals(document_scroller.scrollTop, 600);
}, 'Making a snap container not scrollable should promote the next scrollable\
ancestor to become a snap container.');
</script>

Просмотреть файл

@ -0,0 +1,149 @@
<!DOCTYPE html>
<title>
Adding a scrollable element should make it start capturing snap points.
</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#captures-snap-positions"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
div {
position: absolute;
margin: 0px;
}
html {
scroll-snap-type: y mandatory;
}
body {
margin: 0px;
}
#middle-scroller {
top: 100px;
height: 500px;
width: 500px;
overflow: visible;
background-color: rgb(12, 61, 2);
scroll-snap-type: none;
}
#inner-scroller {
top: 200px;
height: 400px;
width: 400px;
overflow: visible;
background-color: rgb(65, 139, 50);
scroll-snap-type: y mandatory;
}
.space {
width: 2000px;
height: 2000px;
}
#inner-snap-area {
top: 300px;
width: 200px;
height: 200px;
background-color: blue;
scroll-snap-align: start;
}
#document-snap-area {
top: 500px;
width: 200px;
height: 200px;
background-color: lightblue;
scroll-snap-align: start;
}
#inserted-snap-container {
top: 400px;
height: 600px;
width: 400px;
overflow: scroll;
scroll-snap-type: y mandatory;
}
</style>
<div class="space"></div>
<div id="middle-scroller">
<div class="space"></div>
<div id="inner-scroller">
<div class="space"></div>
<div id="inner-snap-area"></div>
</div>
</div>
</div>
<div id="document-snap-area"></div>
<script>
const inner_scroller = document.getElementById("inner-scroller");
const middle_scroller = document.getElementById("middle-scroller");
const document_scroller = document.scrollingElement;
// This tests that making an element scrollable will reassign the correct snap
// areas to itself, per spec [1].
// [1] https://drafts.csswg.org/css-scroll-snap/#captures-snap-positions
test(() => {
// Confirm that the document-level scroller is the snap container for all of
// the snap areas.
document_scroller.scrollBy(0, 10);
assert_equals(document_scroller.scrollTop, 500);
// Snaps to the inner snap area.
document_scroller.scrollBy(0, 75);
assert_equals(document_scroller.scrollTop, 600);
// The middle scroller should now have the inner snap area assigned to it.
// Per spec, even if the snap-type is 'none', it should still capture snap
// points.
middle_scroller.style.setProperty("overflow", "scroll");
// The middle scroller has snap-type 'none' so it should not snap.
middle_scroller.scrollBy(0, 10);
assert_equals(middle_scroller.scrollTop, 10);
// The document scroller should only snap to the document-level snap area.
document_scroller.scrollTo(0, 600);
assert_equals(document_scroller.scrollTop, 500);
// The inner scroller should now have the innermost snap area assigned to it.
inner_scroller.style.setProperty("overflow", "scroll");
inner_scroller.scrollBy(0, 10);
assert_equals(inner_scroller.scrollTop, 300);
document_scroller.scrollTo(0, 600);
assert_equals(document_scroller.scrollTop, 500);
}, "Making an element scrollable should make it capture the correct descendant\
snap areas' snap points.");
// Test that attaching a new snap container also properly assigns snap areas.
test(() => {
// Sanity check that the scrollers still snap to the snap areas.
document_scroller.scrollBy(0, 10);
inner_scroller.scrollBy(0,10);
assert_equals(inner_scroller.scrollTop, 300);
assert_equals(document_scroller.scrollTop, 500);
// Create new snap container and append thedocument-level snap area as its
// child.
const inserted_scroller = document.createElement("div");
inserted_scroller.id = "inserted-snap-container";
const space = document.createElement("div");
space.classList.add("space");
inserted_scroller.appendChild(space);
inserted_scroller.appendChild(document.getElementById("document-snap-area"));
document_scroller.appendChild(inserted_scroller);
// Document scroller no longer snaps.
document_scroller.scrollTo(0, 400);
assert_equals(document_scroller.scrollTop, 400);
// Inserted scroller snaps.
inserted_scroller.scrollBy(0, 10);
assert_equals(inserted_scroller.scrollTop, 500);
}, "Attaching a new element that is scrollable should assign the correct snap\
areas to it.");
</script>