tor-browser

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

finalizationRegistry_worker.js (2137B)


      1 let holdings1 = [];
      2 let holdings2 = [];
      3 let holdings3 = [];
      4 let holdings4 = [];
      5 let holdings5 = [];
      6 
      7 onmessage = (event) => {
      8  switch (event.data) {
      9  case 'startTest':
     10    startTest();
     11    break;
     12  case 'checkResults':
     13    checkResults();
     14    break;
     15  default:
     16    throw "Unknown message";
     17  }
     18 };
     19 
     20 function startTest() {
     21  // Registry with no registered objects.
     22  let registry1 = new FinalizationRegistry(v => { holdings1.push(v); });
     23 
     24  // Registry with three registered objects.
     25  let registry2 = new FinalizationRegistry(v => { holdings2.push(v); });
     26  registry2.register({}, 1);
     27  registry2.register({}, 2);
     28  registry2.register({}, 3);
     29 
     30  // Registry with registered object that is then unregistered.
     31  let registry3 = new FinalizationRegistry(v => { holdings3.push(v); });
     32  let token3 = {}
     33  registry3.register({}, 1, token3);
     34  registry3.unregister(token3);
     35 
     36  // Registry with registered object that doesn't die.
     37  let registry4 = new FinalizationRegistry(v => { holdings4.push(v); });
     38  let object4 = {};
     39  registry4.register(object4, 1);
     40 
     41  // Registry observing cyclic JS data structure.
     42  let registry5 = new FinalizationRegistry(v => { holdings5.push(v); });
     43  registry5.register(makeJSCycle(4), 5);
     44 
     45  const { gc } = getJSTestingFunctions();
     46  gc();
     47 
     48  Promise.resolve().then(() => {
     49    checkNoCallbacks();
     50  });
     51 
     52  postMessage('started');
     53 }
     54 
     55 function checkNoCallbacks() {
     56  is(holdings1.length, 0);
     57  is(holdings2.length, 0);
     58  is(holdings3.length, 0);
     59  is(holdings4.length, 0);
     60  is(holdings5.length, 0);
     61 }
     62 
     63 function checkResults() {
     64  is(holdings1.length, 0);
     65 
     66  let result = holdings2.sort((a, b) => a - b);
     67  is(result.length, 3);
     68  is(result[0], 1);
     69  is(result[1], 2);
     70  is(result[2], 3);
     71 
     72  is(holdings3.length, 0);
     73  is(holdings4.length, 0);
     74 
     75  is(holdings5.length, 1);
     76  is(holdings5[0], 5);
     77 
     78  postMessage('passed');
     79 }
     80 
     81 function is(a, b) {
     82  if (a !== b) {
     83    throw `Expected ${b} but got ${a}`;
     84  }
     85 }
     86 
     87 function makeJSCycle(size) {
     88  let first = {};
     89  let current = first;
     90  for (let i = 0; i < size; i++) {
     91    current.next = {};
     92    current = current.next;
     93  }
     94  current.next = first;
     95  return first;
     96 }