跳转至

延迟的浏览器注册回复会恢复已退役的渲染进程状态

createBrowserPageWebviewGuestSession 会等待 registerGuest IPC,然后将返回的 guest ID 写入渲染进程的持久 registeredWebContentsIds 映射。显式关闭可能在该回复到达之前移除 webview 和映射条目;延迟的成功回复会恢复已退役的条目。较早的回复也可能覆盖替换 guest 的 ID。其后续回调可能在监听器会话被销毁后同步过时的注释桥接,或修改恢复状态。另外,恢复验证可能在其初始注册查询的生命周期超过其所有者之后发出修复 IPC。

该修复在接受回复或运行这些后续操作之前,会检查现有的恢复销毁状态、当前监听器引用、持久注册表标识以及捕获的 WebContents ID。它不会创建新的注册表,也不会发送延迟的注销 IPC。当前隐藏的 guest 仍会接受成功的注册。当持久 guest 重新挂载时,如果旧回复被忽略,新会话现有的 validateAfterResume 路径会重试注册。当前未成功回复和当前修复保留其原有行为。

复现

在依赖项已安装的情况下:

ORCA_BACKGROUND_LAUNCH=1 node docs/audits/browser-registration-reply-retention/reproduce.mjs

这会针对无头 DOM 测试夹具和延迟 IPC 回复,运行实际的渲染进程会话、恢复控制器和持久 guest 注册表。基线仅在内存中反转所附带的生产补丁。一个临时观察者会在所有回复完成后记录映射/回调计数。该脚本使用共享进程启动器、512 MiB 工作进程、60 秒截止时间,以及在 finally 中删除的临时文件。不会启动 Orca 窗口、原生 guest 或远程主机。

在 1,000 次显式 guest 关闭和延迟成功回复之后 修复前 修复后
活动 webviews 0 0
保留的注册条目 1,000 0
延迟的注释同步 1,000 0
注销调用 1,000 1,000

基线失败十项测试并通过六项对照;修复后的源码通过全部 16 项。用例覆盖不同的已关闭 ID、替换元素、同一元素上变更的 guest ID、复用同一元素/引用的重新挂载、已销毁和已移动的引用、在监听器销毁前移除注册表、抛出异常的标识获取器、当前隐藏的 guest、成功/不确定回复,以及延迟修复与当前修复。修复完成用例验证旧的成功回复无法清除较新 guest 的恢复错误。所有 host-guest 套件也通过:23 个文件中的 196 项测试,包括恢复、视口、注册表、worktree 保留和可绘制性。web 类型检查通过。

版本与限制

对 v1.4.198 的针对性读取确认了相同的无条件注册 setter、回复后回调、查询后修复以及关闭时的映射删除。这证明了报告版本中存在渲染进程保留路径,而不是 #19831 或 #19768 触发了该路径。每个保留条目都是一个页面 ID 和数字 guest ID。该证明没有显示存活的 native 浏览器进程,也没有解释 GB 级内存增长。独立的主进程已销毁 guest 回调保留有其自身的修复和证明。

注册回复是 registeredWebContentsIds 的唯一生产 setter;显式关闭和替换会移除其键。后续调用方未发现第二个能在移除后重建相同元数据的 setter。注释回调使用当前页面路由,这就是为什么需要跳过过时的回调,而不对替换项发出清理。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca