围栏框架

社区组报告草案,

此版本:
https://wicg.github.io/fenced-frame/
编辑:
Dominic Farolino (Google)
(Google)
参与:
GitHub WICG/fenced-frame (新建议题, 开放议题)
提交:
GitHub spec.bs 提交
测试套件:
https://wpt.fyi/results/fenced-frame/

摘要

围栏框架在嵌入页面与跨站嵌入文档之间强制建立边界,使得对两个站点可见的用户数据 不能被合并在一起。

本文档状态

本规范由 Web Platform Incubator Community Group 发布。 它不是 W3C 标准,也不在 W3C 标准轨道上。 请注意,根据 W3C 社区贡献者许可协议 (CLA) 存在有限的退出权,并且适用其他条件。 了解更多关于 W3C 社区和业务组 的信息。

1. 引言

本节是非规范性的。

在一个其 cookie 和存储按顶层框架站点进行分区的 Web 中,有些场合——例如由 [Protected-Audience] API 提供的基于兴趣组的广告,或 转化 提升 测量) ——会需要在同一页面中显示来自不同分区的内容。只有当包含来自不同 分区数据的 Document 彼此隔离、虽然在同一页面上以视觉方式重新组合但仍无法通信时,这才能以保护隐私的方式完成。 iframe 元素并不适合这种场景,因为它们与其嵌入者之间提供了许多有意设计的 通信通道。本规范引入了 fencedframe 元素,这是一个用于在页面上嵌入 Document 的新元素,它明确阻止该 Document 与其嵌入者之间的通信。

本规范定义了这个新元素、它与 Web 平台其他部分的集成,包括 § 3 HTML 集成§ 4 与其他规范的交互,以及其支持性的 基元 例如 FencedFrameConfig, 它是 fencedframe 的主要输入,用来取代普通 URL 和 "src" 属性。鉴于本规范定义了一个新元素及其与平台其余部分的 集成,因此应主要将其理解为对 [HTML] 的猴子补丁,其最终目标是在具有足够的 跨浏览器支持后合并到该标准中。

2. fencedframe 元素

类别:
流内容.
短语内容.
嵌入内容.
交互内容.
可感知内容.
可使用此元素的上下文:
在预期使用嵌入内容的位置。
内容模型:
无内容.
内容属性:
全局属性
width — 水平尺寸
height — 垂直尺寸
allow — 要应用到 fencedframe 内容的 权限策略
无障碍注意事项:

TODO

DOM 接口:
[Exposed=Window]
interface HTMLFencedFrameElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions] attribute FencedFrameConfig? config;
  [CEReactions] attribute DOMString width;
  [CEReactions] attribute DOMString height;
  [SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
  [CEReactions] attribute DOMString allow;
};

fencedframe 元素表示围栏可导航体

fencedframe 元素的后代不表示任何内容。

每个 fencedframe 都有一个 config,它要么是 FencedFrameConfig, 要么是 null。其初始值为 null。

每个 fencedframe 都有一个 fencedframe 沙盒化标志集,它是一个 沙盒化标志集。某一特定时刻 fencedframe 沙盒化标志集中设置了哪些标志 由 fencedframe 元素的 sandbox 属性决定。

修改确定创建沙盒化标志 算法。将并集中的第二步重写为以下 2 个步骤:
当一个 fencedframe 元素 element插入到一个 document 中,且该 document 的 浏览上下文为非 null 时,运行以下步骤:
  1. nested traversable 为为 element 创建新的 嵌套可遍历体的结果。

  2. nested traversable加载模式设置为 "fencedframe"。

  3. 如果 element 具有 sandbox 属性,则以该属性的值和 elementfencedframe 沙盒化标志 集为参数解析沙盒化指令

不必像通常进行子 可导航体创建顶级 可遍历体创建时那样调用 URL 和历史记录更新步骤,但我们仍然需要一种机制来初始化新可导航体中的 History.length。 这是 HTML Standard 中的一个现有问题:https://github.com/whatwg/html/issues/9030

当一个 fencedframe 元素被从 document 中移除时,用户代理必须运行 以下步骤:
  1. TODO: 销毁嵌套可遍历体。

  2. 并行地,给定该 Document节点可导航体顶级可遍历体重新计算 所有围栏框架后代的不受信任网络状态

config IDL 属性的 getter 步骤 是返回 thisconfig

config IDL 属性的 setter 步骤如下:
  1. 如果 this连接

    1. 断言this围栏可导航体为 null。

      注: 这是成立的,因为当该元素从 DOM 中移除时,其移除步骤 会立即销毁该围栏可导航体

  2. instancethis相关全局对象浏览上下文围栏框架配置实例

  3. 如果 instance 不是 null,且其 不受信任网络 状态 不是已启用,则返回。

  4. navigation url or urn 为给定 FencedFrameConfigurl, 如果 给定 FencedFrameConfigurl 不是 null;否则为给定 FencedFrameConfigurn

  5. 如果 navigation url or urn 是 failure,则返回。

  6. shared storage context 为给定 FencedFrameConfigsharedStorageContext

  7. 使用 element节点 document,将 element围栏可导航体导航navigation url or urn,其中 historyHandling 设为 "replace",referrerPolicy 设为 "no-referrer",并使用 shared storage context

    注: 有关普通 导航流程中针对 fencedframe 的特定 更改,请参见 § 3.8.5 实际导航更改

测试

allow 属性在指定时,决定当 fencedframe围栏可导航体中某个 Document权限策略被初始化时,将使用的 容器策略。其值必须是一个序列化权限策略[PERMISSIONS-POLICY]

sandbox 属性在指定时,会对由 fencedframe 承载的任何内容启用一组 额外限制。 其值必须是一个由唯一空格分隔 token 组成的无序集合, 这些 token ASCII 大小写不敏感。允许的值为:

IDL 属性 allowsandbox 必须反映对应的同名内容属性。

sandboxDOMTokenList 所支持的 token,是在 sandbox 属性中定义并受用户代理支持的允许值。

以下属性更改步骤,给定 elementlocalNameoldValuevaluenamespace,用于所有 fencedframe 元素:
  1. 断言namespaceHTML 命名空间

  2. 如果 localNamesandbox, 则:

    1. 如果 value 是 null,则清空 elementfencedframe 沙盒化 标志集

    2. 否则,给定 valueelementfencedframe 沙盒化 标志集,运行解析沙盒化指令

2.1. 尺寸属性

本节详述对 [HTML]尺寸 属性章节所作的猴子补丁。该章节将被更新,以便在其自身的 widthheight 尺寸属性具有与 [HTML] 中定义的一般 widthheight 尺寸属性相同作者要求的元素列表中,包含 fencedframe

此外,IDL 属性 widthheight 必须反映各自的同名内容属性。

2.2. 围栏框架配置映射

每个 可遍历可导航体都有一个 围栏 框架配置 映射,它是一个围栏框架配置映射

注: 此映射会在导航期间被查阅,并由我们 口语上称为 URN-generating APIsconfig-generating APIs 的 API 写入,这些 API 生成 urn uuid围栏框架配置,以用于导航 fencedframeiframe 元素。 例如参见 [Protected-Audience] API 和 [Shared-Storage] 规范。

一个 围栏框架 配置映射具有三个子映射:

待定配置映射

一个映射,其urn uuid,且 其围栏框架配置

已完成配置 映射

一个映射,其urn uuid,且 其围栏框架配置

嵌套配置映射

一个映射,其urn uuid,且 其围栏框架配置

注: 待定配置的目的是让 config-generating APIs 能以不产生计时旁路的方式异步解析配置,也就是说,在任何其耗时 取决于跨站点数据的计算之前,待定配置会以恒定时间量返回给 Web 平台。 由于这项隐私保护依赖于 Web 平台无法辨别待定配置何时完成,因此重要的是所有 可见性以及透明字段的值,在从待定 配置到已完成配置的过程中都不发生变化,因为它们可以通过 FencedFrameConfig 的 getter 被检查。因此,一个被创建并暴露给 Web 平台的 FencedFrameConfig 实际上是不可变的,即使该 configurn 所表示的 围栏框架配置在技术上是“待定”的,并且会在稍后完全 解析完成。

每个围栏框架配置映射都有一个 最大配置 数量,它是实现定义的。最大配置数量可以是 非负数或无穷大。

注: 指定 最大配置数量的行为很重要, 因为其语义可能以隐私敏感的方式与 config-generating APIs 交互。

在高层次上,为了在 围栏框架配置映射中存储一个 围栏框架配置, 配置的创建者必须先存储一个 待定配置,然后将该待定配置变为已完成配置。这些过程如下:

要在围栏框架配置映射 mapping存储待定配置,给定一个 围栏框架 配置 config,运行以下步骤:
  1. pendingMappingmapping待定配置映射

  2. 如果 pendingMapping大小 + mapping已完成配置 映射大小mapping最大配置 数量,返回 failure。

  3. urn 为一个随机生成的 urn uuid

  4. 断言urn存在pendingMapping 中。

  5. 设置 pendingMapping[urn] 为 config

  6. 返回 urn

要在围栏框架配置映射 mapping完成待定配置,给定一个 urn uuid urn围栏框架配置 config,运行以下步骤:
  1. pendingMappingmapping待定配置映射

  2. finalizedMappingmapping已完成配置 映射

  3. 如果 pendingMapping[urn] 不存在,返回 failure。

  4. 移除 pendingMapping[urn]。

  5. 设置 finalizedMapping[urn] 为 config

要在围栏框架配置映射 mapping存储嵌套配置,给定一个 嵌套配置 nestedConfigs,运行以下步骤:
  1. nestedMappingmapping嵌套配置映射

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

  3. 对于 nestedConfigs 中的每个 urnconfig 执行

    1. 设置 nestedMapping[urn] 为 config

    2. nestedMapping[urn] 的 is ad component 设为 true。

要在围栏框架配置 映射 mapping查找配置,给定一个 urn uuid urn, 运行以下步骤:
  1. nestedMappingmapping嵌套配置映射

  2. pendingMappingmapping待定配置映射

  3. finalizedMappingmapping已完成配置 映射

  4. 如果 nestedMapping[urn] 存在,返回 其值。

  5. 如果 pendingMapping[urn] 存在,则等待 直到它不再存在

  6. 如果 finalizedMapping[urn] 存在,返回 其值。

  7. 返回 failure。

2.3. 围栏框架配置

2.3.1. 引言

本节是非规范性的。

fencedframe 元素的一个关键特性是,Web 平台 API 可以以一种限制其他执行上下文修改或检查此 配置能力的方式来配置框架的行为,这是出于安全和隐私原因。例如,[Protected-Audience] API 会对跨站点数据执行设备端广告竞价,重要的是赢得竞价的广告能够被加载到一个框架中, 而 API 调用方既不知道哪个广告赢得了竞价,也不能操纵该广告加载时的环境。

我们使用“围栏框架配置”这一概念来实现这一点。围栏框架配置是一组字段的 集合,可以被加载到 fencedframe 元素中,并指定 产生的环境。围栏框架配置只能由特定的 Web 平台 API 创建, 不能由脚本构造或修改。它们的字段还包含 “可见性”,用于规定当通过 FencedFrameConfig 接口检查字段时,该字段是否应被“遮蔽”。像 [Protected-Audience][Shared-Storage] API 这样的 config-generating APIs 必须为其 围栏框架 配置的所有字段指定值,以确保它们已经考虑了每个字段的隐私影响,尽管它们可以选择将这些值设为 null。

每当一个 fencedframe 导航到一个围栏 框架配置时,它会被实例化为一个新的 围栏框架配置实例,该实例治理 围栏可导航体内部的特定 浏览上下文组

2.3.2. 用例

渲染通过广告竞价创建的广告:

广告竞价 API 运行一次竞价并确定获胜广告。有关获胜广告的详情必须 对嵌入者隐藏,并且不允许嵌入上下文影响 fencedframe 的环境。 这两种情况都会允许信息跨越围栏框架边界流动,从而可能允许串通方合并跨站点数据并建立用户画像。 为了防止这种情况,广告竞价 API 构造一个 围栏框架 配置,其底层 URL 对 嵌入上下文是不透明的。该围栏框架配置还会被构造为带有关于该框架的 容器尺寸内容尺寸 必须为何值,以及该框架的权限策略必须为何值的限制,因为这些都可用作指纹识别向量。

显示个性化支付按钮:

一个电商网站嵌入一个 fencedframe, 其中包含一个“立即支付”按钮。该电商网站将用户信用卡信息作为第一方存储保存在浏览器中。 起初,托管在 fencedframe 中的 Document 没有第一方 cookie/存储访问权限,因此信息可以自由流入流出,而不会有信用卡信息与跨站点 数据合并的风险。因此,可以使用 FencedFrameConfig 构造函数直接从 Web 平台构造该围栏框架,而不损害隐私。此时按钮中没有 个性化数据,因为它还不能访问信用卡数据。该 Document 只有在它通过 disableUntrustedNetwork() 关闭所有网络访问后,才能读取该信用卡数据, 这会阻止数据流出围栏框架,并阻止它与跨站点数据合并以建立用户画像。一旦这样做, 按钮便会显示用户信用卡号的最后 4 位,按照其保存在浏览器中、位于该电商平台来源的第一方存储分区中的内容显示。

2.3.3. 围栏框架配置结构体

我们现在建立一些预备类型:

可见性要么是 "opaque",要么是 "transparent"。

尺寸是一个包含以下结构体

宽度

一个非负整数

高度

一个非负整数

TODO: 考虑为这些成员使用不同的数值类型。

兴趣组描述符是一个结构体,具有 以下

所有者

一个

名称

一个字符串

权限策略行为要么是 "fixed",要么是 "flexible"。

默认围栏框架有效 沙盒化标志是一个 沙盒化标志集,具有以下标志:

待定事件是一个结构体,具有以下

目标

一个 FenceReportingDestination

事件

一个目标事件

请求发起者

一个

发起者 referrer 策略

一个referrer 策略

报告目标信息是一个结构体,具有 以下

报告 url 声明者 源

一个

报告 url 映射

一个映射,其字符串,其URL

报告宏映射

null,或一个映射,其字符串,其字符串

围栏框架报告映射是一个映射, 其FenceReportingDestination, 其要么是:

注: 此表示方式旨在允许 config-generating APIs 通过异步解析报告目标的值来降低延迟,即使在它们已经构造并返回 围栏框架配置之后,甚至在配置已加载且事件报告已在围栏框架内部生成之后也可以这样做。 当 config-generating API 声明围栏框架报告映射时,它们可以使用一个空 列表将某些目标标记为待定,然后 保留对该映射的引用以供稍后使用。如果围栏框架尝试在某个目标仍处于待定状态时向其 报告事件,它会将该事件存储在此 列表中以供稍后 处理。当 config-generating API 或其回调最终通过其保留的引用完成报告目标时, 它会处理存储在该列表中的所有待定事件。如果该目标永远没有完成,则这些待定事件将永远 不会被发送。

不受信任网络状态要么是 "enabled", "disabled for this tree",或 "disabled for this tree and fenced subtrees"。

