软导航与交互内容绘制

社区组报告草案,

此版本:
https://wicg.github.io/soft-navigations/
测试套件:
https://github.com/web-platform-tests/wpt/tree/master/soft-navigation-heuristics
问题跟踪:
GitHub
编辑:
(Google)
(Google)
前任编辑:
(Shopify)

摘要

本文档定义一种用于测量由交互发起的影响的机制,使用户代理能够 将页面修改和性能条目归因回触发它们的用户交互。

本文档状态

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

1. 简介

本节是非规范性的。

现代 Web 应用程序通常会响应用户交互动态更新内容,而不 执行完整的页面导航。这些由交互发起的影响——例如结构性 DOM 修改、内容绘制和历史状态变更——在历史上一直难以测量, 也难以归因到正确的用户操作。

考虑一种典型的单页应用程序模式:用户点击产品链接,这会触发一个 click 事件处理器。该处理器为产品详情发起网络 fetch()。当响应到达时,会执行一个 回调,将新内容动态注入 DOM,并使用 History 或 Navigation API 更新 URL。虽然这在用户看来像一次导航,但诸如 Largest Contentful Paint (LCP) ([LARGEST-CONTENTFUL-PAINT]) 这样的现有指标只测量初始页面加载, 而 Interaction to Next Paint (INP) 只测量点击本身的即时视觉反馈, 使得后续重要的渲染和“软”导航未被捕获。

本规范利用 [EVENT-TIMING] API 来定义交互,并利用 [ASYNC-CONTEXT] 提案来跨异步任务边界跟踪因果关系。它定义浏览器如何识别 和报告这些影响,包括“软导航”,方法是与 [PAINT-TIMING][LARGEST-CONTENTFUL-PAINT] 集成,以将渲染变化归因到 性能时间线。

此外,本规范还与 [CONTAINER-TIMING] 提案集成。当 用户交互导致 DOM 修改时,这些被修改的节点会被指定为新的“容器根”。 这些子树内任何后续内容绘制都会归因到其各自的根,而这些根 随后会被追溯到原始交互。这允许高效且准确地测量 在初始事件派发很久之后发生的丰富动态页面更新。

2. 交互基础设施

2.1. 导航 ID

导航 id 是在一个 全局对象 的生命周期内分配给每次导航(硬导航和软导航)的唯一 标识符。

每个 全局对象 都有一个当前导航 id,一个 unsigned long long,初始设置为与初始化 Documentinitial interactionId value 以及 Navigation Timing 的初始 navigationId 相同的值。

2.2. 交互上下文简介

软导航检测依赖于跟踪任务因果关系的能力,并观察某些 操作(例如追加 DOM 节点)是由特定用户交互触发的。

本规范利用 TC39 [ASYNC-CONTEXT] 提案来处理这种传播。每个新的用户 交互(由 Event Timing 定义)或相关导航事件都会创建一个新的 InteractionContext。此上下文存储在一个隐藏的、仅供内部使用的 AsyncContext.Variable 中(记作 [[ActiveInteractionContext]])。

Web 平台与 AsyncContext 的集成确保此变量会自动附加到 异步延续(例如 setTimeoutfetchawait),使 浏览器能够将后续影响归因回原始交互。

除了脚本传播之外,本规范还定义修改 DOM 的用户交互如何 建立 容器根(通过 [CONTAINER-TIMING])。这些根 使后续渲染影响(如内容绘制)即使在当前没有异步脚本活动时, 也能被追溯回发起该影响的交互上下文。

2.3. InteractionContext 结构体

InteractionContext 是一个 结构体,用于维护 从单个交互检测软导航所需的数据。 它具有以下
本规范的未来版本可能会跟踪交互上下文期间发生的所有 URL 更新, 以提供更完整的导航历史。最后一个 URL 值在内部被跟踪, 以确保即使当前只有第一个 URL 值暴露在 SoftNavigationEntry 的 name 中,也能将影响准确归因回交互的最终状态。
总绘制面积这一概念预计会作为 [CONTAINER-TIMING] 集成的一部分进行细化,可能会转向跟踪 特定更新区域。

2.4. 基础设施算法

获取 当前交互上下文,运行以下步骤:
  1. context 为内部 AsyncContext.Variable [[ActiveInteractionContext]] 的值。

  2. 返回 context

