"use strict"; // This does not work as you expect because mutation observer compound microtasks are confusing. // Basically you can only use it once per test. function queueMicrotaskViaMO(cb) { const observer = new MutationObserver(cb); const node = document.createTextNode(""); observer.observe(node, { characterData: true }); node.data = "foo"; } // Need to use promise_test to get sequential ordering; otherwise the global mutation observer // compound microtask business screws us over. promise_test(() => { return new Promise(resolve => { const happenings = []; queueMicrotaskViaMO(() => happenings.push("x")); queueMicrotask(() => happenings.push("a")); queueMicrotask(() => { assert_array_equals(happenings, ["x", "a"]); resolve(); }); }); }, "It interleaves with MutationObservers as expected"); promise_test(() => { return new Promise(resolve => { const happenings = []; queueMicrotask(() => happenings.push("a")); Promise.reject().catch(() => happenings.push("x")); queueMicrotaskViaMO(() => happenings.push(1)); Promise.resolve().then(() => happenings.push("y")); queueMicrotask(() => happenings.push("b")); queueMicrotask(() => happenings.push("c")); queueMicrotask(() => { assert_array_equals(happenings, ["a", "x", 1, "y", "b", "c"]); resolve(); }); }); }, "It interleaves with MutationObservers and promises together as expected");