1. 7.5 文档生命周期
      1. 7.5.1 共享文档创建基础设施
      2. 7.5.2 加载 HTML 文档
      3. 7.5.3 加载 XML 文档
      4. 7.5.4 加载文本文档
      5. 7.5.5 加载 multipart/x-mixed-replace 文档
      6. 7.5.6 加载媒体文档
      7. 7.5.7 加载用于不具有 DOM 的内联内容的文档
      8. 7.5.8 完成加载过程
      9. 7.5.9 卸载文档
      10. 7.5.10 销毁文档
      11. 7.5.11 中断文档加载
    2. 7.6 `X-Frame-Options` 头部
    3. 7.7 `Refresh` 头部
    4. 7.8 浏览器用户界面注意事项

7.5 文档生命周期

7.5.1 共享文档创建基础设施

当使用以下算法之一加载文档时,我们使用以下步骤来创建和初始化 Document 对象,给定一个类型 type内容类型 contentType导航参数 navigationParams

创建新的浏览上下文和文档时,也会创建 Document 对象;此算法永远不会创建此类初始 about:blank Document。此外,可以通过各种 API(例如document.implementation.createHTMLDocument())创建无浏览上下文Document 对象。

  1. browsingContextnavigationParams可导航对象活动浏览上下文

  2. browsingContext 设置为给定 browsingContextnavigationParams最终沙盒标志集navigationParams跨源打开程序策略navigationParamsCOOP 执行结果获取用于导航响应的浏览上下文的结果。

    这可能导致浏览上下文组切换,在这种情况下,browsingContext 将是一个新创建的浏览上下文,而不是 navigationParams可导航对象活动浏览上下文。在这种情况下,创建的 WindowDocument代理 最终将不会被使用;因为创建的 Document来源不透明的,我们将最终创建新的代理Window在此算法的后面 以配合新的 Document

  3. permissionsPolicy 为给定 navigationParams可导航对象容器navigationParams来源navigationParams响应从响应创建权限策略的结果。[PERMISSIONSPOLICY]

    从响应创建权限策略算法使用了传递的来源。如果已将document.domain 用于 navigationParams可导航对象容器文档,则其来源 不能与传递的来源同源,因为这些步骤在创建 document 之前运行,因此它本身尚不能使用document.domain。请注意,这意味着与执行同源检查相比,权限策略检查的许可性较低。

    请参见下面的实际示例。

  4. creationURLnavigationParams响应URL

  5. 如果 navigationParams请求 不为空,则将 creationURL 设置为 navigationParams请求当前 URL

  6. window 为 null。

  7. 如果 browsingContext活动文档是否为初始 about:blank 为 true,并且 browsingContext活动文档来源navigationParams来源同源,则将 window 设置为 browsingContext活动窗口

    这意味着初始 about:blank Document 和即将创建的新 Document 将共享相同的 Window 对象。

  8. 否则

    1. oacHeader 为给定 `Origin-Agent-Cluster` 和 "item" 从 navigationParams响应头部列表获取结构化字段值的结果。

    2. 如果 oacHeader 不为空且 oacHeader[0] 为布尔值 true,则令 requestsOAC 为 true;否则为 false。

    3. 如果 navigationParams保留环境非安全上下文,则将 requestsOAC 设置为 false。

    4. agent 为给定 navigationParams来源browsingContextrequestsOAC获取同源窗口代理的结果。

    5. realmExecutionContext 为给定 agent 和以下自定义项的创建新领域的结果

      • 对于全局对象,创建一个新的 Window 对象。

      • 对于全局this绑定,使用 browsingContextWindowProxy 对象。

    6. window 设置为 realmExecutionContext 的 Realm 组件的全局对象

    7. topLevelCreationURLcreationURL

    8. topLevelOriginnavigationParams来源

    9. 如果 navigable容器 不为空,则

      1. parentEnvironmentnavigable容器相关设置对象

      2. topLevelCreationURL 设置为 parentEnvironment顶级创建 URL

      3. topLevelOrigin 设置为 parentEnvironment顶级来源

    10. 设置窗口环境设置对象,其中包含 creationURLrealmExecutionContextnavigationParams保留环境topLevelCreationURLtopLevelOrigin

    这是常见情况,即我们即将创建的新 Document 会获得一个新的 Window 与之配合。

  9. loadTimingInfo 为一个新的文档加载时间信息,其导航开始时间设置为 navigationParams响应时间信息开始时间

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

    类型
    类型
    内容类型
    contentType
    来源
    navigationParams来源
    浏览上下文
    browsingContext
    策略容器
    navigationParams策略容器
    权限策略
    permissionsPolicy
    活动沙盒标志集
    navigationParams最终沙盒标志集
    打开程序策略
    navigationParams跨源打开程序策略
    加载时间信息
    loadTimingInfo

    通过跨源重定向创建
    navigationParams响应包含跨源重定向
    WebDriver BiDi 的加载期间导航 ID
    navigationParamsID
    URL
    creationURL
    当前文档就绪状态
    "loading"
    关于基础 URL
    navigationParams关于基础 URL
    允许声明式 Shadow DOM
    true
  11. window关联的 Document 设置为 document

  12. 给定 document运行 Document 的 CSP 初始化[CSP]

  13. 如果 navigationParams请求 不为空,则

    1. documentreferrer 设置为空字符串。

    2. referrernavigationParams请求referrer

    3. 如果 referrer 是一个 URL 记录,则将 documentreferrer 设置为 referrer序列化

      根据 Fetchreferrer 在这一点上将是 URL 记录 或 "no-referrer"。

  14. 如果 navigationParams获取控制器 不为空,则

    1. fullTimingInfo 为从 navigationParams获取控制器 提取完整计时信息 的结果。

    2. 如果 navigationParams响应包含跨源重定向 为 true,则令 redirectCount 为 0;否则为 navigationParams请求重定向计数

    3. 给定 fullTimingInforedirectCountnavigationTimingTypenavigationParams响应服务工作线程计时信息navigationParams响应主体信息创建 document 的导航计时条目

  15. 给定 navigationParams响应计时信息redirectCountnavigationParams导航计时类型navigationParams响应服务工作线程计时信息创建 document 的导航计时条目

  16. 如果 navigationParams响应 包含 `Refresh` 头部,则

    1. value 为该头部值的 同构解码

    2. 使用 documentvalue 运行 共享的声明式刷新步骤

    我们目前没有关于如何处理多个 `Refresh` 头部的规范。这已作为 问题 #2900 跟踪。

  17. 如果 navigationParams提交早期提示 不为空,则使用 document 调用 navigationParams提交早期提示

  18. 给定 documentnavigationParams响应 和 "pre-media",处理链接头部

  19. 返回 document

