1. 7.3 文档序列基础设施
      1. 7.3.1 可导航对象
        1. 7.3.1.1 可遍历的可导航对象
        2. 7.3.1.2 顶级可遍历对象
        3. 7.3.1.3 子可导航对象
        4. 7.3.1.4 杰克图表
        5. 7.3.1.5 相关可导航对象集合
        6. 7.3.1.6 可导航对象销毁
        7. 7.3.1.7 可导航对象目标名称
      2. 7.3.2 浏览上下文
        1. 7.3.2.1 创建浏览上下文
        2. 7.3.2.2 相关浏览上下文
        3. 7.3.2.3 浏览上下文分组
      3. 7.3.3 全激活文档

7.3 文档序列基础设施

本标准包含多个相关概念,用于对文档序列进行分组。作为简短的非规范性摘要

本标准的大部分内容都使用可导航对象的语言,但某些 API 公开了浏览上下文切换的存在,因此本标准的某些部分需要使用浏览上下文的语言。

一个 可导航对象 通过其 活动会话历史记录条目 向用户呈现一个 Document。每个可导航对象都具有

通常,当前会话历史记录条目活动会话历史记录条目 相同,但在以下情况下它们会不同步


一个 可导航对象活动文档 是其 活动会话历史记录条目文档

这可以在可导航对象的 顶级可遍历对象会话历史记录遍历队列 中安全读取。虽然一个 可导航对象活动历史记录条目 可以同步更改,但新条目始终具有相同的 Document

一个 可导航对象活动浏览上下文 是其 活动文档浏览上下文。如果此 可导航对象 是一个 可遍历的可导航对象,那么其 活动浏览上下文 将是一个 顶级浏览上下文

一个 可导航对象活动 WindowProxy 是其 活动浏览上下文 的关联 WindowProxy

一个 可导航对象活动窗口 是其 活动 WindowProxy[[Window]]

这始终等于可导航对象的 活动文档相关全局对象;这是通过 设为活动 算法保持同步的。

一个 可导航对象目标名称 是其 活动会话历史记录条目文档状态可导航对象目标名称


要获取 节点 node节点可导航对象,请返回其 活动文档node节点文档可导航对象,如果没有这样的 可导航对象,则返回 null。


初始化可导航对象 可导航对象 navigable,给定 文档状态 documentState 和可选的 可导航对象-或-null parent(默认值为 null)

  1. 断言documentState文档 不为 null。

  2. entry 为一个新的 会话历史记录条目,具有

    URL
    documentState文档URL
    文档状态
    documentState

    此算法的调用者负责初始化 entry步骤;它将在完成之前保持为“pending”。

  3. navigable当前会话历史记录条目 设置为 entry

  4. navigable活动会话历史记录条目 设置为 entry

  5. navigable父对象 设置为 parent

7.3.1.1 可遍历的可导航对象

一个 可遍历的可导航对象 是一个 可导航对象,它还控制哪些 会话历史记录条目 应成为自身及其后代 可导航对象当前会话历史记录条目活动会话历史记录条目

除了 可导航对象 的属性之外,可遍历的可导航对象 还具有

要获取 可导航对象 inputNavigable可遍历的可导航对象

  1. navigableinputNavigable

  2. navigable 不是 可遍历的可导航对象 时,将 navigable 设置为 navigable父对象

  3. 返回 navigable

7.3.1.2 顶级可遍历对象

一个 顶级可遍历对象 是一个 可遍历的可导航对象,其 父对象 为 null。

目前,所有 可遍历的可导航对象 都是 顶级可遍历对象。未来的提案设想引入非顶级可遍历对象。

用户代理维护着一个 顶级可遍历集合(一个包含 集合顶级可遍历)。这些通常以浏览器窗口或浏览器标签的形式呈现给用户。

要获取 可导航 inputNavigable顶级可遍历

  1. navigableinputNavigable

  2. navigable父级 不为 null 时,将 navigable 设置为 navigable父级

  3. 返回 navigable

