<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<title>Event Timing: interactionId.</title>
<button id='button'>Click me.</button>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src=resources/event-timing-test-utils.js></script>
<script>
  let observedEntries = [];
  let map = new Map();
  async function clickOnElement(id) {
  const element = document.getElementById(id);
  const clickHandler = () => {
    mainThreadBusy(200);
  };
  element.addEventListener("mousedown", clickHandler);
  element.addEventListener("mouseup", clickHandler);
  element.addEventListener("pointerdown", clickHandler);
  element.addEventListener("pointerup", clickHandler);
  element.addEventListener("click", clickHandler);
  await test_driver.click(element);
  }
  function eventsForCheck(entry) {
      if (entry.name === 'pointerdown' || entry.name === 'pointerup' || entry.name === 'click'
      || entry.name === 'mousedown' || entry.name === 'mouseup') {
        map.set(entry.name, entry.interactionId);
        return true;
      }
      return false;
  }
  async_test(function(t) {
    assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
    new PerformanceObserver(t.step_func(entryList => {
      observedEntries = observedEntries.concat(entryList.getEntries().filter(eventsForCheck));
      if (observedEntries.length < 5)
        return;
      assert_equals(map.get('mousedown'), 0, 'Should not have a interactionId');
      assert_equals(map.get('mouseup'), 0, 'Should not have a interactionId');
      assert_greater_than(map.get('pointerdown'), 0, 'Should have a non-trivial interactionId');
      assert_equals(map.get('pointerdown'), map.get('pointerup'), 'Pointerdown and pointerup should have the same interactionId');
      assert_equals(map.get('pointerdown'), map.get('click'), 'Pointerdown and click should have the same interactionId');
      t.done();
    })).observe({type: 'event'});
    clickOnElement('button');
  }, "Event Timing: compare event timing interactionId.");
</script>
</html>
