fix(webkit): resolve OAuth popup rendering and sizing issues
- commit
- aef040f9d2dd5dfbdd92ff76a6c28b4c05c59419
- author
- bamen · · 2025-09-21 03:01 UTC
- parent
- 8f9dae0
- signature
- unsigned
2 files · +22 -2
M internal/app/browser/workspace_manager.go +10 -0
| @@ -1359,6 +1359,10 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web | |||
| 1359 | 1359 | if err := newView.LoadURL(url); err != nil { | |
| 1360 | 1360 | log.Printf("[workspace] failed to load popup URL: %v", err) | |
| 1361 | 1361 | } | |
| 1362 | + | // Ensure the WebView is visible after loading URL | |
| 1363 | + | if err := newView.Show(); err != nil { | |
| 1364 | + | log.Printf("[workspace] failed to show popup WebView: %v", err) | |
| 1365 | + | } | |
| 1362 | 1366 | } | |
| 1363 | 1367 | ||
| 1364 | 1368 | log.Printf("[workspace] Created popup pane for URL: %s", url) | |
| @@ -1389,6 +1393,12 @@ func (wm *WorkspaceManager) insertPopupPane(target *paneNode, newPane *BrowserPa | |||
| 1389 | 1393 | webkit.WidgetSetVExpand(newContainer, true) | |
| 1390 | 1394 | webkit.WidgetRealizeInContainer(newContainer) | |
| 1391 | 1395 | ||
| 1396 | + | // Also realize the WebView widget itself for proper popup rendering | |
| 1397 | + | webViewWidget := newPane.webView.Widget() | |
| 1398 | + | if webViewWidget != 0 { | |
| 1399 | + | webkit.WidgetRealizeInContainer(webViewWidget) | |
| 1400 | + | } | |
| 1401 | + | ||
| 1392 | 1402 | existingContainer := target.container | |
| 1393 | 1403 | if existingContainer == 0 { | |
| 1394 | 1404 | return errors.New("existing pane missing container") | |
| @@ -1359,6 +1359,10 @@ func (wm *WorkspaceManager) HandlePopup(source *webkit.WebView, url string) *web | |||||
| 1359 | if err := newView.LoadURL(url); err != nil { | 1359 | if err := newView.LoadURL(url); err != nil { | ||
| 1360 | log.Printf("[workspace] failed to load popup URL: %v", err) | 1360 | log.Printf("[workspace] failed to load popup URL: %v", err) | ||
| 1361 | } | 1361 | } | ||
| 1362 | + | // Ensure the WebView is visible after loading URL | |||
| 1363 | + | if err := newView.Show(); err != nil { | |||
| 1364 | + | log.Printf("[workspace] failed to show popup WebView: %v", err) | |||
| 1365 | + | } | |||
| 1362 | } | 1366 | } | ||
| 1363 | 1367 | ||||
| 1364 | log.Printf("[workspace] Created popup pane for URL: %s", url) | 1368 | log.Printf("[workspace] Created popup pane for URL: %s", url) | ||
| @@ -1389,6 +1393,12 @@ func (wm *WorkspaceManager) insertPopupPane(target *paneNode, newPane *BrowserPa | |||||
| 1389 | webkit.WidgetSetVExpand(newContainer, true) | 1393 | webkit.WidgetSetVExpand(newContainer, true) | ||
| 1390 | webkit.WidgetRealizeInContainer(newContainer) | 1394 | webkit.WidgetRealizeInContainer(newContainer) | ||
| 1391 | 1395 | ||||
| 1396 | + | // Also realize the WebView widget itself for proper popup rendering | |||
| 1397 | + | webViewWidget := newPane.webView.Widget() | |||
| 1398 | + | if webViewWidget != 0 { | |||
| 1399 | + | webkit.WidgetRealizeInContainer(webViewWidget) | |||
| 1400 | + | } | |||
| 1401 | + | ||||
| 1392 | existingContainer := target.container | 1402 | existingContainer := target.container | ||
| 1393 | if existingContainer == 0 { | 1403 | if existingContainer == 0 { | ||
| 1394 | return errors.New("existing pane missing container") | 1404 | return errors.New("existing pane missing container") | ||
M pkg/webkit/webview_cgo.go +12 -2
| @@ -265,10 +265,9 @@ static GtkWidget* new_webview_related(WebKitWebView* related_view, WebKitUserCon | |||
| 265 | 265 | g_object_ref(u); // Add ref since we'll pass it to new WebView | |
| 266 | 266 | } | |
| 267 | 267 | ||
| 268 | - | // Create WebView with same session and content manager for process sharing | |
| 268 | + | // Create WebView with related view for process sharing (network session is inherited) | |
| 269 | 269 | GtkWidget* w = GTK_WIDGET(g_object_new(WEBKIT_TYPE_WEB_VIEW, | |
| 270 | 270 | "user-content-manager", u, | |
| 271 | - | "network-session", related_session, | |
| 272 | 271 | "related-view", related_view, | |
| 273 | 272 | NULL)); | |
| 274 | 273 | ||
| @@ -1485,6 +1484,17 @@ func NewWebViewWithRelated(cfg *Config, relatedView *WebView) (*WebView, error) | |||
| 1485 | 1484 | ||
| 1486 | 1485 | C.gtk_box_append((*C.GtkBox)(unsafe.Pointer(container)), viewWidget) | |
| 1487 | 1486 | ||
| 1487 | + | // Make the WebView widget visible and expandable for popup rendering | |
| 1488 | + | C.gtk_widget_set_visible(viewWidget, C.gboolean(1)) | |
| 1489 | + | C.gtk_widget_set_visible(container, C.gboolean(1)) | |
| 1490 | + | C.gtk_widget_set_hexpand(viewWidget, C.gboolean(1)) | |
| 1491 | + | C.gtk_widget_set_vexpand(viewWidget, C.gboolean(1)) | |
| 1492 | + | C.gtk_widget_set_hexpand(container, C.gboolean(1)) | |
| 1493 | + | C.gtk_widget_set_vexpand(container, C.gboolean(1)) | |
| 1494 | + | // Remove any size constraints from popup WebView to let it fill the pane | |
| 1495 | + | C.gtk_widget_set_size_request(viewWidget, -1, -1) | |
| 1496 | + | C.gtk_widget_set_size_request(container, -1, -1) | |
| 1497 | + | ||
| 1488 | 1498 | if cfg.CreateWindow { | |
| 1489 | 1499 | win = C.new_window() | |
| 1490 | 1500 | if win == nil { | |
| @@ -265,10 +265,9 @@ static GtkWidget* new_webview_related(WebKitWebView* related_view, WebKitUserCon | |||||
| 265 | g_object_ref(u); // Add ref since we'll pass it to new WebView | 265 | g_object_ref(u); // Add ref since we'll pass it to new WebView | ||
| 266 | } | 266 | } | ||
| 267 | 267 | ||||
| 268 | - | // Create WebView with same session and content manager for process sharing | 268 | + | // Create WebView with related view for process sharing (network session is inherited) |
| 269 | GtkWidget* w = GTK_WIDGET(g_object_new(WEBKIT_TYPE_WEB_VIEW, | 269 | GtkWidget* w = GTK_WIDGET(g_object_new(WEBKIT_TYPE_WEB_VIEW, | ||
| 270 | "user-content-manager", u, | 270 | "user-content-manager", u, | ||
| 271 | - | "network-session", related_session, | |||
| 272 | "related-view", related_view, | 271 | "related-view", related_view, | ||
| 273 | NULL)); | 272 | NULL)); | ||
| 274 | 273 | ||||
| @@ -1485,6 +1484,17 @@ func NewWebViewWithRelated(cfg *Config, relatedView *WebView) (*WebView, error) | |||||
| 1485 | 1484 | ||||
| 1486 | C.gtk_box_append((*C.GtkBox)(unsafe.Pointer(container)), viewWidget) | 1485 | C.gtk_box_append((*C.GtkBox)(unsafe.Pointer(container)), viewWidget) | ||
| 1487 | 1486 | ||||
| 1487 | + | // Make the WebView widget visible and expandable for popup rendering | |||
| 1488 | + | C.gtk_widget_set_visible(viewWidget, C.gboolean(1)) | |||
| 1489 | + | C.gtk_widget_set_visible(container, C.gboolean(1)) | |||
| 1490 | + | C.gtk_widget_set_hexpand(viewWidget, C.gboolean(1)) | |||
| 1491 | + | C.gtk_widget_set_vexpand(viewWidget, C.gboolean(1)) | |||
| 1492 | + | C.gtk_widget_set_hexpand(container, C.gboolean(1)) | |||
| 1493 | + | C.gtk_widget_set_vexpand(container, C.gboolean(1)) | |||
| 1494 | + | // Remove any size constraints from popup WebView to let it fill the pane | |||
| 1495 | + | C.gtk_widget_set_size_request(viewWidget, -1, -1) | |||
| 1496 | + | C.gtk_widget_set_size_request(container, -1, -1) | |||
| 1497 | + | ||||
| 1488 | if cfg.CreateWindow { | 1498 | if cfg.CreateWindow { | ||
| 1489 | win = C.new_window() | 1499 | win = C.new_window() | ||
| 1490 | if win == nil { | 1500 | if win == nil { | ||