创建一个新的顶级可遍历,给定一个 浏览上下文-或-null opener,一个字符串 targetName,以及一个可选的 可导航 openerNavigableForWebDriver

  1. document 为 null。

  2. 如果 opener 为 null,则将 document 设置为 创建新的顶级浏览上下文和文档 的第二个返回值。

  3. 否则,将 document 设置为 创建新的辅助浏览上下文和文档(给定 opener)的第二个返回值。

  4. documentState 为一个新的 文档状态,具有以下内容:

    document
    document
    发起者来源
    如果 opener 为 null,则为 null;否则,为 document来源
    来源
    document来源
    可导航目标名称
    targetName
    关于基础 URL
    document关于基础 URL
  5. traversable 为一个新的 可遍历可导航

  6. 初始化可导航 traversable,给定 documentState

  7. initialHistoryEntrytraversable活动会话历史条目

  8. initialHistoryEntry步骤 设置为 0。

  9. 追加 initialHistoryEntrytraversable会话历史条目

  10. 如果 opener 不为 null,则 旧式克隆一个可遍历存储棚,给定 opener顶级可遍历traversable[STORAGE]

  11. 追加 traversable 到用户代理的 顶级可遍历集合

  12. 调用 WebDriver BiDi 可导航已创建,使用 traversableopenerNavigableForWebDriver

  13. 返回 traversable

创建一个新的顶级可遍历,给定一个 URL initialNavigationURL 和一个可选的 POST 资源-或-null initialNavigationPostResource(默认值 null)

  1. traversable创建一个新的顶级可遍历(给定 null 和空字符串)的结果。

  2. 导航 traversableinitialNavigationURL,使用 traversable活动文档,并将 documentResource 设置为 initialNavigationPostResource

    我们将这些初始导航视为 traversable 自身导航,这将确保所有相关的安全检查都通过。

  3. 返回 traversable

7.3.1.3 子可导航

某些元素(例如,iframe 元素)可以向用户呈现一个 可导航。这些元素称为 可导航容器

每个 可导航容器 都具有一个 内容可导航,它要么是一个 可导航,要么为 null。它最初为 null。

可导航 navigable容器 是那个 可导航容器,其 内容可导航navigable,或者如果不存在这样的元素,则为 null。

可导航 navigable容器文档 是执行以下步骤的结果

  1. 如果 navigable容器 为 null,则返回 null。

  2. 返回 navigable容器节点文档

    这等同于 navigable容器包含阴影的根,因为 navigable容器 必须是 连接的

Document document容器文档 是执行以下步骤的结果

  1. 如果 document节点可导航 为 null,则返回 null。

  2. 返回 document节点可导航容器文档

可导航 navigable父级potentialParent 时,navigable 是另一个可导航 potentialParent子可导航。我们也可以简单地说一个 可导航 “是一个 子可导航”,这意味着它的 父级 不为 null。

所有 子可导航 都是它们 容器内容可导航

可导航容器 container内容文档 是执行以下步骤的结果

  1. 如果 container内容可导航 为 null,则返回 null。

  2. documentcontainer内容可导航活动文档

  3. 如果 document来源container节点文档来源 不是 同源域,则返回 null。

  4. 返回 document

可导航容器 container内容窗口 是执行以下步骤的结果

  1. 如果 container内容可导航 为 null,则返回 null。

  2. 返回 container内容可导航活动 WindowProxy 的对象。


创建一个新的子可导航,给定一个元素 element

  1. parentNavigableelement节点可导航

  2. groupelement节点文档浏览上下文顶级浏览上下文

  3. browsingContextdocument创建新的浏览上下文和文档(给定 element节点文档elementgroup)的结果。

  4. targetName 为 null。

  5. 如果 element 具有 name 内容属性,则将 targetName 设置为该属性的值。

  6. documentState 为一个新的 文档状态,具有以下内容:

    document
    document
    发起者来源
    document来源
    来源
    document来源
    可导航目标名称
    targetName
    关于基础 URL
    document关于基础 URL
  7. navigable 为一个新的 可导航

  8. 初始化可导航 navigable,给定 documentStateparentNavigable

  9. element内容可导航 设置为 navigable

  10. historyEntrynavigable活动会话历史条目

  11. traversableparentNavigable可遍历可导航

  12. 追加以下会话历史遍历步骤traversable

    1. parentDocStateparentNavigable活动会话历史条目文档状态

    2. parentNavigableEntries获取会话历史条目(针对 parentNavigable)的结果。

    3. targetStepSHEparentNavigableEntries 中第一个 会话历史条目,其 文档状态 等于 parentDocState

    4. historyEntry步骤 设置为 targetStepSHE步骤

    5. nestedHistory 为一个新的 嵌套历史,其 idnavigableid,以及 条目列表 为 « historyEntry »。

    6. 追加 nestedHistoryparentDocState嵌套历史

    7. 更新可导航创建/销毁,给定 traversable

  13. 使用 traversable 调用 WebDriver BiDi 可导航对象创建 事件。

