chromium/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/range-boundary.html

<!DOCTYPE html>
<html class="reftest-wait">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="match" href="range-boundary-ref.html">
  <title></title>
</head>
<style type="text/css">
  @keyframes transform {
    0% { transform: translateX(25px); }
    100% { transform: translateX(50px); }
  }

  @keyframes background {
    0% { background-color: #99f; }
    100% { background-color: #9f9; }
  }

  .scroller {
    display:  inline-block;
    border: 2px solid black;
    height:  100px;
    width:  100px;
    overflow: hidden;
  }
  .spacer {
    height: 300px;
    margin:  0;
  }
  .box {
    background: gray;
    height: 50px;
    width: 50px;
    margin: 0;
    animation:  transform auto, background auto;
    animation-timeline: view(), view();
    animation-range: entry 0% entry 100%, contain 0% contain 100%;
  }
</style>
<body>
  <!-- scroll to bottom
       top-box:
         transform: none (after phase)
         bg-color: #9f9 (at active-after boundary with inclusive endpoint)
       bottom-box:
         transform: 100px (at active-after boundary with inclusive endpoint)
         bg-color: #99f (at active-before boundary with inclusive endpoint)
  -->
  <div id="scroller-1" class="scroller">
    <div class="spacer"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <!-- scroll to top
       top-box:
         transform: none (after phase)
         bg-color: gray (at active-after boundary with exclusive endpoint)
       bottom-box:
         transform: none (at active-after boundary with exclusive endpoint)
         bg-color: #99f (at active-before boundary with inclusive endpoint)
  -->
  <div id="scroller-2" class="scroller">
    <div class="box"></div>
    <div class="box"></div>
    <div class="spacer"></div>
  </div>
  <br>
  <!-- scroll to midpoint
       top-box:
         transform: none (after phase)
         bg-color: gray (at active-after boundary with exclusive endpoint)
       bottom-box:
         transform: none (at active-after boundary with exclusive endpoint)
         bg-color: #99f (at active-before boundary with inclusive endpoint)
  -->
  <div id="scroller-3" class="scroller">
    <div class="spacer"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="spacer"></div>
  </div>
  <!-- scroll to bottom + reverse
       top-box:
         transform: none (before phase)
         bg-color: gray (at active-before boundary with exclusive endpoint)
       bottom-box:
         transform: none (at active-before boundary with exclusive endpoint)
         bg-color: #9f9 (at active-after boundary with inclusive endpoint)
  -->
  <div id="scroller-4" class="scroller">
    <div class="spacer"></div>
    <div class="box reverse"></div>
    <div class="box reverse"></div>
  </div>
  <br>
  <!-- scroll to top + reverse
       top-box:
         transform: none (before phase)
         bg-color:  #99f (at active-before boundary with inclusive endpoint)
       bottom-box:
         transform: 25px (at active-before boundary with inclusive endpoint)
         bg-color: #9f9 (at active-after boundary with inclusive endpoint)
  -->
  <div id="scroller-5" class="scroller">
    <div class="box reverse"></div>
    <div class="box reverse"></div>
    <div class="spacer"></div>
  </div>
  <!-- scroll to midpoint + reverse
       top-box:
         transform: none (before phase)
         bg-color: gray (at active-before boundary with exclusive endpoint)
       bottom-box:
         transform: none (at active-before boundary with exclusive endpoint)
         bg-color: #9f9 (at active-before boundary with inclusive endpoint)
  -->
  <div id="scroller-6" class="scroller">
    <div class="spacer"></div>
    <div class="box reverse"></div>
    <div class="box reverse"></div>
    <div class="spacer"></div>
  </div>
</body>
<script src="/common/reftest-wait.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script>
  function scrollTo(scroller_id, relative_offset) {
    const scroller = document.getElementById(scroller_id);
    const max_scroll = scroller.scrollHeight - scroller.clientHeight;
    scroller.scrollTop = relative_offset * max_scroll;
  }

  window.onload = async () => {
    await waitForCompositorReady();
    document.querySelectorAll('.reverse').forEach(elem => {
      elem.getAnimations().forEach(anim => {
        anim.reverse();
      });
    });
    // Playing forward
    scrollTo('scroller-1', 1);
    scrollTo('scroller-2', 0);
    scrollTo('scroller-3', 0.5);
    // Playing reverse
    scrollTo('scroller-4', 1);
    scrollTo('scroller-5', 0);
    scrollTo('scroller-6', 0.5);
    await waitForNextFrame();
    takeScreenshot();
  };
</script>
</html>