注: Disabled for this tree 不是最终的 网络切断状态。它是一个中间状态,在该状态中,框架树内所有未跨越围栏框架边界的框架 都已撤销其网络访问权限,但至少还有一个子围栏框架树仍具有网络访问权限。在此阶段它不会获得特殊 API 访问权限,因为它获得访问权的任何信息仍可通过具有网络访问权限的子围栏框架被外泄。 一旦所有子围栏框架也都禁用了其不受信任网络,围栏框架的状态就会切换到最终的 disabled for this tree and fenced subtrees 状态。

为了完成报告目标,给定一个围栏框架报告映射 reporting map,一个 FenceReportingDestination destination,一个 reporting url declarer origin,一个映射 destination map,其字符串,且 其url,以及 macro map,它要么是 null,要么是一个 映射, 其字符串,其字符串,运行这些 步骤:
  1. 断言 reporting map[destination] 是一个 列表 (即 destination 的 元数据尚未完成)。

  2. pending event listreporting map[destination]。

  3. 设置 reporting map[destination] 为一个具有以下结构体

    报告 url 声明者源

    reporting url declarer origin

    报告 url 映射

    destination map

    报告宏映射

    macro map

  4. 对于 pending event list 中的每个 pending event 执行

    1. 使用 destination mappending event事件pending event请求发起者,以及 pending event发起者 referrer 策略发送 beacon

围栏框架报告元数据是一个结构体,具有 以下

围栏框架报告 映射

一个围栏框架报告映射

直接卖方是 卖方

一个布尔值,初始值为 true

允许的报告 源

null 或由组成的列表。一个源必须存在于此列表中,才能作为 目标 URL 事件报告的目标。

尝试 向不允许源进行自定义 url 报告

一个布尔值,初始值为 false

自动 beacon 事件类型要么是 "reserved.top_navigation_start", "reserved.top_navigation_commit", 或 "reserved.top_navigation"。

reserved.top_navigationreserved.top_navigation_commit 的早期 命名。 虽然它们 做的是同一件事, reserved.top_navigation 将来会被 移除,不应在新代码中使用。

围栏框架报告器是一个结构体,具有以下

围栏框架报告元数据 引用

对一个围栏框架报告元数据的可变引用 TODO: 以更符合规范风格的方式处理指针/引用

目标枚举事件是一个结构体,具有以下

类型

一个字符串

数据

一个字符串

attributionReportingEnabled

一个布尔值

attributionReportingContextOrigin

一个

目标 URL 事件是一个 URL

自动 beacon 事件是一个结构体,具有以下

类型

一个自动 beacon 事件类型

数据

一个字符串

attributionReportingEnabled

一个布尔值

attributionReportingContextOrigin

一个

目标事件要么是 目标枚举事件,要么是 目标 URL 事件,或是 自动 beacon 事件

为了使用一个报告目标信息 destination info、一个目标事件 event、一个 request initiator,以及一个referrer 策略 initiator referrer policy 发送 beacon,运行以下步骤:
  1. destination url 为空字符串

  2. attributionReportingEligibility 为 "unset"。

  3. processResponse 为 null。

  4. useParallelQueue 为 false。

  5. 如果 event目标枚举事件自动 beacon 事件,则:

    1. destination mapdestination info报告 url 映射

    2. eventTypeevent目标类型,或者 自动类型,取决于 event 是哪种 变体。

    3. 如果 destination map[eventType] 不存在, 返回。

    4. destination url 设置为 destination map[eventType]。

    5. 如果 eventattributionReportingEnabled 为 true 且 eventattributionReportingContextOrigin 是合适的

      1. 如果 eventeventType 匹配某个自动 beacon 事件类型值,则将 attributionReportingEligibility 设置为 "navigation-source"。

      2. 否则,将 attributionReportingEligibility 设置为 "event-source"。

      3. processResponse 设置为给定一个响应 response 的这些步骤:

        1. fenced 为 true。

        2. 使用 eventattributionReportingContextOriginattributionReportingEligibilityfencedresponse 运行处理 归因合格响应

      4. useParallelQueue 设置为 true。

  6. 否则:

    1. 断言event 是一个目标 URL 事件

    2. macro mapdestination info报告宏 映射

    3. 如果 macro map 为 null,则返回。

    4. destination url 设置为 event

    5. destination url 为使用 macro map 将宏代入 destination url结果

  7. 可选地,返回。

    注: 这个实现定义的条件旨在 允许用户代理出于多种原因丢弃该 beacon,例如用户选择退出,或 destination url站点登记

  8. request 为一个新的请求,具有以下属性:

    方法

    如果 event目标枚举事件,则为 POST, 否则为 GET

    URL

    destination url

    标头列表

    一个新的标头列表,其中包含一个标头,其名称"Content-Type",且 "text/plain"

    主体

    如果 event 是一个目标枚举事件,则为一个 主体,其event数据,否则为 null。

    客户端

    null

    service-workers 模式

    "all"

    默认值是 "all",因此从技术上讲我们不必在这里设置任何内容。我们这样做是为了 提醒自己,这里跳过 service workers 可能更合适,类似于某些 其他 beacon

    如果 event目标 URL 事件,则为 request initiator,否则为 destination info报告 url 声明者源

    注: 目标 URL 事件的报告目标 由调用 reportEvent()Document 决定, 不同于目标枚举事件自动 beacon 事件, 后者的报告 目标是在创建加载此 Document围栏框架 配置的 worklet 中决定的。 我们将设置为决定报告目标的 Document 或 worklet 的,以防止跨站请求伪造。

    referrer

    request initiator

    referrer 策略

    initiator referrer policy

    模式

    "cors"

    凭据模式

    "omit"

    Attribution Reporting eligibility

    attributionReportingEligibility

  9. Fetch request,其中 processResponseprocessResponse(如果它不是 null),且 useParallelQueueuseParallelQueue

    注: 此算法可以在并行期间调用,也可以在 Document 的 主 线程上调用。为了正确处理并行调用,我们在使用可选的 响应处理算法时,会调用 fetch 并将 useParallelQueue 设为 true;否则,即使此 算法在其他实例中并行运行,也无需这样做。

为了使用一个围栏框架报告器 reporter,以一个 FenceReportingDestination destination、一个 request initiator、 一个referrer 策略 initiator referrer policy,以及一个目标事件 event 报告 事件,运行以下步骤:
  1. metadatareporter围栏框架 报告元数据引用

  2. 如果 destination"direct-seller"

    1. 如果 metadata直接卖方 是卖方为 true,则将 destination 设置为 "seller"

    2. 否则,将 destination 设置为 "component-seller"

  3. 如果 event 是一个目标 URL 事件

    1. 如果 event不与 metadata允许的 报告源中的任一条目同源

      1. metadata尝试 向不允许源进行自定义 url 报告设置为 true。

    2. 如果 metadata尝试 向不允许源进行自定义 url 报告为 true,则返回。

  4. reporting map 为对 metadata围栏框架 报告映射的引用。

  5. 如果 reporting map[destination] 不存在,返回。

  6. 如果 reporting map[destination] 是一个列表

    1. newEvent 为一个新的待定事件,具有以下内容:

      目标

      destination

      事件

      event

      请求发起者

      request initiator

      发起者 referrer 策略

      initiator referrer policy

    2. newEvent追加reporting map[destination]。

    3. 返回。

      注: 该待定事件将被异步发送。

  7. 断言 reporting map[destination] 是一个 映射(即 destination 的 元数据已经完成)。

  8. 使用 reporting map[destination]、eventrequest initiatorinitiator referrer policy发送 beacon

为了使用一个围栏框架报告器 reporter 和一个 字符串 event 报告私有聚合事件,运行以下步骤:
  1. 如果 eventeventType "reserved." 开头,则返回。

  2. reporter event TODO: 填写此处

外泄预算元数据是一个结构体,具有 以下

一个

要扣减的量

一个非负有效浮点数

外泄预算元数据引用 是一个结构体, 具有 以下

一个

要扣减的量 引用

对一个非负有效浮点数的可变引用 TODO: 以更符合规范风格的方式处理指针/引用

分区 nonce是一个 实现定义的值。

注: 这类似于 网络 分区键,由 Fetch 使用。

围栏框架配置 是一个结构体, 具有以下

映射 url

一个结构体,具有以下

一个 URL

可见性

一个可见性

容器尺寸

null,或一个尺寸

内容尺寸

null,或一个结构体,具有以下

一个尺寸

可见性

一个可见性

兴趣组描述符

null,或一个结构体,具有以下

一个兴趣组描述符

可见性

一个可见性

on navigate 回调

null,或一系列步骤

有效沙盒化标志

null,或一个结构体,具有以下

一个沙盒化标志集

可见性

一个可见性

有效启用权限

null,或一个结构体,具有以下

受策略控制的特性组成的列表

可见性

一个可见性

注: 当非 null 时,这是一个由受策略控制的特性组成的列表, 此配置的生成器依赖这些特性在导航到此配置的 fencedframe 内部被独占启用。具体而言,此列表中的每个特性必须 在导航到此配置时,由该 fencedframe围栏可导航体权限策略继承策略启用,导航才会成功。 此列表中的特性不是被强制启用,而是用于检查影响上述 继承策略的嵌入者环境是否足够宽松, 能够支持这些必要 特性。如果这些特性中任一特性的继承策略值为 "Disabled",则导航到此配置会失败。任何受策略控制的特性只要在 此列表中,就不会在导航到此配置的 fencedframe 中被设为 "Disabled"。

围栏框架报告元数据

null,或一个结构体,具有以下

一个围栏框架报告 元数据

可见性

一个可见性

外泄预算元数据

null,或一个结构体,具有以下

一个外泄预算 元数据

可见性

一个可见性

嵌套配置

null,或一个结构体,具有以下

围栏框架配置组成的列表

可见性

一个可见性

嵌入者 shared storage 上下文

null,或一个字符串

is ad component

一个布尔值,初始值为 false。

注: 当为 true 时,此围栏框架配置 表示一个广告组件。广告组件可用于构造由多个片段组成的广告。参见 Protected Audience explainer。对于广告组件,事件报告的处理方式不同。参见描述此内容的 Fenced Frame Ads Reporting explainer

允许跨源报告

一个布尔值,初始值为 false。

2.3.4. 围栏框架配置 实例结构体

围栏框架 配置实例是一个结构体,具有以下

映射 url

一个 URL

容器尺寸

null,或一个尺寸

内容尺寸

null,或一个尺寸

兴趣组 描述符

null,或一个兴趣组描述符

on navigate 回调

null,或一系列步骤

有效沙盒化 标志

null,或一个沙盒化标志集

权限策略 行为

一个权限策略行为

有效启用 权限

null,或由受策略控制的特性组成的列表

围栏框架报告器

null,或一个围栏框架报告器

外泄 预算元数据引用

null,或一个外泄预算元数据 引用

嵌套配置

null,或一个映射,其urn uuid,且 其围栏框架配置

分区 nonce

一个分区 nonce

嵌入者 shared storage 上下文

null,或一个字符串

is ad component

一个布尔值

不受信任网络 状态

一个不受信任网络状态,初始为enabled

网络禁用时 promise

一个映射,其全局对象,且是由 Promise 组成的列表, 初始为空。

注: 这会存储在 disableUntrustedNetwork() 期间从各个全局对象创建的各种 Promise。 我们将它们存储在此处,以便当 fencedframe 及其后代围栏框架的网络访问权限被完全 撤销时(即不受信任网络状态disabled for this tree and fenced subtrees),可以一次性解析所有这些 promise。

允许跨源报告

一个布尔值,初始值为 false。

要在给定围栏框架配置 config实例化 配置,返回一个 围栏框架配置实例,具有以下成员:
映射 url

config映射 url

容器尺寸

config容器尺寸

内容尺寸

如果 config内容尺寸为 null,则为它本身;否则为 config内容尺寸

兴趣组 描述符

如果 config兴趣组描述符为 null,则为它本身;否则为 config兴趣组描述符

on navigate 回调

configon navigate 回调

有效沙盒化 标志

如果 config有效沙盒化标志 为 null,则为它本身;否则为 config有效沙盒化 标志

权限策略 行为

如果 config有效启用 权限为 null,则为 flexible,否则为fixed

有效启用 权限

如果 config有效启用 权限为 null,则为它本身;否则为 config有效启用 权限

围栏框架报告器
  1. 如果 config围栏框架 报告元数据为 null,则设为 null。

  2. 否则,设置为一个围栏框架报告器,具有 以下 成员:

    围栏 框架报告元数据引用

    config围栏 框架报告元数据的引用

外泄 预算元数据引用
  1. 如果 config外泄预算 元数据为 null,则设为 null。

  2. 否则,设置为一个外泄 预算元数据引用

    config外泄 预算元数据

    要 扣减的量引用

    config外泄 预算元数据要扣减的 量的引用

嵌套配置
  1. 如果 config嵌套配置为 null,则设为 null。

  2. 否则:

    1. results 为一个新的映射

    2. 对于 config嵌套配置中的每个 nested config 执行

      1. urn 为随机生成的 urn uuid

      2. 设置 results[urn] 为 nested config

    3. 嵌套配置 设为 results

分区 nonce

一个随机、唯一的分区 nonce

嵌入者 shared storage 上下文

config嵌入者 shared storage 上下文

is ad component

configis ad component

允许跨源报告

config允许跨源报告

不受信任网络状态

enabled

网络禁用时 promise

一个空的映射

每个浏览上下文都有一个 围栏框架配置实例, 它是一个围栏框架配置实例或 null,初始为 null。

围栏框架配置实例实际上应存在于 浏览上下文组上;不过,在第三方 cookie 被弃用之前,本 规范在 fencedframe 概念的许多方面支持 iframe 元素。这要求 在短期内,一个普通的内容可导航体能够加载 围栏框架 配置,因此能够访问该导航对应的围栏框架配置 实例

2.3.5. FencedFrameConfig 接口

fencedframe 元素的一个主要输入是 FencedFrameConfig 接口,它 映射到一个内部的围栏框架配置结构体

enum OpaqueProperty {"opaque"};

[Exposed=Window, Serializable]
interface FencedFrameConfig {
  constructor(USVString url);
  undefined setSharedStorageContext(DOMString contextString);
};

每个 FencedFrameConfig 都具有:

注: 只有在提供了 urn 时, config 的 url 才为 null。

FencedFrameConfig(url) 构造方法步骤 如下:
  1. config 为一个新的 FencedFrameConfig 对象。

  2. configurl 设为对 url 运行 URL 解析器的结果。

  3. 返回 config

setSharedStorageContext(contextString) 方法步骤 是将 thissharedStorageContext 设为 contextString
FencedFrameConfig 对象是可序列化对象。给定 valueserializedforStorage,它们的序列化步骤为:
  1. 如果 forStorage 为 true,则抛出一个 DataCloneError DOMException

  2. serialized.[[Url]] 设为 valueurl

  3. serialized.[[Urn]] 设为 valueurn

  4. serialized.[[SharedStorageContext]] 设为 valuesharedStorageContext