在此示例中,子文档不允许使用 PaymentRequest,即使在子文档尝试使用它时是 同源域。在子文档初始化时,只有父文档设置了 document.domain,而子文档尚未设置。

<!-- https://foo.example.com/a.html -->
<!doctype html>
<script>
document.domain = 'example.com';
</script>
<iframe src=b.html></iframe>
<!-- https://bar.example.com/b.html -->
<!doctype html>
<script>
document.domain = 'example.com'; // This happens after the document is initialized
new PaymentRequest(); // Not allowed to use
</script>

在此示例中,子文档允许使用 PaymentRequest,即使在子文档尝试使用它时不是 同源域。在子文档初始化时,任何文档都尚未设置 document.domain,因此 同源域 回退到正常的 同源 检查。

<!-- https://example.com/a.html -->
<!doctype html>
<iframe src=b.html></iframe>
<!-- The child document is now initialized, before the script below is run. -->
<script>
document.domain = 'example.com';
</script>
<!-- https://example.com/b.html -->
<!doctype html>
<script>
new PaymentRequest(); // Allowed to use
</script>

给定 Document document填充 html/head/body

  1. html 为给定 documenthtmlHTML 命名空间 创建元素 的结果。

  2. head 为给定 documentheadHTML 命名空间 创建元素 的结果。

  3. body 为给定 documentbodyHTML 命名空间 创建元素 的结果。

  4. 追加 htmldocument

  5. 追加 headhtml

  6. 追加 bodyhtml

7.5.2 加载 HTML 文档

