1. 2.4 URL
      1. 2.4.1 术语
      2. 2.4.2 解析 URL
      3. 2.4.3 基础 URL 的动态更改
    2. 2.5 获取资源
      1. 2.5.1 术语
      2. 2.5.2 确定资源类型
      3. 2.5.3meta 元素中提取字符编码
      4. 2.5.4 CORS 设置属性
      5. 2.5.5 Referrer 策略属性
      6. 2.5.6 Nonce 属性
      7. 2.5.7 延迟加载属性
      8. 2.5.8 阻止属性
      9. 2.5.9 获取优先级属性

2.4 URL

2.4.1 术语

如果一个字符串是 有效的 URL 字符串,但不是空字符串,则它是一个 有效的非空 URL

如果一个字符串在 剥离前导和尾随 ASCII 空白 后,它是一个 有效的 URL 字符串,则它是一个 有效的 URL,可能被空格包围

如果一个字符串在 剥离前导和尾随 ASCII 空白 后,它是一个 有效的非空 URL,则它是一个 有效的非空 URL,可能被空格包围

本规范将 URL about:legacy-compat 定义为一个保留的,但不可解析的,about: URL,用于在 DOCTYPE 中,在需要与 XML 工具兼容的 HTML 文档 中使用。 [ABOUT]

本规范将 URL about:html-kind 定义为一个保留的,但不可解析的,about: URL,它被用作媒体轨道类型的标识符。 [ABOUT]

本规范将 URL about:srcdoc 定义为一个保留的,但不可解析的,about: URL,它被用作 iframe srcdoc 文档URL[ABOUT]

一个 Document 对象 document回退基础 URL 是通过执行以下步骤获得的 URL 记录

  1. 如果 document一个 iframe srcdoc 文档,则

    1. 断言documentabout 基础 URL 非空。

    2. 返回 documentabout 基础 URL

  2. 如果 documentURL 匹配 about:blankdocumentabout 基础 URL 非空,则返回 documentabout 基础 URL

  3. 返回 documentURL

一个 Document 对象的 文档基础 URL 是通过执行以下步骤获得的 URL 记录

  1. 如果 Document 中没有具有 href 属性的 base 元素,则返回 Document回退基础 URL

  2. 否则,返回 Document 中第一个具有 href 属性的 base 元素的 冻结基础 URL,按照 树序


一个 URL 匹配 about:blank,如果它的 方案 是“about”,它的 路径 包含一个字符串“blank”,它的 用户名密码 是空字符串,并且它的 主机 为空。

这样的 URL 的 查询片段 可以是非空的。例如,通过 解析about:blank?foo#bar” 创建的 URL 记录 匹配 about:blank

一个 URL 匹配 about:srcdoc,如果它的 方案 是“about”,它的 路径 包含一个字符串“srcdoc”,它的 查询 为空,它的 用户名密码 是空字符串,并且它的 主机 为空。

之所以 匹配 about:srcdoc 确保 URL查询 为空,是因为不可能创建一个 iframe srcdoc 文档,它的 URL 具有非空的 查询,这与 Document 不同,DocumentURL 匹配 about:blank。换句话说,所有 URL 中,匹配 about:srcdoc 的 URL 仅在其 片段 上有所不同。

2.4.2 解析 URL

解析 URL 是将一个字符串转换为它表示的 URL 记录 的过程。虽然此过程是在 URL 中定义的,但 HTML 标准定义了一些包装器来抽象基础 URL 和编码。 [URL]

大多数新 API 都是使用 解析 URL。较旧的 API 和 HTML 元素可能需要使用 编码解析 URL。当需要自定义基础 URL 或不需要基础 URL 时,当然也可以直接使用 URL 解析器

解析 URL,给定一个字符串 url,相对于一个 Document 对象或 环境设置对象 environment,执行以下步骤。它们返回失败或一个 URL

  1. 如果 environment 是一个 Document 对象,则将 baseURL 设置为 environment基础 URL;否则,将其设置为 environmentAPI 基础 URL

  2. 返回将 URL 解析器 应用于 url,并使用 baseURL 的结果。

