/** * Imports code into a worklet. E.g. * * importWorklet(CSS.paintWorklet, {url: 'script.js'}); * importWorklet(CSS.paintWorklet, '(javascript string)'); * * @param {Worklet} worklet * @param {(Object|string)} code */ function importWorklet(worklet, code) { let url; if (typeof code === 'object') { url = code.url; } else { const blob = new Blob([code], {type: 'text/javascript'}); url = URL.createObjectURL(blob); } return worklet.addModule(url); } /** @private */ async function animationFrames(frames) { for (let i = 0; i < frames; i++) await new Promise(requestAnimationFrame); } /** @private */ async function workletPainted() { await animationFrames(2); } /** * To make sure that we take the snapshot at the right time, we do double * requestAnimationFrame. In the second frame, we take a screenshot, that makes * sure that we already have a full frame. * * @param {Worklet} worklet * @param {(Object|string)} code */ async function importWorkletAndTerminateTestAfterAsyncPaint(worklet, code) { if (typeof worklet === 'undefined') { takeScreenshot(); return; } await importWorklet(worklet, code); await workletPainted(); takeScreenshot(); }