获取 或创建交互的上下文,给定一个 Document document、一个 interaction id,以及一个 Event event, 运行以下步骤:
  1. 如果 documentinteraction id 到 interaction context[interaction id] 存在,返回 documentinteraction id 到 interaction context[interaction id]。

  2. interaction context 为一个新的 InteractionContext

  3. interaction contextid 设置为 interaction id

  4. interaction context开始 时间设置为 eventstartTime

  5. 设置 documentinteraction id 到 interaction context[interaction id] 为 interaction context

  6. 返回 interaction context

更新事件的交互上下文,给定一个 Document document 和一个 Event event,运行以下步骤:
  1. timestamp 为给定 document相关全局对象时的当前高精度时间

  2. is scroll 为 true,如果 event 的类型为 "scroll";否则为 false。

  3. is input 为 true,如果 event 的类型是会触发 has dispatched input event 的事件类型(如 [EVENT-TIMING] 中所定义);否则为 false。

  4. 如果 is scroll 为 false 且 is input 为 false,则返回。

  5. 对于 documentinteraction id 到 interaction context 的值中的每个 interaction context

    1. 如果 is scroll 为 true,并且 interaction context第一个滚动时间戳 未设置:

      1. interaction context第一个滚动 时间戳设置为 timestamp

    2. 如果 is input 为 true,并且 interaction context第一个输入时间戳 未设置:

      1. interaction context第一个输入 时间戳设置为 timestamp

交互事件处理开始,给定一个 Document document、一个 interaction id,以及一个 Event event,运行以下步骤:
  1. 如果 interaction id 为 null,则返回 null。

  2. interaction context 为使用 documentinteraction idevent 调用 获取或创建交互的上下文 的结果。

  3. 将内部 AsyncContext.Variable [[ActiveInteractionContext]] 的值设置为 interaction context

  4. 返回 interaction context

交互事件时序处理结束,给定 null 或 InteractionContext interaction context,运行以下步骤:
  1. 如果 interaction context 为 null,则返回。

  2. 将内部 AsyncContext.Variable [[ActiveInteractionContext]] 的值设置为 null。

3. 交互内容绘制

3.1. InteractionContentfulPaint 接口

[Exposed=Window]
interface InteractionContentfulPaint : PerformanceEntry {
    readonly attribute DOMHighResTimeStamp renderTime;
    readonly attribute DOMHighResTimeStamp loadTime;
    readonly attribute unsigned long long size;
    readonly attribute DOMString id;
    readonly attribute DOMString url;
    readonly attribute Element? element;
    readonly attribute unsigned long long interactionId;

    object toJSON();
};

InteractionContentfulPaint includes PaintTimingMixin;

每个 InteractionContentfulPaint 都有一个关联的绘制时序信息

目前它以 Largest Contentful Paint (LCP) 性能条目为模型,但未来方向是 以 Container Timing 性能条目为模型。
renderTime 属性的 getter 必须返回 this 的关联绘制 时序信息渲染更新结束时间

loadTime 属性的 getter 必须返回 this 的关联绘制 时序信息实现定义的 呈现时间

size 属性的 getter 必须返回内容绘制的大小。

id 属性的 getter 必须返回内容绘制的 ID。

url 属性的 getter 必须返回内容绘制的 URL。

element 属性的 getter 必须返回与内容绘制关联的 Element, 或者如果该元素已从文档中移除,则返回 null。

interactionId 属性的 getter 必须返回触发此绘制的交互的交互 id

3.2. 交互内容绘制算法

创建交互内容绘制条目, 给定一个 全局对象 global、一个 InteractionContext interaction context,以及一个 Element element,运行以下步骤:
  1. entryglobalrealm 中的一个新的 InteractionContentfulPaint 对象。

  2. entryentryType 设置为 "interaction-contentful-paint"。

  3. entryelement 设置为 element

  4. entryinteractionId 设置为 interaction contextid

  5. entry 的关联绘制时序信息设置为一个新的绘制时序信息

  6. 将 entry 的 renderTimeloadTimesizeid、 以及 url 设置为 report largest contentful paint 算法中定义的内容绘制候选的对应值, 如 [LARGEST-CONTENTFUL-PAINT] 中所述。

  7. entrystartTime 设置为 interaction context开始 时间

  8. entryduration 设置为 entryrenderTimeentrystartTime 之间的差值。

  9. 返回 entry