编码解析 URL,给定一个字符串 url,相对于一个 Document 对象或 环境设置对象 environment,执行以下步骤。它们返回失败或一个 URL

  1. encoding 设置为 UTF-8

  2. 如果 environment 是一个 Document 对象,则将 encoding 设置为 environment字符编码

  3. 否则,如果 environment相关全局对象 是一个 Window 对象,则将 encoding 设置为 environment相关全局对象关联的 Document字符编码

  4. 如果 environment 是一个 Document 对象,则将 baseURL 设置为 environment基础 URL;否则,将其设置为 environmentAPI 基础 URL

  5. 返回将 URL 解析器 应用于 url,并使用 baseURLencoding 的结果。

为了编码、解析和序列化一个 URL,给定一个字符串 url,相对于一个 Document 对象或一个 环境设置对象 environment,执行以下步骤。这些步骤将返回失败或一个字符串。

  1. url编码解析一个 URL 的结果,给定 url,相对于 environment

  2. 如果 url 是失败,则返回失败。

  3. 返回将 URL 序列化器 应用于 url 的结果。

2.4.3 基于 URL 的动态更改

当文档的 文档基本 URL 发生更改时,该文档中的所有元素都会 受到基本 URL 更改的影响

以下是 基本 URL 更改步骤,当元素 受到基本 URL 更改的影响(如 DOM 所定义)时,这些步骤将运行。

如果该元素创建了一个 超链接

如果超链接标识的 URL 正在显示给用户,或者从该 URL 衍生的任何数据正在影响显示,则 href 属性的值应 重新解析,相对于元素的 节点文档,并相应地更新 UI。

例如,CSS :link/:visited 伪类 可能受到影响。

如果超链接具有 ping 属性,并且其 URL(s) 正在显示给用户,则 ping 属性的标记应 重新解析,相对于元素的 节点文档,并相应地更新 UI。

如果该元素是 qblockquoteinsdel 元素,并且具有 cite 属性

如果 cite 属性标识的 URL 正在显示给用户,或者从该 URL 衍生的任何数据正在影响显示,则 cite 属性的值应 重新解析,相对于元素的 节点文档,并相应地更新 UI。

否则

该元素不会直接受到影响。

例如,更改基本 URL 不会影响 img 元素显示的图像,尽管随后从脚本访问 src IDL 属性将返回一个新的 绝对 URL,该 URL 可能不再对应于正在显示的图像。

2.5 获取资源

2.5.1 术语

一个 响应,其 类型 为 "basic"、"cors" 或 "default",则为 CORS 同源[FETCH]

一个 响应,其 类型 为 "opaque" 或 "opaqueredirect",则为 CORS 跨源

一个 响应不安全响应 是其 内部响应(如果存在),否则是该 响应 本身。

为了 创建一个潜在的 CORS 请求,给定一个 urldestinationcorsAttributeState 和一个可选的 同源回退标志,执行以下步骤

  1. 如果 corsAttributeState无 CORS,则设 mode 为 "no-cors",否则设为 "cors"。

  2. 如果 同源回退标志 已设置,并且 mode 为 "no-cors",则将 mode 设置为 "same-origin"。

  3. credentialsMode 为 "include"。

  4. 如果 corsAttributeState匿名,则将 credentialsMode 设置为 "same-origin"。

  5. request 为一个新的 请求,其 URLurl目标destination模式mode凭据模式credentialsMode,并且其 使用 URL 凭据标志 已设置。

2.5.2 确定资源类型

必须以与 MIME 嗅探 的要求一致的方式获取和解释资源的 Content-Type 元数据[MIMESNIFF]

必须以与 MIME 嗅探 中给出的要求一致的方式找到资源的 计算出的 MIME 类型[MIMESNIFF]

