96 lines
3.5 KiB
HTML
96 lines
3.5 KiB
HTML
<!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>
|