fix(desktop): route mouse thumb buttons to the in-app browser - #4459
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ApprovabilityVerdict: Approved This is a targeted bug fix for mouse thumb button navigation in the in-app browser. The changes follow existing patterns in the codebase, include comprehensive tests, and are self-contained within the preview system without touching sensitive areas. You can customize Macroscope's approvability policy. Learn more. |
When the pointer hovers the preview <webview> without focusing it, Chromium routes back/forward thumb-button navigation to the focused host renderer, so the app router navigated instead of the browser. Intercept the thumb buttons (button 3 = back, 4 = forward) in the guest preload, suppress Chromium's default, and forward an explicit navigate request to PreviewManager so the buttons always drive the hovered browser's history and never the host app. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
d04de2b to
deb168a
Compare
## What's Changed * fix(desktop): route mouse thumb buttons to the in-app browser by @akosbalogh in pingdotgg/t3code#4459 * fix(web): keep the final segment of directory paths with a trailing separator by @jorvarea in pingdotgg/t3code#5460 * Keep block code plain when copying from rendered markdown by @yashranaway in pingdotgg/t3code#4468 * fix(web): add web app manifest so installed app keeps its scope by @Albro3459 in pingdotgg/t3code#4306 * Skip user hooks during Claude capability probes by @yashranaway in pingdotgg/t3code#4466 * fix(mobile): use Android monospace font family by @tastelessjolt in pingdotgg/t3code#4609 * fix(desktop): timestamps follow the OS locale instead of en-US by @brzzdev in pingdotgg/t3code#6190 * fix(web): keep multi-select questions open after the first click by @RaitP1 in pingdotgg/t3code#6646 * fix(web): stop clipping the changed-files expand hover on Windows by @mrmg in pingdotgg/t3code#6545 * fix(server): allow long-running git pushes by @devchaudhary24k in pingdotgg/t3code#6499 * fix(desktop): keep probing backend readiness while the process is alive by @lgwacker in pingdotgg/t3code#5526 * fix(server): allow install scripts in npm-global provider updates by @hey-jj in pingdotgg/t3code#5646 * fix: detect SSH remotes with non-git user prefixes (e.g. gitlab@) by @JackatDJL in pingdotgg/t3code#3649 * fix(web): describe what Ultracode does in the Reasoning picker by @delltrak in pingdotgg/t3code#6092 * fix(server): settle pending user-input requests when a Claude session stops by @AaronAbuUsama in pingdotgg/t3code#5127 * fix(server): stop replaying a command receipt for a different aggregate by @ostapondo in pingdotgg/t3code#5246 * fix(server): settle snoozed threads immediately by @0bkevin in pingdotgg/t3code#5379 * fix(mobile): prevent crash on sign out in settings by @shubhu121 in pingdotgg/t3code#4899 * fix(mobile): local-checkout threads record their branch so PR badges show by @Zeus-Deus in pingdotgg/t3code#4986 * fix(web): contain long approval commands by @Serendeep in pingdotgg/t3code#6503 * feat(web): make right panel maximize bindable by @husseinraoouf in pingdotgg/t3code#5091 * fix(server): respect inherited OPENCODE_CONFIG_CONTENT by @jonocodes in pingdotgg/t3code#4242 * fix(marketing): detect Mac chip on homepage download button by @mahdibm-dev in pingdotgg/t3code#4197 * Keep the server alive when a response write hits a dead socket by @yashranaway in pingdotgg/t3code#4470 * Limit physical key fallback to non-Latin layout output by @yashranaway in pingdotgg/t3code#4469 * fix: restore CLAUDE.md symlink target by @NgoQuocViet2001 in pingdotgg/t3code#3929 * fix(clients): default clone destination to folder plus repo name by @inayayousfi in pingdotgg/t3code#5989 * fix(web): keep timestamp date and time in the same locale by @juliusmarminge in pingdotgg/t3code#7081 * feat(desktop): add signal macOS DMG installer background by @Brechard in pingdotgg/t3code#6201 ## New Contributors * @akosbalogh made their first contribution in pingdotgg/t3code#4459 * @jorvarea made their first contribution in pingdotgg/t3code#5460 * @yashranaway made their first contribution in pingdotgg/t3code#4468 * @Albro3459 made their first contribution in pingdotgg/t3code#4306 * @tastelessjolt made their first contribution in pingdotgg/t3code#4609 * @brzzdev made their first contribution in pingdotgg/t3code#6190 * @RaitP1 made their first contribution in pingdotgg/t3code#6646 * @devchaudhary24k made their first contribution in pingdotgg/t3code#6499 * @lgwacker made their first contribution in pingdotgg/t3code#5526 * @JackatDJL made their first contribution in pingdotgg/t3code#3649 * @delltrak made their first contribution in pingdotgg/t3code#6092 * @AaronAbuUsama made their first contribution in pingdotgg/t3code#5127 * @0bkevin made their first contribution in pingdotgg/t3code#5379 * @shubhu121 made their first contribution in pingdotgg/t3code#4899 * @Zeus-Deus made their first contribution in pingdotgg/t3code#4986 * @husseinraoouf made their first contribution in pingdotgg/t3code#5091 * @jonocodes made their first contribution in pingdotgg/t3code#4242 * @mahdibm-dev made their first contribution in pingdotgg/t3code#4197 * @NgoQuocViet2001 made their first contribution in pingdotgg/t3code#3929 * @inayayousfi made their first contribution in pingdotgg/t3code#5989 **Full Changelog**: pingdotgg/t3code@v0.0.34-nightly.20260815.1101...v0.0.34-nightly.20260815.1102 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.34-nightly.20260815.1102
Fixes #4839
What changed
Mouse thumb (side) buttons — back =
button 3, forward =button 4— now navigate the in-app browser's history when the pointer is over the preview<webview>, instead of navigating the host T3 Code app (threads/agents view).Why
The preview is an Electron
<webview>whoseWebContentsis driven byPreviewManager. When the pointer merely hovers the guest page (the guest isn't focused), Chromium routes thumb-button history navigation to the focusedWebContents— the host app renderer — so pressing back/forward over the browser sent the app router back instead of the browser. This was intermittent ("sometimes") because it depended on which surface held focus.Note
app-commandis Windows/Linux-only and Electron never auto-navigates on it, and this repo has no handler — so that path is deliberately untouched. The DOM-level path is the mechanism here.How
PickPreload.ts(runs inside every preview guest): capture-phase listeners for the thumb buttonspreventDefault()+stopImmediatePropagation()onmousedown/mouseup/auxclickto suppress Chromium's default navigation, and forward an explicit{ direction }over a newMOUSE_NAVIGATE_CHANNELIPC. Guarded byevent.isTrustedso automation-injected events are unaffected.Manager.ts:attachListenersregisters amouseNavigatehandler that drives that tab's history via the existingwc.navigationHistory.goBack()/goForward()(guarded bycanGoBack()/canGoForward()), mirroring the existing UI back/forward path. Registered/torn down alongside the existingHUMAN_INPUT_CHANNELlistener.GuestProtocol.ts: newMOUSE_NAVIGATE_CHANNELconstant.Suppression in the guest is unconditional, so the host app never navigates while the cursor is over the browser — even when the browser has no back history.
Testing
Manager.test.tsasserting the IPC handler drivesgoBack/goForward, ignores unknown payloads, and does nothing when history is exhausted.apps/desktoptypecheck, lint, format pass locally. Repo-widevp checkreports 0 errors and the desktop suite passes 368/368 — worth noting since CI on this PR is still sitting ataction_requiredpending maintainer approval, so none of it has run here.🤖 Generated with Claude Code
Note
Low Risk
Localized preview input/navigation wiring with validation and history guards; no auth, data, or broad architectural changes.
Overview
Mouse thumb buttons (back / forward) over the preview webview now move that tab’s browser history instead of the host app router when the guest isn’t focused.
PickPreload intercepts trusted thumb-button events in capture phase, blocks Chromium’s default routing, and sends
{ direction }onpreview:mouse-navigate. PreviewManager handles that IPC like existing guest channels and callsnavigationHistory.goBack()/goForward()only whencanGoBack/canGoForwardallow it.A unit test covers back/forward, invalid payloads, and no-op when history is exhausted.
Reviewed by Cursor Bugbot for commit deb168a. Bugbot is set up for automated code reviews on this repo. Configure here.