导航替换的对象¶
有三种主要的导航类型,每种类型都可能导致不同的对象被替换。一般规则如下所示
类/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
方法中复制。
chrome 浏览上下文**不**指在内容区域加载了系统主体页面的页面,例如 about:preferences
。chrome 浏览上下文通常用作 chrome 窗口中的根上下文,例如在其中为浏览器窗口加载 browser.xhtml
的位置。
所有 chrome 浏览上下文都只在父进程中加载,并且在导航时无法进行进程切换。