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 Jake 图
        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和一个可选的navigable openerNavigableForWebDriver,来创建一个新的顶级可遍历对象

  1. document为null。

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

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

  4. documentState为一个新的文档状态,其中包含:

    document
    document
    发起者来源
    如果opener为null,则为null;否则为document来源
    来源
    document来源
    navigable目标名称
    targetName
    about基准URL
    documentabout基准URL
  5. traversable为一个新的可遍历navigable

  6. 给定documentState初始化navigable traversable

  7. initialHistoryEntrytraversable活动会话历史条目

  8. initialHistoryEntry步数设置为0。

  9. initialHistoryEntry追加traversable会话历史条目中。

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

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

  12. 使用traversableopenerNavigableForWebDriver调用WebDriver BiDi navigable创建

  13. 返回traversable

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

  1. traversable为给定null和空字符串创建新的顶级可遍历对象的结果。

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

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

  3. 返回traversable

7.3.1.3 子navigable

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

每个navigable容器都有一个内容navigable,它要么是一个navigable,要么为null。它最初为null。

一个navigable navigable容器是其内容navigablenavigablenavigable容器,如果没有这样的元素,则为null。

一个navigable navigable容器文档是运行以下步骤的结果:

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

  2. 返回navigable容器节点文档

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

一个Document document容器文档是运行以下步骤的结果:

  1. 如果document节点navigable为null,则返回null。

  2. 返回document节点navigable容器文档

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

所有子navigable都是其容器内容navigable

一个navigable容器 container内容文档是运行以下步骤的结果:

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

  2. documentcontainer内容navigable活动文档

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

  4. 返回document

一个navigable容器 container内容窗口是运行以下步骤的结果:

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

  2. 返回container内容navigable活动WindowProxy的对象。


给定一个元素element,来创建一个新的子navigable

  1. parentNavigableelement节点navigable

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

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

  4. targetName为null。

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

  6. documentState为一个新的文档状态,其中包含:

    document
    document
    发起者来源
    document来源
    来源
    document来源
    navigable目标名称
    targetName
    about基准URL
    documentabout基准URL
  7. navigable为一个新的navigable

  8. 给定documentStateparentNavigable初始化navigable navigable

  9. element内容navigable设置为navigable

  10. historyEntrynavigable活动会话历史条目

  11. traversableparentNavigable可遍历navigable

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

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

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

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

    4. historyEntry步数设置为targetStepSHE步数

    5. nestedHistory为一个新的嵌套历史,其IDnavigableID,并且条目列表为« historyEntry »。

    6. nestedHistory追加parentDocState嵌套历史中。

    7. 给定traversable更新navigable创建/销毁

  13. 使用traversable调用WebDriver BiDi navigable创建

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 和文档之间转换。第一个标签为top,表示顶级可遍历对象,其余的是子可导航对象。文档由每个单元格的背景颜色给出,新的背景颜色表示该可导航对象中的新文档。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开始。尽管非完全激活的Document确实具有祖先和后代可导航对象,但它们通常表现得好像没有一样(例如,在window.parent获取器中)。

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. navigableContainersdocument 的所有是可导航容器包含阴影的后代列表,按照包含阴影的树顺序

  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. navigableContainersdocument 的所有是可导航容器后代列表,按照树顺序

  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 父级可遍历可导航对象(它可以使用 辅助浏览上下文,这取决于各种用户偏好和用户代理策略),“无”表示不会发生任何事情,“可能新建”表示如果 allow-popups 关键字也指定在 sandbox 属性上(或者用户覆盖了沙盒),则与“新建”相同,否则与“无”相同。