给定 serializedvalue targetRealm, 它们的反序列化步骤为:
  1. valueurl 初始化为 serialized.[[Url]]。

  2. valueurn 初始化为 serialized.[[Urn]]。

  3. valuesharedStorageContext 初始化为 serialized.[[SharedStorageContext]]。

注: 为了帮助易于采用, 到 2026 年之前我们将 支持 API navigator.deprecatedReplaceInURN(), 该 API 允许你将 宏代入与给定 urn uuidFencedFrameConfig 对应的映射 url

注: 为了帮助易于采用, 在 第三方 cookie 弃用之前 我们将支持 API navigator.deprecatedURNtoURL(), 它会返回 与给定 urn uuidFencedFrameConfig 对应的映射 url

typedef (USVString or FencedFrameConfig) UrnOrConfig;

partial interface Navigator {
  Promise<undefined> deprecatedReplaceInURN(
    UrnOrConfig urnOrConfig, record<USVString, USVString> replacements);
  Promise<USVString> deprecatedURNtoURL(
    UrnOrConfig urnOrConfig, optional boolean send_reports = false);
  sequence<USVString> adAuctionComponents(unsigned short numAdComponents);
};
要使用一个有序映射 macros 将宏代入一个字符串 string 中,该映射具有 字符串字符串,运行 以下步骤:
  1. TODO: 规范 此内容。 将 macros 中的键替换为 string 中对应的值, 并返回 新字符串。不存在递归替换。

deprecatedReplaceInURN(urnOrConfig, replacements) 方法步骤如下:
  1. urn 为 null。

  2. 如果 urnOrConfig 是一个 USVString, 则将 urn 设为 urnOrConfig

  3. 否则,将 urn 设为 urnOrConfigurn

  4. 如果 urn 不是有效的 urn uuid (即不会通过 urn uuid第 3 节中的 ABNF),则抛出一个 TypeError

  5. 对于 replacements 中的每个 key → _ 执行

    1. 如果 key 不是 ${%% 开头, 则抛出一个 TypeError

    2. 如果 key 不是 }%% 结尾, 则抛出一个 TypeError

  6. p一个新的 promise

  7. globalthis相关全局对象

  8. 并行地运行以下步骤:

    1. mappingglobal可导航体可遍历可导航体围栏框架配置 映射

    2. config 为在 mapping 中以 urn查找配置的结果。

    3. 如果 config 为 failure,则在给定 global 的情况下,在DOM 操作任务源排入一个全局任务,以使用 undefined 解析 p, 并中止这些步骤。

    4. substitutedUrl 为使用 replacements 将宏代入 config映射 url结果

    5. config映射 url设置为 substitutedUrl

    6. 在给定 global 的情况下,在DOM 操作任务源排入一个全局任务,以 使用 undefined解析 p

  9. 返回 p

测试
deprecatedURNtoURL(urnOrConfig, send_reports) 方法 步骤如下:
  1. urn 为 null。

  2. 如果 urnOrConfig 是一个 USVString, 则将 urn 设为 urnOrConfig

  3. 否则,将 urn 设为 urnOrConfigurn

  4. 如果 urn 不是有效的 urn uuid (即不会通过 urn uuid第 3 节中的 ABNF),则抛出一个 TypeError

  5. p一个新的 promise

  6. globalthis相关全局对象

  7. 并行地运行以下步骤:

    1. mappingglobal可导航体可遍历可导航体围栏框架配置 映射

    2. 如果 mapping已完成配置 映射[urn] 不 存在,则在给定 global 的情况下,在DOM 操作任务源排入一个全局任务, 以使用 undefined解析 p, 并中止这些步骤。

    3. configmapping已完成配置 映射[urn]。

    4. 在给定 global 的情况下,在DOM 操作任务源排入一个全局任务,以 使用 config映射 url解析 p

    5. 如果 send_reports 为 true,则运行 configon navigate 回调中的步骤。

  8. 返回 p

测试
adAuctionComponents(numAdComponents)
  1. instancethis相关全局对象浏览上下文围栏框架配置 实例

  2. 如果 instance 为 null,则抛出一个 InvalidStateError DOMException

  3. 如果 this相关设置对象instance映射 url不是同源,则抛出一个 InvalidStateError DOMException

  4. maxAdComponents 为 40。

  5. 如果 numAdComponents > maxAdComponents,则将 numAdComponents 设为 maxAdComponents

  6. adComponentsURNs 为空的由urn组成的列表

  7. 对于 instance嵌套配置中的每个 urnconfig 执行

    1. 如果 numAdComponents 等于 0,则中断

    2. urn追加adComponentsURNs

    3. numAdComponents 设为 numAdComponents − 1。

  8. 返回 adComponentsURNs

2.4. Fence 接口

若干特定于围栏框架的 API 定义在 Fence 接口上。

enum FenceReportingDestination {
  "buyer",
  "seller",
  "component-seller",
  "direct-seller",
  "shared-storage-select-url",
};

dictionary FenceEvent {
  // This dictionary has two mutually exclusive modes that aren’t represented as
  // distinct IDL types due to distinguishability issues:
  //
  // When reporting to a preregistered destination (specified by enum), the following
  // properties are used:
  DOMString eventType;
  DOMString eventData;
  sequence<FenceReportingDestination> destination;

  // Determines if this data can be sent in a reportEvent() beacon or automatic
  // beacon that originates from a document that is cross-origin to the mapped
  // URL of the fenced frame config that loaded this frame tree.
  // Note that automatic beacon data can only be set from documents that are
  // same-origin to the fenced frame config’s mapped URL, so this effectively
  // opts in the data to being used in a cross-origin subframe.
  boolean crossOriginExposed = false;

  // When setting event data to be used later in an automatic beacon, the
  // following properties are used:
  boolean once = false;

  // When reporting to a custom destination URL (with substitution of macros defined by
  // the Protected Audience buyer), the following property is used:
  USVString destinationURL;
};

typedef (FenceEvent or DOMString) ReportEventType;

[Exposed=Window]
interface Fence {
    undefined reportEvent(optional ReportEventType event = {});
    undefined setReportEventDataForAutomaticBeacons(optional FenceEvent event = {});
    sequence<FencedFrameConfig> getNestedConfigs();
    Promise<undefined> disableUntrustedNetwork();
    undefined notifyEvent(Event event);
};
reportEvent(event) 方法步骤如下:
  1. documentthis相关全局对象关联 Document

  2. 如果 document 不是完全活动的,则抛出一个 SecurityError DOMException

  3. instancethis相关全局对象浏览上下文围栏框架配置 实例

  4. 如果 instance 为 null,则返回。

  5. 如果 instanceis ad component 为 true,则 返回。

  6. 如果 instance围栏框架报告器 为 null,则返回。

  7. request initiatorthis相关设置对象

  8. initiator referrer policydocument策略容器referrer 策略

  9. 如果 event 是一个 DOMString

    1. 如果 this相关设置对象instance映射 url不是同源,则返回。

    2. 使用 instance围栏框架 报告器event 运行报告私有聚合 事件

  10. 如果 event 是一个 FenceEvent

    1. 如果 eventeventType "reserved." 开头,则 返回。

    2. 如果以下所有条件都为 true:

      则返回。

    3. 如果 event 具有 destinationURL

      1. 如果 event 具有 destinationeventTypeeventData

        1. 抛出一个 TypeError

      2. destinationURL 为对 destinationURL 运行URL 解析器的结果。

      3. 如果以下任一条件成立,则抛出一个 TypeError

        • destinationURL 为 failure;

        • destinationURLscheme 不是 "https";

      4. 使用 instance围栏 框架报告器buyerrequest initiatorinitiator referrer policy,以及一个目标 URL 事件运行报告事件,该事件是 eventdestinationURL

    4. 否则:

      1. 如果 event 不具有 destinationevent 不具有 eventType

        1. 抛出一个 TypeError

      2. attributionReportingEnabled 为确定 document 是否被允许使用 "attribution-reporting" 特性的结果。

      3. attributionReportingContextOrigindocument上下文源

      4. 对于 eventdestination 中的每个 destination 执行

        1. 使用 instance围栏 框架报告器destinationrequest initiatorinitiator referrer policy,以及一个 目标 枚举事件运行报告事件,该事件具有以下

          类型

          eventeventType

          数据

          eventeventData (若未定义则为空字符串)。

        attributionReportingEnabled

        attributionReportingEnabled

        attributionReportingContextOrigin

        attributionReportingContextOrigin

测试
setReportEventDataForAutomaticBeacons(event) 方法步骤如下:
  1. 如果 this相关全局对象关联 Document不是完全活动的,则抛出一个 SecurityError DOMException

  2. 如果 event 不具有 destinationevent 不具有 eventType

    1. 抛出一个 TypeError

  3. 如果 eventeventType 与任何自动 beacon 事件类型 值都不匹配,则返回。

  4. instancethis相关全局对象浏览上下文围栏框架配置 实例

  5. 如果 instance 为 null,则返回。

  6. 如果 this相关设置对象instance映射 url不是同源,且 eventcrossOriginExposed 为 false,则返回。

  7. 如果 instance围栏框架报告器 为 null,则返回。

  8. this相关全局对象关联 Document自动 beacon 数据 映射[eventeventType] 设为一个自动 beacon 数据,具有以下

    eventData

    如果已定义且 instanceis ad component 为 false,则为 eventeventData, 否则为空字符串

    destination

    eventdestination

    once

    eventonce

    crossOriginExposed

    eventcrossOriginExposed

测试
getNestedConfigs() 方法步骤如下:
  1. instancethis相关全局对象浏览上下文围栏框架配置 实例

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

  3. 如果 this相关设置对象instance映射 url不是同源,则返回。

  4. 如果 instance嵌套配置为 null,则 返回。

  5. results 为空的由 FencedFrameConfig 组成的列表

  6. 对于 instance嵌套配置中的每个 urnconfig 执行

    1. newConfig 为在 this相关 Realm 中创建的一个新的 FencedFrameConfig 对象,具有以下内容:

      urn

      urn

      sharedStorageContext

      config嵌入者 shared storage 上下文

    2. newConfig追加results

  7. 返回 results

测试
notifyEvent(event) 方法步骤如下:
  1. 如果 this相关全局对象关联 Document不是完全活动的,则抛出一个 SecurityError DOMException

  2. navigablethis相关全局对象可导航体

  3. 如果满足以下任一条件,则抛出一个 SecurityError DOMException

  4. 如果 this相关全局对象没有瞬态激活,则返回。

  5. 消耗 this相关全局对象用户激活

  6. parentNavigablenavigable非围栏 父级

  7. 在给定 parentNavigable活动 window 的情况下,在DOM 操作任务源排入一个全局任务来运行这些步骤:

    1. 执行激活通知步骤。

    2. navigable围栏可导航体容器触发一个事件,其名称为 "fencedtreeclick"。 将该事件的 bubblescancelable 属性初始化为 true。在运行 内部事件创建 步骤时,将 time 设为一个实现定义的值,该值在此方法的所有调用中保持 一致。

测试
disableUntrustedNetwork() 方法步骤如下:
  1. p一个新的 promise

  2. 如果 this相关全局对象关联 Document不是完全活动的,则抛出一个 SecurityError DOMException

  3. instancethis相关全局对象浏览上下文围栏框架配置 实例

  4. 如果 instance 为 null,则返回。

  5. 如果相关设置对象instance映射 url不是同源,则用 TypeError拒绝 p

  6. 如果 this相关全局对象可导航体可遍历可导航体不是一个围栏可导航体,则用 undefined解析 p 并返回 p

  7. globalthis相关全局对象

  8. settingsthis相关设置对象

  9. 对于每个相关全局对象globalWebSocket 对象 webSocket 执行:给定 webSocket,运行使 WebSocket 连接失败

  10. 对于每个相关全局对象globalWebTransport 对象 webTransport 执行:用一个新创建的 WebTransportError 清理 webTransport,该错误的 source"session"

    注: 不传入 WebTransportCloseInfo 可确保 WebTransport 对象被 设为 "failed" 状态,而不是 "closed" 状态。

  11. 并行地运行以下步骤:

    1. fencedFrameNonceinstance分区 nonce

    2. credentiallessNonceglobal页面 credentialless nonce

    3. settingsfencedFrameNonce 调用撤销分区 nonce 的网络

    4. 如果 credentiallessNonce 非 null,则以 settingscredentiallessNonce 调用撤销分区 nonce 的网络

    5. instance不受信任 网络状态设为disabled for this tree

    6. promisesinstance网络 禁用时 promise

    7. 如果 promises[global] 存在,则将 p追加promises[global]。

      否则,设置 promises[global] 为列表 « p »。

    8. 给定 global浏览上下文顶级可遍历体重新计算 所有围栏框架后代的不受信任网络状态

  12. 返回 p

要给定一个 顶级 可遍历体 topLevelTraversable重新计算所有围栏框架后代的不受信任 网络状态,运行以下步骤:
  1. 断言:这是并行地运行。

  2. navigablestopLevelTraversable活动 document包含后代可导航体,其中 unfenced 设为 true。

  3. navigablesWithNetworkChildren 为由围栏可导航体组成的集合,初始为 空。

  4. navigables为空循环

    1. currentNavigable 为从 navigables 弹出的 结果。

    2. ongoingNavigationcurrentNavigable进行中的导航

    3. 如果 currentNavigable 不是一个围栏可导航体

      1. 如果 ongoingNavigation 非 null:

        1. ancestorFencedRootcurrentNavigable可遍历可导航体

        2. 如果 ancestorFencedRoot 是一个围栏 可导航体, 则将 ancestorFencedRoot追加navigablesWithNetworkChildren

      2. 继续

    4. configcurrentNavigable活动浏览上下文围栏框架配置 实例

    5. 如果 config不受信任 网络状态disabled for this tree and fenced subtrees,且 ongoingNavigation 为 null, 则继续

    6. 如果 navigablesWithNetworkChildren包含 currentNavigable,且 config不受信任 网络状态disabled for this tree,则令 networkCutoffReady 为 true;否则为 false。

      注: 当某个围栏可导航体 是另一个被确定为尚未准备好进行网络切断的围栏框架的非围栏祖先时,它会被添加到 navigablesWithNetworkChildren

    7. 如果 networkCutoffReady 为 true:

      1. config不受信任 网络状态设为disabled for this tree and fenced subtrees

        注: 此时,任何受不受信任网络已禁用这一条件限制的 API 都可以立即使用,即使 promise 尚未完成解析。

      2. 对于 config网络 禁用时 promise中的每个 globalpromises 执行

        1. 对于 promises 中的每个 promise 执行

          1. 在给定 global 的情况下,在DOM 操作 任务源排入一个全局任务,以 使用 undefined解析 promise

      3. 清空 config网络 禁用时 promise

    8. 如果 networkCutoffReady 为 false 或 ongoingNavigation 非 null:

      1. ancestorFencedRootcurrentNavigable非围栏父级可遍历可导航体

      2. 如果 ancestorFencedRoot 是一个围栏 可导航体, 则将 ancestorFencedRoot追加navigablesWithNetworkChildren

