// Flags: --experimental-web-worker 'use strict'; const common = require('../common'); const assert = require('node:assert'); for (const type of ['classic', 'module']) { const source = ` const results = []; const conversions = []; const sentinel = new Error('conversion'); try { importScripts('https://[', { toString() { conversions.push('converted'); throw sentinel; } }); } catch (error) { results.push([conversions, error === sentinel]); } const order = []; try { importScripts( { toString() { order.push(1); return 'https://['; } }, { toString() { order.push(2); return 'data:text/javascript,'; } } ); } catch (error) { results.push([order, error.name]); } postMessage(results); `; const worker = new Worker(`data:text/javascript,${encodeURIComponent(source)}`, { type }); worker.onerror = common.mustNotCall('worker failed'); worker.onmessage = common.mustCall(({ data }) => { worker.terminate(); assert.deepStrictEqual(data, [ [['converted'], true], [[1, 2], type === 'module' ? 'TypeError' : 'SyntaxError'], ]); }); } if (common.hasCrypto) { // URL parsing must capture blob entries after all arguments are converted. const source = ` self.ran = false; const url = URL.createObjectURL(new Blob(['self.ran = true'], { type: 'text/javascript' })); let errorName; try { importScripts(url, { toString() { URL.revokeObjectURL(url); return 'data:text/javascript,'; } }); } catch (error) { errorName = error.name; } postMessage([self.ran, errorName]); `; const worker = new Worker(`data:text/javascript,${encodeURIComponent(source)}`); worker.onerror = common.mustNotCall('worker failed'); worker.onmessage = common.mustCall(({ data }) => { worker.terminate(); assert.deepStrictEqual(data, [false, 'NetworkError']); }); }