| ... | @@ -156,9 +156,18 @@ export function HostedBrowserWebview(props: { | ... | @@ -156,9 +156,18 @@ export function HostedBrowserWebview(props: { |
| 156 | } | 156 | } |
| 157 | }, recovery.delayMs); | 157 | }, recovery.delayMs); |
| 158 | }; | 158 | }; |
| | 159 | // A click inside the guest only reaches this document as a webview focus |
| | 160 | // event, so open menus and popovers never see the outside press that |
| | 161 | // would dismiss them. Replay it as a pointerdown on the webview itself. |
| | 162 | const dismissHostPopups = () => { |
| | 163 | webview.dispatchEvent( |
| | 164 | new PointerEvent("pointerdown", { bubbles: true, pointerType: "mouse" }), |
| | 165 | ); |
| | 166 | }; |
| 159 | webview.addEventListener("did-attach", register); | 167 | webview.addEventListener("did-attach", register); |
| 160 | webview.addEventListener("dom-ready", register); | 168 | webview.addEventListener("dom-ready", register); |
| 161 | webview.addEventListener("render-process-gone", recoverGuest); | 169 | webview.addEventListener("render-process-gone", recoverGuest); |
| | 170 | webview.addEventListener("focus", dismissHostPopups); |
| 162 | register(); | 171 | register(); |
| 163 | return () => { | 172 | return () => { |
| 164 | disposed = true; | 173 | disposed = true; |
| ... | @@ -166,6 +175,7 @@ export function HostedBrowserWebview(props: { | ... | @@ -166,6 +175,7 @@ export function HostedBrowserWebview(props: { |
| 166 | webview.removeEventListener("did-attach", register); | 175 | webview.removeEventListener("did-attach", register); |
| 167 | webview.removeEventListener("dom-ready", register); | 176 | webview.removeEventListener("dom-ready", register); |
| 168 | webview.removeEventListener("render-process-gone", recoverGuest); | 177 | webview.removeEventListener("render-process-gone", recoverGuest); |
| | 178 | webview.removeEventListener("focus", dismissHostPopups); |
| 169 | }; | 179 | }; |
| 170 | }, [clientSettingsHydrated, config, initialSrc, runtimeTabId, webviewGeneration]); | 180 | }, [clientSettingsHydrated, config, initialSrc, runtimeTabId, webviewGeneration]); |
| 171 | | 181 | |