导航替换的对象

有三种主要的导航类型,每种类型都可能导致不同的对象被替换。一般规则如下所示

跨导航替换或保留的对象

类/ID

进程内导航

跨进程导航

跨组导航

BrowserId [1]

✔️ 保留

✔️ 保留

✔️ 保留

BrowsingContextWebProgress

✔️ 保留

✔️ 保留

✔️ 保留

BrowsingContextGroup

✔️ 保留

✔️ 保留

❌ 替换

BrowsingContext

✔️ 保留

✔️ 保留

❌ 替换

nsFrameLoader

✔️ 保留

❌ 替换

❌ 替换

RemoteBrowser

✔️ 保留

❌ 替换

❌ 替换

Browser{Parent,Child}

✔️ 保留

❌ 替换

❌ 替换

nsDocShell

✔️ 保留

❌ 替换

❌ 替换

nsGlobalWindowOuter

✔️ 保留

❌ 替换

❌ 替换

nsGlobalWindowInner

❌ 替换 [2]

❌ 替换

❌ 替换

WindowContext

❌ 替换 [2]

❌ 替换

❌ 替换

WindowGlobal{Parent,Child}

❌ 替换 [2]

❌ 替换

❌ 替换

文档

❌ 替换

❌ 替换

❌ 替换

导航类型

进程内导航

进程内导航是传统的导航类型,也是在未启用 Fission 时最常见的导航类型。

当不需要进程切换或浏览上下文替换时,将使用这些导航,其中包括大多数在禁用 Fission 时进行的导航,以及在启用 Fission 时进行的大多数同站点同源导航。

跨进程导航

当导航需要进行进程切换且不需要替换浏览上下文时,将使用跨进程导航。这是在启用 Fission 时的一种常见加载类型,尽管在禁用 Fission 时,它也用于导航到和来自特殊 URL(如 file:// URI)的导航。

DocumentLoadListener 确定需要进行进程切换时,将触发这些进程更改。有关更多详细信息,请参阅该类的文档。

跨组导航

当导航的 响应需要切换浏览上下文组 时,将使用跨组导航。

这些类型的切换可能会或可能不会导致进程更改,但将在与它们开始时不同的 BrowsingContextGroup 中完成。与 跨进程导航 一样,这些导航是使用 DocumentLoadListener 中的进程切换逻辑触发的。

由于内容浏览上下文的父级不能因导航而更改,只能是顶级内容浏览上下文才能进行跨组导航。chrome 浏览上下文 [3] 或内容子框架中的导航只会经历进程内或跨进程导航。

在撰写本文时,我们目前在以下情况下触发跨组导航,但这在将来可能会发生变化

  • 如果指定了 Cross-Origin-Opener-Policy 标头,并且检测到不匹配。

  • 在父进程和内容进程之间切换进程时。

  • 在顶级浏览上下文中加载扩展程序文档时。

  • 从预加载的 about:newtab 文档导航时。

  • BrowsingContext 放入父级 BFCache 实现中的会话历史记录的 BFCache 时。在启用 fission.bfcacheInParent 首选项时,这将在大多数没有打开程序关系的顶级导航上发生。

需要在 BrowsingContext 实例上跨组导航保存的状态在 CanonicalBrowsingContext::ReplacedBy 方法中复制。