servo/tests/wpt/web-platform-tests/event-timing/bufferbeforeonload.html

99 lines
3.3 KiB
HTML

<!DOCTYPE html>
<html>
<meta charset=utf-8 />
<title>Event Timing: buffer long-latency events before onload</title>
<meta name="timeout" content="long">
<button id='button' onmousedown='clickDelay()'>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>
<img src=resources/slow-image.py>
<script>
let clickTimeMin;
let processingStartMin;
let onloadStart;
let firstClickStart = 0;
let firstClickEnd = 0;
function clickDelay() {
const onclickStart = performance.now();
if (firstClickStart === 0)
firstClickStart = onclickStart;
while(performance.now() < onclickStart + 60) {}
if (firstClickEnd === 0)
firstClickEnd = performance.now();
}
function validateEntries(entries) {
const entriesBeforeOnload = entries.filter(
e => e.startTime < onloadStart);
assert_equals(entriesBeforeOnload.length, 1,
"Long latency events before onload should be buffered.");
const entry = entriesBeforeOnload[0];
verifyClickEvent(entry, true);
assert_greater_than_equal(entry.startTime, clickTimeMin,
"The entry's start time should be later than clickTimeMin.");
assert_greater_than_equal(entry.processingStart, processingStartMin,
"The entry should be processed later than processingStartMin.");
assert_less_than_equal(entry.processingStart, firstClickStart,
"The processingStart must be before firstClickStart.")
assert_greater_than_equal(entry.processingEnd, firstClickEnd,
"The processingEnd must be after firstClickEnd.");
const entriesAfterOnload = entries.filter(
e => e.startTime >= onloadStart);
assert_equals(entriesAfterOnload.length, 1,
"Events after onload should still be buffered.");
}
/* Timeline:
Begin Busy Loop
Click 1 arrives
End Busy Loop
(Dispatch and Process Click 1 - buffered)
Onload Event Fires
Begin Busy Loop
Click 2 arrives
End Busy Loop
(Dispatch and Process Click 2 - not buffered)
*/
async_test(function(t) {
if (!window.PerformanceEventTiming)
assert_unreached("PerformanceEventTiming is not supported");
clickTimeMin = performance.now();
clickAndBlockMain('button');
// Event handlers will be dispatched asynchronously, so this will be called
// before processing begins.
processingStartMin = performance.now();
const bufferedEntries = [];
on_event(window, 'load', e => {
onloadStart = performance.now();
// Register the observer after the page has been loaded
const observer = new PerformanceObserver(function (entryList, observer) {
entryList.getEntries().forEach(function(entry) {
assert_equals(entry.entryType, "event");
if (entry.name === 'mousedown') {
bufferedEntries.push(entry);
}
if (bufferedEntries.length == 2) {
validateEntries(bufferedEntries)
observer.disconnect();
t.done();
}
});
})
observer.observe({
type: "event",
buffered: true
});
clickAndBlockMain('button');
});
}, "Event Timing: click, onload.");
</script>
</html>