Skip to content

fix(preview): failed tabs no longer sit as a blank floating panel - #7236

Open
gbarros-dev wants to merge 17 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player
Open

fix(preview): failed tabs no longer sit as a blank floating panel#7236
gbarros-dev wants to merge 17 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-dev gbarros-dev commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

A dead preview URL still counted as a live tab. The floating mini-player stayed a white rectangle, and preview_status told the agent the page was healthy.

The mini-player now shows Retry and Close on a failed load. Status reports available: false with the URL the agent actually tried, not chrome-error://.

Closes #7212.

Verification:

  • 82 desktop preview-manager tests
  • 14 focused web preview tests
  • 2 IPC contract tests
  • web, desktop, and contracts typechecks
  • targeted lint, formatting, and git diff --check

Originally implemented with Grok 4.6 through Grok CLI. Rebased and updated with GPT-5.6 Luna in Codex.


Note

Medium Risk
Changes preview automation readiness and status semantics across desktop IPC and the web host, which can affect agent navigate/retry behavior but stays within preview UI and automation—not auth or data paths.

Overview
Failed preview navigations no longer look like a healthy, blank mini-player or automation target. LoadFailed tabs show a Retry/Close overlay instead of an empty webview, and agents get available: false with the requested URL and error text—not chrome-error://.

Desktop PreviewManager.automationStatus now exposes an optional attached flag (live guest vs stale overlay), treats LoadFailed as unavailable while keeping the guest reachable for retry, and preserves failure metadata when web contents are destroyed. Web-side applyPreviewLoadFailureToAutomationStatus merges snapshot failures into preview_status without letting stale LoadFailed state override a live healthy or loading guest.

waitForNavigationReadiness and overlay waiting stop treating available: false as an infinite wait: attached failed loads settle, detached/destroyed guests fail fast. Picture-in-picture is blocked on unreachable previews unless PiP is already open.

Reviewed by Cursor Bugbot for commit 9ef66d5. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix failed preview tabs showing blank floating panel with unreachable overlay

  • Adds PreviewMiniPlayerUnreachable overlay that displays a parsed host, friendly error description, and Retry/Close actions when a preview navigation fails
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process reports whether the guest webContents is still alive, distinguishing live guests from destroyed or missing ones
  • Updates previewNavigationReadiness and preview.waitForDesktopOverlay to resolve readiness after a failed load when the guest is attached, and to reject with target-unavailable when the guest is detached or destroyed
  • Transforms snapshot-only LoadFailed states into unavailable automation status, preserving the requested navigation URL and failure title instead of a chrome-error interstitial URL
  • Behavioral Change: PreviewManager.automationStatus no longer replaces failed navigation details with chrome-error URLs or in-flight loading state; callers that do not pass live-status precedence will now see unavailable with the original requested URL. ThreadPreviewMiniPlayer disables popping out a failed preview unless already popped out.

Macroscope summarized 9ef66d5.

@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 895e3cbd-6d8b-463d-8bdd-9959f0ad3c29

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 16, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the new mini-player overlay's buttons inherit pointer-events: none from the mini-player root, so Retry/Close can't be clicked.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment thread apps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment thread apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeapp Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This fixes failed floating previews with a new Retry/Close UI and coordinated desktop, web, automation-readiness, and IPC-status changes. Because it alters an automatic automation gate and adds cross-process production behavior beyond a small isolated fix, human review is warranted.

You can add or adjust custom eligibility rules. Learn more.

Comment thread apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1 Compare August 17, 2026 07:39
@macroscopeapp
macroscopeapp Bot dismissed their stale review August 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
Contributor Author

Rebased onto current main after #7082 / tooltip lint. Conflict was only in ThreadPreviewMiniPlayer.tsx; kept the styled tooltips and the failed-tab PiP disable (close stays available if already popped out).

Comment thread apps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the new mini-player unreachable overlay: the host line can overflow the floating player because nothing constrains or truncates it.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment thread apps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973 Compare August 17, 2026 08:33
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798 Compare August 23, 2026 07:25
@macroscopeapp
macroscopeapp Bot dismissed their stale review August 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment thread apps/desktop/src/preview/Manager.ts
Comment thread apps/web/src/components/preview/previewNavigationReadiness.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6 Compare August 30, 2026 07:53
Comment thread apps/web/src/components/preview/previewNavigationReadiness.ts
Comment thread apps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7 Compare September 3, 2026 09:31
Comment thread apps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209a Compare September 3, 2026 10:14
Comment thread apps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment thread apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
A dead preview URL still has WebContents, so the mini-player rendered a white
rectangle and preview_status reported the tab as available. Surface Retry/Close
on LoadFailed and mark automation status unavailable.
chrome-error:// is not navigable. available:false plus the Chromium error
title already mark the tab dead; status.url stays the page the agent tried.
The listener map was typed as never[], so calling did-fail-load with a
real event payload failed tsgo.
…layer

The floating preview root is pointer-events-none. The overlay now opts back
in so the buttons work, matching the drag chrome and resize handle.
A successful retry can make desktop status available before the server
snapshot catches up. Trust live availability on the desktop path. Also
disable native PiP on the failed mini-player, matching the full panel.
Disabling the toggle on LoadFailed also blocked closing an already-open
separate window. Only prevent opening while the page is unreachable.
LoadFailed still has a live guest. Waiting on available:false blocked
navigate and retry. The wait now keys off hasWebContents.

The overlay also truncated neither the host nor hostless file/data URLs.
registerWebview now restores audio mute on attach; the LoadFailed
automation-status test was still missing those stubs after rebasing
onto mute-tab.
LoadFailed reports available:false with a live guest. waitForNavigationReadiness
was still polling for available:true, so navigate to a dead URL hung until
timeout instead of returning the error status.
available:false + loading:false is LoadFailed only while the webview is
still attached. A destroyed webContents now fails as an unavailable target
instead of completing waitForNavigationReadiness.
A stale LoadFailed snapshot no longer overwrites an in-flight load.
Desktop automation status now reports whether the guest is actually
attached, so a destroyed webContents cannot settle as a finished load.
@gbarros-dev
gbarros-dev force-pushed the fix/preview-failed-mini-player branch from 611eb1d to cb1782b Compare September 4, 2026 07:47
Comment thread apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 3 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 7c268a7. Configure here.

Comment thread apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Comment thread apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
Comment thread apps/web/src/components/preview/previewAutomationStatus.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Failed browser preview remains as a blank floating panel

2 participants