bfcache-test-helpers.js (1532B)
1 'use strict'; 2 3 // Calls `createLock` with a file handle for `fileName`. Returns the lock if it 4 // succeeds. Returns undefined if it doesn't. 5 export async function tryToCreateLock(fileName, createLock) { 6 const dir = await navigator.storage.getDirectory(); 7 const fileHandle = await dir.getFileHandle(fileName, {create: true}); 8 9 try { 10 return await createLock(fileHandle); 11 } catch { 12 return undefined; 13 } 14 } 15 16 // Returns a function that forwards `funcName` and the `args` passed to it to 17 // the `bfcache-test-worker.js` dedicated worker. 18 // 19 // Will create the dedicated worker if it doesn't already exist. 20 export const forwardToDedicatedWorker = (() => { 21 let dedicatedWorker; 22 23 // Returns a promise that resolves with the next dedicated worker result. Or 24 // rejects if there is an error on the worker. 25 function getNextDedicatedWorkerResult(dedicatedWorker) { 26 return new Promise((resolve, reject) => { 27 dedicatedWorker.addEventListener('message', ({data}) => { 28 resolve(data); 29 }, {once: true}); 30 dedicatedWorker.addEventListener('error', () => { 31 reject(new Error('An error occurred on the dedicated worker.')); 32 }, {once: true}); 33 }); 34 } 35 36 return function(funcName) { 37 return (...args) => { 38 if (!dedicatedWorker) { 39 dedicatedWorker = new Worker( 40 `/fs/resources/bfcache-test-worker.js`, {type: 'module'}); 41 } 42 43 dedicatedWorker.postMessage({funcName, args}); 44 return getNextDedicatedWorkerResult(dedicatedWorker); 45 } 46 } 47 })();