Skip to content

Commit c45e7ea

Browse files
committed
Use authoritative omnibar state for webview click handoff
1 parent 233a91c commit c45e7ea

1 file changed

Lines changed: 38 additions & 5 deletions

File tree

Sources/Panels/BrowserPanelView.swift

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -510,27 +510,40 @@ struct BrowserPanelView: View {
510510
guard let webView = note.object as? CmuxWebView else { return false }
511511
return webView === panel?.webView
512512
}) { _ in
513+
let shouldDismissOmnibar = browserWebViewClickShouldDismissOmnibar(
514+
localAddressBarFocused: addressBarFocused,
515+
focusedAddressBarPanelId: AppDelegate.shared?.focusedBrowserAddressBarPanelId(),
516+
pendingAddressBarFocusRequestId: panel.pendingAddressBarFocusRequestId,
517+
panelId: panel.id
518+
)
519+
let shouldPromoteWebViewFocus = browserWebViewClickShouldPromoteWebViewFocus(
520+
isPanelFocused: isFocused,
521+
shouldDismissOmnibar: shouldDismissOmnibar
522+
)
513523
#if DEBUG
514524
dlog(
515525
"browser.focus.clickIntent panel=\(panel.id.uuidString.prefix(5)) " +
516526
"isFocused=\(isFocused ? 1 : 0) " +
517-
"addressFocused=\(addressBarFocused ? 1 : 0)"
527+
"addressFocused=\(addressBarFocused ? 1 : 0) " +
528+
"dismissOmnibar=\(shouldDismissOmnibar ? 1 : 0) " +
529+
"promoteWeb=\(shouldPromoteWebViewFocus ? 1 : 0)"
518530
)
519531
#endif
520-
if addressBarFocused {
532+
if shouldDismissOmnibar {
521533
#if DEBUG
522534
logBrowserFocusState(event: "addressBarFocus.webViewClickBlur")
523535
#endif
524536
NotificationCenter.default.post(
525537
name: .browserWillBlurAddressBarForWebViewClick,
526538
object: panel.id
527539
)
540+
}
541+
if shouldPromoteWebViewFocus {
528542
panel.prepareForExplicitWebViewFocus(
529-
isPanelFocused: isFocused,
543+
isPanelFocused: true,
530544
reason: "webView.clickIntent"
531545
)
532-
if isFocused,
533-
let window = panel.webView.window,
546+
if let window = panel.webView.window,
534547
!panel.webView.isHiddenOrHasHiddenAncestor {
535548
let focusedWebView = window.makeFirstResponder(panel.webView)
536549
if focusedWebView {
@@ -543,6 +556,8 @@ struct BrowserPanelView: View {
543556
)
544557
#endif
545558
}
559+
}
560+
if shouldDismissOmnibar {
546561
setAddressBarFocused(false, reason: "webView.clickIntent")
547562
}
548563
if !isFocused {
@@ -3198,6 +3213,24 @@ func browserOmnibarShouldReacquireFocusAfterEndEditing(
31983213
desiredOmnibarFocus && !nextResponderIsOtherTextField && !explicitPointerBlurIntent
31993214
}
32003215

3216+
func browserWebViewClickShouldDismissOmnibar(
3217+
localAddressBarFocused: Bool,
3218+
focusedAddressBarPanelId: UUID?,
3219+
pendingAddressBarFocusRequestId: UUID?,
3220+
panelId: UUID
3221+
) -> Bool {
3222+
localAddressBarFocused ||
3223+
focusedAddressBarPanelId == panelId ||
3224+
pendingAddressBarFocusRequestId != nil
3225+
}
3226+
3227+
func browserWebViewClickShouldPromoteWebViewFocus(
3228+
isPanelFocused: Bool,
3229+
shouldDismissOmnibar: Bool
3230+
) -> Bool {
3231+
isPanelFocused || shouldDismissOmnibar
3232+
}
3233+
32013234
private final class OmnibarNativeTextField: NSTextField {
32023235
var onPointerDown: (() -> Void)?
32033236
var onHandleKeyEvent: ((NSEvent, NSTextView?) -> Bool)?

0 commit comments

Comments
 (0)