From d4cdb99e4cc544fc875ae8dd44bd4e1cef005a89 Mon Sep 17 00:00:00 2001 From: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Date: Tue, 25 Aug 2026 13:17:29 +0800 Subject: [PATCH] fix(desktop): suppress resize observer loop warnings (#44883) --- packages/desktop/src/renderer/diagnostics.ts | 67 +------------------- 1 file changed, 3 insertions(+), 64 deletions(-) diff --git a/packages/desktop/src/renderer/diagnostics.ts b/packages/desktop/src/renderer/diagnostics.ts index 40ee7f528b7..cb3b210d651 100644 --- a/packages/desktop/src/renderer/diagnostics.ts +++ b/packages/desktop/src/renderer/diagnostics.ts @@ -2,7 +2,9 @@ const resizeLoopWarning = "ResizeObserver loop completed with undelivered notifi if (import.meta.env.DEV) { installConsoleStacks() - installResizeObserverStacks() + window.addEventListener("error", (event) => { + if (event.message === resizeLoopWarning) event.preventDefault() + }) } function installConsoleStacks() { @@ -10,60 +12,6 @@ function installConsoleStacks() { console.error = tracedConsole(console.error.bind(console), "Console error") } -function installResizeObserverStacks() { - if (typeof ResizeObserver !== "function") return - - const NativeResizeObserver = ResizeObserver - type ResizeTrace = { - created: string - last?: { at: number; targets: Element[] } - } - const observers = new Set() - - class TracedResizeObserver extends NativeResizeObserver { - private readonly trace: ResizeTrace - - constructor(callback: ResizeObserverCallback) { - const trace: ResizeTrace = { - created: diagnosticStack("ResizeObserver created"), - } - super((entries, observer) => { - trace.last = { at: performance.now(), targets: entries.map((entry) => entry.target) } - callback(entries, observer) - }) - this.trace = trace - observers.add(trace) - } - - override disconnect() { - observers.delete(this.trace) - super.disconnect() - } - } - - globalThis.ResizeObserver = TracedResizeObserver - window.addEventListener("error", (event) => { - if (event.message !== resizeLoopWarning) return - const now = performance.now() - const active = [...observers] - .flatMap((observer) => { - if (!observer.last || now - observer.last.at >= 100) return [] - return [{ ...observer, last: observer.last }] - }) - .sort((a, b) => b.last.at - a.last.at) - .slice(0, 5) - const detail = active.length - ? active - .map( - (observer, index) => - `Recent ResizeObserver ${index + 1}; targets: ${observer.last.targets.map(describeElement).join(", ") || "none"}\n${observer.created}`, - ) - .join("\n") - : "No ResizeObserver callback was recorded in the previous 100 ms." - console.warn(`[renderer diagnostics] ${resizeLoopWarning}\n${detail}`) - }) -} - function tracedConsole(write: (...args: unknown[]) => void, label: string) { const pending = new Map() return (...args: unknown[]) => { @@ -85,15 +33,6 @@ function tracedConsole(write: (...args: unknown[]) => void, label: string) { } } -function describeElement(element: Element) { - const id = element.id ? `#${element.id}` : "" - const classes = [...element.classList] - .slice(0, 3) - .map((name) => `.${name}`) - .join("") - return `${element.tagName.toLowerCase()}${id}${classes}` -} - function diagnosticStack(label: string) { return new Error(label).stack ?? label }