动态标准 — 最后更新于 2024年9月12日
本标准包含多个用于对文档序列进行分组的相关概念。作为一个简短的、非规范性的摘要
可导航对象 是文档序列面向用户的表示,即它们表示可以在文档之间进行导航的内容。典型的示例包括 Web 浏览器中的标签或窗口,或者 iframe
元素,或者 frame
元素在 frameset
中。
可遍历的可导航对象 是一种特殊类型的可导航对象,它控制自身及其后代可导航对象的会话历史。也就是说,除了它们自己的文档序列之外,它们还表示进一步的文档序列树,以及在线性遍历此树的扁平视图的能力。
浏览上下文 是文档序列面向开发者的表示。它们与 WindowProxy
对象一一对应。每个可导航对象都可以呈现一系列浏览上下文,在某些明确定义的情况下,这些浏览上下文之间会发生 切换。
本标准的大部分内容都使用可导航对象的语言,但某些 API 公开了浏览上下文切换的存在,因此本标准的某些部分需要以浏览上下文的术语进行操作。
一个 可导航对象 通过其 活动会话历史条目 向用户呈现一个 Document
。每个可导航对象都具有
一个 id,一个 新的唯一内部值。
一个 父级,一个 可导航对象 或 null。
一个 当前会话历史条目,一个 会话历史条目。
一个 活动会话历史条目,一个 会话历史条目。
一个 正在关闭 布尔值,最初为 false。
这仅在 顶级可遍历的可导航对象 中设置为 true。
一个 正在延迟 load
事件 布尔值,最初为 false。
这仅在可导航对象的 父级 不为 null 的情况下设置为 true。
当前会话历史条目 和 活动会话历史条目 通常相同,但在以下情况下会不同步
一个 可导航对象 的 活动文档 是其 活动会话历史条目 的 文档。
这可以在可导航对象的 顶级可遍历对象 的 会话历史遍历队列 中安全读取。尽管 可导航对象 的 活动历史条目 可以同步更改,但新条目始终具有相同的 Document
。
一个 可导航对象 的 活动浏览上下文 是其 活动文档 的 浏览上下文。如果此 可导航对象 是 可遍历的可导航对象,则其 活动浏览上下文 将是 顶级浏览上下文。
一个 可导航对象 的 活动 WindowProxy
是其 活动浏览上下文 关联的 WindowProxy
。
一个 可导航对象 的 活动窗口 是其 活动 WindowProxy
的 [[Window]]。
这将始终等于可导航对象的 活动文档 的 相关全局对象;这由 设为活动 算法保持同步。
一个 可导航对象 的 目标名称 是其 活动会话历史条目 的 文档状态 的 可导航对象目标名称。
要获取 节点 node 的 节点可导航对象,返回其 活动文档 为 node 的 节点文档 的 可导航对象,如果不存在这样的 可导航对象,则返回 null。
要 初始化可导航对象 可导航对象 navigable,给定一个 文档状态 documentState 和一个可选的 可导航对象-或-null parent(默认为 null)
令 entry 为一个新的 会话历史条目,其中包含
此算法的调用者负责初始化 entry 的 步骤;在完成之前,它将保留为“pending
”。
将 navigable 的 当前会话历史条目 设置为 entry。
将 navigable 的 活动会话历史条目 设置为 entry。
将 navigable 的 父级 设置为 parent。
一个 可遍历的可导航对象 是一个 可导航对象,它还控制哪个 会话历史条目 应为其自身及其后代 可导航对象 的 当前会话历史条目 和 活动会话历史条目。
一个 当前会话历史步骤,一个数字,最初为 0。
一个 会话历史遍历队列,一个 会话历史遍历并行队列,是 启动新的会话历史遍历并行队列 的结果。
一个 正在运行嵌套应用历史步骤 布尔值,最初为 false。
一个 系统可见性状态,其值为“hidden
”或“visible
”。
有关此项目的具体要求,请参阅 页面可见性 部分。
要获取 可导航对象 inputNavigable 的 可遍历的可导航对象
令 navigable 为 inputNavigable。
返回 navigable。
一个 顶级可遍历对象 是一个 可遍历的可导航对象,其 父级 为 null。
目前,所有 可遍历的可导航对象 都是 顶级可遍历对象。未来的提案设想引入非顶级可遍历对象。
用户代理持有 顶级可遍历对象集(一个 集合,包含 顶级可遍历对象)。这些通常以浏览器窗口或浏览器标签的形式呈现给用户。
要获取 可导航对象 inputNavigable 的 顶级可遍历对象
给定一个浏览上下文-或-null opener、一个字符串targetName和一个可选的navigable openerNavigableForWebDriver,来创建一个新的顶级可遍历对象
令document为null。
如果opener为null,则将document设置为创建新的顶级浏览上下文和文档的第二个返回值。
否则,将document设置为创建新的辅助浏览上下文和文档(给定opener)的第二个返回值。
令documentState为一个新的文档状态,其中包含:
令traversable为一个新的可遍历navigable。
给定documentState,初始化navigable traversable。
令initialHistoryEntry为traversable的活动会话历史条目。
将initialHistoryEntry的步数设置为0。
如果opener不为null,则给定opener的顶级可遍历对象和traversable,旧版克隆可遍历存储棚。 [STORAGE]
使用traversable和openerNavigableForWebDriver调用WebDriver BiDi navigable创建。
返回traversable。
给定一个URL initialNavigationURL和一个可选的POST资源-或-null initialNavigationPostResource(默认为null),来创建一个新的顶级可遍历对象
令traversable为给定null和空字符串创建新的顶级可遍历对象的结果。
使用traversable的活动文档将traversable导航到initialNavigationURL,并将documentResource设置为initialNavigationPostResource。
我们将这些初始导航视为traversable自身导航,这将确保所有相关的安全检查都通过。
返回traversable。
某些元素(例如,iframe
元素)可以向用户呈现一个navigable。这些元素称为navigable容器。
每个navigable容器都有一个内容navigable,它要么是一个navigable,要么为null。它最初为null。
一个navigable navigable的容器是其内容navigable为navigable的navigable容器,如果没有这样的元素,则为null。
一个navigable navigable的容器文档是运行以下步骤的结果:
一个Document
document的容器文档是运行以下步骤的结果:
如果document的节点navigable为null,则返回null。
返回document的节点navigable的容器文档。
当navigable的父级为potentialParent时,navigable navigable是另一个navigable potentialParent的子navigable。我们也可以简单地说一个navigable“是一个子navigable”,这意味着它的父级不为null。
所有子navigable都是其容器的内容navigable。
一个navigable容器 container的内容文档是运行以下步骤的结果:
如果container的内容navigable为null,则返回null。
令document为container的内容navigable的活动文档。
返回document。
一个navigable容器 container的内容窗口是运行以下步骤的结果:
如果container的内容navigable为null,则返回null。
返回container的内容navigable的活动WindowProxy
的对象。
给定一个元素element,来创建一个新的子navigable
令parentNavigable为element的节点navigable。
令browsingContext和document为给定element的节点文档、element和group,创建新的浏览上下文和文档的结果。
令targetName为null。
如果element具有name
内容属性,则将targetName设置为该属性的值。
令documentState为一个新的文档状态,其中包含:
令navigable为一个新的navigable。
给定documentState和parentNavigable,初始化navigable navigable。
将element的内容navigable设置为navigable。
令historyEntry为navigable的活动会话历史条目。
令traversable为parentNavigable的可遍历navigable。
将以下会话历史遍历步骤追加到traversable中:
使用traversable调用WebDriver BiDi navigable创建。
可视化文档序列(尤其是可导航对象及其会话历史记录条目)的一种实用方法是使用Jake 图。一个典型的 Jake 图如下所示:
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
顶层 | /t-a | /t-a#foo | /t-b | ||
frames[0] | /i-0-a | /i-0-b | |||
frames[1] | /i-1-a | /i-1-b |
这里,每个编号的列表示可遍历对象的会话历史记录步骤的可能值。每个带标签的行描绘了一个可导航对象,因为它在不同的 URL 和文档之间转换。第一个标签为top
,表示顶级可遍历对象,其余的是子可导航对象。文档由每个单元格的背景颜色给出,新的背景颜色表示该可导航对象中的新文档。URL 由单元格的文本内容给出;通常为了简洁起见,它们被给出为相对 URL,除非正在专门调查跨源情况。给定的可导航对象可能在给定的步骤中不存在,在这种情况下,相应的单元格为空。粗斜体步骤号描绘了可遍历对象的当前会话历史记录步骤,所有带有粗斜体 URL 的单元格都表示该行可导航对象的当前会话历史记录条目。
因此,上述 Jake 图描绘了以下事件序列:
第一个子可导航对象被导航到另一个文档,URL 为/i-0-b
。
第二个子可导航对象被导航到另一个文档,URL 为/i-1-b
。
顶级可遍历对象被导航到相同的文档,将其 URL 更新为/t-a#foo
。
顶级可遍历对象被导航到另一个文档,URL 为/t-b
。(请注意,当然,此文档不会保留旧文档的子可导航对象。)
可遍历对象被通过增量−3 遍历,返回到步骤 1。
Jake 图是可视化多个可导航对象、导航和遍历的交互的强大工具。它们无法捕获所有可能的交互——例如,它们仅适用于单层嵌套——但我们将有机会在整个标准中使用它们来说明一些复杂的情况。
Jake 图以其创造者、无与伦比的 Jake Archibald 的名字命名。
在本标准的算法中,查看从给定Document
开始的可导航对象集合通常很有帮助。本节包含一组精心挑选的用于收集这些可导航对象的算法。
这些算法的返回值是有序的,以便父级出现在其子级之前。调用者依赖此顺序。
从Document
而不是可导航对象开始通常更好,因为它使调用者能够意识到他们是从一个完全激活的Document
还是非完全激活的Document
开始。尽管非完全激活的Document
确实具有祖先和后代可导航对象,但它们通常表现得好像没有一样(例如,在window.parent
获取器中)。
Document
document 的祖先可导航对象由以下步骤给出:
令 ancestors 为一个空列表。
当 navigable 不为 null 时
返回 ancestors。
Document
document 的包含祖先可导航对象由以下步骤给出:
Document
document 的后代可导航对象由以下步骤给出:
令 navigables 为一个新的列表。
令 navigableContainers 为 document 的所有是可导航容器的包含阴影的后代的列表,按照包含阴影的树顺序。
对于 navigableContainers 的每个 navigableContainer
返回 navigables。
Document
document 的包含后代可导航对象由以下步骤给出:
这些后代收集算法被描述为查看后代Document
对象的 DOM 树。实际上,这通常不可行,因为 DOM 树可能位于与算法调用者不同的进程中。相反,实现通常会在进程之间复制相应的树。
Document
document 的文档树子可导航对象由以下步骤给出:
如果 document 的节点可导航对象为 null,则返回空列表。
令 navigables 为一个新的列表。
对于 navigableContainers 的每个 navigableContainer
返回 navigables。
要销毁子可导航对象,给定一个可导航容器 container
令 navigable 为 container 的内容可导航对象。
如果 navigable 为 null,则返回。
将 container 的内容可导航对象设置为 null。
通知导航 API 关于子可导航对象销毁,给定 navigable。
令 parentDocState 为 container 的节点可导航对象的活动会话历史记录条目的文档状态。
将以下会话历史记录遍历步骤添加到 traversable 中。
更新可导航对象创建/销毁,给定 traversable。
使用 navigable 调用WebDriver BiDi 可导航对象销毁。
要销毁顶级可遍历对象,给定一个顶级可遍历对象 traversable
令 browsingContext 为 traversable 的活动浏览上下文。
移除 browsingContext。
从用户界面中移除 traversable(例如,在带标签的浏览器中关闭或隐藏其标签)。
使用 traversable 调用 WebDriver BiDi 可导航对象已销毁。
用户代理可以随时 销毁顶级可遍历对象(通常,响应用户请求)。
要 关闭顶级可遍历对象 traversable
如果 traversable 的 正在关闭 为 true,则返回。
如果 toUnload 的 检查卸载是否已取消 的结果为 true,则返回。
将以下会话历史记录遍历步骤 附加到 traversable
可导航对象 可以被赋予 目标名称,目标名称是字符串,允许某些 API(例如 window.open()
或 a
元素的 target
属性)将 导航 定位到该可导航对象。
一个 有效的可导航目标名称 是任何至少包含一个字符的字符串,该字符串既不包含 ASCII 制表符或换行符 和 U+003C (<),也不以 U+005F (_) 开头。(以 U+005F (_) 开头的名称保留用于特殊关键字。)
一个 有效的可导航目标名称或关键字 是任何字符串,该字符串要么是 有效的可导航目标名称,要么与以下之一进行 ASCII 不区分大小写 匹配:_blank
、_self
、_parent
或 _top
。
这些值根据页面是否处于沙盒状态具有不同的含义,如下表(非规范性)中所述。在此表中,“当前”表示链接或脚本所在的 可导航对象,“父级”表示链接或脚本所在的 可导航对象 的 父级,“顶级”表示链接或脚本所在的 可导航对象 的 顶级可遍历对象,“新建”表示一个新的具有 null 父级 的 可遍历可导航对象(它可以使用 辅助浏览上下文,这取决于各种用户偏好和用户代理策略),“无”表示不会发生任何事情,“可能新建”表示如果 allow-popups
关键字也指定在 sandbox
属性上(或者用户覆盖了沙盒),则与“新建”相同,否则与“无”相同。
关键字 | 普通效果 | 在具有...的 iframe 中的效果 | |
---|---|---|---|
sandbox=""
| sandbox="allow-top-navigation"
| ||
未指定,用于链接和表单提交 | 当前 | 当前 | 当前 |
空字符串 | 当前 | 当前 | 当前 |
_blank
| 新建 | 可能新建 | 可能新建 |
_self
| 当前 | 当前 | 当前 |
如果不存在父级,则为_parent | 当前 | 当前 | 当前 |
如果父级也是顶级,则为_parent | 父级/顶级 | 无 | 父级/顶级 |
如果存在父级且它不是顶级,则为_parent | 父级 | 无 | 无 |
如果顶级是当前,则为_top | 当前 | 当前 | 当前 |
如果顶级不是当前,则为_top | 顶层 | 无 | 顶层 |
不存在的名称 | 新建 | 可能新建 | 可能新建 |
存在且是后代的名称 | 指定的子代 | 指定的子代 | 指定的子代 |
存在且是当前的名称 | 当前 | 当前 | 当前 |
存在且是顶级祖先的名称 | 指定的祖先 | 无 | 指定的祖先/顶级 |
存在且不是顶级祖先的名称 | 指定的祖先 | 无 | 无 |
存在且具有相同顶级的其他名称 | 指定 | 无 | 无 |
存在且具有不同顶级的名称,如果熟悉并且允许一个沙盒导航器 | 指定 | 指定 | 指定 |
存在且具有不同顶级的名称,如果熟悉但不是允许一个沙盒导航器 | 指定 | 无 | 无 |
存在且具有不同顶级的名称,不熟悉 | 新建 | 可能新建 | 可能新建 |
沙盒浏览上下文的大多数限制由其他算法应用,例如 导航 算法,而不是下面给出的 选择可导航对象的规则。
选择可导航对象的规则,给定一个字符串 name、一个 可导航对象 currentNavigable 和一个布尔值 noopener 如下
令 chosen 为 null。
令 windowType 为“现有或无
”。
如果 name 为空字符串或与“_self
”进行 ASCII 不区分大小写 匹配,则将 chosen 设置为 currentNavigable。
否则,如果 name 与“_parent
”进行 ASCII 不区分大小写 匹配,则将 chosen 设置为 currentNavigable 的 父级(如果存在),否则为 currentNavigable。
否则,如果 name 与“_top
”进行 ASCII 不区分大小写 匹配,则将 chosen 设置为 currentNavigable 的 可遍历可导航对象。
否则,如果 name 不与“_blank
”进行 ASCII 不区分大小写 匹配,存在一个 可导航对象,其 目标名称 与 name 相同,currentNavigable 的 活动浏览上下文 熟悉 该 可导航对象 的 活动浏览上下文,并且用户代理确定这两个浏览上下文之间的关联足够紧密,因此如果它们相互到达是可以的,则将 chosen 设置为该可导航对象。如果有多个匹配的 可导航对象,用户代理应该以某种任意一致的方式选择一个,例如最近打开的、最近聚焦的或关联性更强的,并将其设置为 chosen。
这将在 问题 #313 中得到更精确的说明。
否则,正在请求一个新的 顶级可遍历对象,发生的情况取决于用户代理的配置和功能——由以下列表中第一个适用的选项给出的规则确定
用户代理可能会通知用户弹出窗口已被阻止。
用户代理可能会向开发者控制台报告弹出窗口已被阻止。
将 windowType 设置为“新建且不受限制
”。
令 currentDocument 为 currentNavigable 的 活动文档。
如果 currentDocument 的 跨源打开程序策略 的 值 为“same-origin
”或“same-origin-plus-COEP
”,并且 currentDocument 的 源 与 currentDocument 的 相关设置对象 的 顶级源 不 同源,则
将 noopener 设置为 true。
将 name 设置为“_blank
”。
将 windowType 设置为“新建且无打开程序
”。
在存在 打开程序策略 的情况下,与顶级浏览上下文的活动文档跨源的嵌套文档始终将 noopener 设置为 true。
令 chosen 为 null。
令 targetName 为空字符串。
如果 name 不与“_blank
”进行 ASCII 不区分大小写 匹配,则将 targetName 设置为 name。
如果 noopener 为 true,则将 chosen 设置为根据 null、targetName 和 currentNavigable 创建新的顶级可遍历对象 的结果。
否则
将 chosen 设置为根据 currentNavigable 的 活动浏览上下文、targetName 和 currentNavigable 创建新的顶级可遍历对象 的结果。
如果 sandboxingFlagSet 的 沙盒导航浏览上下文标志 已设置,则将 chosen 的 活动浏览上下文 的 唯一允许的沙盒导航器 设置为 currentNavigable 的 活动浏览上下文。
如果 sandboxingFlagSet 的 沙盒传播到辅助浏览上下文标志 已设置,则 sandboxingFlagSet 中设置的所有标志都必须在 chosen 的 活动浏览上下文 的 弹出窗口沙盒标志集 中设置。
将 chosen 设置为 currentNavigable。
不执行任何操作。
鼓励用户代理提供一种方式,允许用户配置用户代理始终选择 currentNavigable。
返回 chosen 和 windowType。
一个 浏览上下文 是文档序列的程序化表示,其中多个文档可以存在于单个 可导航对象 中。每个 浏览上下文 都有一个对应的 WindowProxy
对象,以及以下内容
一个 打开者浏览上下文,一个 浏览上下文 或 null,初始值为 null。
一个 创建时的打开者来源,一个 来源 或 null,初始值为 null。
一个 是否为弹出窗口 布尔值,初始值为 false。
本规范中 是否为弹出窗口 的唯一强制影响是相关 visible
获取器获取的 BarProp
对象。但是,用户代理也可能将其用于 用户界面方面的考虑。
一个 是否为辅助 布尔值,初始值为 false。
一个 初始 URL,一个 URL 或 null,初始值为 null。
一个 虚拟浏览上下文组 ID 整数,初始值为 0。这由 打开者策略报告 使用,以跟踪如果已执行 report-only 策略则会发生的浏览上下文组切换。
一个 浏览上下文 的 活动窗口 是其 WindowProxy
对象的 [[Window]] 内部槽值。一个 浏览上下文 的 活动文档 是其 活动窗口 的 关联的 Document
。
一个 浏览上下文 的 顶级可遍历对象 是其 活动文档 的 节点可导航对象 的 顶级可遍历对象。
一个 浏览上下文,其 是否为辅助 为 true,被称为 辅助浏览上下文。辅助浏览上下文始终是 顶级浏览上下文。
目前尚不清楚是否需要单独的 是否为辅助 概念。在 issue #5680 中,表明我们可以通过使用 打开者浏览上下文 是否为 null 来简化这一点。
现代规范应避免在大多数情况下使用 浏览上下文 概念,除非它们正在处理 由于跨源打开者策略导致的浏览上下文组切换 和 代理集群分配 的细微差别。相反,Document
和 可导航对象 概念通常更合适。
一个 Document
的浏览上下文 是一个 浏览上下文 或 null,初始值为 null。
一个 Document
不一定具有非 null 的 浏览上下文。特别是,数据挖掘工具可能永远不会实例化浏览上下文。使用诸如 createDocument()
之类的 API 创建的 Document
从未具有非 null 的 浏览上下文。并且为 iframe
元素最初创建的 Document
,该元素已被 从文档中移除,没有关联的浏览上下文,因为该浏览上下文已 被设为 null。
通常,只要 Document
对象具有非 null 的 浏览上下文,Window
对象与 Document
对象之间存在 1 对 1 的映射。有一个例外。一个 Window
可以重复用于在同一个 浏览上下文 中呈现第二个 Document
,因此映射为 1 对 2。当 浏览上下文 从 初始 about:blank
Document
导航到另一个时,就会发生这种情况,这将使用 替换 来完成。
要 创建新的浏览上下文和文档,给定 null 或 Document
对象 creator、null 或元素 embedder 以及 浏览上下文组 group
令 browsingContext 为一个新的 浏览上下文。
令 unsafeContextCreationTime 为 不安全的共享当前时间。
令 creatorOrigin 为 null。
令 creatorBaseURL 为 null。
如果 creator 不为 null,则
将 creatorOrigin 设置为 creator 的 来源。
将 creatorBaseURL 设置为 creator 的 文档基本 URL。
将 browsingContext 的 虚拟浏览上下文组 ID 设置为 creator 的 浏览上下文 的 顶级浏览上下文 的 虚拟浏览上下文组 ID。
令 sandboxFlags 为根据 browsingContext 和 embedder 确定创建沙盒标志 的结果。
令 origin 为根据 about:blank
、sandboxFlags 和 creatorOrigin 确定来源 的结果。
令 permissionsPolicy 为根据 embedder 和 origin 创建权限策略 的结果。 [PERMISSIONSPOLICY]
令 agent 为根据 origin、group 和 false 获取相同来源的窗口代理 的结果。
令 领域执行上下文 为根据 agent 和以下自定义项 创建新的领域 的结果
对于全局对象,创建一个新的 Window
对象。
对于全局 this 绑定,使用 browsingContext 的 WindowProxy
对象。
如果 embedder 为 null,则令 topLevelCreationURL 为 about:blank
;否则为 embedder 的 相关设置对象 的 顶级创建 URL。
如果 embedder 为 null,则令 topLevelOrigin 为 origin;否则为 embedder 的 相关设置对象 的 顶级来源。
设置窗口环境设置对象,使用 about:blank
、领域执行上下文、null、topLevelCreationURL 和 topLevelOrigin。
令 loadTimingInfo 为一个新的 文档加载计时信息,其 导航开始时间 设置为使用 unsafeContextCreationTime 和新的 环境设置对象 的 跨源隔离功能 调用 粗化时间 的结果。
令 document 为一个新的 Document
,其中包含
html
"text/html
"quirks
"about:blank
如果 creator 不为 null,则
断言:document的URL和document的相关设置对象的创建 URL均为about:blank
。
将document标记为加载后任务就绪。
使用html
/head
/body
填充,给定document。
激活document。
完全完成加载document。
返回browsingContext和document。
要创建新的顶级浏览上下文和文档
令group和document为创建新的浏览上下文组和文档的结果。
返回group的浏览上下文集[0]和document。
要创建新的辅助浏览上下文和文档,给定一个浏览上下文opener
令group为openerTopLevelBrowsingContext的组。
令browsingContext和document为创建新的浏览上下文和文档的结果,使用opener的活动文档、null 和group。
将browsingContext的是否为辅助设置为 true。
追加browsingContext到group。
将browsingContext的opener 浏览上下文设置为opener。
将browsingContext的虚拟浏览上下文组 ID设置为openerTopLevelBrowsingContext的虚拟浏览上下文组 ID。
将browsingContext的创建时的 opener 源设置为opener的活动文档的源。
返回browsingContext和document。
要确定源,给定一个URLurl、一个沙箱标志集sandboxFlags和一个源或 nullsourceOrigin
如果sandboxFlags的沙箱源浏览上下文标志已设置,则返回一个新的不透明源。
如果url为 null,则返回一个新的不透明源。
如果url为about:srcdoc
,则
断言:sourceOrigin不为 null。
返回sourceOrigin。
如果url匹配about:blank
且sourceOrigin不为 null,则返回sourceOrigin。
返回url的源。
返回sourceOrigin的情况会导致两个Document
最终具有相同的底层源,这意味着document.domain
会影响两者。
如果以下算法返回 true,则称浏览上下文potentialDescendant为浏览上下文potentialAncestor的祖先
令potentialDescendantDocument为potentialDescendant的活动文档。
如果potentialDescendantDocument不是完全活动的,则返回 false。
令ancestorBCs为通过获取potentialDescendantDocument的祖先可导航对象中每个成员的活动文档的浏览上下文而获得的列表。
如果ancestorBCs包含potentialAncestor,则返回 true。
返回 false。
一个顶级浏览上下文是一个浏览上下文,其活动文档的节点可导航对象是一个可遍历可导航对象。
它不需要是顶级可遍历对象。
浏览上下文start的顶级浏览上下文是以下算法的结果
返回navigable的活动浏览上下文。
如果以下算法返回 true,则称浏览上下文A与第二个浏览上下文B为熟悉
如果A的顶级浏览上下文为B,则返回 true。
如果B是一个辅助浏览上下文且A与B的opener 浏览上下文为熟悉,则返回 true。
如果存在B的祖先浏览上下文,其活动文档具有与A的活动文档相同的相同源,则返回 true。
这包括A是B的祖先浏览上下文的情况。
返回 false。
顶级浏览上下文具有关联的组(null 或浏览上下文组)。最初为 null。
当一个组被创建时,一个顶级浏览上下文会被添加到该组。随后添加到该组的所有顶级浏览上下文都将是辅助浏览上下文。
一个浏览上下文组有一个关联的代理集群映射(一个弱映射,将代理集群键映射到代理集群)。当用户代理认为没有任何东西可以再访问它们时,负责收集代理集群。
一个浏览上下文组有一个关联的历史代理集群键映射,它是一个映射,将来源映射到代理集群键。此映射用于通过记录以前为给定来源使用哪些代理集群键来确保基于来源的代理集群功能的一致性。
在浏览上下文组的生命周期中,历史代理集群键映射只会获得条目。
一个浏览上下文组有一个跨源隔离模式,它是一个跨源隔离模式。最初为"none
"。
一个跨源隔离模式可以是三种可能的值之一:" none
"、"logical
" 或 "concrete
"。
"logical
" 和 "concrete
" 类似。它们都用于浏览上下文组,其中
每个顶级Document
都有 `Cross-Origin-Opener-Policy: same-origin
`,并且
每个Document
都具有一个 `Cross-Origin-Embedder-Policy
` 标头,其值为与跨源隔离兼容。
在某些平台上,很难提供授予对由跨源隔离功能控制的 API 进行安全访问所需的安全性属性。因此,只有 "concrete
" 可以授予该功能的访问权限。"logical
" 用于不支持此功能的平台,其中跨源隔离强加的各种限制仍然适用,但不会授予该功能。
要创建新的浏览上下文组和文档
令 group 为一个新的浏览上下文组。
令 browsingContext 和 document 为使用 null、null 和 group 创建新的浏览上下文和文档的结果。
将 browsingContext 追加到 group。
返回 group 和 document。
要将顶级浏览上下文 browsingContext 追加到浏览上下文组 group
要移除顶级浏览上下文 browsingContext
追加和移除是帮助定义浏览上下文组生命周期的基本操作。它们由Document
和浏览上下文的高级创建和销毁操作调用。
当没有Document
对象的浏览上下文等于给定的浏览上下文(即,所有此类Document
都已被销毁),并且该浏览上下文的WindowProxy
有资格进行垃圾回收时,则该浏览上下文将永远不会再次被访问。如果它是一个顶级浏览上下文,则此时用户代理必须移除它。
当 d 是可导航对象 navigable的活动文档,并且 navigable 是顶级可遍历对象或 navigable 的容器文档是完全活动时,Document
d 被认为是完全活动。
由于它们与元素相关联,因此子可导航对象始终与其父可导航对象中的特定Document
(其容器文档)相关联。用户代理不得允许用户与子可导航对象交互,这些对象的容器文档本身不是完全活动。
以下示例说明了Document
如何可以是其节点可导航对象的活动文档,但不是完全活动。这里 a.html
加载到浏览器窗口中,b-1.html
从加载到iframe
中开始,如所示,而 b-2.html
和 c.html
被省略(它们可以只是一个空文档)。
<!-- a.html -->
<!DOCTYPE html>
< html lang = "en" >
< title > Navigable A</ title >
< iframe src = "b-1.html" ></ iframe >
< button onclick = "frames[0].location.href = 'b-2.html'" > Click me</ button >
<!-- b-1.html -->
<!DOCTYPE html>
< html lang = "en" >
< title > Navigable B</ title >
< iframe src = "c.html" ></ iframe >
此时,由 a.html
、b-1.html
和 c.html
给出的文档都是其各自节点可导航对象的活动文档。它们也都完全活动。