7.3.1.4 Jake 图

Jake 图是一种用于可视化文档序列的有效方法,特别是用于可视化 可导航对象 及其 会话历史记录条目。典型 Jake 图如下所示:

01234
顶部/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 图描述了以下事件序列:

  1. 一个 顶级可遍历对象 被创建,从 URL /t-a 开始,有两个 子可导航对象 分别从 /i-0-a/i-1-a 开始。

  2. 第一个子可导航对象被 导航 到另一个文档,其 URL 为 /i-0-b

  3. 第二个子可导航对象被 导航 到另一个文档,其 URL 为 /i-1-b

  4. 顶级可遍历对象被 导航相同文档,将其 URL 更新为 /t-a#foo

  5. 顶级可遍历对象被 导航 到另一个文档,其 URL 为 /t-b。(请注意,这个文档当然不会保留旧文档的子可导航对象。)

  6. 可遍历对象被 以增量 -3 遍历,回到步骤 1。

Jake 图 是一个强大的工具,可以用来可视化多个可导航对象、导航和遍历的交互。它们无法捕捉所有可能的交互——例如,它们只适用于单层嵌套——但我们将不时地使用它们来说明本标准中的几种复杂情况。

Jake 图 以其创造者,杰出的 Jake Archibald 的名字命名。

在本标准的算法中,查看从给定的 Document 开始的 可导航对象 集合通常很有帮助。本节包含一组经过整理的用于收集这些可导航对象的算法。

这些算法的返回值按顺序排列,父级出现在其子级之前。调用方依赖于这种排序。

Document 而不是从 可导航对象 开始通常更好,因为这使得调用方能够意识到他们是从一个 完全活跃Document 开始还是从其他开始。虽然非 完全活跃Document 确实具有祖先和后代可导航对象,但它们的行为通常就像没有一样(例如,在 window.parent getter 中)。

Document document祖先可导航对象 由以下步骤给出:

  1. navigabledocument节点可导航对象父级

  2. ancestors 为一个空列表。

  3. navigable 不为 null 时

    1. navigable 预置ancestors 中。

    2. navigable 设置为 navigable父级

  4. 返回 ancestors

Document document包含祖先可导航对象 由以下步骤给出:

  1. navigablesdocument祖先可导航对象

  2. document节点可导航对象 追加navigables 中。

  3. 返回 navigables

Document document后代可导航对象 由以下步骤给出:

  1. navigables 为一个新的 列表

  2. navigableContainers 为一个 列表,其中包含 document 的所有 包含阴影的后代,它们是 可导航容器,按 包含阴影的树的顺序

  3. 针对 navigableContainers 中的每个 navigableContainer

    1. 如果 navigableContainer内容可导航对象 为 null,则继续。

    2. navigableContainer内容可导航对象活动文档包含后代可导航对象 扩展navigables 中。

  4. 返回 navigables

Document document包含后代可导航对象 由以下步骤给出:

  1. navigables 为 « document节点可导航对象 »。

  2. document后代可导航对象 扩展navigables 中。

  3. 返回 navigables

这些后代收集算法被描述为查看后代 Document 对象的 DOM 树。实际上,这通常不可行,因为 DOM 树可能与调用算法的进程位于不同的进程中。相反,实现通常会跨进程复制相应的树。

