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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

Open
gbarros-dev wants to merge 15 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 15 commits into
pingdotgg:mainfrom
gbarros-dev:fix/preview-failed-mini-player

Conversation

@gbarros-dev

@gbarros-devgbarros-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.

Implemented with Grok 4.6 through Grok CLI.


Note

Medium Risk
Changes preview automation readiness, IPC status shape, and agent-facing preview_status semantics; mistakes could block navigate/retry or misreport tab health, but behavior is heavily tested.

Overview
Failed preview navigations no longer look like a healthy blank tab: automation status reports available: false with the requested URL and error text (not chrome-error://), and desktop status adds an optional attached flag so callers can tell a live-but-failed guest from a destroyed one.

The floating mini-player shows a Retry / Close overlay on LoadFailed, hides the webview surface, and wires Retry to previewBridge.refresh. Shared applyPreviewLoadFailureToAutomationStatus keeps preview_status honest while preferLiveAvailability avoids stale failure snapshots during an in-flight retry.

Automation overlay and navigation readiness waits now key off attachment (with overlay fallback for older hosts): they settle when a guest is attached but failed, and fail fast when attached === false instead of timing out or treating a dead guest as a finished load.

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

Note

Fix failed preview tabs to show unreachable overlay instead of blank panel

  • Adds PreviewMiniPlayerUnreachable component that renders the parsed host or raw URL, friendly error text, and Retry/Close actions for failed navigations in the floating mini-player
  • Adds an optional attached boolean to DesktopPreviewAutomationStatusSchema so the main process can report whether the live guest process is still attached, independent of the registered web contents identifier
  • Updates PreviewManager.automationStatus to preserve failure description and requested URL for failed navigations, and report detached for destroyed or missing web contents instead of returning a generic empty status
  • Updates waitForNavigationReadiness to settle for an attached guest after a failed navigation and reject detached guests with PreviewAutomationTargetUnavailableError; falls back to overlay snapshot for older hosts without the attached field
  • Blocks opening picture-in-picture for failed previews while still allowing closing an existing picture-in-picture window
  • Behavioral Change: automation status payloads now prefer live available or loading state over a stale LoadFailed snapshot; older desktop hosts without the attached field still work via overlay fallback

Macroscope summarized 611eb1d.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
@macroscopeapp

macroscopeappBot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a new failed-preview recovery UI and modifies automation readiness and status semantics across the desktop process, web renderer, and IPC contract. Although the scope is focused and tested, the cross-layer runtime behavior and new user-facing capability merit human review.

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

Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 16, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 042078f to 20612c1CompareAugust 17, 2026 07:39
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 17, 2026 07:39

Dismissing prior approval to re-evaluate 20612c1

@gbarros-dev

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated

@macroscopeappmacroscopeappBot 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 threadapps/web/src/components/preview/PreviewMiniPlayerUnreachable.tsx Outdated
Comment threadapps/desktop/src/preview/Manager.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 20612c1 to c63e973CompareAugust 17, 2026 08:33
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 17, 2026
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch 2 times, most recently from ebf9fe9 to 6c07798CompareAugust 23, 2026 07:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 23, 2026 07:26

Dismissing prior approval to re-evaluate 83b931f

Comment threadapps/desktop/src/preview/Manager.ts
@Lermatroid

Copy link
Copy Markdown

looking forward to this getting merged 👀

@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from a3ff688 to d4d87f6CompareAugust 30, 2026 07:53
Comment threadapps/web/src/components/preview/previewAutomationStatus.ts
@gbarros-dev
gbarros-devforce-pushed the fix/preview-failed-mini-player branch from 9f0f330 to ef6fdb7CompareSeptember 3, 2026 09:31
Comment threadapps/desktop/src/preview/Manager.ts
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-devforce-pushed the fix/preview-failed-mini-player branch from b707c47 to 16d209aCompareSeptember 3, 2026 10:14

@cursorcursorBot 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 1 potential issue.

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 16d209a. Configure here.

Comment threadapps/web/src/components/preview/PreviewAutomationHosts.tsx Outdated
Comment threadapps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR 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

@gbarros-dev@Lermatroid