给定 导航参数 navigationParams加载 HTML 文档

  1. document 为给定 "html"、"text/html" 和 navigationParams 创建和初始化 Document 对象 的结果。

  2. 如果 documentURLabout:blank,则给定 document 填充 html/head/body

    即使是非 初始 about:blank Document 也同步获得其元素节点的这个特殊情况,对于与已部署内容的兼容性是必要的。换句话说,改为进入“其他”分支并将空 字节序列 馈送到 HTML 解析器 以异步填充 document 是不兼容的。

  3. 否则,创建一个 HTML 解析器 并将其与 document 关联。在获取过程中,网络任务源 放置在 任务队列 上的每个 任务 必须随后用获取的字节填充解析器的 输入字节流,并导致 HTML 解析器 对输入流执行适当的处理。

    在获取过程中,网络任务源 放置在 任务队列 上的第一个 任务 必须在任务由 HTML 解析器 处理后,给定 documentnavigationParams响应 和 "media" 处理链接头部

    在任何脚本执行发生之前,用户代理必须等待 脚本可能为新创建的文档运行document 为 true。

    输入字节流 将字节转换为字符以供 标记器 使用。此过程部分依赖于在资源的实际 Content-Type 元数据 中找到的字符编码信息;计算的类型不用于此目的。

    当不再有字节可用时,用户代理必须在给定 document相关全局对象网络任务源排队一个全局任务,以使解析器处理隐含的 EOF 字符,这最终会导致触发 load 事件。

  4. 返回 document

7.5.3 加载 XML 文档

当需要内联显示 XML 文件时,在提供 导航参数 navigationParams 和字符串 type 的情况下,用户代理必须遵循 XMLXML 命名空间XML 媒体类型DOM 及其他相关规范中定义的要求,来 创建并初始化一个 Document 对象 document(给定 "xml"、typenavigationParams),并返回该 Document。它们还必须创建一个相应的 XML 解析器[XML] [XMLNS] [RFC7303] [DOM]

在撰写本文档时,XML 规范社区实际上尚未指定 XML 和 DOM 如何交互。

在获取过程中,网络任务源 放入 任务队列 的第一个 任务 必须 处理链接头,给定 documentnavigationParams响应 和 "media",在该任务由 XML 解析器 处理之后。

在确定字符编码时,必须使用实际的 HTTP 头部和其他元数据,而不是本规范中给出的算法修改或暗示的头部,这些头部必须根据上述规范中给出的规则使用。一旦字符编码确定,则必须将 文档的字符编码 设置为该字符编码。

在任何脚本执行之前,用户代理必须等待 新创建的文档可以运行脚本 对新创建的 Document 为 true。

解析完成后,用户代理必须将 documentWebDriver BiDi 的加载中导航 ID 设置为 null。

对于 HTML 文档,这会在解析完成后重置,在触发 load 事件之后。

解析过程中的错误消息(例如,XML 命名空间格式良好的错误)可以通过修改 Document 来内联报告。

7.5.4 加载文本文档

加载文本文档,给定 导航参数 navigationParams 和字符串 type

  1. document创建并初始化一个 Document 对象 的结果,给定 "html"、typenavigationParams

  2. document解析器无法更改模式标志 设置为 true。

  3. document模式 设置为 "no-quirks"。

  4. 创建一个 HTML 解析器 并将其与 document 关联。假定标记器已发出一个开始标记令牌,其标记名称为 "pre",后跟一个 U+000A 换行符 (LF) 字符,并将 HTML 解析器 的标记器切换到 纯文本状态。然后,网络任务源 在获取过程中放入 任务队列 的每个 任务 必须使用获取的字节填充解析器的 输入字节流,并导致 HTML 解析器 对输入流执行相应的处理。

    document编码 必须设置为在解析过程中用于解码文档的字符编码。

    在获取过程中,网络任务源 放入 任务队列 的第一个 任务 必须 处理链接头,给定 documentnavigationParams响应 和 "media",在该任务由 HTML 解析器 处理之后。

    在任何脚本执行之前,用户代理必须等待 新创建的文档可以运行脚本document 为 true。

    当没有更多字节可用时,用户代理必须在 网络任务源排队一个全局任务,给定 document相关全局对象,以便解析器处理隐含的 EOF 字符,这最终会导致触发 load 事件。

  5. 用户代理可以向 documenthead 元素添加内容,例如,链接到样式表、提供脚本或为文档提供 标题

    特别是,如果用户代理支持 RFC 3676 的 Format=Flowed 功能,则用户代理需要应用额外的样式以使文本正确换行并处理引用功能。这可以使用例如 CSS 扩展来执行。

  6. 返回 document

