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 }