Refresh browser portal after pane zoom

This commit is contained in:
austinpower1258 2026-03-09 20:14:42 -07:00
parent 23484eb01a
commit e96dc5dd83

View file

@ -3220,6 +3220,9 @@ final class Workspace: Identifiable, ObservableObject {
guard let paneId = paneId(forPanelId: panelId) else { return false }
guard bonsplitController.togglePaneZoom(inPane: paneId) else { return false }
focusPanel(panelId)
if browserPanel(for: panelId) != nil {
scheduleBrowserPortalReconcileAfterSplitZoom(panelId: panelId, remainingPasses: 4)
}
return true
}
@ -3482,6 +3485,46 @@ final class Workspace: Identifiable, ObservableObject {
}
}
// Browser panes host WKWebView in the window portal. After pane zoom toggles,
// force a few post-layout sync passes so the portal does not outlive the omnibar chrome.
private func scheduleBrowserPortalReconcileAfterSplitZoom(panelId: UUID, remainingPasses: Int) {
guard remainingPasses > 0 else { return }
DispatchQueue.main.async { [weak self] in
guard let self, let browserPanel = self.browserPanel(for: panelId) else { return }
for window in NSApp.windows {
window.contentView?.layoutSubtreeIfNeeded()
window.contentView?.displayIfNeeded()
}
let anchorView = browserPanel.portalAnchorView
let anchorReady =
anchorView.window != nil &&
anchorView.superview != nil &&
anchorView.bounds.width > 1 &&
anchorView.bounds.height > 1
if anchorReady {
BrowserWindowPortalRegistry.synchronizeForAnchor(anchorView)
BrowserWindowPortalRegistry.refresh(
webView: browserPanel.webView,
reason: "workspace.toggleSplitZoom"
)
}
let portalNeedsFollowUpPass =
!anchorReady ||
browserPanel.webView.window == nil ||
browserPanel.webView.superview == nil
if portalNeedsFollowUpPass {
self.scheduleBrowserPortalReconcileAfterSplitZoom(
panelId: panelId,
remainingPasses: remainingPasses - 1
)
}
}
}
private func scheduleMovedTerminalRefresh(panelId: UUID) {
guard terminalPanel(for: panelId) != nil else { return }