| ... | ... | @@ -156,9 +156,18 @@ export function HostedBrowserWebview(props: { |
| 156 | 156 | } |
| 157 | 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 | 167 | webview.addEventListener("did-attach", register); |
| 160 | 168 | webview.addEventListener("dom-ready", register); |
| 161 | 169 | webview.addEventListener("render-process-gone", recoverGuest); |
| 170 | webview.addEventListener("focus", dismissHostPopups); |
| 162 | 171 | register(); |
| 163 | 172 | return () => { |
| 164 | 173 | disposed = true; |
| ... | ... | @@ -166,6 +175,7 @@ export function HostedBrowserWebview(props: { |
| 166 | 175 | webview.removeEventListener("did-attach", register); |
| 167 | 176 | webview.removeEventListener("dom-ready", register); |
| 168 | 177 | webview.removeEventListener("render-process-gone", recoverGuest); |
| 178 | webview.removeEventListener("focus", dismissHostPopups); |
| 169 | 179 | }; |
| 170 | 180 | }, [clientSettingsHydrated, config, initialSrc, runtimeTabId, webviewGeneration]); |
| 171 | 181 | |