| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| async function reset(t, scrollers) { |
| for (const scroller of scrollers) { |
| await waitForScrollReset(t, scroller); |
| } |
| } |
| |
| /** |
| * This tests executing scrollIntoView on multiple scroll containers at the same |
| * time. It assumes and verifies vertical scrolling. |
| */ |
| async function simultaneousScrollIntoViewsTest(test, |
| behaviors, |
| targets, |
| scrollers, |
| target_offsets) { |
| assert_equals(targets.length, behaviors.length, |
| "equal numbers of targets and behaviors provided"); |
| assert_equals(scrollers.length, target_offsets.length, |
| "equal numbers of scrollers and target_offsets provided"); |
| await reset(test, scrollers); |
| await waitForCompositorCommit(); |
| |
| // All scrollers should be at an offset of 0. |
| for (const scroller of scrollers) { |
| assert_equals(scroller.scrollTop, 0, `${scroller.id}'s scrollTop is reset`); |
| } |
| |
| const scrollend_promises = Array.from(scrollers, (scroller) => { |
| return waitForScrollEndFallbackToDelayWithoutScrollEvent(scroller); |
| }); |
| |
| // Scroll all targets into view. |
| for (let idx = 0; idx < targets.length; idx++) { |
| targets[idx].scrollIntoView({ |
| block: "start", |
| behavior: behaviors[idx] |
| }); |
| } |
| await Promise.all(scrollend_promises); |
| |
| // Verify the expected positions os all scrollers. |
| for (let idx = 0; idx < scrollers.length; idx++) { |
| assert_approx_equals(scrollers[idx].scrollTop, target_offsets[idx], 1, |
| `scrollIntoView finished executing on ${scrollers[idx].id}` |
| ); |
| } |
| } |