From 386300545ccfbc5a283844167d7a05042015a629 Mon Sep 17 00:00:00 2001 From: ciregenz Date: Wed, 15 Jul 2026 16:45:46 -0700 Subject: [PATCH] [eric] browser: did-fail-load clears the spinner + surfaces the reload UI (failed nav used to spin forever with no recovery) --- frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx b/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx index 1bd759da..af46b757 100644 --- a/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx +++ b/frontend/src/app/pages/Dashboard/cards/BrowserCard.tsx @@ -404,6 +404,13 @@ const BrowserCard: React.FC = ({ }); }; + // A failed/aborted main-frame load never fires did-stop-loading, and initializedTabs is already set so doLoad won't re-arm: without this the card sits blank with the spinner running forever. errorCode -3 is ERR_ABORTED (a superseded nav), not a failure. + const onDidFailLoad = (e: any) => { + if (!e || e.isMainFrame === false) return; + updateTabLocal(tabId, { loading: false }); + if (e.errorCode && e.errorCode !== -3) onProcessGone(); + }; + const onFaviconUpdate = (e: any) => { const favicons = e.favicons || (e.detail && e.detail.favicons); if (favicons?.[0]) { @@ -428,6 +435,7 @@ const BrowserCard: React.FC = ({ wv.addEventListener('new-window', onNewWindow as any); wv.addEventListener('render-process-gone', onProcessGone as any); wv.addEventListener('crashed', onProcessGone as any); + wv.addEventListener('did-fail-load', onDidFailLoad as any); cleanups.push(() => { unregisterWebview(browserId, tabId); @@ -441,6 +449,7 @@ const BrowserCard: React.FC = ({ wv.removeEventListener('new-window', onNewWindow as any); wv.removeEventListener('render-process-gone', onProcessGone as any); wv.removeEventListener('crashed', onProcessGone as any); + wv.removeEventListener('did-fail-load', onDidFailLoad as any); const churn = urlChurnThrottle.current.get(tabId); if (churn?.timer) { clearTimeout(churn.timer); churn.timer = null; } });