关键字普通效果在具有...的 iframe 中的效果
sandbox="" sandbox="allow-top-navigation"
未指定,用于链接和表单提交当前当前当前
空字符串当前当前当前
_blank 新建可能新建可能新建
_self 当前当前当前
如果不存在父级,则为_parent当前当前当前
如果父级也是顶级,则为_parent父级/顶级父级/顶级
如果存在父级且它不是顶级,则为_parent父级
如果顶级是当前,则为_top当前当前当前
如果顶级不是当前,则为_top顶层顶层
不存在的名称新建可能新建可能新建
存在且是后代的名称指定的子代指定的子代指定的子代
存在且是当前的名称当前当前当前
存在且是顶级祖先的名称指定的祖先指定的祖先/顶级
存在且不是顶级祖先的名称指定的祖先
存在且具有相同顶级的其他名称指定
存在且具有不同顶级的名称,如果熟悉并且允许一个沙盒导航器指定指定指定
存在且具有不同顶级的名称,如果熟悉但不是允许一个沙盒导航器指定
存在且具有不同顶级的名称,不熟悉新建可能新建可能新建

沙盒浏览上下文的大多数限制由其他算法应用,例如 导航 算法,而不是下面给出的 选择可导航对象的规则


选择可导航对象的规则,给定一个字符串 name、一个 可导航对象 currentNavigable 和一个布尔值 noopener 如下

  1. chosen 为 null。

  2. windowType 为“现有或无”。

  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 设置为“新建且不受限制”。

    2. currentDocumentcurrentNavigable活动文档

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

      1. noopener 设置为 true。

      2. name 设置为“_blank”。

      3. windowType 设置为“新建且无打开程序”。

      在存在 打开程序策略 的情况下,与顶级浏览上下文的活动文档跨源的嵌套文档始终将 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,该元素已被 从文档中移除,没有关联的浏览上下文,因为该浏览上下文已 被设为 null

通常,只要 Document 对象具有非 null 的 浏览上下文Window 对象与 Document 对象之间存在 1 对 1 的映射。有一个例外。一个 Window 可以重复用于在同一个 浏览上下文 中呈现第二个 Document,因此映射为 1 对 2。当 浏览上下文初始 about:blank 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. 如果 embedder 为 null,则令 topLevelCreationURLabout:blank;否则为 embedder相关设置对象顶级创建 URL

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

  13. 设置窗口环境设置对象,使用 about:blank领域执行上下文、null、topLevelCreationURLtopLevelOrigin

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

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

    类型
    "html"
    内容类型
    "text/html"
    模式
    "quirks"
    来源
    来源
    浏览上下文
    browsingContext
    权限策略

    权限策略
    活动沙箱标志集
    沙箱标志
    加载计时信息
    加载计时信息
    是否初始的about:blank
    true
    about基准URL
    创建者基本 URL
    允许声明式 Shadow DOM
    true
  16. 如果 creator 不为 null,则

    1. documentreferrer设置为creator序列化后的URL

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

    3. 如果creatorcreator相关设置对象顶级源同源,则将documentopener 策略设置为creator浏览上下文顶级浏览上下文活动文档opener 策略

  17. 断言documentURLdocument相关设置对象创建 URL均为about: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. browsingContextopener 浏览上下文设置为opener

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

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

  10. 返回browsingContextdocument

确定源,给定一个URLurl、一个沙箱标志集sandboxFlags和一个或 nullsourceOrigin

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

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

  3. 如果urlabout:srcdoc,则

    1. 断言sourceOrigin不为 null。

    2. 返回sourceOrigin

  4. 如果url匹配about:blanksourceOrigin不为 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是一个辅助浏览上下文ABopener 浏览上下文熟悉,则返回 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. browsingContext 追加group

  5. 返回 groupdocument

要将顶级浏览上下文 browsingContext 追加浏览上下文组 group

  1. browsingContext 追加group浏览上下文集

  2. browsingContext设置为 group

移除顶级浏览上下文 browsingContext

  1. 断言browsingContext不为 null。

  2. groupbrowsingContext

  3. browsingContext设置为 null。

  4. group浏览上下文集移除 browsingContext

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

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

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

7.3.3 完全活动文档

d可导航对象 navigable活动文档,并且 navigable顶级可遍历对象navigable容器文档完全活动时,Document d 被认为是完全活动

由于它们与元素相关联,因此子可导航对象始终与其父可导航对象中的特定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 中后,我们将获得以下结果