14 — FrameTree 与其他核心设计
这一篇只保留几个容易追问的对象模型:FrameTree、RenderFrameHost、BFCache、Prerender、viz。
FrameTree
一个页面可能包含主 frame、iframe、跨进程 iframe 等结构。Chrome 在浏览器进程侧用 FrameTree 描述这些 frame 关系。
常见对象:
- WebContents:大致对应一个标签页。
- FrameTreeNode:表示 frame 结构中的一个节点。
- RenderFrameHost:表示某个 frame 当前关联的渲染端实体。
导航时,FrameTreeNode 可以保持不变,但 RenderFrameHost 可能切换。
OOPIF
OOPIF 是 out-of-process iframe。跨站 iframe 可以放到另一个 Renderer 进程中,但视觉上仍嵌入在同一个页面里。
渲染上,每个进程可以产生自己的 CompositorFrame,最后由 viz 聚合。
BFCache
BFCache 是 back-forward cache。离开页面时,页面不一定立刻销毁,而是可能被冻结保存;用户返回时可以快速恢复。
它提升返回体验,但也改变了生命周期假设:页面离开后可能仍然存在,不能简单认为导航就等于销毁。
Prerender
Prerender 会提前在后台准备页面,等用户真的访问时再激活。它同样要求浏览器区分当前展示页面和非激活页面。
RenderDocument
RenderDocument 的方向是让导航更倾向于创建新的 RenderFrameHost,减少旧文档状态复用带来的复杂性和安全风险。
总结
FrameTree 描述页面 frame 结构,RenderFrameHost 描述具体渲染实体。OOPIF 让跨站 iframe 跨进程,BFCache 和 Prerender 让一个 WebContents 中可能存在非当前激活页面,所有这些都要求 Chrome 精细管理文档生命周期。