mirror of
https://github.com/servo/servo.git
synced 2025-07-30 10:40:27 +01:00
99 lines
3.3 KiB
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>
|