已销毁的浏览器 guest 保留主进程回调¶
嵌入式浏览器 guest 的 destroyed 事件调用了 cleanupGuestPolicyAttachment。这会移除其主页面到 WebContents 的查找,但留下四个每页清理回调,它们捕获已销毁的 WebContents 包装器,以及 renderer/workspace/worktree/profile 元数据。unregisterAll 随后只遍历此时已为空的主查找:三个回调映射以及 renderer/workspace 元数据也在那次清理后存活。
渲染器重载可以销毁 guest,而无需每个页面发送显式 unregister IPC。之后关闭一个已恢复但未挂载的页面也不会发送该 IPC:destroyPersistentWebview 在其 renderer 注册表中没有 guest 时提前返回。显式 unregister 会正确释放这些资源;同页面重新注册也会替换其回调。该缺陷影响未走上述任一路径的已销毁 owner。
修复仅在某个确切 guest 仍拥有主页面 ID 时,通过现有 unregisterGuest 并带有 guest 退役原因来路由销毁。已绑定下载在它们结束前保留现有 renderer 路由;显式页面关闭仍会取消它们。未注册 guest 和弹出窗口保留仅策略清理。过期回调无法 unregister 替代者。正常渲染进程丢失会保留其活动 WebContents 和元数据,用于重载恢复;新的 guest 注册会再次提供其所有权元数据。共享浏览器会话和同级页面不受影响。
下载生命周期修正¶
评审发现,初始修复将 guest 销毁视为逻辑页面关闭,并取消了绑定下载。一个精确源码的前后对照控制使用 EventEmitter guest 和受控 DownloadItem 确认了该差异。guest 退役现在会释放 guest 拥有的回调,同时保留进行中的页面下载、其目标位置和取消授权。保留的数值 renderer 路由会在最后一个下载结束后排空,前提是没有替代 guest、其他下载或更新的路由 owner 需要它。
九个额外控制覆盖进度和完成/错误投递、guest 销毁后的显式关闭、多个下载、替代 guest/路由、重复 guest 销毁和渲染进程丢失。连同四个现有浏览器测试套件,55 个测试通过;Node typecheck 以及普通/anti-slop lint 通过。这些控制并未证明在各操作系统上销毁后原生 Chromium 下载能够存活。没有下载容量或传输格式变更。
复现¶
在依赖项已安装的情况下,从仓库根目录运行:
该脚本使用 EventEmitter WebContents 测试夹具运行实际的 manager 和 guest 回调安装器。它仅为基线在内存中移除销毁守卫,然后在修复后的源码上运行相同的九个测试。一个临时测试观察者会在每次断言前记录实际映射大小。它不启动 Orca 窗口或浏览器进程,将每个 worker 限制为 512 MiB,每次运行限制为 60 秒,使用共享进程启动器,并删除临时文件。结果包括源码哈希和运行时来源信息。
| 在 1,000 次不同 guest 销毁之后 | 之前 | 修复后 |
|---|---|---|
| 主 guest 查找 | 0 | 0 |
| 每个 context-menu / grab-shortcut / app-shortcut / wheel 清理映射 | 1,000 | 0 |
| 每个 renderer / workspace / worktree / profile 映射 | 1,000 | 0 |
| 策略清理映射 | 0 | 0 |
unregisterAll 之后的每个 context-menu / grab-shortcut / app-shortcut 映射 |
1,000 | 0 |
unregisterAll 之后的 renderer 和 workspace 映射 |
1,000 | 0 |
基线:六个测试通过,三个失败。修复后:九个全部通过。控制覆盖显式 unregister、使用捕获的旧回调进行同 ID 替换、弹出窗口和注册前销毁、渲染进程恢复、新 guest 注册,以及两个页面共享一个浏览器会话 profile。选定的现有 browser-manager 和 offscreen 生命周期套件也通过:包括新套件在内的七个文件共 64 个测试。
版本与限制¶
对 v1.4.198 的针对性源码阅读确认了相同的 destroyed 事件仅策略清理、映射所有权以及 unregisterAll 遗漏。可执行比较使用当前生产源码;它不会启动历史应用。这是 #19831/#19768 所报告的版本中存在的一条保留路径。它并未证明任一事件遵循了该销毁序列,也未测量已销毁 WebContents 保留的原生内存。1,000 次迭代测量的是保留的回调和元数据,而不是 1,000 个存活的 Chromium 进程或一吉字节分配。
相邻审计阴性结果:显式页面关闭会移除 renderer guest 注册表和主注册;worktree 切换会按照现有 hidden-worktree 保留策略有意将 guest 停放;offscreen 创建会同步索引,并带有 shutdown 准入和精确窗口拆除;客户端托管的异步页面创建会在获取后检查可用性,并清理已取消的 owner。PDF 捕获会拒绝迟到的已断开客户端完成,其流缓冲区具有五分钟 TTL,现有截图命令具有截止时间。未复现额外的原生截图挂起或无界原生页面获取。另一个迟到的 renderer 注册回复可以在关闭后恢复少量 page-ID 元数据;它不属于本次主进程修复。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca