fix(workspace): setup popup handling for all pane creation paths
Fixes OAuth popups not functioning correctly in stacked panes and split operations. The `setupPopupHandling()` call was missing in several pane creation code paths, causing popup windows to not properly register their handlers. Added setupPopupHandling() calls in: - finalizeStackCreation: When creating new stacked panes - CloseStackedPane: When converting last stacked pane back to regular pane - splitNode: When creating new panes via split operations This ensures all panes have proper popup lifecycle management regardless of how they were created (direct, stacked, or split).
- commit
- 72ad1649f0670dedc060561e5cfb90bbbc0ee799
- author
- bnema · · 2025-11-17 19:27 UTC
- committer
- bnema · · 2025-11-17 19:18 UTC
- parent
- ff83895
- signature
- unsigned
3 files · +4 -0
M internal/app/browser/stacked_panes.go +2 -0
| @@ -343,6 +343,7 @@ func (spm *StackedPaneManager) reattachToParent(container gtk.Widgetter, target | |||
| 343 | 343 | func (spm *StackedPaneManager) finalizeStackCreation(stackNode, newLeaf *paneNode, insertIndex int) (*paneNode, error) { | |
| 344 | 344 | // Update workspace state first | |
| 345 | 345 | spm.wm.viewToNode[newLeaf.pane.webView] = newLeaf | |
| 346 | + | spm.wm.setupPopupHandling(newLeaf.pane.webView, newLeaf) | |
| 346 | 347 | spm.wm.ensureHover(newLeaf) | |
| 347 | 348 | spm.wm.app.panes = append(spm.wm.app.panes, newLeaf.pane) | |
| 348 | 349 | if newLeaf.pane.zoomController != nil { | |
| @@ -876,6 +877,7 @@ func (spm *StackedPaneManager) CloseStackedPane(node *paneNode) error { | |||
| 876 | 877 | lastPane.stackedPanes = nil | |
| 877 | 878 | lastPane.titleBar = nil | |
| 878 | 879 | spm.wm.viewToNode[lastPane.pane.webView] = lastPane | |
| 880 | + | spm.wm.setupPopupHandling(lastPane.pane.webView, lastPane) | |
| 879 | 881 | ||
| 880 | 882 | generation := spm.wm.nextCleanupGeneration() | |
| 881 | 883 | spm.wm.cleanupPane(node, generation) | |
| @@ -343,6 +343,7 @@ func (spm *StackedPaneManager) reattachToParent(container gtk.Widgetter, target | |||||
| 343 | func (spm *StackedPaneManager) finalizeStackCreation(stackNode, newLeaf *paneNode, insertIndex int) (*paneNode, error) { | 343 | func (spm *StackedPaneManager) finalizeStackCreation(stackNode, newLeaf *paneNode, insertIndex int) (*paneNode, error) { | ||
| 344 | // Update workspace state first | 344 | // Update workspace state first | ||
| 345 | spm.wm.viewToNode[newLeaf.pane.webView] = newLeaf | 345 | spm.wm.viewToNode[newLeaf.pane.webView] = newLeaf | ||
| 346 | + | spm.wm.setupPopupHandling(newLeaf.pane.webView, newLeaf) | |||
| 346 | spm.wm.ensureHover(newLeaf) | 347 | spm.wm.ensureHover(newLeaf) | ||
| 347 | spm.wm.app.panes = append(spm.wm.app.panes, newLeaf.pane) | 348 | spm.wm.app.panes = append(spm.wm.app.panes, newLeaf.pane) | ||
| 348 | if newLeaf.pane.zoomController != nil { | 349 | if newLeaf.pane.zoomController != nil { | ||
| @@ -876,6 +877,7 @@ func (spm *StackedPaneManager) CloseStackedPane(node *paneNode) error { | |||||
| 876 | lastPane.stackedPanes = nil | 877 | lastPane.stackedPanes = nil | ||
| 877 | lastPane.titleBar = nil | 878 | lastPane.titleBar = nil | ||
| 878 | spm.wm.viewToNode[lastPane.pane.webView] = lastPane | 879 | spm.wm.viewToNode[lastPane.pane.webView] = lastPane | ||
| 880 | + | spm.wm.setupPopupHandling(lastPane.pane.webView, lastPane) | |||
| 879 | 881 | ||||
| 880 | generation := spm.wm.nextCleanupGeneration() | 882 | generation := spm.wm.nextCleanupGeneration() | ||
| 881 | spm.wm.cleanupPane(node, generation) | 883 | spm.wm.cleanupPane(node, generation) | ||
M internal/app/browser/workspace_manager.go +1 -0
| @@ -171,6 +171,7 @@ func NewWorkspaceManager(app *BrowserApp, rootPane *BrowserPane) *WorkspaceManag | |||
| 171 | 171 | manager.root = root | |
| 172 | 172 | manager.mainPane = root | |
| 173 | 173 | manager.viewToNode[rootPane.webView] = root | |
| 174 | + | manager.setupPopupHandling(rootPane.webView, root) | |
| 174 | 175 | manager.ensureHover(root) | |
| 175 | 176 | ||
| 176 | 177 | if handler := rootPane.MessageHandler(); handler != nil { | |
| @@ -171,6 +171,7 @@ func NewWorkspaceManager(app *BrowserApp, rootPane *BrowserPane) *WorkspaceManag | |||||
| 171 | manager.root = root | 171 | manager.root = root | ||
| 172 | manager.mainPane = root | 172 | manager.mainPane = root | ||
| 173 | manager.viewToNode[rootPane.webView] = root | 173 | manager.viewToNode[rootPane.webView] = root | ||
| 174 | + | manager.setupPopupHandling(rootPane.webView, root) | |||
| 174 | manager.ensureHover(root) | 175 | manager.ensureHover(root) | ||
| 175 | 176 | ||||
| 176 | if handler := rootPane.MessageHandler(); handler != nil { | 177 | if handler := rootPane.MessageHandler(); handler != nil { | ||
M internal/app/browser/workspace_pane_ops.go +1 -0
| @@ -602,6 +602,7 @@ func (wm *WorkspaceManager) splitNode(target *paneNode, direction string, existi | |||
| 602 | 602 | // GTK4 automatically handles widget rendering after reparenting - no manual updates needed | |
| 603 | 603 | ||
| 604 | 604 | wm.viewToNode[newPane.webView] = newLeaf | |
| 605 | + | wm.setupPopupHandling(newPane.webView, newLeaf) | |
| 605 | 606 | wm.ensureHover(newLeaf) | |
| 606 | 607 | ||
| 607 | 608 | // Don't ensure hover on originalTarget when splitting from stack - it competes with new pane focus | |
| @@ -602,6 +602,7 @@ func (wm *WorkspaceManager) splitNode(target *paneNode, direction string, existi | |||||
| 602 | // GTK4 automatically handles widget rendering after reparenting - no manual updates needed | 602 | // GTK4 automatically handles widget rendering after reparenting - no manual updates needed | ||
| 603 | 603 | ||||
| 604 | wm.viewToNode[newPane.webView] = newLeaf | 604 | wm.viewToNode[newPane.webView] = newLeaf | ||
| 605 | + | wm.setupPopupHandling(newPane.webView, newLeaf) | |||
| 605 | wm.ensureHover(newLeaf) | 606 | wm.ensureHover(newLeaf) | ||
| 606 | 607 | ||||
| 607 | // Don't ensure hover on originalTarget when splitting from stack - it competes with new pane focus | 608 | // Don't ensure hover on originalTarget when splitting from stack - it competes with new pane focus | ||