注: Chromium 内部的 Web 平台测试可在 third_party/blink/web_tests/wpt_internal/fenced_frame/disable-untrusted-network-ongoing-navigation.https.html 获取。 一旦 WICG/fenced-frame#192 解决,它将被上游化并在此处链接。

重写 iframe 元素的HTML iframe 元素移除步骤,使其 内容为:

给定 removedNodeiframeHTML 元素移除步骤 为:

  1. topLevelTraversableremovedNode内容可导航体顶级可遍历体

  2. 给定 removedNode销毁子可导航体

  3. 并行地,给定 topLevelTraversable重新计算 所有围栏框架后代的不受信任网络状态

修改设置进行中的导航算法。在步骤 2 之后添加一个新步骤,内容为:
  1. 如果 newValue 为 null,则并行地,给定该 navigable顶级可遍历体重新计算 所有围栏框架后代的不受信任网络状态

用户代理具有一个关联的 网络撤销 nonce 集,它是由 分区 nonce组成的集合,以及一个 网络 撤销豁免映射,它是一个映射,其 分区 nonce,且是由 URL 组成的集合

注: 网络 撤销豁免映射仅用于 Web 平台测试;在正常使用中, 它始终为空。此列表会在 Web 平台测试中通过函数调用直接修改,以 使特定 URL 免于网络撤销。

