98 lines
3.6 KiB
HTML
98 lines
3.6 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;
|
|
|
|
// 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>
|