| <!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> |