blob: bafb9659c970b14f9bf064aa5f3a38440a5d113c [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;
// Observer is first watching measures => then marks => measures => both.
// NOTE: Measures are sorted before marks due to startTime.
window.callbackCount = 0;
window.list = null;
let observer = new PerformanceObserver((list) => {
window.list = list;
callbackCount++;
testPassed("PerformanceObserver callback fired");
if (callbackCount === 1) {
// Expected: [measure1]
shouldBe(`list.getEntries().length`, `1`);
shouldBeEqualToString(`list.getEntries()[0].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[0].name`, "measure1");
updateObserver(["mark"]);
performance.mark("mark2");
performance.measure("measure2");
} else if (callbackCount === 2) {
// Expected: [mark2]
shouldBe(`list.getEntries().length`, `1`);
shouldBeEqualToString(`list.getEntries()[0].entryType`, "mark");
shouldBeEqualToString(`list.getEntries()[0].name`, "mark2");
performance.mark("mark-before-change-observe-state-to-measure");
performance.measure("measure-before-change-observe-state-to-measure");
updateObserver(["measure"]);
performance.mark("mark3");
performance.measure("measure3");
} else if (callbackCount === 3) {
// Expected: [measure3, mark-before-change-observe-state-to-measure]
shouldBe(`list.getEntries().length`, `2`);
shouldBeEqualToString(`list.getEntries()[0].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[0].name`, "measure3");
shouldBeEqualToString(`list.getEntries()[1].entryType`, "mark");
shouldBeEqualToString(`list.getEntries()[1].name`, "mark-before-change-observe-state-to-measure");
performance.mark("mark-before-change-observe-state-to-both");
performance.measure("measure-before-change-observe-state-to-both");
updateObserver(["mark", "measure"]);
performance.mark("mark4");
performance.measure("measure4");
} else if (callbackCount === 4) {
// Expected: [measure-before-change-observe-state-to-both, measure4, mark4]
shouldBe(`list.getEntries().length`, `3`);
shouldBeEqualToString(`list.getEntries()[0].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[0].name`, "measure-before-change-observe-state-to-both");
shouldBeEqualToString(`list.getEntries()[1].entryType`, "measure");
shouldBeEqualToString(`list.getEntries()[1].name`, "measure4");
shouldBeEqualToString(`list.getEntries()[2].entryType`, "mark");
shouldBeEqualToString(`list.getEntries()[2].name`, "mark4");
performance.mark("mark-before-disconnect");
performance.measure("measure-before-disconnect");
observer.disconnect();
performance.mark("mark-after-disconnect");
performance.measure("measure-after-disconnect");
setTimeout(finishJSTest, 50);
} else if (callbackCount === 5)
testFailed("Should not have received another callback, the observer was disconnected");
for (let mark of list.getEntries())
debug(" - " + mark.name);
});
function updateObserver(entryTypes) {
debug("Observing: " + JSON.stringify(entryTypes));
observer.observe({entryTypes});
}
updateObserver(["measure"]);
performance.mark("mark1");
performance.measure("measure1");
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>