发出交互内容绘制条目,给定一个 Element element、一个 Document document,以及一个 InteractionContext interaction context,运行以下步骤:
  1. globaldocument相关全局对象

  2. paint entry 为使用 globalinteraction contextelement 调用 创建交互内容 绘制条目的结果。 注:对于需要资源加载的元素(例如带有新 src 的图像),[PAINT-TIMING] 规范负责确保在触发最终调用 此算法的内容绘制检测之前,满足 "is loaded" 标准。

  3. 如果 interaction context第一个滚动时间戳 已设置, 并且 paint entryrenderTime 大于 interaction context第一个滚动时间戳,则返回。

  4. 如果 interaction context第一个输入时间戳 已设置,并且 paint entryrenderTime 大于 interaction context第一个输入时间戳,则返回。

  5. 排队 paint entry

  6. paint entry 添加到 global性能条目缓冲区

  7. 如果 interaction context第一次内容绘制 为 null:

    1. interaction context第一次内容绘制 设置为 paint entry

  8. interaction context最大内容绘制设置为 paint entry

  9. interaction context总绘制面积增加 paint entry 的 size。

注:InteractionContentfulPaint 条目会在检测到时发出到性能 时间线,而不取决于该交互最终是否产生软 导航。这允许开发者监测所有交互的渲染更新。

4. 软导航

4.1. SoftNavigationEntry 接口

[Exposed=Window]
interface SoftNavigationEntry : PerformanceEntry {
    readonly attribute DOMString navigationType;
    readonly attribute unsigned long long interactionId;
    readonly attribute InteractionContentfulPaint? largestInteractionContentfulPaint;
};

SoftNavigationEntry includes PaintTimingMixin;

每个 SoftNavigationEntry 都有一个关联的绘制时序信息

navigationType 属性的 getter 必须返回触发 软导航的交互的导航类型

interactionId 属性的 getter 必须返回触发软导航的交互的交互 id

largestInteractionContentfulPaint 属性的 getter 必须返回一个 InteractionContentfulPaint 条目,该条目表示由于该交互发生的最大内容绘制;如果 没有发生此类绘制,则返回 null。

name 属性的 getter 必须返回触发软导航的交互的第一个 URL 值

startTime 属性的 getter 必须返回触发 软导航的交互的开始时间

duration 属性的 getter 必须返回在发出时 thispresentationTimethisstartTime 之间的差值。

实践中,largestInteractionContentfulPaint 预计为非 null,因为确认的软导航要求至少检测到一个交互 内容绘制来触发其发出。

不过,未来迭代可能会评估软导航是否可在 URL 修改后、 第一次绘制之前立即被视为已提交。在这样的模型中,此字段在发出时可能为 null。

此时序的主要设计考量是归因其他时间线条目(例如 LayoutShiftPerformanceResourceTimingLongAnimationFrameTiming 等),这些条目发生在 URL 修改与第一次绘制之间的区间内。例如,许多站点会在发起 fetch 请求时立即提交新的 URL,即使当前页面仍处于上一个导航状态。为确保 时间线切片一致,本规范将所有此类条目归因到前一个 导航标识符,直到第一次绘制确认转换。

4.2. 软导航算法

软导航是 满足以下条件的同文档导航:

评估软导航发出,给定一个 Document document 和一个 InteractionContext interaction context,运行以下步骤:
  1. 如果 interaction contextemitted 为 true,则返回。

  2. 如果 document活动软导航候选 不是 interaction context,则返回。

  3. 如果 interaction context第一个 URL 值未设置,则返回。

  4. 如果 interaction context第一次内容绘制为 null, 则返回。

  5. globaldocument相关全局对象

  6. urlinteraction context第一个 URL 值

  7. entry 为使用 globalinteraction contexturlinteraction context开始 时间调用 创建 软导航条目的结果。

  8. 使用 globalentry 调用 发出软导航条目

  9. interaction contextemitted 设置为 true。

