wpt / css / css-pseudo / events-on-view-transition-pseudos.tentative.html

Status: FAIL | Duration: 62ms | Subtests: 0/1 | Open test on wpt.live | wpt.fyi

/css/css-pseudo/events-on-view-transition-pseudos.tentative.html

<!DOCTYPE html>
<html>
<title>CSS Pseudo Test: Events on View Transition PseudoElements</title>
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#CSSPseudoElement-interface">
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/#pseudo">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<style>
  html {
    view-transition-name: none;
  }

  #target {
    width: 100px;
    height: 100px;
    background: blue;
    contain: paint;
    view-transition-name: target;
  }

  #underneath {
    width: 100vw;
    height: 100vh;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 10000;
  }

  ::view-transition {
    pointer-events: auto;
    padding: 20px;
    background: rgba(255, 0, 0, 0.5);
    /* red */
  }

  ::view-transition-group(*) {
    animation-duration: 300s;
  }
</style>
<div id="target"></div>
<div id="underneath"></div>
<script>
  promise_test(async t => {
    assert_implements(document.startViewTransition, "Missing document.startViewTransition");

    let clickPseudoTarget = null;
    let clickTarget = null;
    const clickHandler = (e) => {
      clickPseudoTarget = e.pseudoTarget;
      clickTarget = e.target;
    };
    document.documentElement.addEventListener("click", clickHandler);
    t.add_cleanup(() => document.documentElement.removeEventListener("click", clickHandler));

    // Ensure we have a frame before starting the transition.
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));

    let transition = document.startViewTransition(() => {
      document.getElementById("target").style.background = "purple";
    });

    await transition.ready;

    let html = document.documentElement;
    let vt = html.pseudo("::view-transition");

    // Wait for the pseudo-elements to be fully generated and visible.
    await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));

    let computedStyle = window.getComputedStyle(document.documentElement, "::view-transition");
    assert_equals(computedStyle.pointerEvents, "auto", "pointer-events should be auto");

    let vtRect = vt.getBoxQuads()[0].getBounds();
    const x = vtRect.x + vtRect.width / 2;
    const y = vtRect.y + vtRect.height / 2;

    await new test_driver.Actions()
      .pointerMove(Math.round(x), Math.round(y))
      .pointerDown()
      .pointerUp()
      .send();

    // Check if the underneath div was hit, which means the pseudo element didn't intercept it.
    let underneath = document.getElementById("underneath");
    let hitDescription = clickTarget ? (clickTarget.id || clickTarget.tagName) : "null";
    assert_not_equals(clickTarget, underneath, "event.target should NOT be the underneath div. Pseudo element should intercept the click. Hit target was: " + hitDescription);
    assert_equals(clickTarget, html, "event.target should be the document element");
    assert_equals(clickPseudoTarget, vt, "click on ::view-transition sets pseudoTarget");

    transition.skipTransition();
  }, "Clicking on view transition pseudo elements sets event.pseudoTarget correctly");
</script>

</html>