| <!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> |