创建 软导航条目,给定一个 全局对象 global、一个 InteractionContext interaction context、一个 字符串 url,以及一个 DOMHighResTimeStamp start time,运行以下步骤:
  1. entryglobalrealm 中的一个新的 SoftNavigationEntry 对象。

  2. entryname 设置为 url

  3. entryentryType 设置为 "soft-navigation"。

  4. entrystartTime 设置为 start time

  5. first paintinteraction context第一次内容绘制

  6. 如果 first paint 不是 null:

    1. entry 的关联绘制时序信息设置为 first paint 的 关联绘制时序信息

  7. entryinteractionId 设置为 interaction contextid(如果可用)。

  8. entrylargestInteractionContentfulPaint 设置为 interaction context最大内容绘制

  9. 返回 entry

注:navigationId 在后面,在 queue a PerformanceEntry 中设置。
发出软 导航条目,给定一个 全局对象 global,以及一个 SoftNavigationEntry entry,运行以下步骤:
  1. entry导航 id 设置为 entryinteractionId

  2. global当前导航 id 设置为 entryinteractionId

  3. 排队 entry

  4. entry 添加到 global性能条目缓冲区

处理同 文档提交,给定一个 Document document字符串 url,以及 字符串 navigation type, 运行以下步骤:
  1. interaction context 为调用 获取 当前交互上下文的结果。

  2. 如果 interaction context 为 null,则返回。

  3. interaction context最后一个 URL 值设置为 url

  4. 如果 interaction context第一个 URL 更新时间戳 未设置:

    1. interaction context第一个 URL 更新 时间戳设置为给定 document相关全局对象时的当前高精度时间

    2. interaction context第一个 URL 值设置为 url

    3. interaction context导航类型设置为 navigation type

  5. document活动软导航候选 设置为 interaction context

  6. 使用 documentinteraction context 调用 评估软导航发出

5. PerformanceEntry 扩展

[Exposed=(Window,Worker)]
partial interface PerformanceEntry {
    readonly attribute unsigned long long navigationId;
};
每个 PerformanceEntry 都有一个关联的导航 id,一个 unsigned long long,初始为 0。

navigationId 属性的 getter 必须返回 this导航 id

6. 规范集成

6.1. HTML 集成

6.1.1. Document

每个 document 都有一个interaction id 到 interaction context,一个映射,初始为空。

每个 document 都有一个活动软导航 候选,为一个 InteractionContext 或 null,初始为 null。

6.1.2. History

update document for history step application 中,在 5.5.1 之前(如果 documentsEntryChanged 为 true 且 documentIsNew 为 false), 使用该 Documententryurl,以及 "traverse" 调用 处理同文档提交
shared history push/replace steps(如 [HTML] 中定义)中,在 URL 被更新后, 使用该 Document、新的 URL,以及操作类型("push" 或 "replace" 之一)调用 处理同文档提交

6.1.3. Node

每个 node 都有一个关联的交互 上下文,初始为 null。

6.1.4. 硬导航

当创建一个新的 全局对象 global 时(例如在一次“硬” 导航期间),其 当前导航 id 会按 § 2.1 导航 ID 中的规定 初始化。

[NAVIGATION-TIMING] 中,创建初始导航的 PerformanceNavigationTiming 条目时,用户代理必须将其 navigationId 设置为 全局对象当前 导航 id

6.2. Event Timing 集成

本规范扩展了 [EVENT-TIMING] 对交互的定义,以包含与现代 Web 应用程序和单页应用程序 相关的其他事件类型。

以下事件类型被认为是交互 的一部分(如 [EVENT-TIMING] 中所定义):

当这些事件作为用户交互的结果被派发时,用户代理必须为它们分配一个唯一的 交互 id,该 id 通过为文档的相关全局对象运行获取下一个 interactionId 的步骤来获得。如果事件由一个已分配 交互 id 的先前交互触发,用户代理应复用同一个标识符。

这些事件只有在它们是来自用户操作的发起事件时,才会作为主要交互报告 (例如点击浏览器 UI 的后退按钮)。在大多数其他场景中——例如 click 处理器手动操作历史记录——后续的 popstatenavigate 事件不被认为是 独立的用户交互。

虽然这些以编程方式触发的事件可能没有设置 isTrusted 标志,但它们会通过 [ASYNC-CONTEXT] 正确归因回原始交互, 因为历史记录和导航 API 被视为发起任务的异步延续。