这需要一个 RFC 来 向 WPT WebDriver 添加仅用于测试的函数。 (WICG/fenced-frame#192) 一旦该 WebDriver 更改完成,现有用于 disableUntrustedNetwork() 的 Chromium 内部 Web 平台测试 需要被上游化并在此处链接。 (WICG/fenced-frame#207)

要使用一个分区 nonce nonce 并给定一个 相关设置对象 settings撤销分区 nonce 的网络,运行以下 步骤:
  1. 断言:这是并行地运行。

  2. nonce追加到用户代理的网络撤销 nonce 集

  3. 终止 settingsfetch 组

要确定获取一个 请求 request 是否必须因被撤销的 分区 nonce 而被阻止,运行以下步骤:
  1. key 为对 request 运行确定网络分区 键的结果。

  2. noncekeynonce

  3. 如果用户代理的网络撤销豁免 映射[nonce] 存在,且 requestURL存在于 其中,则返回 allowed

  4. 如果用户代理的网络撤销 nonce 集包含 nonce,则返回 blocked

  5. 返回 allowed

2.5. 用于网络撤销的猴子补丁

本引言小节是非规范性的。

本节中的网络撤销机制需要修补会发起网络 请求的标准。在我们的补丁之前,这些标准会在不知道最终发起 请求的上下文的网络撤销状态的情况下发起网络请求(例如发起 WebSocket 连接)。我们的补丁会向这些标准中的算法添加检查,以便在发起请求之前考虑发起上下文的网络 撤销状态。有关更多信息,可以找到一些测试这些 API 的非外部 WPT,位于 此处。 这些目前不是外部测试,仅仅是因为网络撤销特性尚未推出。 一旦推出,它们将发布到 WPT 仓库。

网络撤销机制需要对 [FETCH] Standard 作以下猴子补丁。

fetch 算法的第 7 步中,原文为:

If should request be blocked due to a bad port, should fetching request be blocked as mixed content, or should request be blocked by Content Security Policy returns blocked, then set response to a network error.

在 "should request be blocked by Content Security Policy" 之后的条件中添加“必须因被撤销的 分区 nonce 而被阻止”。

这需要同时传入 围栏框架 nonce 以及 iframe credentialless nonce(如果存在)。 (WICG/fenced-frame#191)

修改获取连接算法,在第 1 步之前插入以下步骤:
  1. noncekeynonce

  2. 如果用户代理的网络撤销豁免 映射[nonce] 存在,但 网络撤销豁免 映射[nonce][yrl] 不存在,则:

    1. 如果用户代理的网络撤销 nonce 集包含 nonce,则返回 failure。

修改解析源算法,以包含一个额外参数:一个 URL url

在第 1 步之前插入以下步骤:

  1. noncekeynonce

  2. 如果用户代理的网络撤销豁免 映射[nonce] 存在,但 网络撤销豁免 映射[nonce][url] 不存在,则:

    1. 如果用户代理的网络撤销 nonce 集包含 nonce,则返回 failure。

网络撤销机制需要对 [WebSockets] Standard 作以下猴子补丁。

修改建立 WebSocket 连接算法。在第 10 步之后添加一个新步骤, 内容为:
  1. 如果给定 client全局对象可导航体运行确定可导航体是否已为自身撤销网络的结果为 true,则使 WebSocket 连接失败

网络撤销机制需要对 [WebTransport] Standard 作以下猴子补丁。

修改通过 HTTP 初始化 WebTransport算法。重写 第 5 步(保持所有子步骤不变),使其内容为:
  1. 如果以下任一条件为 true:

    则中止剩余步骤,并使用 transport排入一个网络任务以运行这些步骤:

网络撤销机制需要对 [Reporting] Standard 作以下猴子补丁。

修改生成并排入报告算法。在第 1 步之后添加一个新步骤,内容为:
  1. 如果 context 是一个 Document, 且给定 context节点可导航体运行确定可导航体是否已为自身撤销网络的结果为 true,则返回。

网络撤销机制需要对 [Webpackage] Standard 作以下猴子补丁。

修改对 HTTP fetch猴子补丁。重写 "b2" 或 "b3" switch case 下的第 4 步,内容为:
  1. 如果确定 request 是否必须因被撤销的 分区 nonce 而阻止的结果为 false,则并行地,为 parsedExchangereport 等待并排队报告

2.6. 新的请求目标

fencedframe 的 导航请求处理模型与普通 导航请求有足够多的差异,因此有理由引入一个新的请求目标值。 本规范更新请求目标枚举,以包含一个新 条目 "fencedframe"。对 [FETCH] Standard 执行以下猴子补丁。

将 "fencedframe" 添加到非子资源请求列表以及导航 请求列表。

将 "fencedframe" 添加到 RequestDestination enum。

fetch 算法的第 13.2 步中,原文为:

A user agent should set value to the first matching statement, if any, switching on request’s destination:

将 "fencedframe" 添加到 switch cases 中,与 "document"、 "frame" 和 "iframe" 并列。

测试

以非规范性的方式,更新 DOM 引言中的目标 表,以说明 fencedframe 导航请求具有以下属性:

2.7. 基于网络撤销限制方法

本引言小节是非规范性的。

在围栏框架完全禁用不受信任网络访问之后,即 disableUntrustedNetwork() 返回的 Promise解析后,某些强大的接口方法将 可供在围栏框架内部执行的脚本使用。这些方法在 其他规范中定义,这些规范将使用下面的第一个算法来确定调用是否能够 成功发生。一个受不受信任网络访问撤销限制的方法示例是 在 SharedStorageWorklet 外部调用时的 get()。 该方法 定义在 [Shared-Storage] 草案规范中。

在已调用 disableUntrustedNetwork() 但返回的 Promise 尚未解析的中间状态中,涉及通过网络发起 请求的特性会受到限制。下面的第二个算法用于确定这些特性 是否被允许。

我们区分 "fully revoked" 与 "revoked for self", 因为嵌套的围栏框架树可能仍然具有网络访问权限,并且这些限制不会 应用于它们,直到它们也调用了 disableUntrustedNetwork()

要给定一个可导航体 navigable确定可导航体是否已完全撤销网络
  1. 如果 navigable可遍历可导航体不是一个围栏可导航体,则返回 false。

  2. confignavigable活动浏览上下文围栏框架配置 实例

  3. 如果 config不受信任网络 状态不是disabled for this tree and fenced subtrees,则返回 false。

  4. 返回 true。

要给定一个可导航体 navigable确定可导航体是否已为自身撤销网络
  1. 如果 navigable可遍历可导航体不是一个围栏可导航体,则返回 false。

  2. confignavigable活动浏览上下文围栏框架配置 实例

  3. 如果 config不受信任网络 状态enabled,则返回 false。

  4. 返回 true。

要给定一个 可导航体 navigable 和一个源快照参数 sourceSnapshotParams确定嵌入者发起的围栏框架导航是否应被阻止
  1. 如果 sourceSnapshotParams目标围栏框架 配置为 null,则 返回 false。

    其意图是 sourceSnapshotParams目标围栏框架 配置对于嵌入者发起的 fencedframe 导航应为非 null,而在其他情况下为 null。 然而,在此议题 解决之前,这一点并不成立。

  2. 如果 navigable可遍历可导航体非围栏父级为 null,则返回 false。

    注:navigable可遍历可导航体非围栏父级为 null 时,随着 navigable围栏 可导航体容器销毁navigable停止加载

  3. 如果以下所有条件为 true:

    则返回 true。

  4. 否则,返回 false。

2.8. 自动报告

第一个引言段落是非规范性的。

围栏边界模型的一个副作用是,广告将失去得知一次点击 是否导致成功导航的能力。这是因为从围栏框架发起的顶级 导航加载的页面将不被允许向该围栏框架报告它已经 加载(通过类似 window.opener 的方式)。 因此,我们引入 特殊的事件级报告类型reserved.top_navigation_startreserved.top_navigation_commit, 当围栏框架发起到 顶级 可遍历体的成功导航时,它们会自动发送一个事件级 beacon

要给定一个源快照参数 sourceSnapshotParams、一个 sourceOrigin、一个 Document targetDocument,以及一个 自动 beacon 事件类型 eventType尝试发送自动 beacon,运行以下步骤:
  1. 如果 targetDocument节点可导航体可遍历可导航体不是一个顶级可遍历体,则中止这些步骤。

  2. 如果 sourceSnapshotParams具有瞬态激活被设为 false,则中止这些步骤。

  3. configsourceSnapshotParams发起者围栏 框架配置实例

  4. 如果 config 为 null,则中止这些步骤。

    注: 由于此算法会无条件地针对所有导航调用, 这用于捕获到顶级可遍历体导航并非源自 fencedframe 的情况。

  5. 如果 configis ad component 为 false,则令 request initiatorsourceOrigin;否则为 sourceSnapshotParams发起者祖先根 源

  6. 如果 configis ad component 为 false,则令 initiator referrer policysourceSnapshotParams源策略容器referrer 策略;否则为 sourceSnapshotParams发起者 祖先根 referrer 策略

  7. 如果 sourceOriginconfig映射 url不是同源,则令 isCrossOrigin 为 true;否则为 false。

  8. 如果 isCrossOrigin 为 false,则令 beaconMappingsourceSnapshotParams快照自动 beacon 存储数据映射; 否则为 sourceSnapshotParams快照自动 beacon 存储跨源 暴露数据映射

  9. beaconDatabeaconMapping[eventType]。

  10. automaticBeaconsAllowedsourceSnapshotParams允许自动 beacon

    注: 这会跟踪是否通过 `Allow-Fenced-Frame-Automatic-Beacons` 标头进行了选择加入。当此值为 false 时,对于同源 document 或通过设置数据选择加入的 document, 仍然可以发送自动 beacon。

  11. 如果 beaconData 为 null 且 automaticBeaconsAllowed 为 false,则中止这些 步骤。

  12. 如果 isCrossOrigin 为 true 且 automaticBeaconsAllowed 为 false,则中止这些 步骤。

  13. 对于 config围栏框架报告器围栏框架 报告元数据引用围栏框架报告映射中的每个 destination 执行

    1. 使用 config围栏框架 报告器destinationrequest initiatorinitiator referrer policy,以及一个 自动 beacon 事件运行报告 事件,该事件具有以下

      类型

      eventType

      数据

      如果 beaconData 为 null,则为空字符串;否则为 beaconDataeventData

      attributionReportingEnabled

      sourceSnapshotParams已启用 attribution reporting

      attributionReportingContextOrigin

      sourceSnapshotParamsattribution reporting 上下文源

  14. 如果 beaconDataonce 为 true,则将 beaconMapping[eventType] 设为 null。

测试
修改 [HTML]navigate 算法。在第 4 步之后添加一个新步骤,内容为:
  1. 给定 sourceSnapshotParamsinitiatorOriginSnapshotnavigable 关联的 Documentreserved.top_navigation_start尝试发送自动 beacon

修改 [HTML]尝试填充历史记录 条目的 document算法。在第 6 步的 子步骤 11 中,在第 5 步之后添加一个新步骤,内容为:
  1. 如果 failure 为 false,则:

    1. 给定 sourceSnapshotParamsentrydocument state发起者源documentreserved.top_navigation_commit尝试发送自动 beacon

    2. 给定 sourceSnapshotParamsentrydocument state发起者源documentreserved.top_navigation尝试发送自动 beacon

3. HTML 集成

3.1. Window 接口的扩展

partial interface Window {
  // Collection of fenced frame APIs
  readonly attribute Fence? fence;
};

每个 Window 对象都有一个关联的 fence,它是在创建该 Window 时一并创建的 Fence 实例。

fence getter 步骤如下:
  1. 如果 this浏览上下文围栏框架配置 实例 非 null,则返回 thisfence

  2. 返回 null。

测试

3.2. Document 支持概念

我们首先建立一些初步类型:

自动 beacon 数据是一个具有以下 结构体

eventData

一个字符串

destination

一个由 FenceReportingDestination 组成的列表

once

一个布尔值

crossOriginExposed

一个布尔值

自动 beacon 数据映射是一个映射,其自动 beacon 事件类型,且其是 null 或一个 自动 beacon 数据

快照自动 beacon 存储是一个具有 以下结构体

数据映射

一个自动 beacon 数据映射

跨源 暴露数据映射

一个自动 beacon 数据映射

每个 Document 对象都有一个关联的 自动 beacon 数据映射, 它是一个自动 beacon 数据映射

每个 Document 对象都有一个关联的 允许自动 beacon,它 是一个布尔值,初始为 false。

3.3. 对创建浏览上下文的修改

[HTML]创建新的浏览上下文和 document算法中, 重写以以下内容开头的两个步骤 (目前为第 4 步和第 15 步):

改为使用更严格的条件:

注: 这是因为我们需要确保不会跨围栏框架 边界泄露 creatorreferrerdocument 基 URL策略容器

向此算法第 4 步(上面已修改)添加一个子步骤,内容为:

  1. browsingContext围栏框架配置 实例设置为 creator浏览上下文围栏框架配置 实例

3.4. 策略容器继承

当向本地 URL发起导航请求时, iframe 会从导航 请求发起者 Document 克隆其 策略容器。 如果 fencedframe 也做同样的事情,则会允许关于发起者 策略容器的信息跨围栏框架 边界泄露。本节会修补 策略容器继承,以关闭该泄漏。

修改确定导航参数策略 容器算法,使其具有一个新的可选 布尔值 参数 fenced,默认值为 false。

重写第 3 步,内容为:

  1. 如果 responseURL 为本地initiatorPolicyContainer 不是 null,且 fenced 为 false, 则返回 initiatorPolicyContainer 的一个克隆

注: 我们不需要修改 responseURLabout:srcdoc 的情况, 因为围栏框架不支持导航到 about:srcdoc

通过获取创建导航参数的第 23 步之前添加一个步骤, 内容为:
  1. 如果 navigable 是一个围栏可导航体,则令 fenced 为 true; 否则为 false。

    注: 这确保无论发起者 Documentnavigable活动 document 还是其非围栏 父级fenced 都为 true。

重写第 23 步(现在是第 24 步),内容为:

  1. resultPolicyContainer 为给定 responseURL entrydocument state历史策略容器 sourceSnapshotParams源策略容器、null、 responsePolicyContainerfenced确定导航参数 策略容器的结果。

注: fencedframe 在初始 Document 创建时的策略容器继承会在 § 3.3 对创建浏览上下文的修改 一节中处理。

3.5. 嵌套可遍历体

3.5.1. 引言

本节是非规范性的。

[HTML] Standard 将可导航体组织为两类:子可导航体可遍历可导航体(也称为顶级可遍历体)。像围栏框架这样的特性 的引入,以及在较小程度上 portals 的引入, 通过添加一种新的可遍历可导航体类型,使这个模型复杂化;这种类型有时子可导航体。由于这些新的框架类型位于与其嵌入者分离的 浏览上下文组中,因此期望并要求某种具体层级的隔离;另一方面, 由于它们在视觉上组合在其他浏览上下文组内部,所以它们有时 需要像我们在例如 iframe 中看到的普通子可导航体那样表现。

这里的复杂性在于决定诸如可导航体容器可导航体父级后代可导航体等术语何时需要跨越 可遍历可导航体/浏览上下文组边界,而何时这样做会 不安全或不正确。下面的示例说明了这一点。

当用户 激活一个 Document 内部的内容时, 通常激活通知步骤会向所有 祖先可导航体以及所有同源 后代可导航体赋予用户激活。但是, 因为 fencedframe 可以托管需要与其嵌入者隔离的敏感内容, 并且因为用户激活消耗在这两方之间提供了通信 向量,所以就用户激活而言, fencedframe围栏可导航体不能被视为其 嵌入者的后代,其嵌入者也不能被视为 fencedframe围栏可导航体的祖先,不能按用户激活算法当前使用这些术语的方式来理解。换句话说,我们认为用户激活是围栏化的, 以表示它永远不会跨越 围栏可导航体边界;如果它是非围栏化的,它将 像在 iframe 中那样表现, 允许用户激活在框架 边界之间自由流动。

测试

不同于用户激活,当 fencedframe围栏可导航体创建导航时,它必须继承其嵌入者 Document活动沙盒化标志集,这与普通 子可导航体Document 的标准行为一致。如果我们不这样做,那么 fencedframe 元素将成为一个轻易的 sandbox 绕过。因为 fencedframe sandbox 标志继承的行为类似于它在 iframe 元素中的行为,我们认为 sandbox 继承是非围栏化的

为了提供上面提到的隔离及其有条件的放松,本规范为可遍历可导航体定义了一种新的父级,称为非围栏父级,它提供到其 嵌入者的链接,算法在需要非围栏化时可以有意使用该链接,如上所述。

注: 引入一种新的父级(非围栏父级)是一项有意的 设计决策。这意味着默认情况下, fencedframe 边界是私有且隔离的, 因为默认情况下 Web 平台中没有任何内容会从 fencedframe围栏可导航体遍历到其嵌入者。在 修改算法以使它们能够跨越 fencedframe 围栏可导航体边界时,必须谨慎, 并且此类每项修改都将 独立评估,并出现在本规范中。

本节其余部分为各种处理相关可导航体集合的 [HTML] 定义(及其用法)提供补丁,目的是适当地对 Web 平台的各个部分 进行围栏化和非围栏化。

3.5.2. 可遍历可导航体

[HTML]可遍历 可导航体一节中,添加以下内容:

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

注: 非围栏父级链接赋予 fencedframe围栏可导航体到其嵌入者的链接, 该链接会被谨慎用于 需要 "非围栏化" 的事物,例如焦点处理模型中的某些算法。

要获取一个可导航体 navigable非围栏父级
  1. 如果 navigable 是一个子可导航体,则返回 navigable父级

  2. 断言navigable 是一个围栏可导航体

  3. 返回 navigable非围栏父级

注: 此算法与可遍历可导航体非围栏父级 getter 不同,因为此 算法首先会在 navigable 是普通子可导航体时,尝试获取该可导航体的 普通父级

要获取一个可导航体 navigable非围栏容器 document
  1. parentNavigablenavigable非围栏 父级

  2. 返回 parentNavigable活动 document

3.5.3. 嵌套可遍历体

[HTML]可导航体 一节中,添加一个标题为 "Nested traversables" 的新小节,其中包含以下文本、定义和 算法。

类似于可导航体容器及其各自的内容可导航体, 其他元素(到目前为止,仅 fencedframe 元素)会向 用户呈现一个更隔离的可导航体。这些元素称为 围栏可导航体容器

围栏可导航体容器具有一个 围栏 可导航体,它要么是一个具有非 null 非围栏父级可遍历可导航体,要么为 null。它初始为 null。

测试
要给定一个document state documentState 和一个可导航体 parent初始化嵌套可遍历体 traversable
  1. 给定 documentState初始化可导航体 traversable

  2. traversable非围栏父级设置为 parent

要给定一个元素 element创建新的 嵌套可遍历体
  1. group 为一个新的浏览上下文组

注: 似乎没有理由像创建新的浏览上下文组和 document那样,将 group追加到用户代理的浏览上下文组集合

  1. document 为给定 element节点 documentelementgroup,运行创建新的浏览上下文和 document 的第二个返回值。

  2. documentState 为一个新的document state,其documentdocument

  3. traversable 为一个新的可遍历可导航体

  4. parentNavigableelement节点可导航体

  5. 给定 documentStateparentNavigable初始化嵌套可遍历体 traversable

  6. element围栏可导航体设置为 traversable

  7. initialHistoryEntrytraversable活动会话历史条目

  8. initialHistoryEntrystep 设为 0。

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

  10. 返回 traversable

注: 创建新的 嵌套可遍历体算法会创建第一种不是顶级可遍历体可遍历可导航体。这将 需要移除 [HTML]顶级 可遍历体一节中关于嵌套可遍历体的注释。

3.5.4. 顶级可遍历体

[HTML] Standard 当前 将顶级可遍历体定义为一个可遍历可导航体, 其父级为 null,然而这是一个不充分的定义,本 规范会修改它。[HTML] 提到,在本规范之外,所有可遍历可导航体都是顶级可遍历体,但它 “设想”未来规范可能会想要 创建一种嵌套的可遍历体,并通过非 null 的父级实现嵌套;因此,顶级可遍历体可遍历可导航体之间的区别依赖于父级是否为 null。

本规范提出的围栏可导航体,正是 [HTML] 在为顶级可遍历体可遍历可导航体之间的区别留出空间时所设想的内容,然而本规范不会 为围栏可导航体使用 父级指针,原因如上文所述 (它们改为使用非围栏父级指针)。这意味着在 默认情况下,顶级可遍历体围栏可导航体都具有 null 的父级,这会使 这种区别失去意义。

为了修补顶级可遍历体围栏可导航体之间预期的区别,请按如下方式修补以下 定义:

顶级 可遍历体是一个可遍历可导航体,其父级非围栏父级均为 null。
要获取一个可导航体 inputNavigable顶级可遍历体
  1. navigableinputNavigable

  2. 循环

    1. 如果 navigable父级非围栏父级均为 null,则中断

    2. navigable 设为 navigable父级非围栏父级,取其中 非 null 的那个。

      注: 此处 navigable父级非围栏父级中恰好有一个 为非 null。

  3. 返回 navigable

注: 采用这些新定义后,顶级 可遍历体本质上是§ 3.5.1 引言中所述的“非围栏化”的。

修改包含后代可导航体算法,使其接受一个新的可选 布尔值 参数 unfenced,默认值为 false。

进一步将此算法的第 2 步重写为:

  1. document后代可导航体扩展 navigables,其中 unfenced 设为 unfenced

修改后代可导航体算法,使其接受一个新的可选布尔值 参数 unfenced,默认值为 false,并按如下方式重写该算法:
  1. navigables 为一个新的列表

  2. navigableContainers 为一个列表,其中包含 document 的所有包含影树的后代中,作为可导航体容器的那些元素(如果 unfenced 为 true,则还包括围栏 可导航体容器),按包含影树的树序排列。

  3. 对于 navigableContainers 中的每个 navigableContainer 执行

    1. 如果 navigableContainer内容可导航体围栏可导航体均为 null,则继续

    2. descendantNavigablenavigableContainer内容可导航体围栏可导航体, 取其中非 null 的那个。

    3. descendantNavigable活动 document包含后代可导航体扩展 navigables, 其中 unfenced 设为 unfenced

  4. 返回 navigables

修改祖先可导航体算法,使其接受一个新的可选布尔值 参数 unfenced,默认值为 false,并按如下方式重写该算法:
  1. navigabledocument节点可导航体父级

  2. 如果 navigable 为 null 且 unfenced 为 true,则将 navigable 设为 document节点可导航体可遍历可导航体非围栏父级

  3. ancestors 为空列表。

  4. navigable 不是 null 时:

    1. navigable前置ancestors

    2. navigable 设为 navigable父级

    3. 如果 navigable 为 null 且 unfenced 为 true,则将 navigable 设为 navigable可遍历可导航体非围栏父级

  5. 返回 ancestors

3.7. 对焦点算法的修改

[HTML] Standard 定义了如何 处理元素和 Window 的聚焦, 包括通过用户手势 以及通过脚本发起的 API。由于围栏框架被设计为防止跨 围栏框架边界的通信,我们需要谨慎处理聚焦。这是因为当焦点跨越 fencedframe 边界时,边界两侧的上下文都能检测到该变化,这可能被 用来在 fencedframe 与其嵌入者之间打开通信信道。

我们通过不允许聚焦步骤将脚本发起的焦点移过围栏 框架边界来实现这一点。

当用户 点击 button 之类的元素,该元素位于 fencedframe 内部,而另一个位于 fencedframe 外部的元素正处于聚焦状态时, 聚焦步骤会允许该 button 获得焦点,因为这明确是一个 用户发起的操作。若不允许这样做,则 fencedframe 内部的任何元素都永远无法 获得焦点

如果我们 继续像本规范之前的现状那样,允许所有元素都通过 focus() 方法被 聚焦,则一个围栏可导航体容器及其围栏可导航体可以使用一系列 focus() 调用来跨 围栏框架边界发送任意数据,这是一种隐私泄漏。为避免这种情况,我们实际上会“围栏化” focus() 方法,它为了隐私牺牲了一些功能。

修改聚焦步骤,使其接受一个新的可选布尔值参数 unfenced,默认值为 false。

在算法第 3 步(会改变新的焦点目标)之后添加一个新步骤,内容为:

  1. 如果 new focus target 是一个围栏可导航体容器,且具有非 null 的 围栏可导航体,则将 new focus target 设为该 围栏可导航体活动 document

在定义 new chain 变量的步骤之后添加一个新步骤,内容为:

  1. 如果 unfenced 为 false,new chain 包含一个 Document document,其节点可导航体可遍历可导航体是一个 围栏可导航体,且 old chain 并不也 包含 document,则返回。

    注: 这就是在焦点尝试跨越围栏时,我们如何在调用 焦点更新步骤之前提前退出。

修改聚焦步骤中算法步骤之后的用户代理句子,使其内容为:

每当用户尝试将焦点移动到 candidate 时,用户代理必须立即对一个可聚焦区域可导航体 candidate 运行聚焦步骤,并将 unfenced 设为 true。

修改accesskey 属性 命令算法的操作,使其为:
  1. 对该元素运行聚焦步骤,并将 unfenced 设为 true。

  2. 在该元素上触发一个 click 事件

修改用户激活一个点击可聚焦可聚焦区域 时的行为,使其为:

当用户激活一个点击可聚焦可聚焦区域时,用户代理必须 对该可聚焦区域运行聚焦步骤,并将 focus trigger 设为 "click",且将 unfenced 设为 true。

修改隐藏 popover 算法的第 10 步,使其内容为:
  1. 如果 previouslyFocusedElement 不是 null,则:

    1. element先前聚焦元素设为 null。

    2. 如果 focusPreviousElement 为 true,则对 previouslyFocusedElement 运行聚焦步骤,并将 unfenced 设为 true;执行此步骤时不应滚动 视口。

注: 尽管手动关闭 popover 是一个 用户发起的手势, 聚焦步骤仍会在 unfenced 设为 false 的情况下被调用, 无论这是通过用户手势调用还是通过脚本调用。

修改交互式验证约束 算法第 3 步的第一个项目符号,使其内容为:
has focus 步骤算法的 while 循环第 2 步之后添加一个步骤,内容为:
  1. 如果 candidate聚焦区域是一个围栏可导航体容器,且具有一个非 null 的 围栏可导航体,则将 candidate 设为该围栏 可导航体容器围栏可导航体活动 document

修改焦点链算法中 while 循环的第 3 步,使其内容为:
  1. 如果 currentObject 是一个可聚焦区域,则将 currentObject 设为 currentObjectDOM 锚点节点 document

    否则,如果 currentObject 是一个 Document, 其节点可导航体父级 非 null,则将 currentObject 设为 currentObject节点可导航体父级

    否则,如果 currentObject 是一个 Document, 其节点可导航体是一个可遍历可导航体,且其非围栏父级非 null,则 将 currentObject 设为 currentObject节点可导航体非围栏父级

    否则,中断

修改获取可聚焦区域算法。向 switch 语句添加一个新 case:
如果 focus target 是一个围栏可导航体容器,且具有非 null 的 围栏可导航体

返回该围栏可导航体容器围栏可导航体活动 document

注: 此算法可以无条件“跳过围栏” 边界,因为其返回值总是 会输入到一个确实会谨慎考虑围栏边界的算法中。

修改顶级可遍历体的当前聚焦区域算法的第 3 步,使其内容为:
  1. candidate聚焦区域是一个具有 非 null 内容可导航体可导航体容器,或是一个具有 非 null 围栏可导航体围栏 可导航体容器循环:将 candidate 设为该可导航体容器内容可导航体,或该围栏 可导航体容器围栏可导航体活动 document,取其中非 null 的那个。

修改顺序焦点导航算法的第 6 步,使其内容为:
  1. 如果 candidate 不是 null,则对 candidate 运行聚焦步骤,并将 unfenced 设为 true,然后返回。

修改顺序焦点导航算法的第 9 步,使其内容为:

  1. 否则,starting point 是一个可聚焦区域,其节点 document节点可导航体是一个子可导航体围栏可导航体。将 starting point 设为该节点可导航体非围栏 父级,并返回到 标记为 loop 的步骤。

修改顺序导航搜索算法的第 2 步,使其内容为:
  1. 如果 candidate 是一个可导航体容器,且具有非 null 的 内容可导航体,则令 new candidate 为使用 candidate内容可导航体作为第一个参数、 direction 作为 第二个参数,并以 sequential 作为第三个参数运行 顺序导航搜索 算法的结果。

    如果 candidate 是一个围栏可导航体容器,且具有非 null 的 围栏可导航体,则令 new candidate 为使用 candidate围栏可导航体作为第一个 参数、 direction 作为第二个参数,并以 sequential 作为第三个参数运行 顺序导航搜索 算法的结果。

    如果 new candidate 为 null,则令 starting pointcandidate,并返回到此算法的开头。否则,令 candidatenew candidate

测试

本节描述 fencedframe 元素如何与极其复杂的导航过程交互,该过程包括与各种标头、隔离机制和策略的集成。

3.8.1. `Supports-Loading-Mode` HTTP 响应标头

本节旨在对 [HTML] Standard 进行猴子补丁,然而由于 `Supports-Loading-Mode` 标头 尚未合并到 [HTML] 中, 而是存在于 [Prerendering-Revamped] 规范中,因此本节实际上 是对该猴子补丁规范进行猴子补丁。

将下面新的token添加到 `Supports-Loading-Mode` 响应 标头的有效token列表中:

`fenced-frame` token 表示 该响应可用于在围栏可导航体内创建一个 Document。 如果没有这种显式选择加入,则围栏可导航体内的所有导航都将失败,如 § 3.8 导航中所述。

修改 [HTML]尝试填充历史 条目的 document算法,使得 在已排队任务内以 "If failure is true, then:" 开头的步骤之前,插入一个 新步骤:
  1. 否则,如果以下所有条件为 true:

    则将 failure 设为 true。

3.8.2. `Allow-Fenced-Frame-Automatic-Beacons` HTTP 响应标头

提供一个 document 资源,该资源被加载到一个 Document 中,而该 Document 与其浏览上下文围栏框架配置 实例映射 url不是同源,同时带有 Allow-Fenced-Frame-Automatic-Beacons HTTP 响应标头,会使该 Document 选择加入:当它执行导航时触发自动 beacon 事件。此标头是一个 结构化标头,其值必须是一个布尔值

3.8.3. `Allow-Cross-Origin-Event-Reporting` HTTP 响应标头

提供一个 document 资源,该资源由具有 Allow-Cross-Origin-Event-Reporting HTTP 响应标头的围栏框架配置实例加载到 fencedframe 中,会使该 Document 的 跨源子可导航体选择加入,使其能够发送 reportEvent() beacon。此标头是一个结构化 标头,其值必须是一个 布尔值

3.8.4. COOP、COEP 和跨源隔离

在本规范之外,`Cross-Origin-Opener-Policy` 标头仅应用顶级 可遍历体而非所有可导航体,并且本规范延续了这一 意图,即此标头不会影响围栏可导航体,也不会从其嵌入者继承。 因此,托管在围栏可遍历可导航体内的浏览上下文组跨源隔离模式始终会被设为 "none"。

不过,围栏可导航体会遵守其非围栏父级嵌入者策略,这通过以下内容实现:

检查导航 响应对其嵌入者策略的遵守情况算法中,将所有出现的:

重写为:

注: 这会导致 fencedframe 内部的导航在未提供合适的 `Cross-Origin-Embedder-Policy` 标头时失败,就像 iframe 的行为一样。

确定我们是否需要 围栏化或非围栏化排入跨源嵌入者 策略继承违规算法,因为让它非围栏化可能会造成隐私泄漏。

接下来,我们修改跨源资源策略检查如何应用 于导航请求。按如下方式重写通过获取创建导航参数算法 的第 19 步子步骤 13:
  1. 如果 response 不是网络错误navigable 是一个子可导航体围栏可导航体,且使用 navigable非围栏容器 documentnavigable非围栏容器 document相关设置对象request目标response 和 true 执行跨源资源策略检查的结果为 blocked, 则将 response 设为一个网络错误,并中断

    注: 这里我们是在针对 非围栏父级可导航体运行跨源资源策略检查,而不是针对 navigable 本身。这是 因为我们关心的是嵌入内容相对于嵌入者上下文的同源性(忽略“围栏”),而不是导航源。

确定我们是否需要 围栏化或非围栏化排入跨源嵌入者 策略 CORP 违规报告算法,因为让它非围栏化可能会造成隐私泄漏。

测试
将以下新的添加到源快照参数结构体中:
发起者 围栏框架配置实例

一个围栏框架配置实例或 null, 初始为 null。

发起者祖先根 源

一个或 null,初始为 null。

发起者 祖先根 referrer 策略

一个referrer 策略或 null,初始为 null。

目标围栏框架 配置

一个围栏 框架配置或 null,初始为 null。

注: 发起者围栏框架 配置实例是加载到导航发起者浏览上下文中的围栏框架配置实例,如果存在的话。 对于组件广告,发起者祖先根 源是顶级广告容器的源(如果存在)。对于组件广告,发起者祖先根 referrer 策略是顶级广告容器的 referrer 策略(如果存在)。 如果由 fencedframe 发起的 导航成功,它们会被尝试发送自动 beacon算法用于比较 ,并确定要向哪些 FenceReportingDestination 发送 beacon,以及附带什么 信息。另一方面,目标围栏框架配置是未实例化围栏框架配置,它会在 以围栏框架为目标的导航中加载到 fencedframe 元素中。 这些字段之间并不会以任何有意义的方式相互交互。

已启用 attribution reporting

一个布尔值

attribution reporting 上下文源

一个

允许自动 beacon

一个布尔值

快照自动 beacon 存储

一个快照自动 beacon 存储

要给定一个 Document sourceDocument快照自动 beacon 数据映射
  1. 断言这些步骤正在 sourceDocument事件循环上运行。

  2. info 为一个新的空快照自动 beacon 存储

  3. mappinginfo数据映射

  4. crossOriginMappinginfo跨源 暴露数据映射

  5. current navigablesourceDocument节点可导航体

  6. current navigable 不是 null 时循环

    1. 对于 current navigable活动 document自动 beacon 数据 映射中的每个 typedata 执行

      1. 如果 mapping[type] 不存在,则将 mapping[type] 设为 data

      注: 这保证了第一个包含特定类型自动 beacon 数据的 祖先可被发起导航的 document 使用。这也会 防止某个祖先阻止 document 使用在更高层祖先中设置的数据。

      1. 如果 crossOriginMapping[type] 不存在,且 datacrossOriginExposed 为 true,则将 crossOriginMapping[type] 设为 data

    2. current navigable 设为 current navigable父级

  7. 返回 info

注: 存储在 info 中的映射意在 保存对原始 Document自动 beacon 数据映射的引用,这些映射 被用来构造 info。稍后会在尝试发送自动 beacon中修改这些映射,以清除 任何 once 设为 true 的 beacon 数据。

要获取给定 Document sourceDocument发起者的围栏曾祖先的 可导航体
  1. navigablesourceDocument节点可导航体

  2. navigable 不是 null 且 navigable 不是围栏可导航体时:

    1. navigable 设为 navigable父级

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

  4. 断言navigable 是一个围栏可导航体

  5. navigable 设为 navigable非围栏 父级

  6. navigable 不是 null 且 navigable 不是围栏可导航体时:

    1. navigable 设为 navigable父级

  7. 返回 navigable

给定一个嵌入在 fencedframe 内部的 Document, 此算法会获取该 document 最近的围栏框架祖先的最近围栏框架祖先的可导航体。如果不存在这样的“围栏 框架曾祖先”,则该算法返回 null。因此,只有当给定 Document 至少位于一个本身也位于 围栏框架中的围栏框架内时,此算法才会返回一个可导航体。例如,对于给定的框架树结构:
Main frame (origin A)
  <fencedframe> (origin B)
    <iframe> (origin C)
      <fencedframe> (origin D)
        <iframe> (origin E)
          <fencedframe> (origin F)

给定每个 document 时,该算法将返回以下内容:

  • Main frame (origin A) 将返回 null

  • <fencedframe> (origin B) 将返回 null

  • <iframe> (origin C) 将返回 null

  • <fencedframe> (origin D) 将返回 <fencedframe> (origin B)

  • <iframe> (origin E) 将返回 <fencedframe> (origin B)

  • <fencedframe> (origin F) 将返回 <fencedframe> (origin D)

修改快照源快照参数算法,使其返回一个具有以下 额外字段的源快照参数
发起者围栏 框架配置实例

sourceDocument浏览上下文围栏框架配置 实例

发起者祖先根 源

如果在 sourceDocument 上运行获取发起者的围栏 曾祖先的可导航体的结果为 null,则为 null。否则,为 sourceDocument发起者的围栏 曾祖先的可导航体活动 document

发起者祖先 根 referrer 策略

如果在 sourceDocument 上运行获取发起者的围栏 曾祖先的可导航体的结果为 null,则为 null。否则,为 sourceDocument发起者的围栏 曾祖先的可导航体活动 document策略容器referrer 策略

已启用 attribution reporting

确定 sourceDocument 是否被允许使用 "attribution-reporting" 特性的结果

attribution reporting 上下文源

sourceDocument上下文源

允许自动 beacon

sourceDocument允许自动 beacon

快照自动 beacon 存储

sourceDocument 上运行快照自动 beacon 数据 映射的结果。

修改导航必须是 replace算法。添加以下 新条件:
测试
修改 [HTML]navigate 算法,使其包含一个额外参数:一个可选的字符串 sharedStorageContext(默认值为 null)。

[HTML]navigate 算法第 5 步之后添加一个步骤,内容为:

  1. 如果给定 sourceDocument节点可导航体运行确定可导航体是否已为自身撤销网络的结果为 true,则返回。

修改 [HTML]navigate 算法第 13 步("If all of the following are true:"),以 包含以下条件:

测试

将这些步骤插入到第 22 步,即并行地执行的步骤之后,使得 后续内容成为已修补算法中最先并行地运行的步骤:

  1. 如果 url 是一个urn uuidnavigable 是一个围栏可导航体

    上述条件没有达到 应有的严格程度。例如,如果一个 fencedframe 使用生成配置的 API 生成一个 FencedFrameConfig, 然后正确猜出该配置的 urn:uuid,那么理论上它可以 通过类似 location API 的方式,将猜出的 urn 作为一个URL传入 navigate 算法, 从而将自身导航到该配置。 这很糟糕,因为 FencedFrameConfig 的目的 是确保只有嵌入者才能通过直接使用配置对象,将 fencedframe 导航到由该配置表示的资源。有关修复此问题的想法,请参见 #194

    1. config 为在 sourceDocument节点可导航体可遍历可导航体围栏框架配置 映射查找配置的结果。

      注: 这可能会“等待” 任意长时间,直到与 urn uuid url 关联的 config围栏框架配置 映射中“完成”。这就是为什么此步骤并行地运行。若随后发生任何嵌入者发起的导航,则该导航 通过通常跟踪进行中的导航的机制被取消。

    2. config嵌入者 shared storage 上下文设为 sharedStorageContext

    3. 断言sourceSnapshotParams目标围栏框架 配置 为 null。

    4. sourceSnapshotParams目标围栏框架 配置设为 config

    5. 断言 config映射 url是一个 URL,其scheme为 "https"。

    6. url 设为 config映射 url

    7. 运行 config导航时回调中的步骤。

  2. 如果 navigable 是一个围栏可导航体,且 sourceDocument节点可导航体位于 navigable活动 document祖先可导航体中,且 unfenced 设为 true:

    1. config 为一个新的围栏框架配置,具有以下

      映射 url

      一个具有以下结构体

      url

      可见性

      transparent

      有效 沙盒化标志

      一个具有以下结构体

      默认 围栏框架有效沙盒化标志

      可见性

      opaque

      有效 启用权限

      null

    2. 断言sourceSnapshotParams目标围栏框架 配置 为 null。

    3. sourceSnapshotParams目标围栏框架 配置设为 config

测试

将以 "Let unloadPromptCanceled be the result of" 开头的步骤重写为:

  1. 如果 navigable 是一个围栏可导航体,则令 unloadPromptCanceled 为 false;否则为对 navigable活动 document包含后代可导航体检查卸载是否被用户取消的结果。

在第 22.8.2 步(Let finalSandboxFlags be the union...)之后添加一个步骤,内容为:

  1. 如果 sourceSnapshotParams目标围栏框架 配置不是 null, 且如果 sourceSnapshotParams目标围栏框架 配置有效沙盒化标志 不是 null,则将 finalSandboxFlags 设为 finalSandboxFlagssourceSnapshotParams目标围栏框架 配置有效沙盒化标志之间的并集

    注: 这确保 finalSandboxFlags 至少目标围栏框架 配置中定义的有效沙盒化标志 一样严格。被 沙盒化标志阻止?算法中的单独检查会确保 finalSandboxFlags 不会比有效沙盒化标志更严格。

测试


下面的补丁使用此前已赋值的目标围栏框架配置,并实例化 它,以便在导航 最终完成时使用。

导航参数结构体添加一个新的
围栏框架配置实例

一个围栏框架配置实例或 null, 初始为 null。

注: 这仅会为 嵌入者发起的 fencedframe 导航设置;如果这样的导航创建了一个新的 Document, 则该成员会转移到新的 围栏可导航体活动浏览上下文围栏框架配置 实例成员。

修改 [HTML]通过获取创建导航参数算法,使得最后 返回导航参数的步骤具有以下额外赋值:
围栏框架配置实例

如果 sourceSnapshotParams目标围栏框架 配置为 null,则为 null;否则,为实例化 sourceSnapshotParams目标围栏框架 配置的结果。


最后,下面的补丁使用导航参数围栏框架配置实例,并 处理由导航发起的浏览上下文围栏框架配置实例赋值。

注: 浏览上下文围栏框架配置实例会以两种 不同方式赋值:(1) 在嵌入者发起的 fencedframe 导航期间赋值,如本节其余部分 所述;以及 (2) 在可遍历可导航体围栏可导航体子可导航体中,为 Document 初始创建期间继承,如§ 3.3 对创建浏览上下文的修改一节中处理的那样。

对于 fencedframe 内部的任何成功导航, 无论它是由 fencedframe 中的内容发起,还是由其嵌入者发起,都恰好会发生以下两种情况之一:

修改 [HTML]创建并初始化 Document 对象算法,在 第 2 步之后插入一个步骤,内容为:
  1. 如果 navigationParams围栏框架配置 实例不是 null:

    1. 断言browsingContext 不等于 navigationParams可导航体活动浏览上下文

      注: 这是因为 嵌入者发起的导航(由 navigationParams围栏框架配置 实例非 null 表示)始终会导致一次 § 3.8.6 浏览上下文组交换

    2. navigationParams围栏框架配置 实例允许跨源 报告设为在 navigationParams响应标头列表上,给定 `Allow-Cross-Origin-Event-Reporting` 和 "item",运行获取结构化字段 值的结果。

    3. browsingContext围栏框架配置 实例设为 navigationParams围栏框架配置 实例

在第 9 步之后添加一个新步骤,内容为:

  1. automaticBeaconsAllowed 为在 navigationParams响应标头列表上 给定 `Allow-Fenced-Frame-Automatic-Beacons` 和 "item",运行获取结构化字段值的结果。

进一步重写第 10 步(现在为第 12 步),以返回一个带有额外参数的新 Document

允许自动 beacon

automaticBeaconsAllowed

修改 [HTML]尝试填充历史 条目的 document算法第 5 步子步骤 4("Otherwise, if any of the following are true:"),以包含以下条件:

3.8.6. 浏览上下文组交换

fencedframe 的嵌入者在该框架内部发起导航时,我们必须执行一次 浏览上下文组交换,以完全重置该框架内部的上下文, 确保没有任何遗留内容会泄漏给下一个 Document

修改 [HTML]尝试填充历史 条目的 document算法。在读取为 "6. Queue a global task on the navigation and traversal task source" 的步骤 之前添加一个步骤,内容为:
  1. 如果以下所有条件为 true:

    则将 navigationParamsCOOP 强制执行结果需要浏览上下文组切换布尔值设为 true。

    这确实 可行,但我们应考虑使用一种单独机制来完成此事, 而不是搭载在 COOP 机制之上;COOP 机制在设计时并未考虑围栏框架, 并且可能会以给本规范带来不期望副作用的方式演进。

3.8.7. "_unfencedTop" 导航目标

围栏框架使用一个额外的保留导航目标 "_unfencedTop" 来导航。 本节修补 [HTML] 规范的相关部分,以添加对这个新的 保留关键字的支持。

修改有效可导航体目标名称或关键字,以 包含一个名为 "_unfencedTop" 的新关键字。

修改下面的段落,以将以下文本替换掉:

替换为:

注: 这一更改是必要的,因为本规范 添加了 可遍历可导航体顶级可遍历体之间的区别,而二者此前 在功能上是等价的。

在下面的表格中,添加一个名为 "Effect in a fenced frame" 的列。此列中所有现有 行的值都与 "ordinary effect" 相同。然后,添加两行,其内容为:

关键字 普通效果 在具有……的 iframe 中的效果 fencedframe 中的效果>
sandbox="" sandbox="allow-top-navigation"
如果 outermost top 是 current,则为 _unfencedTop new maybe new maybe new current
如果 outermost top 不是 current,则为 _unfencedTop new maybe new maybe new outermost top
选择可导航体的规则当前步骤 6 和 7 之间 添加一个额外步骤,内容为:

6.5. 否则,如果 name 与 "_unfencedTop" 进行 ASCII 大小写不敏感匹配,且 currentNavigable可遍历可导航体是一个围栏可导航体,则将 chosen 设为 currentNavigable顶级可遍历体

3.9. 页面可见性

修改 Page visibility 一节(位于 [HTML]), 使得当用户代理更改一个 可遍历可导航体系统可见性状态时运行的算法第一步,会调用包含后代可导航体算法,并将 unfenced 设为 true。

3.10. 事件

3.10.1. onfencedtreeclick 事件处理器

修改 元素、Document 对象和 Window 对象上的事件处理器一节(位于 [HTML])中的表格,以包含一个新行。
事件处理器 事件处理器事件类型
onfencedtreeclick fencedtreeclick

修改 GlobalEventHandlers 接口如下:

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onfencedtreeclick;
};

此外,修改 可在任何 HTML 元素上指定的事件处理器内容属性 列表(位于 [HTML]),以包含一个 新行:

3.10.2. fencedtreeclick 事件类型

修改 Events 表格(位于 Index 一节,属于 [HTML]),以 包含一个新行。
事件 接口 相关目标 描述
fencedtreeclick Event 元素 在一个 fencedframe 元素的 围栏可导航体Document 调用 notifyEvent() 后异步触发

4. 与其他规范的交互

由于 fencedframe 元素及其与可导航体浏览上下文组等核心概念的交互,必然具有横切性质,因此有许多 规范依赖的术语,其用法必须结合本规范重新评估; 本节容纳我们提议对其他规范作出的各种更改。

4.1. 预渲染

Prerendering Revamped 规范定义了可导航体加载模式及其可取值。我们的 规范为围栏框架添加了另一个值:

"fencedframe"

可导航体正在显示 fencedframe 的 内容

指定导致以下情况的行为:

测试

4.2. 内容安全策略

本引言小节是非规范性的

通常,Content Security Policy [CSP] 可由与托管可导航体容器Document 关联的 Web 内容使用,以限制子可导航体中导航的来源。

为了防止 [CSP] 被用作通信侧信道,向运行其嵌入者的站点暴露 fencedframe 内部导航的 URL,能够影响 fencedframe 导航的唯一源 表达式是:

请参见描述此内容的CSP 解释文档

4.2.1. 算法

frame-src 预请求检查的第 2 步之后添加一个步骤,内容为:
  1. 如果 request目标为 "fencedframe",且 此指令的 包含 "https:"、"https://*:*" 或 "*" 中的任意一个,则返回 "Blocked"。

frame-src 后请求检查的第 2 步之后添加一个步骤,内容为:
  1. 如果 request目标为 "fencedframe",且 此指令的 包含 "https:"、"https://*:*" 或 "*" 中的任意一个, 则返回 "Blocked"。

接下来,我们修改 [CSPEE] 规范的行为。如果嵌入框架指定了 必需 CSP,围栏框架将不会加载。这样做是为了 防止从嵌入者到围栏框架的任意数据流。

响应 对请求是否被上下文的必需 CSP 阻止? 算法的第 1 步之后添加一个步骤,内容为:
  1. 如果 context必需 csp不是 null,且 request目标为 "fencedframe", 则返回 "Blocked"。

4.2.2. 新的 fenced-frame-src [CSP] 指令

由于 fencedframe 是不同于 iframe 的元素, 使用 frame-src 指令无法让网站对其 CSP 规则拥有足够控制。引入一个新的 [CSP] 指令fenced-frame-src。下面给出被猴子补丁修补后的规范:

fenced-frame-src 指令限制可以加载到 fencedframe围栏可导航体中的 URL。该 指令的 名称和值的语法由以下 ABNF 描述:
directive-name  = "fenced-frame-src"
directive-value = serialized-source-list
给定具有以下 Content Security Policy 的页面:
Content-Security-Policy: fenced-frame-src https://example.com/

以下代码的获取将返回网络错误,因为提供的 URL 与 fenced-frame-src源 列表不匹配:

<fencedframe src="https://example.org/">
</fencedframe>

预请求 检查后请求 检查将 与 frame-src 的检查相同。

将修订 default-src 指令的示例 7 和示例 8。在其 表述为:
Content-Security-Policy: connect-src 'self';
                        ...
                        worker-src 'self'

现在将表述为:

Content-Security-Policy: connect-src 'self';
                        ...
                        fenced-frame-src 'self';
                        ...
                        worker-src 'self'
指令回退 列表的第 1 步中,向列表添加一个新条目:
"fenced-frame-src"
  1. 返回 << "fenced-frame-src", "frame-src", "child-src", "default-src" >>

修改获取请求的有效指令算法第 3 步的 switch, 以包含以下 case:
"fencedframe"
  1. 返回 fenced-frame-src

测试

4.3. 权限策略

本引言小节是非规范性的。

可用于 fencedframe 内部 Document受策略控制的特性, 以及计算它们的方式,会根据 fencedframe 导航到的围栏框架配置如何构造而变化。

通过 Web 平台上的 FencedFrameConfig 构造器创建的围栏框架配置实例将具有灵活权限策略行为,且它所导航的 fencedframe 的内部 Document 只要权限属于围栏框架 允许权限列表,就会被允许继承这些权限。所有 其他受策略控制的特性都将被禁用。

通过会设置其有效启用权限的 配置生成 API 创建的围栏框架配置实例将 具有固定权限策略行为,且它所导航到的 fencedframe 的内部 Document 将把有效启用权限作为将在该 Document 中启用的 受策略控制的特性的唯一 列表(其他所有特性都将被 禁用)。

fencedframe 导航到具有固定权限策略行为围栏框架配置实例期间,它会将 正在导航到的围栏框架配置实例有效启用 权限与产生的 Document权限策略继承策略进行比较。只有当每个继承策略值为 "Enabled" 的继承特性,也 出现在有效启用 权限围栏框架配置实例中时,该导航才会成功。否则, 嵌入 fencedframe 的环境会被视为不适合该围栏框架配置, 并且导航会被阻止。

同时,为确保 fencedframe 的 嵌入者不会根据该导航的直接影响框架中的内容(因为该源 派生自跨站数据),本规范修改了多个 [PERMISSIONS-POLICY] 算法, 使 fencedframe Document继承策略在计算时 不考虑其是否与其嵌入者同源。 因此,某个特性只有在其嵌入者通过特殊值 * 允许列表显式 委托它时,才能在 fencedframe 内部启用。

考虑以上所有内容,对于固定权限策略行为导航,我们得到以下有趣影响:

下面一节中的补丁会“围栏化”适当的 [PERMISSIONS-POLICY][HTML] 算法,以实现上述说明性内容中描述的结果。

4.3.1. 定义

围栏 框架允许权限是 "private-aggregation"、 "shared-storage" 或 "shared-storage-select-url"。

4.3.2. 算法补丁

iframe 元素的 allow 属性一节重命名为“iframefencedframe 元素的 allow 属性”,并重写该节为:

iframefencedframe 元素分别具有 allow 属性 (iframeallowfencedframeallow), 其中包含一个ASCII 序列化策略指令

属性中命名特性的允许列表可以为空;在这种情况下,该允许列表的默认 值为 "src",它表示 iframe 的 src 属性中 URL 的源,或 fencedframe 的围栏框架配置

非空时, iframeallowfencedframeallow 属性会在构造 iframefencedframe容器策略时,为每个受支持特性添加一个允许列表

创建一个名为为围栏可导航体创建权限策略的新算法。

给定一个围栏可导航体容器container)和 一个origin),此算法 返回一个新的权限策略

  1. fencedFrameConfigcontainer节点 document活动浏览上下文围栏框架配置 实例

  2. inheritedPolicy 为一个新的有序 映射

  3. 如果 fencedFrameConfig 不是 null,且 fencedFrameConfig权限策略 行为fixed,则:

    1. 对于每个受支持的 feature 执行

      1. 如果 fencedFrameConfig有效 启用权限 包含 feature,则将 inheritedPolicy[feature] 设为 "Enabled"。

        否则,将 inheritedPolicy[feature] 设为 "Disabled"。

      注: 虽然这没有将 allow 属性纳入考虑,但由于导航请求的导航响应是否应被权限策略阻止?, 在调用这里之前它已经被检查过了。任何在 allow 中指定的过于严格的策略都会导致围栏框架不加载, 而任何比有效启用 权限中指定的内容更宽松的策略都将被忽略。

  4. 否则:

    1. 对于每个受支持的 feature 执行

      1. 如果 feature 匹配围栏框架允许 权限之一,则将 inheritedPolicy[feature] 设为给定 featurecontainerorigin 运行为容器中某源处的特性定义继承策略的结果。

        否则,将 inheritedPolicy[feature] 设为 "Disabled"。

  5. policy 为一个新的权限策略,其继承策略inheritedPolicy,且声明策略初始化为两个新的 有序映射

  6. 返回 policy

