Backed out changeset 713114c0331a (bug 1938707) by developer request CLOSED TREE
[gecko.git] / js / xpconnect / tests / mochitest / finalizationRegistry_worker.js
blobd603cdab3800247e276b3c4ea8518da63d640b5f
1 let holdings1 = [];
2 let holdings2 = [];
3 let holdings3 = [];
4 let holdings4 = [];
5 let holdings5 = [];
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   }
20 function startTest() {
21   // Registry with no registered objects.
22   let registry1 = new FinalizationRegistry(v => { holdings1.push(v); });
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);
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);
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);
41   // Registry observing cyclic JS data structure.
42   let registry5 = new FinalizationRegistry(v => { holdings5.push(v); });
43   registry5.register(makeJSCycle(4), 5);
45   const { gc } = getJSTestingFunctions();
46   gc();
48   Promise.resolve().then(() => {
49     checkNoCallbacks();
50   });
52   postMessage('started');
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);
63 function checkResults() {
64   is(holdings1.length, 0);
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);
72   is(holdings3.length, 0);
73   is(holdings4.length, 0);
75   is(holdings5.length, 1);
76   is(holdings5[0], 5);
78   postMessage('passed');
81 function is(a, b) {
82   if (a !== b) {
83     throw `Expected ${b} but got ${a}`;
84   }
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;