注:事件 navigatepopstatehashchange 被用作跟踪软导航和 分配 interactionId 的内部信号。本规范不要求这些事件 类型作为 PerformanceEventTiming 条目暴露到性能 时间线,而是将该决定留给 [EVENT-TIMING] 规范。
[EVENT-TIMING] 规范预计会更新,以显式定义 processingStartprocessingEnd 钩子,并确保 interactionId 分配足够早地发生以支持此集成。目前, interactionId 分配通常会延迟到事件 处理结束时。
TODO/错误修复:本规范对 interactionId 使用 unsigned long long, 以确保安全的全局计数器,而 [EVENT-TIMING] 当前将其定义为 unsigned long。预计此不匹配会在 两个规范的未来版本中解决。
要为一个 Window window 获取下一个 interactionId
  1. windowinteraction count 设置为 windowinteraction count 加 1。

  2. 返回 windowinitial interactionId value 加上 (windowinteraction count 乘以 windowinteractionId increment)。

processingStart(如 [EVENT-TIMING] 中所定义)时,给定一个 Document document 和一个 Event event,添加以下步骤:
  1. 使用 documentevent 调用 更新事件的交互上下文

  2. interaction idevent交互 id

  3. 使用 documentinteraction idevent 调用 交互事件处理开始

processingEnd(如 [EVENT-TIMING] 中所定义)时,给定一个 Document document 和一个 InteractionContext interaction context,添加以下步骤:
  1. 使用 interaction context 调用 交互事件时序处理 结束

6.3. Largest Contentful Paint (LCP) 集成

本规范挂接到 [LARGEST-CONTENTFUL-PAINT] 算法,以将绘制归因到 交互。

report largest contentful paint 中:
  1. contextToNewLargestCandidate 为一个新的映射

  2. 对于 paintedImages 的每个 record

    1. elementrecord待处理图像记录元素

    2. interaction contextelement关联交互上下文

    3. 如果 interaction context 为 null,则继续。

    4. sizeelement有效视觉大小

    5. 如果 size 为 null,则继续。

    6. 如果 interaction context最大内容 绘制不是 null,且 size 小于或等于 interaction context最大内容 绘制size, 则继续。

    7. 如果 contextToNewLargestCandidate[interaction context] 未设置,或者 size 大于 contextToNewLargestCandidate[interaction context] 的 size

      1. 设置 contextToNewLargestCandidate[interaction context] 为 element

  3. 对于 paintedTextNodes 的每个 textNode

    1. interaction contexttextNode关联交互 上下文

    2. 如果 interaction context 为 null,则继续。

    3. sizetextNode有效视觉大小

    4. 如果 size 为 null,则继续。

    5. 如果 interaction context最大内容 绘制不是 null,且 size 小于或等于 interaction context最大内容 绘制size, 则继续。

    6. 如果 contextToNewLargestCandidate[interaction context] 未设置,或者 size 大于 contextToNewLargestCandidate[interaction context] 的 size

      1. 设置 contextToNewLargestCandidate[interaction context] 为 textNode

  4. 对于 contextToNewLargestCandidate 中的每个 interaction contextnewLargestElement

    1. 使用 newLargestElementdocumentinteraction context 调用 发出交互内容 绘制条目

    2. 使用 documentinteraction context 调用 评估软导航 发出

§ 6.4 Container Timing 集成小节定义了对 DOM 的修改如何重置受影响元素的先前已报告绘制, 确保它们由 [LARGEST-CONTENTFUL-PAINT] 算法重新评估,并正确归因到 当前交互。
[LARGEST-CONTENTFUL-PAINT] 算法预计会忽略任何 具有关联交互上下文的绘制,因为这些绘制由本规范的 § 3.1 InteractionContentfulPaint 接口处理。

6.4. Container Timing 集成

[CONTAINER-TIMING] API 提供一种机制,用其共同 DOM 祖先对渲染影响 进行分组。本规范与该机制集成,以将渲染 变化归因回用户交互。

节点插入时,或者当一个节点以 以下方式之一被修改时:

运行以下步骤:

  1. interaction context 为调用 获取 当前交互上下文的结果。

  2. 如果 interaction context 不是 null:

    1. 将该节点的关联交互上下文 设置为 interaction context

    2. 将该节点指定为一个 容器根(如 [CONTAINER-TIMING] 中所定义)。

    3. 对于该节点及其每个后代,将它们从 Document先前已报告绘制中移除(如 [PAINT-TIMING] 中所定义)。