修改为可导航体创建权限策略算法:

给定 null 或一个元素container)、一个origin),以及一个默认值为 false 的可选布尔值 matchAll,此算法返回一个新的权限策略

将第 1 步重写为:

  1. 断言:如果非 null,container 要么是可导航体容器,要么是 围栏可导航体容器

将第 3 步重写为:

  1. 对于每个受支持的 feature 执行

    1. isInherited 为在 featurecontaineroriginmatchAll 上运行为容器中某源处的特性定义继承策略的结果。

    2. inherited policy[feature] 设为 isInherited

修改从响应为可导航体创建权限策略 算法,使其内容为:

给定 null、一个可导航体容器围栏可导航体 容器container)、一个 origin),以及一个响应response),此算法返回一个 新的权限策略

将第 1 步重写为:

  1. 如果 container 是一个围栏可导航体容器,则令 policy 为给定 containerorigin 运行 为围栏可导航体创建权限策略的结果。

    否则,令 policy 为给定 containerorigin 运行为可导航体创建权限策略的结果。

修改处理权限策略属性算法的第 1 步,使其内容为:
  1. 如果 element 不是 iframe 元素,也不是 fencedframe 元素,则 返回一个空的策略指令

修改 [HTML]尝试填充历史 条目的 document算法。向第 6.4 步(Otherwise, if any of the following are true:)添加 以下条件:

注: 如果这些算法中的任意一个返回 "Blocked",则 fencedframe 中已有的 Document 不会继续保留;将加载错误页面。

导航请求的导航响应是否应被权限策略阻止?

给定一个导航参数navigationParams),此算法 返回 "Blocked" 或 "Allowed":

  1. navigablenavigationParams可导航体

  2. 如果 navigable 不是一个围栏可导航体,则返回 "Allowed"。

  3. originnavigationParams

  4. effective permissionsnavigable活动浏览上下文围栏框架配置 实例有效启用 权限

    根据 pull request #84 中省略的工作,配置实例 此时尚未赋值给浏览上下文。我们应考虑把该实例存储在 navigationParams 中,并改为从这里引用它。

  5. permissionsPolicy 为给定 navigable围栏 可导航体容器origin 和 true 创建权限策略的结果。

    注: 这几乎等同于在导航构造此待定导航的最终 Document 时将会被创建权限策略。区别在于,此算法就像在 iframe 上调用时一样, 会包含 allow 属性中指定的所有权限,即使该权限未在围栏框架配置有效启用 权限中指定。我们现在创建它并对其运行 测试,因为这是确定导航是否会失败的适当时机,然后 将其丢弃。如果导航成功,它将被重新创建并无条件安装 到 Document 上。 但是,重新创建时不会包含任何未包含在有效启用 权限中的额外启用权限, 从而有效地将启用权限锁定为有效启用 权限中指定的内容。

  6. inheritedPolicypermissionsPolicy继承策略

  7. 对于 effective permissions 中的每个 effective permission 执行

    1. 如果 inheritedPolicy[effective permission] 为 "Disabled",则返回 "Blocked"。

  8. 返回 "Allowed"。

导航请求的导航响应是否应被沙盒化标志阻止?

给定一个导航参数navigationParams)和一个源快照参数sourceSnapshotParams),此算法返回 "Blocked" 或 "Allowed":

  1. navigablenavigationParams可导航体

  2. 如果 navigable 不是一个围栏可导航体,则返回 "Allowed"。

  3. effectiveSandboxingFlagssourceSnapshotParams目标围栏框架 配置有效沙盒化标志

  4. 如果 navigationParams最终沙盒化标志集不是 effectiveSandboxingFlags子集,则返回 "Blocked"。

    注: 这意味着最终沙盒化标志集不能限制一个在有效沙盒化 标志中尚未受限的特性,因为额外限制可被用作通信信道。到这个 时点,最终沙盒化标志集将已经被设为 至少有效沙盒化 标志一样严格的内容。

  5. 否则,返回 "Allowed"。

修改为容器中某源处的特性定义 继承策略算法,使其内容为:

给定一个特性(feature)、null 或一个可导航体容器container)、该容器中一个 document 的origin),以及一个默认值为 false 的可选布尔值 matchAll, 此算法返回该特性的继承策略

