Skip to content

Commit 441e9f9

Browse files
committed
fix(preview): keep guest viewport and server snapshot in lockstep
A size-only ready check could resolve resize before React committed the webview geometry. A failed CDP apply also left the persisted snapshot on the new size. Resize now waits for the existing ready gates, rolls the snapshot back when the override fails, and re-applies the committed setting when the guest attaches.
1 parent edc69da commit 441e9f9

2 files changed

Lines changed: 23 additions & 16 deletions

File tree

apps/web/src/components/preview/PreviewAutomationHosts.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,6 @@ const waitForRenderedViewport = async (
179179
const appliedSettingKey = webview?.getAttribute("data-preview-viewport-key") ?? null;
180180
const declaredViewport = readDeclaredViewport(webview);
181181
const renderedViewport = webview ? await readWebviewViewport(webview) : null;
182-
if (
183-
setting._tag !== "fill" &&
184-
renderedViewport &&
185-
Math.abs(renderedViewport.width - setting.width) <= 1 &&
186-
Math.abs(renderedViewport.height - setting.height) <= 1
187-
) {
188-
return renderedViewport;
189-
}
190182
if (
191183
renderedViewport &&
192184
isPreviewViewportReady({
@@ -531,6 +523,17 @@ function PreviewAutomationHost(props: { readonly environmentId: EnvironmentId })
531523
try {
532524
await applyPreviewGuestViewport(setViewport, ready.runtimeTabId, setting);
533525
} catch (error) {
526+
const rollback = await resize({
527+
environmentId,
528+
input: {
529+
threadId: request.threadId,
530+
tabId: ready.tabId,
531+
viewport: previousSetting,
532+
},
533+
});
534+
if (rollback._tag !== "Failure") {
535+
updatePreviewServerSnapshot(threadRef, rollback.value);
536+
}
534537
await applyPreviewGuestViewport(
535538
setViewport,
536539
ready.runtimeTabId,

apps/web/src/components/preview/PreviewView.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -240,17 +240,21 @@ export function PreviewView({
240240
throw error;
241241
}
242242
updatePreviewServerSnapshot(threadRef, result.value);
243-
if (runtimeTabId) {
244-
await applyPreviewGuestViewport(
245-
previewBridge?.automation.setViewport,
246-
runtimeTabId,
247-
nextViewport,
248-
);
249-
}
250243
},
251-
[resize, runtimeTabId, tabId, threadRef],
244+
[resize, tabId, threadRef],
252245
);
253246

247+
const viewportOverrideKey =
248+
viewport._tag === "fill" ? "fill" : `${viewport._tag}:${viewport.width}x${viewport.height}`;
249+
useEffect(() => {
250+
if (!runtimeTabId || !desktopOverlay?.hasWebContents) return;
251+
void applyPreviewGuestViewport(
252+
previewBridge?.automation.setViewport,
253+
runtimeTabId,
254+
viewport,
255+
).catch(() => undefined);
256+
}, [desktopOverlay?.hasWebContents, runtimeTabId, viewport, viewportOverrideKey]);
257+
254258
const handleToggleDeviceToolbar = () => {
255259
if (!runtimeTabId) return;
256260
if (viewport._tag !== "fill") {

0 commit comments

Comments
 (0)