如何将纯文本文档的字节转换为实际字符的规则,以及如何实际将文本呈现给用户的规则,由资源的 计算出的 MIME 类型(即 type)的规范定义。

7.5.5 加载 multipart/x-mixed-replace 文档

加载 multipart/x-mixed-replace 文档,给定 导航参数 navigationParams源快照参数 sourceSnapshotParams initiatorOrigin

  1. 使用多部分类型的规则解析 navigationParams响应主体[RFC2046]

  2. firstPartNavigationParamsnavigationParams 的副本。

  3. firstPartNavigationParams响应 设置为一个新的 响应,表示 navigationParams响应主体 的多部分流的第一部分。

  4. document加载文档 的结果,给定 firstPartNavigationParamssourceSnapshotParamsinitiatorOrigin

    对于从 navigationParams响应 获得的每个附加主体部分,用户代理必须 导航 document节点可导航navigationParams请求URL,使用 document,其中 响应 设置为 navigationParams响应,并且 历史处理 设置为 "替换"。

  5. 返回 document

为了算法处理这些主体部分,就好像它们是完整的独立资源一样,用户代理必须在每次到达主体部分后面的边界时,都假定没有更多字节可用于这些资源。

因此,对于加载的每个主体部分,都会触发 load 事件(以及就此而言的 unload 事件)。

7.5.6 加载媒体文档

加载媒体文档,给定 navigationParams 和字符串 type

  1. document创建并初始化一个 Document 对象 的结果,给定 "html"、typenavigationParams

  2. document模式 设置为 "no-quirks"。

  3. 使用 html/head/body 填充,给定 document

  4. 将媒体的元素 主机元素(如下所述)附加到 body 元素。

  5. 将元素 主机元素 的适当属性(如下所述)设置为图像、视频或音频资源的地址。

  6. 用户代理可以向 documenthead 元素或 主机元素 的属性添加内容,例如,链接到样式表、提供脚本、为文档提供 标题 或使媒体 自动播放

  7. 处理链接头,给定 documentnavigationParams响应 和 "media"。

  8. 假定用户代理已 停止解析 document

  9. 返回 document

要为媒体创建的元素 主机元素 是下表中第一列描述媒体的行中第二列给出的元素。要设置的适当属性是同一行中第三列给出的属性。

媒体类型媒体的元素适当的属性
图像 img src
视频 video src
音频 audio src

在任何脚本执行之前,用户代理必须等待 新创建的文档可以运行脚本Document 为 true。

7.5.7 加载没有 DOM 的内联内容的文档

当用户代理要创建文档以内联显示用户代理页面或 PDF 查看器时,在提供 可导航 navigable导航 ID navigationIdNavigationTimingType navTimingType 的情况下,用户代理应

  1. origin 为一个新的 不透明源

  2. coop 为一个新的 打开程序策略

  3. coopEnforcementResult 为一个新的 打开程序策略执行结果,其中包含

    url
    responseURL
    来源
    来源
    打开程序策略
    coop
  4. navigationParams 为一个新的 导航参数,其中包含

    id
    navigationId
    navigable
    navigable
    request
    null
    response
    一个新的 响应
    来源
    来源
    获取控制器
    null
    提交早期提示
    null
    COOP 执行结果
    coopEnforcementResult
    保留的环境
    null
    策略容器
    一个新的 策略容器
    最终沙箱标志集
    一个空集
    打开程序策略
    coop
    导航计时类型
    navTimingType
    关于基础 URL
    null
  5. document创建并初始化一个 Document 对象 的结果,给定 "html"、"text/html" 和 navigationParams

  6. 要么将 document 与自定义渲染相关联(不使用正常的 Document 渲染规则进行渲染),要么修改 document,直到它表示用户代理想要渲染的内容。

  7. 返回 document

因为我们确保生成的Document不透明,并且生成的Document无法运行访问DOM的脚本,因此Web开发者代码无法观察到此Document的存在及其属性。这意味着大多数上述值(例如,text/html类型)并不重要。类似地,navigationParams中的大多数项都没有任何可观察到的效果,除了防止Document创建算法出现混淆,因此将其设置为默认值。

页面设置完成后,用户代理必须表现得好像它已经停止解析

7.5.8 完成加载过程

一个Document有一个完全加载时间(一个时间或null),最初为null。