Document document文档树子可导航对象 由以下步骤给出:

  1. 如果 document节点可导航对象 为 null,则返回空列表。

  2. navigables 为一个新的 列表

  3. navigableContainers 为一个 列表,其中包含 document 的所有 后代,它们是 可导航容器,按 树的顺序

  4. 针对 navigableContainers 中的每个 navigableContainer

    1. 如果 navigableContainer内容可导航对象 为 null,则 继续

    2. navigableContainer内容可导航对象 追加navigables 中。

  5. 返回 navigables

7.3.1.6 可导航对象销毁

销毁子可导航对象,给定 可导航容器 container

  1. navigablecontainer内容可导航对象

  2. 如果 navigable 为 null,则返回。

  3. container内容可导航对象 设置为 null。

  4. 通知导航 API 关于子可导航对象销毁,给定 navigable

  5. 给定 navigable活动文档销毁文档及其后代

  6. parentDocStatecontainer节点可导航对象活动会话历史记录条目文档状态

  7. parentDocState嵌套历史记录移除 嵌套历史记录,其 id 等于 navigableid

  8. traversablecontainer节点可导航对象可遍历可导航对象

  9. 将以下会话历史记录遍历步骤 追加traversable

    1. 给定 traversable更新可导航对象创建/销毁

  10. 使用 navigable 调用 WebDriver BiDi 可导航对象销毁 事件。

销毁顶级可遍历对象,给定 顶级可遍历对象 traversable

  1. browsingContexttraversable活动浏览上下文

  2. 针对 traversable会话历史记录条目 中的每个 historyEntry 按什么顺序?

    1. documenthistoryEntry文档

    2. 如果 document 不为 null,则给定 document销毁文档及其后代

  3. browsingContext 移除

  4. 从用户界面中移除 traversable(例如,关闭或隐藏其在选项卡式浏览器中的选项卡)。

  5. 从用户代理的 顶级可遍历集 中移除 traversable

  6. 使用 traversable 调用 WebDriver BiDi 可导航对象已销毁

用户代理可以随时 销毁顶级可遍历对象(通常,响应用户请求)。

关闭顶级可遍历对象 traversable

  1. 如果 traversable正在关闭 为 true,则返回。

  2. toUnloadtraversable活动文档包含的子代可导航对象

  3. 如果对 toUnload 检查是否取消卸载 的结果为 true,则返回。

  4. 将以下 会话历史记录遍历步骤 附加到 traversable

    1. afterAllUnloads 为一个算法步骤,该步骤 销毁 traversable

    2. 给定 traversable活动文档、null 和 afterAllUnloads卸载文档及其子代

