Last Good Version
1.61.1 (Firefox 151.0, firefox-1532)
First Bad Version
1.62.0 (Firefox 153.0, firefox-1538) — still broken on @playwright/test@next
(1.64.0-alpha-2026-09-04, Firefox 155.0, firefox-1543).
Steps to reproduce
git clone https://github.com/mxschmitt/firefox-worker-reload-crash
cd firefox-worker-reload-crash
npm ci
npx playwright install firefox
npm test # or: npm run loop (standalone, no test runner)
The repro has one dependency (@playwright/test), no bundler and no build step. The whole page is:
window.__worker = new Worker("/worker.js"); // ~2 MB of plain functions
window.__ready = true; // deliberately NOT awaiting the worker
and the test calls page.reload() as soon as __ready is set, so the reload tears the worker
down while the JS engine is still compiling its script.
Expected behavior
The tab survives the reloads, as it does on 1.61.1 and on every Firefox build up to and
including firefox-1536 (152.0.4).
Actual behavior
The Firefox content process dies with SIGSEGV; Playwright surfaces it as Page crashed /
Target crashed:
EVENT page.crash
page.reload: Page crashed
With DEBUG=pw:browser:
[Parent 12830, IPC I/O Parent] WARNING: process 13090 exited on signal 11: file ipc/chromium/src/chrome/common/process_watcher_posix_sigchld.cc:161
8/8 sessions crash on 1.62.1. npx playwright test fails 3/3.
Additional context
Bisect — every Firefox build Playwright shipped during the 1.62 cycle, same repro, same machine:
| Playwright |
Firefox build |
Firefox version |
crashes |
| 1.61.1 |
firefox-1532 |
151.0 |
0/8 |
| 1.62.0-alpha-2026-06-17 |
firefox-1532 |
151.0 |
0/8 |
| 1.62.0-alpha-2026-06-18 |
firefox-1533 |
151.0 |
0/8 |
| 1.62.0-alpha-2026-07-08 |
firefox-1534 |
152.0.4 |
0/8 |
| 1.62.0-alpha-2026-07-17 |
firefox-1535 |
152.0.4 |
0/8 |
| 1.62.0-alpha-2026-07-20 |
firefox-1536 |
152.0.4 |
0/8 |
| 1.62.0-alpha-2026-07-23 |
firefox-1538 |
153.0 |
7/8 |
| 1.62.1 |
firefox-1538 |
153.0 |
8/8 |
The boundary is exactly the firefox-1536 → firefox-1538 browser roll. Those two nightlies are
three days apart, so the Playwright-side code is effectively unchanged — this looks like the
browser roll rather than a Juggler change. (firefox-1537 was never published to npm.)
Not platform-specific, and not fixed on @next:
| Platform |
Playwright |
Firefox |
crashes |
| Linux x64 |
1.61.1 |
151.0 |
0/8 |
| Linux x64 |
1.62.1 |
153.0 |
8/8 |
| Linux x64 |
1.64.0-alpha-2026-09-04 (@next) |
155.0 |
6/6 |
| macOS 26.6.1 arm64 |
1.61.1 |
151.0 |
0/6 |
| macOS 26.6.1 arm64 |
1.62.1 |
153.0 |
6/6 |
| macOS 26.6.1 arm64 |
1.64.0-alpha-2026-09-04 (@next) |
155.0 |
6/6 |
What is and isn't required. Required:
- an actual Web Worker — the same ~7 MB served to the main thread via
<script src> never
crashed (0/4), so it is not merely parse cost
- a worker script large enough to still be compiling when the reload lands:
0.25 MB → 0/4, 0.5 MB → 0/4, 0.75 MB → 2/4, 1 MB → 4/4, 2 MB → 6/6
- reloading immediately, without waiting for the worker
Not required: postMessage to the worker (it never receives one and still crashes 4/4), Monaco,
TypeScript, a bundler, module workers, multiple tabs, or any settle delay.
Crash details. Core dump from the content process (MOZ_DISABLE_CONTENT_SANDBOX=1 so a core
is written):
Program terminated with signal SIGSEGV, Segmentation fault.
Crashing thread name: "DOM Worker"
=> mov 0x8(%rdi),%rax
mov 0x10(%rax),%rax
ret
si_addr = 0x8
rdi = 0x0 <-- null this-pointer
libxul.so in the Playwright build is stripped, so frames symbolize only as offsets (base
0x755202800000): libxul+0x6a74400, +0x6a52070, +0x6a51c01, +0x6a5487f, +0x6a54915,
+0x6a751a4, +0x3d51e6c, +0x3d5559a, +0x6a6fce5, +0x6a73e65, +0x6a55139, +0x6a54d91,
+0x6a7e2bd.
Likely upstream bug. This looks like
Bugzilla 2044428 —
Crash in [@ mozilla::dom::workerinternals::loader::WorkerScriptLoader::EvaluateScript] (NEW,
unassigned, Core :: DOM: Workers, SIGSEGV in content process). The analysis there is that a
re-entrant TryShutdown(), reached from inside JS::Compile(), nulls mWorkerRef underneath a
still-running EvaluateScript; the reporter's trigger was "refreshed the page — iframe crashed".
That also predicts the size threshold above: the script has to be big enough for a GC to happen
mid-compile and for compilation to still be in flight when the reload cancels the worker.
Caveat on scope, so this isn't overstated. I only tested Playwright's bundled Firefox — I did
not test stock Firefox with this repro, so I can't claim it is Playwright-specific. Mozilla
crash-stats in fact shows the WorkerScriptLoader::EvaluateScript signature on 152.0a1, 152.0.x,
153.0.x, 154.x and 155.0a1 (175 reports since 2026-03-01, 173 of them content-process), so the
underlying race predates Firefox 153 and affects stock builds too. What is new in firefox-1538
is that it became reliably reproducible — 0/8 → 8/8 across a single browser roll.
Filing here because the regression is visible purely through Playwright's bundled browser and the
trigger (reload right after load) is routine in test automation: any suite that reloads a page
carrying a heavy worker (Monaco, PDF.js, ffmpeg.wasm, a large language/service worker) will hit
it. It may be worth tracking 2044428 for the next Firefox roll.
Supersedes #42555, which was rightly closed as a draft with no reproduction attached.
Environment
Linux (crashes 8/8):
System:
OS: Linux 6.8 Ubuntu 24.04.4 LTS 24.04.4 LTS (Noble Numbat)
CPU: (4) x64 AMD EPYC-Milan Processor
Memory: 14.67 GB / 15.24 GB
Binaries:
Node: 22.23.2 - /usr/bin/node
npm: 10.9.8 - /usr/bin/npm
npmPackages:
@playwright/test: 1.62.1 => 1.62.1
macOS (crashes 6/6):
System:
OS: macOS 26.6.1
CPU: (12) arm64 Apple M4 Pro
Memory: 396.38 MB / 24.00 GB
Binaries:
Node: 24.9.0
npm: 11.19.0
npmPackages:
@playwright/test: 1.62.1 => 1.62.1
Last Good Version
1.61.1 (Firefox 151.0,
firefox-1532)First Bad Version
1.62.0 (Firefox 153.0,
firefox-1538) — still broken on@playwright/test@next(1.64.0-alpha-2026-09-04, Firefox 155.0,
firefox-1543).Steps to reproduce
The repro has one dependency (
@playwright/test), no bundler and no build step. The whole page is:and the test calls
page.reload()as soon as__readyis set, so the reload tears the workerdown while the JS engine is still compiling its script.
Expected behavior
The tab survives the reloads, as it does on 1.61.1 and on every Firefox build up to and
including
firefox-1536(152.0.4).Actual behavior
The Firefox content process dies with SIGSEGV; Playwright surfaces it as
Page crashed/Target crashed:With
DEBUG=pw:browser:8/8 sessions crash on 1.62.1.
npx playwright testfails 3/3.Additional context
Bisect — every Firefox build Playwright shipped during the 1.62 cycle, same repro, same machine:
firefox-1532firefox-1532firefox-1533firefox-1534firefox-1535firefox-1536firefox-1538firefox-1538The boundary is exactly the
firefox-1536→firefox-1538browser roll. Those two nightlies arethree days apart, so the Playwright-side code is effectively unchanged — this looks like the
browser roll rather than a Juggler change. (
firefox-1537was never published to npm.)Not platform-specific, and not fixed on
@next:@next)@next)What is and isn't required. Required:
<script src>nevercrashed (0/4), so it is not merely parse cost
0.25 MB → 0/4, 0.5 MB → 0/4, 0.75 MB → 2/4, 1 MB → 4/4, 2 MB → 6/6
Not required:
postMessageto the worker (it never receives one and still crashes 4/4), Monaco,TypeScript, a bundler, module workers, multiple tabs, or any settle delay.
Crash details. Core dump from the content process (
MOZ_DISABLE_CONTENT_SANDBOX=1so a coreis written):
libxul.soin the Playwright build is stripped, so frames symbolize only as offsets (base0x755202800000):libxul+0x6a74400,+0x6a52070,+0x6a51c01,+0x6a5487f,+0x6a54915,+0x6a751a4,+0x3d51e6c,+0x3d5559a,+0x6a6fce5,+0x6a73e65,+0x6a55139,+0x6a54d91,+0x6a7e2bd.Likely upstream bug. This looks like
Bugzilla 2044428 —
Crash in [@ mozilla::dom::workerinternals::loader::WorkerScriptLoader::EvaluateScript](NEW,unassigned, Core :: DOM: Workers, SIGSEGV in content process). The analysis there is that a
re-entrant
TryShutdown(), reached from insideJS::Compile(), nullsmWorkerRefunderneath astill-running
EvaluateScript; the reporter's trigger was "refreshed the page — iframe crashed".That also predicts the size threshold above: the script has to be big enough for a GC to happen
mid-compile and for compilation to still be in flight when the reload cancels the worker.
Caveat on scope, so this isn't overstated. I only tested Playwright's bundled Firefox — I did
not test stock Firefox with this repro, so I can't claim it is Playwright-specific. Mozilla
crash-stats in fact shows the
WorkerScriptLoader::EvaluateScriptsignature on 152.0a1, 152.0.x,153.0.x, 154.x and 155.0a1 (175 reports since 2026-03-01, 173 of them content-process), so the
underlying race predates Firefox 153 and affects stock builds too. What is new in
firefox-1538is that it became reliably reproducible — 0/8 → 8/8 across a single browser roll.
Filing here because the regression is visible purely through Playwright's bundled browser and the
trigger (reload right after load) is routine in test automation: any suite that reloads a page
carrying a heavy worker (Monaco, PDF.js, ffmpeg.wasm, a large language/service worker) will hit
it. It may be worth tracking 2044428 for the next Firefox roll.
Supersedes #42555, which was rightly closed as a draft with no reproduction attached.
Environment