如果Document完全加载时间不为null,则认为该Document完全加载

完全完成加载一个Document document

  1. 断言document浏览上下文不为null。

  2. document完全加载时间设置为当前时间。

  3. containerdocument节点可导航容器

    如果documentframeiframe中最初的about:blank Document,则此值为null,因为在调用此算法的浏览上下文创建时,容器关系尚未建立。(这发生在创建新的子可导航的后续步骤中)。

    其结果是以下步骤什么也不做,即我们不会在容器元素上为这些情况触发异步的load事件。相反,当处理iframe属性时,在特殊的初始插入情况下会触发同步的load事件。

  4. 如果containeriframe元素,则在给定containerDOM操作任务源将一个元素任务排队,以运行给定containeriframe加载事件步骤

  5. 否则,如果container不为null,则在给定containerDOM操作任务源将一个元素任务排队,以触发名为load的事件,目标为container

7.5.9 卸载文档

一个Document具有可挽救状态,最初必须为true,以及一个页面显示标志,最初必须为false。页面显示标志用于确保脚本以一致的方式接收pageshowpagehide事件(例如,它们永远不会在没有中间的pageshow的情况下连续接收两个pagehide事件,反之亦然)。

一个Document有一个DOMHighResTimeStamp挂起时间,最初为0。

一个Document有一个列表挂起的计时器句柄,最初为空。

事件循环有一个终止嵌套级别计数器,最初必须为0。

Document对象有一个卸载计数器,用于在以下算法运行时忽略某些操作。最初,计数器必须设置为零。

卸载一个Document oldDocument,给定一个可选的Document newDocument

  1. 断言:这是作为oldDocument相关代理事件循环上排队的任务的一部分运行的。

  2. unloadTimingInfo为一个新的文档卸载时间信息

  3. 如果未给出newDocument,则将unloadTimingInfo设置为null。

    在这种情况下,没有新的文档需要知道oldDocument卸载花费了多长时间。

  4. 否则,如果newDocument事件循环不是oldDocument事件循环,则用户代理可能正在并行卸载oldDocument。在这种情况下,用户代理应该将unloadTimingInfo设置为null。

    在这种情况下,newDocument的加载不受卸载oldDocument所需时间的影響,因此传达该时间信息毫无意义。

  5. intendToKeepInBfcache为true,如果用户代理打算在会话历史记录条目中保持oldDocument处于活动状态,以便稍后可用于历史记录遍历

    如果oldDocument不是可挽救的,或者如果oldDocument的任何后代用户代理都不打算以相同的方式保持活动状态(包括由于它们缺乏可挽救性),则此值必须为false。

  6. eventLoopoldDocument相关代理事件循环

  7. eventLoop终止嵌套级别增加1。

  8. oldDocument卸载计数器增加1。

  9. 如果intendToKeepInBfcache为false,则将oldDocument可挽救状态设置为false。

  10. 如果oldDocument页面显示为true

    1. oldDocument页面显示设置为false。

    2. 触发一个页面转换事件,名为pagehide,目标为oldDocument相关全局对象,并附带oldDocument可挽救状态。

    3. 更新oldDocument的可视状态为“hidden”。

  11. 如果unloadTimingInfo不为null,则将unloadTimingInfo卸载事件开始时间设置为给定newDocument相关全局对象当前高分辨率时间粗化,给定oldDocument相关设置对象跨源隔离功能

  12. 如果oldDocument可挽救状态为false,则触发名为unload的事件,目标为oldDocument相关全局对象,并设置旧版目标覆盖标志

  13. 如果unloadTimingInfo不为null,则将unloadTimingInfo卸载事件结束时间设置为给定newDocument相关全局对象当前高分辨率时间粗化,给定oldDocument相关设置对象跨源隔离功能

  14. eventLoop终止嵌套级别减少1。

  15. oldDocument挂起时间设置为给定document相关全局对象当前高分辨率时间

  16. oldDocument挂起的计时器句柄设置为活动计时器映射获取键的结果。

  17. oldDocument已被用户滚动设置为false。

  18. 运行oldDocument的任何由本规范和其他适用规范定义的卸载文档清理步骤

  19. 如果oldDocument节点可导航顶级可遍历,则为顶级可遍历及其后代构建未恢复的原因,给定oldDocument节点可导航

  20. 如果oldDocument可挽救状态为false,则销毁oldDocument

  21. oldDocument卸载计数器减少1。

  22. 如果给定newDocumentnewDocument通过跨源重定向创建为false,并且newDocumentoldDocument相同,则将newDocument前一个文档卸载时间设置为unloadTimingInfo

