chromium/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/layout-follows-focused-targeted-block.html

<!DOCTYPE html>
<html>
  <head>
    <link rel="help" href="https://drafts.csswg.org/css-scroll-snap" />
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/dom/events/scrolling/scroll_support.js"></script>
  </head>
  <body>
    <style>
      iframe {
        width: 1000px;
        height: 1000px;
      }
    </style>
    <script>
      let scroller;
      let box1;
      let box2;
      let frame;

      const iframe_load_promise = new Promise((resolve) => {
        frame = document.createElement("iframe");
        frame.onload = async () => {
          scroller = frame.contentDocument.getElementById("scroller");
          box1 = frame.contentDocument.getElementById("box1");
          box2 = frame.contentDocument.getElementById("box2");
          resolve();
        };
        frame.src = "./layout-follows-focused-targeted-block-iframe.html#box2";
        document.body.appendChild(frame);
      });

      const displacement = 150;
      async function test_resnap(t, target) {
        // Save box1's position and setup the cleanup.
        const box1_left = box1.style.left;
        t.add_cleanup(async () => {
          // Reset box1's position.
          box1.style.left = box1_left;
          // Reset scroller's writing-mode.
          scroller.style.writingMode = "horizontal-tb";
          // Reset scroll position.
          await waitForScrollReset(t, scroller);
        });

        assert_equals(scroller.scrollTop, 0, "scroll top is reset");
        assert_equals(scroller.scrollLeft, 0, "scroll left is reset");

        // Move box1 outside the scrollport by translating it 150px
        // horizontally.
        const new_left = box1.offsetLeft + displacement;
        box1.style.left = `${new_left}px`;

        assert_equals(scroller.scrollLeft, target.offsetLeft,
          `scroller followed ${target.id} in x axis`);

        assert_equals(scroller.scrollTop, target.offsetTop,
          `scroller followed ${target.id} in y axis`);
      }

      promise_test(async (t) => {
        await iframe_load_promise;

        box1.focus();
        assert_equals(frame.contentDocument.activeElement, box1,
          "sanity check that box1 is focused.");
        assert_equals(frame.contentDocument.querySelector(":target"), box2,
          "sanity check that box2 is targeted.");
        // box2 is targeted but box1 is focused, so box1 should be
        // followed.
        await test_resnap(t, box1);

        // Remove focus from box1.
        scroller.focus();
      }, "focused area prefered over targeted area.");

      promise_test(async (t) => {
        await iframe_load_promise;

        assert_not_equals(frame.contentDocument.activeElement, box1,
          "sanity check that box1 is not focused.");
        assert_equals(frame.contentDocument.querySelector(":target"), box2,
          "sanity check that box2 is targeted.");
        // box2 is targeted and box1 is not focused, so box2 should be
        // followed.
        await test_resnap(t, box2);
      }, "targeted area prefered over non-focused area.");

      promise_test(async (t) => {
        await iframe_load_promise;

        // Clear the targeted element.
        frame.contentDocument.location.hash = "";
        assert_equals(frame.contentDocument.querySelector(":target"), null,
          "sanity check that no box is targeted.");
        assert_not_equals(frame.contentDocument.activeElement, box1,
          "sanity check that box1 is not focused.");

        // Neither box is targeted or focused; so, the block axis target should
        // be followed.
        await test_resnap(t, box1);
      }, "block axis area is preferred.");

      promise_test(async (t) => {
        await iframe_load_promise;

        scroller.style.writingMode = "vertical-lr";

        // Clear the targeted element.
        frame.contentDocument.location.hash = "";
        assert_equals(frame.contentDocument.querySelector(":target"), null,
          "sanity check that no box is targeted.");
        assert_not_equals(frame.contentDocument.activeElement, box1,
          "sanity check that box1 is not focused.");

        // Neither box is targeted or focused; so, the block (x) axis target
        // should be followed.
        await test_resnap(t, box2);
      }, "block axis area is preferred (vertical writing-mode).");
    </script>
  </body>

</html>