fix(browser): 全屏模态打开时让原生浏览器视图让位,避免弹窗被浏览器遮挡 - #2007
Open
Jacky-li-li-li wants to merge 1 commit into
Open
Conversation
受管浏览器基于 Electron 原生 WebContentsView,它盖在 renderer DOM 之上且无法被 CSS z-index 反转。此前浏览器打开时,居中全屏模态(删除项目/会话确认框、 Dialog 等)与浏览器区域相交的部分会被原生视图压住:内容不可见,点击也会落入 网页,必须让原生视图在模态打开期间让位。 BrowserSlot 采用无状态轮询观测 DOM 中是否存在已挂载的模态内容 (role=dialog / role=alertdialog,Radix Dialog 随开关挂载/卸载),模态出现即 发布 visible=false 让位(保留 session、防后台回收),模态消失即恢复。判定以 DOM 实际状态为准,不依赖挂载计数,不会因 HMR / StrictMode / 页面整载导致计数 漂移而把浏览器永久留在隐藏态;轮询同时承担自愈,任何被中断的状态翻转都会在 下一个 200ms tick 校正。Popover / Dropdown / Toast 等局部浮层仍不隐藏浏览器, 维持现状避免白屏与闪烁。 Typecheck 与 renderer 构建通过;dev 冒烟:浏览器打开时删除弹窗完整可见可点, 取消后浏览器即时恢复且不再出现空白。 Made-with: Proma
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
修复受管浏览器打开时,居中全屏模态被右侧浏览器原生视图压住的问题。受影响场景包括:删除项目/会话/对话的确认弹窗、点击图片的预览(含图片编辑)、以及所有基于 Radix Dialog/AlertDialog 的模态弹窗——与浏览器区域相交的部分不可见且无法点击(点击会落入网页)。
复现步骤
根因
受管浏览器是 Electron 原生
WebContentsView,作为原生子视图天然盖在 renderer DOM 之上,CSS z-index 无法反转(BrowserSlot.tsx现有注释亦承认此约束)。当前main的BrowserSlot只按自身尺寸与 Tab 生命周期控制可见性、不为任何应用浮层让位(此前的“任意浮层出现即隐藏”方案曾造成白屏与闪烁而被回退),因此与浏览器区域相交的居中弹窗必然被压住。方案
把“让位”严格限定在全屏模态,且采用无状态 DOM 观测而不是挂载计数:
BrowserSlot每 200ms 检测 DOM 中是否存在已挂载的模态内容(role="dialog"/role="alertdialog")。Radix 的 Dialog/AlertDialog 内容随开关挂载/卸载,因此「存在性」就是可靠信号;这也天然覆盖绕过ui/dialog.tsx包装、直接使用 Radix 原语的组件(图片预览ImageLightbox、FAQ/快捷键弹窗等);visible=false让位,并带preserveSessionOnHide防止隐藏期间被后台回收;模态消失 → 携带新 revision 恢复视图;改动文件
apps/electron/src/renderer/components/browser/BrowserSlot.tsx(+34 / -3)测试方法
bun run typecheck(apps/electron)通过;bun run build:renderer通过(仅项目既有 chunk 警告);截图(修复前后对比)
截图 1 — 删除确认弹窗:修改前右侧被浏览器原生视图压住、「删除」按钮不可见不可点;修改后弹窗完整、关闭后浏览器恢复:
截图 2 — 图片预览:修改前点击图片后预览同样被浏览器 tab 遮挡(图中央为浏览器页面叠在预览之上);修改后预览完整显示:
备注
pr2006-screenshots分支docs/screenshots/pr-2006/,不在本 PR 代码变更内;Made with Proma · GitHub