卸载文档及其后代,给定一个Document document,一个可选的Document或null newDocument(默认为null),一个可选的步骤集afterAllUnloads,以及一个可选的步骤集firePageSwapSteps

  1. 断言:这是在document节点可导航可遍历可导航会话历史记录遍历队列中运行的。

  2. childNavigablesdocument子可导航

  3. numberUnloaded为0。

  4. 对于每个 childNavigablechildNavigable按什么顺序?,在给定 childNavigable活动窗口导航和遍历任务源排队一个全局任务,以执行以下步骤

    1. incrementUnloaded 为一个增加 numberUnloaded 的算法步骤。

    2. 卸载文档及其后代,给定 childNavigable活动文档、null 和 incrementUnloaded

  5. 等待直到 numberUnloaded 等于 childNavigable大小

  6. 在给定 document相关全局对象导航和遍历任务源排队一个全局任务,以执行以下步骤

    1. 如果给定了 firePageSwapSteps,则运行 firePageSwapSteps

    2. 卸载 document,如果 newDocument 不为 null,则将其传递。

    3. 如果给定了 afterAllUnloads,则运行它。

本规范定义了以下 卸载文档清理步骤。其他规范可以定义更多。给定一个 Document document

  1. windowdocument相关全局对象

  2. 对于每个其 相关全局对象windowWebSocket 对象 webSocket使消失 webSocket

    如果这影响了任何 WebSocket 对象,则给定 document 和 "websocket" 使文档无法恢复

  3. 对于每个其 相关全局对象windowWebTransport 对象 transport,运行给定 transport上下文清理步骤

  4. 如果 document可恢复 状态为 false,则

    1. 对于每个其 相关全局对象 等于 windowEventSource 对象 eventSource强制关闭 eventSource

    2. 清除 window活动计时器映射

如果规范作者发送一个拉取请求,直接从这里添加调用到他们的规范中,而不是使用 卸载文档清理步骤 钩子,以确保定义良好的跨规范调用顺序,将会更好。在撰写本文时,已知以下规范具有 卸载文档清理步骤,这些步骤将以未指定的顺序运行:全屏 APIWeb NFCWebDriver BiDi计算压力文件 API媒体捕获和流画中画屏幕方向服务工作者WebLocks APIWebAudio APIWebRTC[FULLSCREEN] [WEBNFC] [WEBDRIVERBIDI] [COMPUTEPRESSURE] [FILEAPI] [MEDIASTREAM] [PICTUREINPICTURE] [SCREENORIENTATION] [SW] [WEBLOCKS] [WEBAUDIO] [WEBRTC]

问题 #8906 跟踪使这些步骤的顺序明确的工作。

7.5.10 销毁文档

销毁 一个 Document document

  1. 断言:这是在 document相关代理事件循环 上排队的 任务 的一部分运行。

  2. 中止 document

  3. document可恢复 状态设置为 false。

  4. ports 为其 相关全局对象关联的 DocumentdocumentMessagePort 列表。

  5. 对于 ports 中的每个 port分离 port

  6. 运行本规范和 其他适用规范 定义的 document 的任何 卸载文档清理步骤

  7. 从任何 任务队列 中删除任何其 文档document任务(无需运行这些任务)。

  8. document浏览上下文 设置为 null。

  9. document节点可导航活动会话历史条目文档状态文档 设置为 null。

  10. 移除 document 来自每个其集合 包含 documentWorkerGlobalScope 对象的 所有者集

  11. 对于每个 document工作线程全局范围 中的 workletGlobalScope终止 workletGlobalScope

即使在销毁后,Document 对象本身也可能仍然可以通过脚本访问,在我们要 销毁子可导航 的情况下。

