面向 Web 开发人员版本 - 最后更新时间 2024 年 9 月 12 日
本标准包含多个相关概念,用于对文档序列进行分组。作为简短的非规范性摘要
可导航对象 是文档序列的用户端表示,即它们表示可以在文档之间进行导航的某项内容。典型的示例包括 Web 浏览器中的标签或窗口,或 iframe
。
可遍历的可导航对象 是一种特殊类型的可导航对象,它控制自身及其后代可导航对象的会话历史记录。也就是说,除了它们自己的文档系列之外,它们还表示进一步的文档系列树,以及线性遍历此树的扁平化视图的能力。
浏览上下文 是文档系列的开发人员端表示。它们与 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 的 顶级可遍历
令 navigable 为 inputNavigable。
返回 navigable。
要 创建一个新的顶级可遍历,给定一个 浏览上下文-或-null opener,一个字符串 targetName,以及一个可选的 可导航 openerNavigableForWebDriver
令 document 为 null。
如果 opener 为 null,则将 document 设置为 创建新的顶级浏览上下文和文档 的第二个返回值。
否则,将 document 设置为 创建新的辅助浏览上下文和文档(给定 opener)的第二个返回值。
令 documentState 为一个新的 文档状态,具有以下内容:
令 traversable 为一个新的 可遍历可导航。
初始化可导航 traversable,给定 documentState。
令 initialHistoryEntry 为 traversable 的 活动会话历史条目。
将 initialHistoryEntry 的 步骤 设置为 0。
如果 opener 不为 null,则 旧式克隆一个可遍历存储棚,给定 opener 的 顶级可遍历 和 traversable。 [STORAGE]
调用 WebDriver BiDi 可导航已创建,使用 traversable 和 openerNavigableForWebDriver。
返回 traversable。
要 创建一个新的顶级可遍历,给定一个 URL initialNavigationURL 和一个可选的 POST 资源-或-null initialNavigationPostResource(默认值 null)
令 traversable 为 创建一个新的顶级可遍历(给定 null 和空字符串)的结果。
导航 traversable 到 initialNavigationURL,使用 traversable 的 活动文档,并将 documentResource 设置为 initialNavigationPostResource。
我们将这些初始导航视为 traversable 自身导航,这将确保所有相关的安全检查都通过。
返回 traversable。
某些元素(例如,iframe
元素)可以向用户呈现一个 可导航。这些元素称为 可导航容器。
每个 可导航容器 都具有一个 内容可导航,它要么是一个 可导航,要么为 null。它最初为 null。
可导航 navigable 的 容器 是那个 可导航容器,其 内容可导航 为 navigable,或者如果不存在这样的元素,则为 null。
可导航 navigable 的 容器文档 是执行以下步骤的结果
如果 navigable 的 容器 为 null,则返回 null。
Document
document 的 容器文档 是执行以下步骤的结果
当 可导航 navigable 的 父级 为 potentialParent 时,navigable 是另一个可导航 potentialParent 的 子可导航。我们也可以简单地说一个 可导航 “是一个 子可导航”,这意味着它的 父级 不为 null。
可导航容器 container 的 内容文档 是执行以下步骤的结果
如果 container 的 内容可导航 为 null,则返回 null。
返回 document。
可导航容器 container 的 内容窗口 是执行以下步骤的结果
如果 container 的 内容可导航 为 null,则返回 null。
返回 container 的 内容可导航 的 活动 WindowProxy
的对象。
要 创建一个新的子可导航,给定一个元素 element
令 parentNavigable 为 element 的 节点可导航。
令 browsingContext 和 document 为 创建新的浏览上下文和文档(给定 element 的 节点文档、element 和 group)的结果。
令 targetName 为 null。
如果 element 具有 name
内容属性,则将 targetName 设置为该属性的值。
令 documentState 为一个新的 文档状态,具有以下内容:
令 navigable 为一个新的 可导航。
初始化可导航 navigable,给定 documentState 和 parentNavigable。
将 element 的 内容可导航 设置为 navigable。
令 historyEntry 为 navigable 的 活动会话历史条目。
令 traversable 为 parentNavigable 的 可遍历可导航。
追加以下会话历史遍历步骤 到 traversable
使用 traversable 调用 WebDriver BiDi 可导航对象创建 事件。
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 和文档之间转换。第一个,标记为 顶部
的,是 顶级可遍历对象,其他则是 子可导航对象。文档由每个单元格的背景颜色表示,新的背景颜色表示该 可导航对象 中的新文档。URL 由单元格的文本内容表示;通常它们以 相对 URL 的形式表示,以简洁起见,除非特定调查的跨域情况。给定可导航对象可能在给定步骤不存在,在这种情况下,相应的单元格为空。粗斜体步骤号表示可遍历对象的 当前会话历史记录步骤,所有带有粗斜体 URL 的单元格表示该行可导航对象的 当前会话历史记录条目。
因此,上面的 Jake 图描述了以下事件序列:
一个 顶级可遍历对象 被创建,从 URL /t-a
开始,有两个 子可导航对象 分别从 /i-0-a
和 /i-1-a
开始。
第一个子可导航对象被 导航 到另一个文档,其 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
确实具有祖先和后代可导航对象,但它们的行为通常就像没有一样(例如,在 window.parent
getter 中)。
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 为一个 列表,其中包含 document 的所有 后代,它们是 可导航容器,按 树的顺序。
针对 navigableContainers 中的每个 navigableContainer
返回 navigables。
要销毁子可导航对象,给定 可导航容器 container
设 navigable 为 container 的 内容可导航对象。
如果 navigable 为 null,则返回。
将 container 的 内容可导航对象 设置为 null。
通知导航 API 关于子可导航对象销毁,给定 navigable。
设 parentDocState 为 container 的 节点可导航对象 的 活动会话历史记录条目 的 文档状态。
从 parentDocState 的 嵌套历史记录 中 移除 嵌套历史记录,其 id 等于 navigable 的 id。
将以下会话历史记录遍历步骤 追加 到 traversable
给定 traversable,更新可导航对象创建/销毁。
使用 navigable 调用 WebDriver BiDi 可导航对象销毁 事件。
要销毁顶级可遍历对象,给定 顶级可遍历对象 traversable
设 browsingContext 为 traversable 的 活动浏览上下文。
针对 traversable 的 会话历史记录条目 中的每个 historyEntry 按什么顺序?
将 browsingContext 移除。
从用户界面中移除 traversable(例如,关闭或隐藏其在选项卡式浏览器中的选项卡)。
从用户代理的 顶级可遍历集 中移除 traversable。
使用 traversable 调用 WebDriver BiDi 可导航对象已销毁。
用户代理可以随时 销毁顶级可遍历对象(通常,响应用户请求)。
要 关闭顶级可遍历对象 traversable
如果 traversable 的 正在关闭 为 true,则返回。
令 toUnload 为 traversable 的 活动文档 的 包含的子代可导航对象。
如果对 toUnload 检查是否取消卸载 的结果为 true,则返回。
将以下 会话历史记录遍历步骤 附加到 traversable
可以给 可导航对象 指定 目标名称,这些名称是字符串,允许某些 API(如 window.open()
或 a
元素的 target
属性)将 导航 定位到该可导航对象。
一个 有效的可导航目标名称 是任何包含至少一个字符的字符串,该字符串既不包含 ASCII 制表符或换行符 和 U+003C (<),也不以 U+005F (_) 开头。(以 U+005F (_) 开头的名称保留用于特殊关键字。)
一个 有效的可导航目标名称或关键字 是任何字符串,它要么是一个 有效的可导航目标名称,要么与以下之一进行 ASCII 不区分大小写 匹配:_blank
、_self
、_parent
或 _top
。
这些值根据页面是否被沙箱隔离,具有不同的含义,如下表(非规范性)所示。在此表中,“当前”表示 可导航对象 链接或脚本所在的 可导航对象,“父级”表示 父级,链接或脚本所在的 可导航对象,“顶部”表示链接或脚本所在的 可导航对象 的 顶级可遍历对象,“新建”表示一个新的 可遍历可导航对象,具有一个为 null 的 父级(它可以使用 辅助浏览上下文,这取决于各种用户偏好和用户代理策略),“无”表示什么也不会发生,而“可能新建”表示与“新建”相同,如果在 sandbox
属性(或如果用户覆盖了沙箱隔离)上也指定了“allow-popups
”关键字,否则与“无”相同。
关键字 | 普通效果 | 在 iframe 中的效果... | |
---|---|---|---|
sandbox=""
| sandbox="allow-top-navigation"
| ||
未指定,对于链接和表单提交 | 当前 | 当前 | 当前 |
空字符串 | 当前 | 当前 | 当前 |
_blank
| 新建 | 可能新建 | 可能新建 |
_self
| 当前 | 当前 | 当前 |
_parent (如果不存在父级) | 当前 | 当前 | 当前 |
_parent (如果父级也是顶部) | 父级/顶部 | 无 | 父级/顶部 |
_parent (如果存在且不是顶部) | 父级 | 无 | 无 |
_top (如果顶部是当前) | 当前 | 当前 | 当前 |
_top (如果顶部不是当前) | 顶部 | 无 | 顶部 |
不存在的名称 | 新建 | 可能新建 | 可能新建 |
存在且是子代的名称 | 指定的子代 | 指定的子代 | 指定的子代 |
存在且是当前的名称 | 当前 | 当前 | 当前 |
存在且是顶部的祖先的名称 | 指定的祖先 | 无 | 指定的祖先/顶部 |
存在且不是顶部的祖先的名称 | 指定的祖先 | 无 | 无 |
与顶部相同的其他现有名称 | 指定 | 无 | 无 |
与顶部不同的现有名称,如果 熟悉 且 只有一个允许的沙箱隔离导航器 | 指定 | 指定 | 指定 |
与顶部不同的现有名称,如果 熟悉 但不是 只有一个允许的沙箱隔离导航器 | 指定 | 无 | 无 |
与顶部不同的现有名称,不熟悉 | 新建 | 可能新建 | 可能新建 |
沙箱隔离浏览上下文的大多数限制都是由其他算法应用的,例如 导航 算法,而不是 选择可导航对象的规则(如下所示)。
给定字符串 name、可导航对象 currentNavigable 和布尔值 noopener,选择可导航对象的规则 如下所示
令 chosen 为 null。
令 windowType 为 "existing or none
"。
令 sandboxingFlagSet 为 currentNavigable 的 活动文档 的 活动沙箱隔离标志集。
如果 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 设置为 "new and unrestricted
"。
令 currentDocument 为 currentNavigable 的 活动文档。
如果 currentDocument 的 跨域打开程序策略 的 值 是 "same-origin
" 或 "same-origin-plus-COEP
",并且 currentDocument 的 来源 与 currentDocument 的 相关设置对象 的 顶级来源 同源,则
将 noopener 设置为 true。
将 name 设置为 "_blank
"。
将 windowType 设置为 "new with no opener
"。
在存在 打开程序策略 的情况下,与顶级浏览上下文的活动文档跨域的嵌套文档始终将 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。
本规范中 是否为弹出窗口 的唯一强制影响是相关 BarProp
对象的 visible
获取器。但是,用户代理也可以将其用于 用户界面考虑。
一个 是否为辅助 布尔值,最初为 false。
一个 初始 URL,一个 URL 或 null,最初为 null。
一个 虚拟浏览上下文组 ID 整数,最初为 0。这由 打开者策略报告 使用,以跟踪如果报告仅策略被强制执行,则会发生的浏览上下文组切换。
一个 浏览上下文 的 活动窗口 是其 WindowProxy
对象的 [[Window]] 内部槽值。一个 浏览上下文 的 活动文档 是其 活动窗口 的 关联的 Document
。
一个 浏览上下文 的 顶层可遍历 是其 活动文档 的 节点可导航 的 顶层可遍历。
一个 浏览上下文,其 是否为辅助 为 true,被称为 辅助浏览上下文。辅助浏览上下文始终是 顶层浏览上下文。
目前尚不清楚是否需要单独的 是否为辅助 概念。在 issue #5680 中,表明我们可能可以通过使用 打开者浏览上下文 是否为 null 来简化此问题。
现代规范应避免在大多数情况下使用 浏览上下文 概念,除非它们正在处理 浏览上下文组切换 和 代理集群分配 的细微差别。相反,Document
和 可导航 概念通常更合适。
一个 Document
的浏览上下文 是一个 浏览上下文 或 null,最初为 null。
Document
不一定具有非 null 浏览上下文。特别是,数据挖掘工具可能永远不会实例化浏览上下文。使用诸如 createDocument()
之类的 API 创建的 Document
永远不会具有非 null 浏览上下文。并且为 iframe
元素最初创建的 Document
,该元素已被 从文档中删除,没有关联的浏览上下文,因为该浏览上下文已 被置空。
通常,只要 Document
对象具有非 null 浏览上下文,Window
对象与 Document
对象之间就存在 1 对 1 映射。有一个例外。Window
可以被重复使用,用于在同一 浏览上下文 中呈现第二个 Document
,这样映射就变成了 1 对 2。当 浏览上下文 从 最初的 about:blank
Document
导航到另一个 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
对象。
让 topLevelCreationURL 为 about:blank
,如果 embedder 为 null;否则 embedder 的 相关设置对象 的 顶层创建 URL。
让 topLevelOrigin 为 origin,如果 embedder 为 null;否则 embedder 的 相关设置对象 的 顶层来源。
设置窗口环境设置对象,其中包含 about:blank
,领域执行上下文,null,topLevelCreationURL 和 topLevelOrigin。
让 loadTimingInfo 成为一个新的 文档加载计时信息,其 导航开始时间 设置为调用 粗化时间 的结果,其中包含 unsafeContextCreationTime 和新的 环境设置对象 的 跨源隔离能力。
让 document 成为一个新的 Document
,其中包含
如果 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。
将 browsingContext 的 虚拟浏览上下文组 ID 设置为 openerTopLevelBrowsingContext 的 虚拟浏览上下文组 ID。
返回 browsingContext 和 document。
要 确定来源,给定一个 URL url,一个 沙箱标志集 sandboxFlags 和一个 来源 或 null sourceOrigin
如果 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 的 活动文档 具有 相同 的 来源,则返回 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
一个Document
d被称为全活跃,当d是可导航navigable的活动文档,并且navigable是一个顶层可遍历或navigable的容器文档是全活跃的。
因为它们与元素相关联,所以子可导航总是绑定到一个特定的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
给出的文档都是它们各自节点可导航的活动文档。它们也都是全活跃的。
单击按钮
后,从而将来自b-2.html
的新Document
加载到可导航 B 中,我们得到以下结果