内置浏览器原生页面边界
Electron shell 的 DOM 工具栏与 native WebContentsView 必须在任意 shell 缩放比例下保持同一页面边界。
已验证缺口
shell 缩放因子约为 1.095 时,renderer 发送 x=812.63, width=518.64 CSS px,主进程直接当作 DIP 使用。正确 native bounds 应约为 x=890, width=568。结果是网页覆盖左侧聊天 pane,并在右侧留下空白。
设计
- renderer 继续发送
getBoundingClientRect()得到的 CSS px。 - 主进程只在 renderer IPC 边界读取
event.sender.getZoomFactor(),把 CSS px 转为 native DIP,再执行现有整数化和非负尺寸约束。 sync-visible与兼容入口set-bounds使用同一转换;主进程内部已经是 DIP 的 show/hide/transfer 路径不重复缩放。- shell 缩放变化会触发现有 renderer
resizelistener,重新测量并发送当前 bounds;主进程在每次 IPC 上读取当前缩放因子。 - 无效或非正缩放因子按
1处理。
边界与排除
不强制重置用户缩放,不修改 split ratio、DOM 布局、preload API、站点缩放、Browser Agent、依赖或配置。Electron 的 WebContentsView.setBounds 接收 DIP,renderer DOM 测量属于 CSS px;renderer 保留测量精度,主进程负责单位转换和最终取整。
任务文件与验收
生产代码:desktop/main.js、web/components/center-tabs/web-tab-pane.tsx 和 web/lib/web-tab-bounds.ts。公开门禁:desktop/scripts/check-webtab-zoom-bounds.js 及现有 web split 门禁。
- 自动化覆盖 100% 缩放、约 109.5% 缩放、无效缩放因子、两个 IPC 入口和现有 desktop 回归。
- 安装版使用默认 18100 worker;在非 100% shell 缩放下验证 DOM body 与 native viewport 同宽同高,并检查分屏、split ratio 调整及窗口缩放。
- 视觉验收只使用一张当前 viewport 截图;不启用 OCR、候选框或多轮 crop。
实现证据
- desktop 与 web 完整检查通过,动态 renderer 测试保留 DOMRect 小数并验证
syncVisiblepayload。 - 安装版在约 109.5% shell 缩放下,DOM body 换算结果与 native viewport 均为
568×763 DIP。 - 窗口调整为
1350×800后,DOM body 换算结果与 native viewport 均为526×712 DIP;恢复窗口后仍一致。 - 默认 18100 worker 健康检查通过,CDP 9223 同时观察 shell 与当前 Bilibili 原生页面。
实现状态
单位转换、自动化门禁和已安装应用验收均已完成。