fix(ui): guard browser ResizeObserver construction (#125480)

This commit is contained in:
Peter Steinberger
2026-08-17 17:55:09 -07:00
committed by GitHub
parent 064efce056
commit 850faa0367
2 changed files with 30 additions and 12 deletions
@@ -69,6 +69,22 @@ describe("normalizeBrowserUrlDraft", () => {
expect(panel.browserPanelIsOpen()).toBe(true);
});
it("mounts when ResizeObserver is unavailable", async () => {
vi.stubGlobal("ResizeObserver", undefined);
const panel = document.createElement("openclaw-browser-panel") as unknown as HTMLElement & {
available: boolean;
embedded: boolean;
renderRoot: ShadowRoot;
updateComplete: Promise<unknown>;
};
panel.available = true;
panel.embedded = true;
document.body.append(panel);
await panel.updateComplete;
expect(panel.renderRoot.querySelector(".bp")).not.toBeNull();
});
it("uses the shared surface empty state when the embedded browser has no tabs", async () => {
const panel = document.createElement("openclaw-browser-panel") as unknown as HTMLElement & {
available: boolean;
+14 -12
View File
@@ -60,15 +60,7 @@ class OpenClawBrowserPanel extends OpenClawLitElement implements BrowserPanelCon
});
private readonly onToggleRequest = (event: Event) => this.handleToggleRequest(event);
private embeddedRefreshTimer: number | null = null;
private readonly viewportResizeObserver = new ResizeObserver((entries) => {
const entry = entries[0];
if (entry) {
this.browserPanelController.handleViewportResize(
entry.contentRect.width,
entry.contentRect.height,
);
}
});
private viewportResizeObserver: ResizeObserver | null = null;
private observedViewportElement: Element | null = null;
static override styles = [
@@ -95,7 +87,8 @@ class OpenClawBrowserPanel extends OpenClawLitElement implements BrowserPanelCon
this.clearEmbeddedRefresh();
super.disconnectedCallback();
window.removeEventListener(BROWSER_PANEL_TOGGLE_EVENT, this.onToggleRequest);
this.viewportResizeObserver.disconnect();
this.viewportResizeObserver?.disconnect();
this.viewportResizeObserver = null;
this.observedViewportElement = null;
}
@@ -135,9 +128,18 @@ class OpenClawBrowserPanel extends OpenClawLitElement implements BrowserPanelCon
const viewportElement = this.renderRoot.querySelector(".bp-viewport");
if (viewportElement !== this.observedViewportElement) {
// The viewport is transient while the dock opens, closes, or becomes unavailable.
this.viewportResizeObserver.disconnect();
this.viewportResizeObserver?.disconnect();
this.observedViewportElement = viewportElement;
if (viewportElement) {
if (viewportElement && typeof ResizeObserver === "function") {
this.viewportResizeObserver ??= new ResizeObserver((entries) => {
const entry = entries[0];
if (entry) {
this.browserPanelController.handleViewportResize(
entry.contentRect.width,
entry.contentRect.height,
);
}
});
this.viewportResizeObserver.observe(viewportElement);
}
}