blob: dcc89e7fdfa1e8413f05a35744b52996b606c5c0 [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
</head>
<body>
<script>
description("Test PerformanceObserver mutating itself while in its callback.");
window.jsTestIsAsync = true;
function assert(assertion)
{
if (!assertion())
console.log(`Assertion "${assertion}" failed`);
}
function wait() {
let now = performance.now();
while (now === performance.now())
continue;
assert(() => now < performance.now());
}
let observer = new PerformanceObserver((list) => {
testPassed("PerformanceObserver callback fired");
window.list = list;
window.sorted = true;
let entries = list.getEntries();
let lastStartTime = entries[0].startTime;
for (let i = 0; i < entries.length; ++i) {
let currentStartTime = entries[i].startTime;
if (lastStartTime > currentStartTime) {
sorted = false;
break;
}
lastStartTime = currentStartTime;
}
shouldBe(`list.getEntries().length`, `8`);
shouldBeTrue(`sorted`);
// Regardless of how identical start time elements are sorted,
// the first three values should be measures1,2,3 with 0 start time,
// followed by mark1. The last entry will be mark3.
shouldBeEqualToString(`list.getEntries()[0].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[1].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[2].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[3].entryType`, "mark");
shouldBeEqualToString(`list.getEntries()[3].name`, "mark1");
shouldBeEqualToString(`list.getEntries()[7].entryType`, "mark");
shouldBeEqualToString(`list.getEntries()[7].name`, "mark3");
// WebKit wants a stable sort based matching user expectations.
// The spec is currently imprecise here.
// <https://github.com/w3c/performance-timeline/issues/67>
shouldBeEqualToString(`list.getEntries()[0].name`, "measure1");
shouldBeEqualToString(`list.getEntries()[1].name`, "measure2");
shouldBeEqualToString(`list.getEntries()[2].name`, "measure3");
shouldBeEqualToString(`list.getEntries()[3].name`, "mark1");
shouldBeEqualToString(`list.getEntries()[4].name`, "mark2");
shouldBeEqualToString(`list.getEntries()[5].name`, "measure-matching-mark2-1");
shouldBeEqualToString(`list.getEntries()[6].name`, "measure-matching-mark2-2");
shouldBeEqualToString(`list.getEntries()[7].name`, "mark3");
const mark2 = list.getEntries().find((entry) => entry.name == 'mark2');
const mark3 = list.getEntries().find((entry) => entry.name == 'mark3');
assert(() => mark2.startTime <= mark2Time);
assert(() => mark3Time <= mark3.startTime);
assert(() => mark2.startTime < mark3.startTime);
finishJSTest();
});
observer.observe({entryTypes: ["mark", "measure"]});
performance.mark("mark1");
performance.measure("measure1");
wait(); // Ensure mark1 !== mark2 startTime by making sure performance.now advances.
performance.mark("mark2");
const mark2Time = performance.now();
performance.measure("measure2");
performance.measure("measure-matching-mark2-1", "mark2");
wait(); // Ensure mark2 !== mark3 startTime by making sure performance.now advances.
const mark3Time = performance.now();
performance.mark("mark3");
assert(() => mark3Time >= mark2Time);
assert(() => mark3Time > mark2Time);
performance.measure("measure3");
performance.measure("measure-matching-mark2-2", "mark2");
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>