通过从先前已报告绘制集合中移除被修改的子树,用户代理 可确保这些元素的下一次内容绘制会被重新检测,并正确归因到 新的 InteractionContext
注:对 "node insert" 的引用是一种高层描述,涵盖将新 元素添加到文档结构中的所有操作(例如 appendChildinnerHTML 更新等)。由用户代理负责将这些操作映射到 跟踪文档结构修改的内部实现钩子。
鼓励用户代理维护一棵稀疏的容器根树。如果被修改的节点是 与同一交互上下文关联的现有容器根的后代,用户 代理可以选择不创建新的冗余根。

此外,为避免在大型 DOM 修改期间执行昂贵的主线程工作,鼓励用户代理 优化从先前已报告绘制中移除后代的过程。 用户代理可以将修改后的根标记为 "dirty",并在后续树遍历期间 (例如布局或绘制期间)惰性传播该状态,而不是立即进行穷尽遍历。已知 不可见或被现有机制(如 content-visibility 或 CSS containment)跳过的子树, 在此重置过程中也可以被跳过。

6.5. Performance Timeline 集成

queue a PerformanceEntry 中,在步骤 1(初始化 条目)之后,添加以下步骤:

  1. 如果 newEntry导航 id 为 0:

    1. newEntry导航 id设置为 global当前导航 id

7. 重叠交互和竞态条件

本节是非规范性的。

Web 应用程序通常会快速连续处理多个用户交互。本规范通过以下模型处理 此类重叠交互:

8. 安全与隐私考量

将 Soft Navigations 暴露到性能时间线本身不具有安全和隐私影响。 不过,作为检测到软导航的结果而重置各种 paint timing 条目,可能会产生 影响, 尤其是在已访问链接被 分区之前。 因此,在没有对 :visited 缓存进行分区的情况下暴露此类绘制操作,只能在 仔细 分析相关绘制操作之后进行,以确保它们不会跨源暴露用户的历史记录。

索引

由本 规范定义的术语

由 引用定义的术语

参考文献

规范性参考文献

[DOM]
Anne van Kesteren. DOM Standard. 现行标准. URL: https://dom.spec.whatwg.org/
[EVENT-TIMING]
Michal Mocny. Event Timing API. URL: https://w3c.github.io/event-timing/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 现行标准. URL: https://infra.spec.whatwg.org/
[LARGEST-CONTENTFUL-PAINT]
Yoav Weiss. Largest Contentful Paint. URL: https://w3c.github.io/largest-contentful-paint/
[NAVIGATION-TIMING-2]
Yoav Weiss; Noam Rosenthal. Navigation Timing Level 2. URL: https://w3c.github.io/navigation-timing/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. URL: https://w3c.github.io/performance-timeline/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 现行 标准. URL: https://webidl.spec.whatwg.org/

资料性参考文献

[ASYNC-CONTEXT]
AsyncContext. URL: https://github.com/tc39/proposal-async-context
[CONTAINER-TIMING]
Container Timing API. URL: https://github.com/WICG/container-timing
[NAVIGATION-TIMING]
Zhiheng Wang. Navigation Timing. 2012 年 12 月 17 日. REC. URL: https://www.w3.org/TR/navigation-timing/
[PAINT-TIMING]
Ian Clelland; Noam Rosenthal. Paint Timing. URL: https://w3c.github.io/paint-timing/

IDL 索引

[Exposed=Window]
interface InteractionContentfulPaint : PerformanceEntry {
    readonly attribute DOMHighResTimeStamp renderTime;
    readonly attribute DOMHighResTimeStamp loadTime;
    readonly attribute unsigned long long size;
    readonly attribute DOMString id;
    readonly attribute DOMString url;
    readonly attribute Element? element;
    readonly attribute unsigned long long interactionId;

    object toJSON();
};

InteractionContentfulPaint includes PaintTimingMixin;

[Exposed=Window]
interface SoftNavigationEntry : PerformanceEntry {
    readonly attribute DOMString navigationType;
    readonly attribute unsigned long long interactionId;
    readonly attribute InteractionContentfulPaint? largestInteractionContentfulPaint;
};

SoftNavigationEntry includes PaintTimingMixin;

[Exposed=(Window,Worker)]
partial interface PerformanceEntry {
    readonly attribute unsigned long long navigationId;
};