可以给 可导航对象 指定 目标名称,这些名称是字符串,允许某些 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选择可导航对象的规则 如下所示

  1. chosen 为 null。

  2. windowType 为 "existing or none"。

  3. sandboxingFlagSetcurrentNavigable活动文档活动沙箱隔离标志集

  4. 如果 name 是空字符串或与 "_self" 进行 ASCII 不区分大小写 匹配,则将 chosen 设置为 currentNavigable

  5. 否则,如果 name 与 "_parent" 进行 ASCII 不区分大小写 匹配,则将 chosen 设置为 currentNavigable父级(如果有),否则设置为 currentNavigable

  6. 否则,如果 name 与 "_top" 进行 ASCII 不区分大小写 匹配,则将 chosen 设置为 currentNavigable可遍历可导航对象

  7. 否则,如果 name 不与 "_blank" 进行 ASCII 不区分大小写 匹配,存在一个 可导航对象,其 目标名称name 相同,currentNavigable活动浏览上下文 熟悉可导航对象活动浏览上下文,并且用户代理确定这两个浏览上下文之间的关联程度足以允许它们互相访问,则将 chosen 设置为该可导航对象。如果存在多个匹配的 可导航对象,则用户代理应该以某种任意一致的方式选择一个,例如最近打开的、最近获得焦点的或关联程度更高的,并将 chosen 设置为它。

    这将在 问题 #313 中得到更详细的说明。

  8. 否则,正在请求一个新的 顶级可遍历对象,发生的情况取决于用户代理的配置和功能——它由以下列表中第一个适用选项的规则确定

    用户代理可能会通知用户弹出窗口已被阻止。

    如果 sandboxingFlagSet 设置了 沙箱隔离辅助导航浏览上下文标志

    用户代理可能会向开发者控制台报告弹出窗口已被阻止。

    如果用户代理已配置为在这种情况下创建新的 顶级可遍历对象
    1. windowType 设置为 "new and unrestricted"。

    2. currentDocumentcurrentNavigable活动文档

    3. 如果 currentDocument跨域打开程序策略 是 "same-origin" 或 "same-origin-plus-COEP",并且 currentDocument来源currentDocument相关设置对象顶级来源 同源,则

      1. noopener 设置为 true。

      2. name 设置为 "_blank"。

      3. windowType 设置为 "new with no opener"。

      在存在 打开程序策略 的情况下,与顶级浏览上下文的活动文档跨域的嵌套文档始终将 noopener 设置为 true。

    4. chosen 为 null。

    5. targetName 为空字符串。

    6. 如果 name 不与 "_blank" 进行 ASCII 不区分大小写 匹配,则将 targetName 设置为 name

    7. 如果 noopener 为 true,则将 chosen 设置为给定 null、targetNamecurrentNavigable创建新的顶级可遍历对象 的结果。

    8. 否则

      1. chosen 设置为给定 currentNavigable活动浏览上下文targetNamecurrentNavigable创建新的顶级可遍历对象 的结果。

      2. 如果 sandboxingFlagSet沙盒导航浏览上下文标志 被设置,则将 chosen活动浏览上下文一个允许的沙盒导航器 设置为 currentNavigable活动浏览上下文

    9. 如果 sandboxingFlagSet沙盒传播到辅助浏览上下文标志 被设置,则 sandboxingFlagSet 中设置的所有标志都必须在 chosen活动浏览上下文弹出窗口沙盒标志集 中设置。

    如果新创建的 可导航 chosen 立即被 导航,则导航将作为 "替换" 导航完成。

    如果用户代理已配置为在这种情况下选择 currentNavigable

    chosen 设置为 currentNavigable

    如果用户代理已配置为在这种情况下不会找到可导航

    不做任何事。

    鼓励用户代理提供一种方法,让用户可以配置用户代理始终选择 currentNavigable

  9. 返回 chosenwindowType

7.3.2 浏览上下文

一个 浏览上下文 是对一系列文档的程序化表示,其中多个文档可以存在于单个 可导航 中。每个 浏览上下文 都对应一个 WindowProxy 对象,以及以下内容

一个 浏览上下文活动窗口 是其 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 时,就会发生这种情况,这将使用 替换 完成。

7.3.2.1 创建浏览上下文

为了 创建新的浏览上下文和文档,给定 null 或 Document 对象 creator,null 或元素 embedder,以及 浏览上下文组 group

  1. browsingContext 成为一个新的 浏览上下文

  2. unsafeContextCreationTime 成为 不安全共享当前时间

  3. creatorOrigin 为 null。

  4. creatorBaseURL 为 null。

  5. 如果 creator 非 null,则

    1. creatorOrigin 设置为 creator来源

    2. creatorBaseURL 设置为 creator文档基本 URL

    3. browsingContext虚拟浏览上下文组 ID 设置为 creator浏览上下文顶层浏览上下文虚拟浏览上下文组 ID

  6. sandboxFlags 成为给定 browsingContextembedder 确定创建沙盒标志 的结果。

  7. origin 成为给定 about:blanksandboxFlagscreatorOrigin 确定来源 的结果。

  8. permissionsPolicy 成为给定 embedderorigin 创建权限策略 的结果。 [PERMISSIONSPOLICY]

  9. agent 成为给定 origingroup 和 false 获取相似来源窗口代理 的结果。

  10. 领域执行上下文 成为给定 agent 和以下自定义项 创建新领域 的结果

  11. topLevelCreationURLabout:blank,如果 embedder 为 null;否则 embedder相关设置对象顶层创建 URL

  12. topLevelOriginorigin,如果 embedder 为 null;否则 embedder相关设置对象顶层来源

  13. 设置窗口环境设置对象,其中包含 about:blank领域执行上下文,null,topLevelCreationURLtopLevelOrigin

  14. loadTimingInfo 成为一个新的 文档加载计时信息,其 导航开始时间 设置为调用 粗化时间 的结果,其中包含 unsafeContextCreationTime 和新的 环境设置对象跨源隔离能力

  15. document 成为一个新的 Document,其中包含

    类型
    "html"
    内容类型
    "text/html"
    模式
    "quirks"
    来源
    来源
    浏览上下文
    browsingContext
    权限策略
    permissionsPolicy
    活动沙盒标志集
    sandboxFlags
    加载计时信息
    loadTimingInfo
    是否为初始 about:blank
    true
    关于基础 URL
    creatorBaseURL
    允许声明式阴影根
    true
  16. 如果 creator 非 null,则

    1. document来源 设置为 creator序列化URL

    2. document策略容器 设置为 creator策略容器克隆

    3. 如果 creator来源creator相关设置对象顶层来源 同源,则将 document打开者策略 设置为 creator浏览上下文顶层浏览上下文活动文档打开者策略

  17. 断言: documentURLdocument相关设置对象创建 URLabout:blank

  18. document 标记为 准备好进行加载后任务

  19. 使用 html/head/body 填充 给定的 document

  20. 激活 document

  21. 完全完成加载 document

  22. 返回 browsingContextdocument