将第 3 步重写为:

  1. 如果在 featurecontainer节点 documentoriginmatchAll 上执行特性是否在 document 中对某源启用?的结果为 "Disabled",则返回 "Disabled"。

注: 我们不必重写第 2 步;该步骤也 委托给同一个算法,以传入 matchAll 布尔值,因为第 2 步涉及检查 feature 是否已在 container节点 document中启用,而不是在 container 内部托管的 Document 中启用。

将第 7 步重写为:

  1. 如果 matchAll 为 false,feature默认允许列表'self',且 origincontainer节点 document的 origin 同源,则返回 "Enabled"

修改特性是否在 document 中对某源启用?算法,使其内容为:

给定一个特性(feature)、一个 Document 对象(document)、一个origin),以及 一个默认值为 false 的可选布尔值 matchAll,如果 feature 应被视为禁用,则此算法返回 "Disabled",否则返回 "Enabled"。

将第 3 步重写为:

  1. 如果 feature 存在于 policy声明策略中,

    1. 如果 matchAll 为 false,且 policy声明策略feature允许列表匹配 origin,则返回 "Enabled"。

    2. 否则,如果 matchAll 为 true,且 policy声明策略feature允许列表特殊值 *,则返回 "Enabled"。

    3. 否则,返回 "Disabled"。

将第 5 步重写为:

  1. 如果 matchAll 为 false,feature默认允许列表'self',且 origindocument 的 origin 同源,则返回 "Enabled"。

修改声明源算法。在第 3 步之后添加一个新步骤,内容为:
  1. 如果 node节点 document浏览上下文围栏框架配置 实例不是 null,则返回 node节点 document浏览上下文围栏框架配置 实例映射 url

注: 这确保在使用围栏框架配置导航 fencedframe (或使用映射到围栏 框架配置的 urn 导航 iframe)时, 可在 allow 属性中设置的 'src' 允许列表能够生效。

测试

4.4. CSSOM View

[CSSOM-VIEW] 规范定义了 scrollIntoView() 方法,该方法会调用 将目标滚动到视图中算法。这不仅会滚动 Element视口以使目标可见,而且还会在必要时滚动祖先, 以使目标可见,本质上会导致滚动“向上冒泡”。这意味着 在子可导航体围栏可导航体中执行的 scrollIntoView() 可以被其嵌入者观察到,从而允许跨围栏框架 边界进行合谋。本节修补将目标滚动到视图中算法,以牺牲部分实用性 为代价来防止这种合谋。

修改将目标滚动到视图中算法,在算法末尾添加一个步骤, 内容如下:
  1. 如果 scrolling box 关联的 Element 关联的 Document节点可导航体可遍历可导航体是一个围栏可导航体,或者如果 scrolling box 关联的视口关联的 Document节点可导航体可遍历可导航体是一个围栏可导航体,则令 这成为该算法的最后一个实例,并停止原本会继续执行的 任何进一步递归实例。

注: 这允许滚动“向上冒泡”到 围栏框架边界,但不跨越该边界。

测试

4.5. Iframe credentialless

第一个引言小节是非规范性的。

[IFRAME-CREDENTIALLESS] 规范定义了一个新对象,即页面 credentialless nonce。从较高层面看,分区 nonce页面 credentialless nonce具有相同 目的(对存储和网络进行分区)。但是,每个 围栏框架都有自己的唯一 nonce,而页面 credentialless nonce只有一个, 其作用域限定为可遍历可导航体活动 window,并由所有 后代 credentialless iframe 共享。

在围栏框架和 credentialless iframe 同时存在于同一树中的情况下,子级的 nonce 始终优先于其父级的 nonce。例如:

除了资源分区之外,分区 nonce还用于 撤销围栏框架中的网络访问。将以下猴子补丁应用到 [IFRAME-CREDENTIALLESS] 规范。

添加以下算法:

要在给定布尔值 credentialless分区 nonce或 null newFencedFrameNonce 的情况下,为 browsing context 计算有效分区 nonce
  1. 如果 credentialless 为 true,则返回关联浏览上下文顶级浏览上下文页面 credentialless nonce

  2. 如果 newFencedFrameNonce 不是 null,则返回 newFencedFrameNonce

  3. instance 为关联浏览上下文围栏框架配置 实例

  4. 如果 instance 不是 null,则返回 instance分区 nonce,否则返回 null。

网络分区键重定义整体重写为:

网络分区键是一个由以下内容组成的元组

第 6.1.9.1 节整体重写如下:

通过获取创建导航参数中,在第 18 步和第 19 步之间添加一个 新步骤,其内容为:

  1. partitionNonce 为在 browsingContext 上运行计算有效 分区 nonce的结果,给定在 browsingContext 上计算导航的 credentialless 标志的结果,以及 null。

注: 我们在此处向计算有效 分区 nonce传入 null,是因为 我们希望源自围栏框架的导航获取使用与围栏框架自身相同的分区。 在导航获取完成并初始化 document 后,我们可以通过围栏框架配置实例分区 nonce访问正确的分区 nonce。

将第 19 步重新编号为第 20 步,并将第 20.2.4 步重写为:

  1. request保留客户端设为一个新的环境,其 id 是一个唯一不透明字符串,目标浏览上下文navigable活动浏览上下文创建 URLcurrentURL顶级创建 URLtopLevelCreationURL顶级源 topLevelOrigin,且分区 noncepartitionNonce.

修改添加到 初始化 document 对象的步骤,使其内容为:

6.9. 令 partitionNonce 为在 browsingContext计算有效 分区 nonce的结果,给定 navigationParamscredentialless,以及如果 navigationParams围栏框架配置实例为 null,则为 null,否则为 navigationParams围栏框架配置实例分区 nonce

4.6. WebRTC

[WEBRTC] 规范定义了“ECMAScript APIs in WebIDL to allow media and generic application data to be sent to and received from another browser or device implementing the appropriate set of real-time protocols”。促进与对等方连接的接口是 RTCPeerConnection。 在围栏框架中不允许构造此接口,因此也不允许通过 WebRTC 连接到对等方。

修改 RTCPeerConnection constructor 算法,以添加新的第一步和 第二步,内容为:
  1. navigablethis相关全局对象可导航体

  2. 如果 navigable 不是 null,且 navigable可遍历可导航体是一个围栏可导航体,则抛出一个 NotAllowedError DOMException

5. 安全与隐私考虑

这些材料正在从我们的解释文档上游移植到本规范中,在此期间 你可以查阅以下资源:

索引

本规范定义的术语

由引用定义的术语

参考文献

规范性参考文献

[ANONYMOUS-IFRAME]
Iframe credentialless。社区组报告草案。URL:https://wicg.github.io/anonymous-iframe/
[ATTRIBUTION-REPORTING-API]
Attribution Reporting。社区组报告草案。URL:https://wicg.github.io/attribution-reporting-api/
[CSP]
Mike West; Antonio Sartori。Content Security Policy Level 3。URL:https://w3c.github.io/webappsec-csp/
[CSPEE]
Mike West。Prerendering Revamped。 CG-DRAFT。URL:https://w3c.github.io/webappsec-cspee/
[CSS2]
Bert Bos; et al。Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification。URL:https://drafts.csswg.org/css2/
[CSSOM-VIEW]
Simon Pieters。CSSOM View Module。URL:https://drafts.csswg.org/cssom-view/
[DOM]
Anne van Kesteren。DOM Standard。Living Standard。 URL:https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren。Fetch Standard。Living Standard。URL:https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al。HTML Standard。 Living Standard。URL:https://html.spec.whatwg.org/multipage/
[IFRAME-CREDENTIALLESS]
Arthur Sonzogni; Camille Lamy。Iframe credentialless。CG-DRAFT。URL:https://wicg.github.io/anonymous-iframe/
[INFRA]
Anne van Kesteren; Domenic Denicola。Infra Standard。Living Standard。URL:https://infra.spec.whatwg.org/
[MIXED-CONTENT]
Emily Stark; Mike West; Carlos IbarraLopez。Mixed Content。URL:https://w3c.github.io/webappsec-mixed-content/
[PERMISSIONS-POLICY]
Ian Clelland。Permissions Policy。URL:https://w3c.github.io/webappsec-permissions-policy/
[Prerendering-Revamped]
Domenic Denicola; Dominic Farolino。Prerendering Revamped。 CG-DRAFT。URL:https://wicg.github.io/nav-speculation/prerendering.html
[REFERRER-POLICY]
Jochen Eisinger; Emily Stark。Referrer Policy。URL:https://w3c.github.io/webappsec-referrer-policy/
[Reporting]
Douglas Creager; Ian Clelland; Mike West。Reporting API。URL:https://w3c.github.io/reporting/
[RFC6455]
I. Fette; A. Melnikov。The WebSocket Protocol。2011 年 12 月。拟议标准。URL:https://www.rfc-editor.org/rfc/rfc6455
[RFC8941]
M. Nottingham; P-H. Kamp。Structured Field Values for HTTP。2021 年 2 月。拟议标准。URL:https://httpwg.org/specs/rfc8941.html
[Shared-Storage]
Cammie Barnes。Shared Storage API。 CG-DRAFT。URL:https://wicg.github.io/shared-storage/
[TURTLEDOVE]
Protected Audience (formerly FLEDGE)。社区组报告草案。URL:https://wicg.github.io/turtledove/
[URL]
Anne van Kesteren。URL Standard。Living Standard。 URL:https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu。Web IDL Standard。Living Standard。URL:https://webidl.spec.whatwg.org/
[Webpackage]
Loading Signed Exchanges。社区组报告草案。URL:https://wicg.github.io/webpackage/loading.html
[WEBRTC]
Cullen Jennings; et al。WebRTC: Real-Time Communication in Browsers。URL:https://w3c.github.io/webrtc-pc/
[WebSockets]
Adam Rice。WebSockets Standard。Living Standard。URL:https://websockets.spec.whatwg.org/
[WebTransport]
Nidhi Jaju; Victor Vasiliev。WebTransport。 URL:https://w3c.github.io/webtransport/

资料性参考文献

[Protected-Audience]
Paul Jensen。Protected Audience API。CG-DRAFT。 URL:https://wicg.github.io/turtledove/

IDL 索引

[Exposed=Window]
interface HTMLFencedFrameElement : HTMLElement {
  [HTMLConstructor] constructor();

  [CEReactions] attribute FencedFrameConfig? config;
  [CEReactions] attribute DOMString width;
  [CEReactions] attribute DOMString height;
  [SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
  [CEReactions] attribute DOMString allow;
};

enum OpaqueProperty {"opaque"};

[Exposed=Window, Serializable]
interface FencedFrameConfig {
  constructor(USVString url);
  undefined setSharedStorageContext(DOMString contextString);
};

typedef (USVString or FencedFrameConfig) UrnOrConfig;

partial interface Navigator {
  Promise<undefined> deprecatedReplaceInURN(
    UrnOrConfig urnOrConfig, record<USVString, USVString> replacements);
  Promise<USVString> deprecatedURNtoURL(
    UrnOrConfig urnOrConfig, optional boolean send_reports = false);
  sequence<USVString> adAuctionComponents(unsigned short numAdComponents);
};

enum FenceReportingDestination {
  "buyer",
  "seller",
  "component-seller",
  "direct-seller",
  "shared-storage-select-url",
};

dictionary FenceEvent {
  // This dictionary has two mutually exclusive modes that aren’t represented as
  // distinct IDL types due to distinguishability issues:
  //
  // When reporting to a preregistered destination (specified by enum), the following
  // properties are used:
  DOMString eventType;
  DOMString eventData;
  sequence<FenceReportingDestination> destination;

  // Determines if this data can be sent in a reportEvent() beacon or automatic
  // beacon that originates from a document that is cross-origin to the mapped
  // URL of the fenced frame config that loaded this frame tree.
  // Note that automatic beacon data can only be set from documents that are
  // same-origin to the fenced frame config’s mapped URL, so this effectively
  // opts in the data to being used in a cross-origin subframe.
  boolean crossOriginExposed = false;

  // When setting event data to be used later in an automatic beacon, the
  // following properties are used:
  boolean once = false;

  // When reporting to a custom destination URL (with substitution of macros defined by
  // the Protected Audience buyer), the following property is used:
  USVString destinationURL;
};

typedef (FenceEvent or DOMString) ReportEventType;

[Exposed=Window]
interface Fence {
    undefined reportEvent(optional ReportEventType event = {});
    undefined setReportEventDataForAutomaticBeacons(optional FenceEvent event = {});
    sequence<FencedFrameConfig> getNestedConfigs();
    Promise<undefined> disableUntrustedNetwork();
    undefined notifyEvent(Event event);
};

partial interface Window {
  // Collection of fenced frame APIs
  readonly attribute Fence? fence;
};

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onfencedtreeclick;
};

问题索引

不必像通常进行URL 和历史更新步骤那样,在子 可导航体创建顶级 可遍历体创建期间调用它,但我们仍然需要一种机制来初始化新可导航体中的 History.length。 这是 HTML Standard 中已有的问题:https://github.com/whatwg/html/issues/9030
默认值是 "all",因此严格来说我们无需在这里设置任何内容。我们这样做是 为了 提醒自己,在这里跳过 service worker 可能更合适,就像一些 其他 beacon 那样。
这需要一份 RFC,以便向 WPT web driver 添加一个仅用于测试的函数。 (WICG/fenced-frame#192) 一旦完成该 web driver 变更,现有的 Chromium 内部 web platform tests 中针对 disableUntrustedNetwork() 的测试需要上游化并链接到这里。 (WICG/fenced-frame#207
这里需要同时传入围栏框架 nonce,以及 iframe credentialless nonce(如果存在)。 (WICG/fenced-frame#191
其意图是,对于嵌入者发起的 fencedframe 导航,sourceSnapshotParams目标围栏框架配置应为 非 null;否则应为 null。然而,在此问题 解决之前,这一点并不成立。
确定是否需要围栏化或非围栏化排队 跨源嵌入者策略继承违规算法,因为保持其非围栏化可能会导致 隐私泄露。
确定是否需要围栏化或非围栏化排队 跨源嵌入者策略 CORP 违规报告算法,因为保持其非围栏化可能会导致 隐私泄露。
上述条件并不像它需要的那样严格。 例如,如果一个 fencedframe 使用 配置生成 API 生成一个 FencedFrameConfig, 然后正确猜出该配置的 urn:uuid,它理论上可以通过 将猜出的 urn 作为 URL 传入 navigate 算法来导航自身到 该配置,例如通过 location API。这样不好,因为 FencedFrameConfig 的目的在于 确保只有嵌入者才能通过直接使用配置对象,将 fencedframe 导航到该配置所 表示的资源。关于修复此问题的想法,请参见 #194
这确实可行,但我们应考虑使用单独的机制来实现这一点, 而不是搭便车使用 COOP 机制;该机制在设计时并未考虑围栏框架, 并且可能以给本规范带来非预期副作用的方式演进。
规定会导致以下结果的行为:
根据 pull request #84 中省略的工作,配置实例 此时尚未赋值给浏览上下文。我们应考虑把该实例存储在 navigationParams 中,并改为从这里引用它。