<!DOCTYPE HTML>
<title>pointerup event fired after pointerdown target is removed</title>
<meta name="variant" content="?mouse">
<meta name="variant" content="?touch">
<meta name="variant" content="?pen">
<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>
<script src="pointerevent_support.js"></script>

<style>
  div.target {
      width: 100px;
      height: 50px;
  }
</style>
<div class="target" id="parent">
  <div class="target" id="child">child</div>
</div>
<div id="done">done</div>

<script>
  'use strict';
  const pointer_type = location.search.substring(1);

  const parent = document.getElementById("parent");
  const child = document.getElementById("child");
  const done = document.getElementById("done");

  let event_log = [];

  function logEvent(e) {
    event_log.push(`${e.type}(${e.eventPhase})`);
  }

  parent.addEventListener("pointerup", logEvent);
  parent.addEventListener("mouseup", logEvent);
  child.addEventListener("pointerdown", e => e.target.remove(), {once:true});

  promise_test(async () => {
    let done_click_promise = getEvent("click", done);

    let actions = new test_driver.Actions()
        .addPointer("TestPointer", pointer_type)
        .pointerMove(0, 0, {origin: parent})
        .pointerDown()
        .pointerUp()
        .pointerMove(0, 0, {origin: done})
        .pointerDown()
        .pointerUp();

    await actions.send();
    await done_click_promise;

    assert_equals(event_log.toString(),
        "pointerup(2),mouseup(2)",
        "received events");
  }, `pointerup event from ${pointer_type} fired after pointerdown target is removed`);
</script>