创建一个新的顶级浏览上下文和文档

  1. groupdocument创建一个新的浏览上下文组和文档 的结果。

  2. 返回 group浏览上下文集[0] 和 document

创建一个新的辅助浏览上下文和文档,给定一个 浏览上下文 opener

  1. openerTopLevelBrowsingContextopener顶级可遍历活动浏览上下文

  2. groupopenerTopLevelBrowsingContext

  3. 断言: group 不为 null,因为 导航 直接调用此方法。

  4. browsingContextdocument创建一个新的浏览上下文和文档 的结果,其中包含 opener活动文档,null 和 group

  5. browsingContext是否为辅助 设置为 true。

  6. 追加 browsingContextgroup

  7. browsingContext打开者浏览上下文 设置为 opener

  8. browsingContext虚拟浏览上下文组 ID 设置为 openerTopLevelBrowsingContext虚拟浏览上下文组 ID

  9. browsingContext打开者创建时的来源 设置为 opener活动文档来源

  10. 返回 browsingContextdocument

确定来源,给定一个 URL url,一个 沙箱标志集 sandboxFlags 和一个 来源 或 null sourceOrigin

  1. 如果 sandboxFlags 设置了其 沙箱来源浏览上下文标志,则返回一个新的 不透明来源

  2. 如果 url 为 null,则返回一个新的 不透明来源

  3. 如果 urlabout:srcdoc,则

    1. 断言: sourceOrigin 不为 null。

    2. 返回 sourceOrigin

  4. 如果 url 匹配 about:blank 并且 sourceOrigin 不为 null,则返回 sourceOrigin

  5. 返回 url来源

返回 sourceOrigin 的情况会导致两个 Document 最终具有相同的底层 来源,这意味着 document.domain 会影响两者。

7.3.2.2 相关浏览上下文

如果以下算法返回 true,则称 浏览上下文 potentialDescendant浏览上下文 potentialAncestor祖先

  1. potentialDescendantDocumentpotentialDescendant活动文档

  2. 如果 potentialDescendantDocument 不是 完全活动,则返回 false。

  3. ancestorBCs 为通过获取 potentialDescendantDocument祖先可导航 中每个成员的 活动文档浏览上下文 获得的列表。

  4. 如果 ancestorBCs 包含 potentialAncestor,则返回 true。

  5. 返回 false。

一个 顶级浏览上下文 是一个 浏览上下文,其 活动文档节点可导航 是一个 可遍历可导航

不需要顶级可遍历

一个 浏览上下文 start顶级浏览上下文 是以下算法的结果。

  1. 如果 start活动文档 不是 完全活动,则返回 null。

  2. navigablestart活动文档节点可导航

  3. navigable 不为 null 时,将 navigable 设置为 navigable

  4. 返回 navigable活动浏览上下文


