Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /reporting/reporting-api-orders-reports-buffered.https.html - WPT Dashboard Interop Dashboard
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>
Reporting API: buffered observer preserves ordering across report types
</title>
<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>
</head>
<body>
<script>
promise_test(async t => {
assert_true("ReportingObserver" in self);
function generateTest(i) {
test_driver.generate_test_report(`Test report ${i}`);
}
function generateDeprecation(i) {
let img = document.createElement("img");
img.src = `/some/bunk/file${i}.png`;
document.body.appendChild(img);
}
let nonBufferedReports = [];
const observeTwoReports = async () => {
let { promise, resolve } = Promise.withResolvers();
let count = 0;
let reportingObserver = new ReportingObserver(reports => {
count += reports.length;
nonBufferedReports.push(...reports);
if (count >= 2) {
resolve();
}
});
reportingObserver.observe();
return promise.finally(() => reportingObserver.disconnect());
}
// Generate interleaved reports
for (let i = 0; i < 25; i++) {
generateTest(i);
generateDeprecation(i);
await observeTwoReports();
}
const collected = [];
const { promise: collectedAll, resolve } = Promise.withResolvers();
const observer = new ReportingObserver(
reports => {
collected.push(...reports);
if (collected.length == nonBufferedReports.length) {
resolve();
}
},
{ buffered: true }
);
observer.observe();
await collectedAll;
observer.disconnect();
assert_greater_than(
collected.length,
0,
"Some reports must be delivered"
);
// Verify relative ordering by type
const observedTypes = collected.map(r => r.type);
assert_array_equals(observedTypes, nonBufferedReports.map(r => r.type));
}, "Buffered ReportingObserver preserves report generation order");
</script>
</body>
</html>