From b63e48c7c626ec672ab9eaf8072b637ca508a5fa Mon Sep 17 00:00:00 2001 From: "wq.pan" Date: Thu, 27 Aug 2026 11:22:33 +0800 Subject: [PATCH] fix(electron): recover crashed renderer windows --- packages/electron/main.mjs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/electron/main.mjs b/packages/electron/main.mjs index b2ede00a..49c2ba22 100644 --- a/packages/electron/main.mjs +++ b/packages/electron/main.mjs @@ -33,6 +33,7 @@ import { } from './linux-autostart.mjs'; import { unsupportedAppSpecificOpenError, validateLocalPath } from './path-open-utils.mjs'; import { shouldAllowBrowserPanelCertificateError } from './browser-panel-security.mjs'; +import { createRendererRecoveryPolicy } from './renderer-recovery.mjs'; import { mintOutsideFileGrant } from '@openchamber/web/server/lib/fs/routes.js'; const execFileAsync = promisify(execFile); @@ -2496,6 +2497,7 @@ const createBrowserWindow = ({ label, restoreGeometry, url, runtimeConfig = {} } }; const browserWindow = new BrowserWindow(options); + const rendererRecoveryPolicy = createRendererRecoveryPolicy(); browserWindow.__ocLabel = label || nextWindowLabel(); browserWindow.__ocRuntimeConfig = { apiBaseUrl: desktopApiBaseUrl, clientToken: desktopClientToken, requestHeaders: desktopRequestHeaders }; browserWindow.__ocInitScript = buildInitScript(desktopLocalOrigin, state.bootOutcome, desktopApiBaseUrl, desktopClientToken, desktopRequestHeaders); @@ -2656,6 +2658,19 @@ const createBrowserWindow = ({ label, restoreGeometry, url, runtimeConfig = {} } browserWindow.webContents.on('zoom-changed', () => { browserWindow.webContents.setZoomFactor(1); }); + browserWindow.webContents.on('render-process-gone', (_event, details) => { + if (!rendererRecoveryPolicy.shouldReload(details.reason)) return; + log.warn('[electron] renderer exited unexpectedly; reloading window', { + label: browserWindow.__ocLabel, + reason: details.reason, + exitCode: details.exitCode, + }); + setTimeout(() => { + if (!browserWindow.isDestroyed()) { + browserWindow.webContents.reload(); + } + }, 100); + }); browserWindow.webContents.on('dom-ready', () => { if (browserWindow.__ocLabel === 'main') {