如果以下算法返回 true,则称 浏览上下文 A 熟悉 第二个 浏览上下文 B

  1. 如果 A活动文档来源B活动文档来源 同源,则返回 true。

  2. 如果 A顶级浏览上下文B,则返回 true。

  3. 如果 B 是一个 辅助浏览上下文 并且 A 熟悉 B打开者浏览上下文,则返回 true。

  4. 如果存在 B祖先浏览上下文,其 活动文档A活动文档 具有 相同来源,则返回 true。

    这包括 AB祖先浏览上下文 的情况。

  5. 返回 false。

7.3.2.3 浏览上下文的组合

一个 顶级浏览上下文 具有关联的 (null 或 浏览上下文组)。它最初为 null。

一个用户代理持有 浏览上下文组集(一个 集合,包含 浏览上下文组)。

一个 浏览上下文组 持有一个 浏览上下文集(一个 集合,包含 顶级浏览上下文)。

当组 创建 时,顶级浏览上下文 会被添加到 中。所有随后添加到 中的 顶级浏览上下文 都是 辅助浏览上下文

一个 浏览上下文组 具有关联的 代理集群映射(一个弱 映射,包含 代理集群键代理集群)。当认为没有任何内容可以再访问代理集群时,用户代理负责收集它们。

一个 浏览上下文组 具有关联的 历史代理集群键映射,它是一个 映射,包含 来源代理集群键。此映射用于通过记录以前为给定来源使用的代理集群键来确保 来源键控代理集群 功能的一致性。

在浏览上下文组的整个生命周期中,历史代理集群键映射 仅获得条目。

一个 浏览上下文组 具有一个 跨来源隔离模式,它是一个 跨来源隔离模式。它最初为 "none"。

一个跨域隔离模式有三种可能的值:"none"、"logical"或"concrete"。

"logical" 和 "concrete" 类似。它们都用于浏览上下文组,其中

在某些平台上,很难提供授予对跨域隔离功能控制的API的安全访问所需的安全性。因此,只有"concrete" 可以授予该功能的访问权限。"logical" 用于不支持此功能的平台,在该平台上,跨域隔离施加的各种限制仍然适用,但该功能未授予。

创建一个新的浏览上下文组和文档

  1. group成为一个新的浏览上下文组

  2. 追加group到用户代理的浏览上下文组集

  3. browsingContextdocument成为创建一个新的浏览上下文和文档的结果,使用 null、null 和 group

  4. 追加browsingContextgroup

  5. 返回groupdocument

追加一个顶层浏览上下文browsingContext到一个浏览上下文组group

  1. 追加browsingContextgroup浏览上下文集

  2. 设置browsingContextgroupgroup

移除一个顶层浏览上下文browsingContext

  1. 断言browsingContextgroup不为 null。

  2. group成为browsingContextgroup

  3. 设置browsingContextgroup为 null。

  4. 移除browsingContextgroup浏览上下文集

  5. 如果group浏览上下文集为空,则移除group从用户代理的浏览上下文组集

追加移除是帮助定义浏览上下文组生命周期的基本操作。它们由Document浏览上下文的高级创建和销毁操作调用。

当没有Document对象的浏览上下文等于给定的浏览上下文(即所有此类Document已被销毁),并且该浏览上下文WindowProxy有资格进行垃圾回收时,该浏览上下文将不再被访问。如果它是一个顶层浏览上下文,那么此时用户代理必须移除它。

7.3.3 全活跃文档

一个Documentd被称为全活跃,当d可导航navigable活动文档,并且navigable是一个顶层可遍历navigable容器文档全活跃的。

因为它们与元素相关联,所以子可导航总是绑定到一个特定的Document,即它们的容器文档,在它们父可导航中。用户代理不得允许用户与子可导航交互,这些可导航的容器文档本身不是全活跃的。

以下示例说明了如何使Document成为其节点可导航活动文档,但不是全活跃的。这里a.html被加载到浏览器窗口中,b-1.html从加载到如所示的iframe中,b-2.htmlc.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.htmlb-1.htmlc.html给出的文档都是它们各自节点可导航活动文档。它们也都是全活跃的。

单击按钮后,从而将来自b-2.html的新Document加载到可导航 B 中,我们得到以下结果