<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<title>Event Timing only times certain types of trusted event.
</title>
<meta name="timeout" content="long">
<button id='button' onmousedown='mainThreadBusy(60)'
  onfocus='mainThreadBusy(60)'>Generate a 'click' event</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 trustedClickStart;
  function trustedClickAndBlockMain(id) {
    trustedClickStart = performance.now();
    return clickAndBlockMain(id);
  }

  function untrustedClickAndBlockMain(id) {
    const target = document.getElementById(id);
    // Block mainthread in the callback, as dispatchEvent() is a sync call.
    target.dispatchEvent(new MouseEvent('mousedown'));
  }

  function trustedFocusAndBlockMain(id) {
    const target = document.getElementById(id);
    trustedFocusStart = performance.now();
    // Block mainthread in the callback,  as focus() is a sync call.
    target.focus();
  }

  promise_test(function(t) {
    assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
    let observedMouseDown = false;
    const observerPromise = new Promise(resolve => {
      new PerformanceObserver(t.step_func(entryList => {
        const observerCallbackTime = performance.now();
        const mouseDowns = entryList.getEntriesByName('mousedown');
        // Ignore cases in which there is no mousedown.
        if (mouseDowns.length === 0)
          return;

        assert_false(observedMouseDown, 'Got more than one callback with mousedown.');
        assert_equals(mouseDowns.length, 1,
            "Should only observe one mousedown entry. Instead, got these: " +
            JSON.stringify(mouseDowns) + ".");
        assert_equals(mouseDowns[0].name, 'mousedown',
            "The observed entry should be a mousedown");
        assert_less_than(mouseDowns[0].startTime, observerCallbackTime,
            "The startTime should be before observerCallbackTime");
        assert_greater_than(mouseDowns[0].startTime, trustedClickStart,
            "The startTime should be after trustedClickStart");
        observedMouseDown = true;
        resolve();
      })).observe({ entryTypes: ['event'] });
    });
    // Untrusted event of a type event timing cares about.
    untrustedClickAndBlockMain('button');
    // Trusted event of a type event timing doesn't cares about.
    trustedFocusAndBlockMain('button');
    // Trusted event of a type event timing cares about.
    const clickPromise = trustedClickAndBlockMain('button').then(wait);
    return Promise.all([observerPromise, clickPromise]);
  }, "Event Timing only times certain types of trusted event.");
</script>
</html>