销毁文档及其后代,给定一个 Document document 和一个可选的步骤集 afterAllDestruction,执行以下步骤 并行

  1. 如果 document 不是 完全活动,则

    1. 使文档无法恢复,给定 document 和 "已屏蔽"。

    2. 如果 document节点可导航 是一个 顶级可遍历为顶级可遍历及其后代构建未恢复的原因,给定 document节点可导航

  2. childNavigablesdocument子可导航

  3. numberDestroyed 为 0。

  4. 对于每个 childNavigablechildNavigable按什么顺序?,在给定 childNavigable活动窗口导航和遍历任务源排队一个全局任务,以执行以下步骤

    1. incrementDestroyed 为一个增加 numberDestroyed 的算法步骤。

    2. 销毁文档及其后代,给定 childNavigable活动文档incrementDestroyed

  5. 等待直到 numberDestroyed 等于 childNavigable大小

  6. 在给定 document相关全局对象导航和遍历任务源排队一个全局任务,以执行以下步骤

    1. 销毁 document

    2. 如果给定了 afterAllDestruction,则运行它。

7.5.11 中止文档加载

中止 一个 Document document

  1. 断言:这是在 document相关代理事件循环 上排队的 任务 的一部分运行。

  2. 取消 document 上下文中 获取 算法的任何实例,丢弃为它们排队的任何 任务,并丢弃从网络为它们接收的任何其他数据。如果这导致了 获取 算法的任何实例被取消或任何排队任务或任何网络数据被丢弃,则给定 document 和 "获取" 使文档无法恢复

  3. 如果 document用于 WebDriver BiDi 的加载期间导航 ID 不为 null,则

    1. 使用 document浏览上下文 和一个新的 WebDriver BiDi 导航已中止,以及一个新的 WebDriver BiDi 导航状态,其 iddocument用于 WebDriver BiDi 的加载期间导航 ID状态 为 "已取消",以及 urldocumentURL

    2. document用于 WebDriver BiDi 的加载期间导航 ID 设置为 null。

  4. 如果 document 有一个 活动解析器,则

    1. document活动解析器已中止 设置为 true。

    2. 中止该解析器.

    3. document可恢复 设置为 false。

    4. 使文档无法恢复,给定 document 和 "解析器已中止"。

中止文档及其后代,给定一个 Document document

  1. 断言:此操作作为 document相关代理事件循环 上排队的 任务 的一部分运行。

  2. descendantNavigablesdocument后代可导航对象

  3. 对于 descendantNavigables 中的每个 descendantNavigable 以什么顺序?,在 descendantNavigable活动窗口 上的 导航和遍历任务源排队一个全局任务,以执行以下步骤

    1. 中止 descendantNavigable活动文档

    2. 如果 descendantNavigable活动文档可挽救 为 false,则将 document可挽救 设置为 false。

  4. 中止 document

停止加载 可导航对象 navigable

  1. documentnavigable活动文档

  2. 如果 document卸载计数器 为 0,并且 navigable正在进行的导航导航 ID,则 navigable 的正在进行的导航 设置为 null。

    这将导致中止 navigable 的任何正在进行的导航,因为在导航期间的某些点,对 正在进行的导航 的更改将导致进一步的工作被放弃。

  3. 中止文档及其后代,给定 document

通过其 用户界面,用户代理还允许停止遍历,即 正在进行的导航 为“traversal”的情况。上述算法没有考虑这种情况。(另一方面,用户代理不允许 window.stop() 停止遍历,因此上述算法对于该调用者是正确的。)请参阅 问题 #6905

7.6 `X-Frame-Options` 标头

Headers/X-Frame-Options

所有当前引擎都支持。

Firefox4+Safari4+Chrome4+
Opera10.5+Edge79+
Edge(旧版)12+Internet Explorer8+
Firefox AndroidSafari iOSChrome AndroidWebView AndroidSamsung InternetOpera Android

`X-Frame-Options` HTTP 响应标头是控制 Document 是否以及如何加载到 子可导航对象 中的传统方法。它已被 frame-ancestors CSP 指令弃用,该指令提供了对相同情况的更细粒度的控制。它最初在 HTTP 标头字段 X-Frame-Options 中定义,但此处的定义取代了该文档。 [CSP] [RFC7034]

特别是,HTTP 标头字段 X-Frame-Options 指定了标头的 `ALLOW-FROM` 变体,但不应实现该变体。

如果在同一个 响应 中同时使用了 CSP frame-ancestors 指令和 `X-Frame-Options` 标头,则忽略 `X-Frame-Options`。

对于 Web 开发人员和一致性检查器,其值 ABNF

X-Frame-Options = "DENY" / "SAMEORIGIN"

