tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

queue-microtask.window.js (1451B)


      1 "use strict";
      2 
      3 // This does not work as you expect because mutation observer compound microtasks are confusing.
      4 // Basically you can only use it once per test.
      5 function queueMicrotaskViaMO(cb) {
      6  const observer = new MutationObserver(cb);
      7  const node = document.createTextNode("");
      8  observer.observe(node, { characterData: true });
      9  node.data = "foo";
     10 }
     11 
     12 // Need to use promise_test to get sequential ordering; otherwise the global mutation observer
     13 // compound microtask business screws us over.
     14 
     15 promise_test(() => {
     16  return new Promise(resolve => {
     17    const happenings = [];
     18 
     19    queueMicrotaskViaMO(() => happenings.push("x"));
     20    queueMicrotask(() => happenings.push("a"));
     21 
     22    queueMicrotask(() => {
     23      assert_array_equals(happenings, ["x", "a"]);
     24      resolve();
     25    });
     26  });
     27 }, "It interleaves with MutationObservers as expected");
     28 
     29 promise_test(() => {
     30  return new Promise(resolve => {
     31    const happenings = [];
     32 
     33    queueMicrotask(() => happenings.push("a"));
     34    Promise.reject().catch(() => happenings.push("x"));
     35    queueMicrotaskViaMO(() => happenings.push(1));
     36    Promise.resolve().then(() => happenings.push("y"));
     37    queueMicrotask(() => happenings.push("b"));
     38    queueMicrotask(() => happenings.push("c"));
     39 
     40    queueMicrotask(() => {
     41      assert_array_equals(happenings, ["a", "x", 1, "y", "b", "c"]);
     42      resolve();
     43    });
     44  });
     45 }, "It interleaves with MutationObservers and promises together as expected");