MIME 嗅探 中还定义了 专门用于嗅探图像的规则用于区分资源是文本还是二进制的规则专门用于嗅探音频和视频的规则。这些规则返回一个 MIME 类型 作为其结果。 [MIMESNIFF]

必须严格遵循 MIME 嗅探 中的规则。当用户代理使用与服务器预期的不同的内容类型检测启发式方法时,可能会出现安全问题。有关更多详细信息,请参阅 MIME 嗅探[MIMESNIFF]

2.5.3meta 元素中提取字符编码

给定一个字符串 smeta 元素中提取字符编码的算法 如下所示。它要么返回一个字符编码,要么不返回任何内容。

  1. positions 中的一个指针,最初指向字符串的开头。

  2. 循环:查找 sposition 之后的前七个字符,它们与单词 "charset" 的 ASCII 不区分大小写 匹配。如果没有找到这样的匹配,则不返回任何内容。

  3. 跳过紧跟在单词 "charset" 之后的任何 ASCII 空格(可能不存在)。

  4. 如果下一个字符不是 U+003D 等号 (=),则将 position 移动到该下一个字符之前,并跳回到标记为 循环 的步骤。

  5. 跳过紧跟在等号之后的任何 ASCII 空格(可能不存在)。

  6. 按以下方式处理下一个字符

    如果它是 U+0022 双引号字符 ("),并且在 s 中存在一个之后的 U+0022 双引号字符 (")
    如果它是 U+0027 单引号字符 ('),并且在 s 中存在一个之后的 U+0027 单引号字符 (')
    返回 从该字符到该字符之后的下一个最早出现的该字符之间的子字符串获取编码 的结果。
    如果它是一个不匹配的 U+0022 双引号字符 (")
    如果它是一个不匹配的 U+0027 单引号字符 (')
    如果不存在下一个字符
    不返回任何内容。
    否则
    返回 从由该字符到第一个 ASCII 空格 或 U+003B 分号字符 (;),或者 s 的结尾(以先到者为准)组成的子字符串获取编码 的结果。

此算法不同于 HTTP 规范中的算法(例如,HTTP 不允许使用单引号,并且需要支持此算法不支持的反斜杠转义机制)。虽然此算法用于在历史上与 HTTP 相关的上下文中,但实现所支持的语法在一段时间之前就发生了分歧。 [HTTP]

2.5.4 CORS 设置属性

属性/crossorigin

所有当前引擎都支持。

Firefox8+Safari6+Chrome13+
Opera?Edge79+
Edge (旧版)12+Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

一个 CORS 设置属性 是一个 枚举属性,包含以下关键字和状态

关键字状态简要描述
anonymous 匿名 对该元素的 请求 将将其 模式 设置为 "cors",并将 凭据模式 设置为 "same-origin"。
(空字符串)
use-credentials 使用凭据 对该元素的 请求 将将其 模式 设置为 "cors",并将 凭据模式 设置为 "include"。

该属性的 缺失值默认值无 CORS 状态,其 无效值默认值匿名 状态。为了 反射 的目的,匿名 状态的 规范关键字anonymous 关键字。

大多数由 CORS 设置属性 控制的获取将通过 创建潜在 CORS 请求 算法进行。

对于更现代的功能,其中请求的 模式 始终为 "cors",某些 CORS 设置属性 已被重新利用,具有稍微不同的含义,其中它们只影响 请求凭据模式。为了执行这种转换,我们定义了给定 CORS 设置属性CORS 设置属性凭据模式,通过切换属性的状态来确定

无 CORS
匿名
"same-origin"
使用凭据
"include"

2.5.5 引用者策略属性

一个 引用者策略属性 是一个 枚举属性。每个 引用者策略(包括空字符串)都是此属性的关键字,映射到相同名称的状态。

该属性的 缺失值默认值无效值默认值 都是空字符串状态。

这些状态对各种 获取 处理模型的影响在本文档、获取引用者策略 中进行了更详细的定义。 [FETCH] [REFERRERPOLICY]

多个信号可以促成对给定 获取 使用哪种处理模型;引用者策略属性 只是其中之一。一般来说,这些信号的处理顺序如下

  1. 首先,noreferrer 链接类型的存在;

  2. 然后,引用者策略属性 的值;

  3. 然后,任何 meta 元素的存在,其 name 属性设置为 referrer

  4. 最后,`Referrer-Policy` HTTP 头部。

2.5.6 随机数属性

Global_attributes/nonce

所有当前引擎都支持。

Firefox31+SafariYesChromeYes
Opera?EdgeYes
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

一个 nonce 内容属性表示一个加密随机数(“一次性使用数字”),它可以被 内容安全策略 用于确定是否允许给定的获取继续。该值是文本。 [CSP]

具有 nonce 内容属性的元素通过从内容属性中获取值,将其移动到名为 [[CryptographicNonce]] 的内部插槽中,通过 HTMLOrSVGElement 接口混合将其公开给脚本,并将内容属性设置为空字符串,从而确保加密随机数仅公开给脚本(而不是公开给 CSS 属性选择器等旁路)。除非另有说明,否则插槽的值为空字符串。

element.nonce

返回为 element 的加密随机数设置的值。如果未使用 setter,则这将是最初在 nonce 内容属性中找到的值。

element.nonce = value

更新 element 的加密随机数的值。

HTMLElement/nonce

Firefox75+Safari🔰 10+Chrome61+
Opera?Edge79+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

在获取时,nonce IDL 属性必须返回此元素的 [[CryptographicNonce]] 的值;在设置时,将此元素的 [[CryptographicNonce]] 设置为给定的值。

请注意,nonce IDL 属性的 setter 不会更新相应的内容属性。这以及下面在元素 变为浏览上下文连接 时将 nonce 内容属性设置为空字符串,旨在防止通过可以轻松读取内容属性的机制(例如选择器)泄露随机数的值。在 问题 #2369 中了解有关此行为的更多信息,其中引入了此行为。

以下 属性更改步骤 用于 nonce 内容属性

  1. 如果 element包含 HTMLOrSVGElement,则返回。

  2. 如果 localName 不是 noncenamespace 不是 null,则返回。

  3. 如果 value 为 null,则将 element[[CryptographicNonce]] 设置为空字符串。

  4. 否则,将 element[[CryptographicNonce]] 设置为 value

每当包含 HTMLOrSVGElement 的元素 包含 变为浏览上下文连接 时,用户代理必须在 element 上执行以下步骤

  1. CSP listelement阴影包含根策略容器CSP 列表

  2. 如果 CSP list 包含一个头部传送的内容安全策略,并且 element 具有 nonce 内容属性 attr,其值不是空字符串,则

    1. nonceelement[[CryptographicNonce]]

    2. 设置属性值,针对 element 使用 "nonce" 和空字符串。

    3. element[[CryptographicNonce]] 设置为 nonce

    如果 element[[CryptographicNonce]] 没有被恢复,那么此时它将为空字符串。

包含 HTMLOrSVGElement 元素的 克隆步骤 必须将 [[CryptographicNonce]] 插槽设置为副本上的值,该值与被克隆元素上的插槽值相同。

2.5.7 延迟加载属性

Lazy_loading

所有当前引擎都支持。

Firefox75+Safari15.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

一个 延迟加载属性 是一个 枚举属性,包含以下关键字和状态

关键字状态简要描述
lazy 延迟 用于延迟获取资源,直到满足某些条件。
eager 立即 用于立即获取资源;默认状态。

该属性指示用户代理立即获取资源,或者根据属性的当前状态,推迟获取资源,直到满足与该元素相关的某些条件。

该属性的 缺失值默认值无效值默认值 均为 Eager 状态。


给定元素 element将延迟加载元素步骤 如下

  1. 如果 脚本被禁用 用于 element,则返回 false。

    这是一个反跟踪措施,因为如果用户代理在脚本被禁用时支持延迟加载,则站点仍然可以通过在页面标记中战略性地放置图像来跟踪用户的近似滚动位置,这样服务器可以跟踪请求了多少图像以及何时请求。

  2. 如果 element延迟加载属性 处于 Lazy 状态,则返回 true。

  3. 返回 false。

每个 imgiframe 元素都具有关联的 延迟加载恢复步骤,最初为 null。

对于 imgiframe 元素,这些元素 将延迟加载,这些步骤从 延迟加载交叉观察器 的回调或当它们的 延迟加载属性 设置为 Eager 状态时运行。这将导致元素继续加载。

每个 Document 都具有一个 延迟加载交叉观察器,最初设置为 null,但可以设置为 IntersectionObserver 实例。

开始交叉观察延迟加载元素 element,请运行以下步骤

  1. docelement节点文档

  2. 如果 doc延迟加载交叉观察器 为 null,则将其设置为新的 IntersectionObserver 实例,初始化如下

    目的是使用 IntersectionObserver 构造函数的原始值。但是,我们被迫在此规范中使用 JavaScript 公开的构造函数,直到 Intersection Observer 公开用于规范的低级钩子。请参阅 bug w3c/IntersectionObserver#464,它跟踪此问题。 [INTERSECTIONOBSERVER]

  3. 调用 doc延迟加载交叉观察器observe 方法,并将 element 作为参数。

    目的是使用 observe 方法的原始值。请参阅 w3c/IntersectionObserver#464[INTERSECTIONOBSERVER]

停止交叉观察延迟加载元素 element,请运行以下步骤

  1. docelement节点文档

  2. 断言doc延迟加载交叉观察器 不为 null。

  3. 调用 doc延迟加载交叉观察器unobserve 方法,并将 element 作为参数。

    目的是使用 unobserve 方法的原始值。请参阅 w3c/IntersectionObserver#464[INTERSECTIONOBSERVER]

(这是一个跟踪向量。) 延迟加载滚动边距 是一个 实现定义 值,但需要考虑以下建议

重要的是 为了隐私延迟加载滚动边距 不应泄漏额外信息。例如,当前设备上的典型滚动速度可能不精确,因此不会引入新的指纹向量。

2.5.8 阻塞属性

一个 阻塞属性 明确指示某些操作应在获取外部资源时被阻塞。可以阻塞的操作由 可能的阻塞令牌 表示,它们是以下表格中列出的字符串

可能的阻塞令牌描述
"render"该元素 可能阻塞渲染

将来,可能会有更多 可能的阻塞令牌

一个 阻塞属性 必须具有一个值为 无序的唯一空格分隔令牌集,每个令牌都是 可能的阻塞令牌。一个 阻塞属性支持的令牌可能的阻塞令牌。任何元素最多只能有一个 阻塞属性

元素 el阻塞令牌集 是以下步骤的结果

  1. valueel阻塞属性 的值,如果不存在此类属性,则为空字符串。

  2. value 设置为 value转换为 ASCII 小写

  3. rawTokensvalue 按 ASCII 空格分隔 的结果。

  4. 返回一个包含 rawTokens 中元素的集合,这些元素是 可能的阻塞令牌

如果元素的 阻塞令牌集 包含 "render",或者如果它是 隐式可能阻塞渲染(将在各个元素中定义),则该元素为 可能阻塞渲染。默认情况下,元素不是 隐式可能阻塞渲染

2.5.9 获取优先级属性

一个 获取优先级属性 是一个 枚举属性,具有以下关键字和状态

关键字状态简要描述
high high 相对于具有相同 目标 的其他资源,信号指示一个高优先级 获取
low low 相对于具有相同目标的其他资源,指示一个低优先级的获取
auto auto 相对于具有相同目标的其他资源,指示自动确定获取优先级。

该属性的缺失值默认值无效值默认值均为auto状态。