下表说明了对标头的各种值的处理,包括不符合标准的值

`X-Frame-Options`有效结果
`DENY`不允许嵌入
`SAMEORIGIN`允许同源嵌入
`INVALID`允许嵌入
`ALLOWALL`允许嵌入
`ALLOW-FROM=https://example.com/`允许嵌入(来自任何地方)

下表说明了如何处理涉及多个值的各种不符合标准的情况

`X-Frame-Options`结果
`SAMEORIGIN, SAMEORIGIN`允许同源嵌入
`SAMEORIGIN, DENY`不允许嵌入
`SAMEORIGIN,`不允许嵌入
`SAMEORIGIN, ALLOWALL`不允许嵌入
`SAMEORIGIN, INVALID`不允许嵌入
`ALLOWALL, INVALID`不允许嵌入
`ALLOWALL,`不允许嵌入
`INVALID, INVALID`允许嵌入

无论值是通过单个标头(其值为逗号分隔)还是通过多个标头传递,都会获得相同的结果。

7.7 `Refresh` 标头

`Refresh` HTTP 响应标头等效于 meta 元素,该元素在 刷新状态 中具有 http-equiv 属性。它采用 相同的值 并且在很大程度上工作方式相同。

浏览器用户代理应提供 导航重新加载停止加载顶级可遍历对象集 中的任何 顶级可遍历对象 的能力。

例如,通过位置栏和重新加载/停止按钮 UI。

浏览器用户代理应提供 按增量遍历顶级可遍历对象集 中的任何 顶级可遍历对象 的能力。

例如,通过后退和前进按钮,可能包括长按功能以更改增量。

建议此类用户代理允许按大于 1 的增量进行遍历,以避免页面通过填充会话历史记录中的虚假条目来“困住”用户。(例如,通过重复调用 history.pushState()片段导航。)

某些用户代理具有启发式方法,用于将单个“后退”或“前进”按钮按下转换为更大的增量,特别是为了克服此类滥用。我们正在考虑在 问题 #7832 中指定这些启发式方法。

浏览器用户代理应为用户提供 创建新的顶级可遍历对象的能力,给定用户提供的或用户代理确定的初始 URL

例如,通过“新建标签页”或“新建窗口”按钮。

浏览器用户代理应为用户提供任意 关闭顶级可遍历对象集 中的任何 顶级可遍历对象 的能力。

例如,通过单击“关闭标签页”按钮。


浏览器用户代理可以提供方法,让用户显式地导致任何 可导航对象(不仅仅是 顶级可遍历对象导航重新加载停止加载

例如,通过上下文菜单。

浏览器用户代理可以提供功能,让用户 销毁顶级可遍历对象

例如,通过强制关闭包含一个或多个此类 顶级可遍历对象 的窗口。


当用户请求 重新加载 可导航对象 时,其 活动会话历史记录条目文档状态资源POST 资源,用户代理应先提示用户确认操作,否则可能会重复事务(例如,购买或数据库修改)。

当用户请求 重新加载 可导航对象 时,用户代理可以提供一种机制,用于在重新加载时忽略任何缓存。


由上述机制发起的对 导航 的所有调用都必须将 userInvolvement 参数设置为“浏览器 UI”。

由上述机制发起的对 重新加载 的所有调用都必须将 userInvolvement 参数设置为“浏览器 UI”。

由上述机制发起的对 按增量遍历历史记录 的所有调用都不得为 sourceDocument 参数传递值。


以上建议以及本规范中的数据结构,并非意在限制用户代理向用户展示会话历史的方式。

例如,尽管顶级可遍历对象会话历史条目被存储和维护为列表,并且建议用户代理提供一个通过增量遍历该列表的接口,但新颖的用户代理也可以额外或替代地提供树状视图,其中每个页面都有多个可供用户选择的“前进”页面。

类似地,尽管所有后代可导航对象的会话历史都存储在其可遍历可导航对象中,但用户代理可以向用户提供更细致的每个可导航对象的会话历史视图。


浏览器用户代理可以使用顶级浏览上下文is popup布尔值用于以下目的

在这两种情况下,用户代理还可以额外纳入用户偏好,或提供是否采用弹出窗口方式的选择。

为这些弹出窗口提供最小用户界面的用户代理,建议不要隐藏浏览器的地址栏。