From 2fc9d6107027619ca5f23ff34f6abe3f7d16aabc Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Wed, 3 Jun 2026 11:06:24 +0800 Subject: [PATCH] Support for "module" type workers. Pretty basic, worker started with the {type: 'module'} option has 2 practical differences: 1 - importScript isn't allowed (TypeError) 2 - the initial script is loaded as a module Seen in various WPT tests, but also saw this usage on mastodon. --- src/browser/js/Env.zig | 2 +- src/browser/tests/worker/module-worker.js | 25 +++++++++++++++ src/browser/tests/worker/worker.html | 23 ++++++++++++++ src/browser/webapi/Worker.zig | 38 ++++++++++++++++++----- src/browser/webapi/WorkerGlobalScope.zig | 6 ++++ 5 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 src/browser/tests/worker/module-worker.js diff --git a/src/browser/js/Env.zig b/src/browser/js/Env.zig index 45452ffc..1fa807f8 100644 --- a/src/browser/js/Env.zig +++ b/src/browser/js/Env.zig @@ -620,7 +620,7 @@ test "Env: Worker context " { const frame = try session.createPage(); defer session.removePage(); - const worker = try @import("../webapi/Worker.zig").init("http://localhost:9582/src/browser/tests/testing.js", frame); + const worker = try @import("../webapi/Worker.zig").init("http://localhost:9582/src/browser/tests/testing.js", null, frame); var ls: js.Local.Scope = undefined; worker._worker_scope.js.localScope(&ls); diff --git a/src/browser/tests/worker/module-worker.js b/src/browser/tests/worker/module-worker.js new file mode 100644 index 00000000..1b1aa7b6 --- /dev/null +++ b/src/browser/tests/worker/module-worker.js @@ -0,0 +1,25 @@ +// A module worker (`new Worker(url, { type: "module" })`). Unlike a classic +// worker, the entry script may use top-level static `import`/`export`, and +// `importScripts()` is not supported (it throws a TypeError). +import { baseValue } from './modules/base.js'; +import { importedValue, localValue } from './modules/importer.js'; + +export const exported = 'top-level-export-ok'; + +let importScriptsError = null; +try { + importScripts('./import-script1.js'); +} catch (e) { + importScriptsError = e.constructor.name; +} + +onmessage = function (event) { + postMessage({ + echo: event.data, + baseValue: baseValue, + importedValue: importedValue, + localValue: localValue, + importScriptsError: importScriptsError, + from: 'module-worker', + }); +}; diff --git a/src/browser/tests/worker/worker.html b/src/browser/tests/worker/worker.html index cabe5d14..881c6b6c 100644 --- a/src/browser/tests/worker/worker.html +++ b/src/browser/tests/worker/worker.html @@ -380,6 +380,29 @@ } + +