Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范定义了一个接口,使网页应用程序能够访问文档导航的完整计时信息。
本节描述了本文档在发布时的状态。当前 W3C 出版物的列表和本技术报告的最新修订版可以在 W3C 技术报告索引 中找到,网址为 https://www.w3.org/TR/。
导航计时 2 取代了第一版 [NAVIGATION-TIMING] 并包含以下更改:
作为工作草案发布并不意味着 W3C 及其成员的认可。
这是一个草案文档,可能随时更新、替换或被其他文档取代。引用此文档作为进展中的工作是不合适的。
本文档由一个在 W3C 专利政策下运营的组织制作。 W3C 维护了一份任何与该组交付成果相关的专利披露的公共列表;该页面还包括披露专利的说明。任何个人若实际知晓包含 必要声明的专利,则必须按照 W3C 专利政策第 6 节披露信息。
本文档受2023年11月3日 W3C流程文件的约束。
本节为非规范性内容。
准确测量网页应用程序的性能特性是提升网页应用程序速度的重要方面。虽然基于 JavaScript 的机制,如 [JSMEASURE] 中描述的,可以为用户的延迟测量提供全面的工具, 但在许多情况下,它们无法提供完整或详细的端到端延迟情况。例如,以下 JavaScript 展示了一个简单测量页面完全加载时间的尝试:
<html>
<head>
<script type="text/javascript">
var start = new Date().getTime();
function onLoad() {
var now = new Date().getTime();
var latency = now - start;
alert("page loading time: " + latency);
}
</script>
</head>
<body onload="onLoad()">
<!- Main page body goes from here. -->
</body>
</html>
上述脚本计算了在执行 head 中的第一段 JavaScript 后加载页面所需的时间,但它并未提供获取页面所需的时间或页面初始化生命周期的相关信息。
本规范定义了 PerformanceNavigationTiming
接口,该接口参与 [PERFORMANCE-TIMELINE-2]
以存储和检索与文档导航相关的高分辨率性能指标数据。由于 PerformanceNavigationTiming
接口使用 [HR-TIME],所有时间值都是相对于条目的相关设置对象的时间原点进行测量的。
例如,如果我们知道响应结束发生在导航开始后的100毫秒,PerformanceNavigationTiming
数据可能如下所示:
startTime: 0.000 // start time of the navigation request
responseEnd: 100.000 // high resolution time of last received byte
以下脚本展示了开发者如何使用
PerformanceNavigationTiming
接口来获取与文档导航相关的准确时间数据:
<script>
function showNavigationDetails() {
// Get the first entry
const [entry] = performance.getEntriesByType("navigation");
// Show it in a nice table in the developer console
console.table(entry.toJSON());
}
</script>
<body onload="showNavigationDetails()">
构造 "一个 Foo
对象",其中 Foo
实际上是一个接口,有时被用作替代更准确的 "实现接口 Foo
的对象"。
术语 当前文档 指的是与 Window 对象的最新 Document 对象关联的文档。
在整个工作中,所有时间值都是从文档导航开始以来以毫秒为单位测量的。例如,文档的导航开始时间为0。术语当前时间是指从文档导航开始到当前时刻所经过的毫秒数。这种时间定义基于 [HR-TIME] 规范。
PerformanceNavigationTiming
接口定义的时序属性。括号中的属性表示它们可能在涉及不同
来源
的文档导航时不可用。
本节为非规范性内容。
通过使用精心设计的计时攻击,有可能泄露最终用户的浏览和活动历史记录。例如,卸载时间揭示了前一个页面执行其卸载处理程序所需的时间,这可以用来推断用户的登录状态。通过在卸载文档时强制执行同源检查算法,这些攻击已得到缓解,具体细节请参见HTML 规范。
放宽的同源策略无法提供足够的保护,防止在跨文档间未经授权的访问。在共享主机环境中,不受信任的第三方可以在同一 IP 地址下但使用不同端口托管 HTTP 服务器。
不同页面共享一个主机名,例如用户生成内容网站上由不同作者托管的内容,因没有按路径名限制访问的功能,这些页面被视为同源。页面间的导航允许后续页面访问前一个页面的时序信息,例如重定向和卸载事件的时序。
本节为非规范性内容。
PerformanceNavigationTiming
接口向 当前文档 暴露有关上一文档的时序信息。为了限制对包括上一文档信息的 PerformanceNavigationTiming
属性的访问,上一文档卸载
算法强制执行 同源策略,与上一文档相关的属性将被设置为零。
当在用户代理和网络服务器之间部署了代理时,connectStart
和 connectEnd
属性之间的时间间隔显示的是用户代理与代理之间的延迟,而不是与网络服务器的延迟。因此,网络服务器可以推断出代理的存在。对于 SOCKS
代理,此时间间隔包括代理身份验证时间和代理连接到网络服务器所花的时间,从而使代理检测变得复杂。在使用 HTTP 代理的情况下,用户代理可能完全不了解代理服务器,因此无法始终有效缓解这种攻击。
本节定义了在 [NAVIGATION-TIMING]
第1级中引入的属性和接口,为了向后兼容而保留。作者不应再使用以下接口,并且强烈建议使用新的 PerformanceNavigationTiming
接口——参见更改和改进的总结。
WebIDL[Exposed=Window]
interface PerformanceTiming
{
readonly attribute unsigned long long unloadEventStart
;
readonly attribute unsigned long long unloadEventEnd
;
readonly attribute unsigned long long redirectStart
;
readonly attribute unsigned long long redirectEnd
;
readonly attribute unsigned long long fetchStart
;
readonly attribute unsigned long long domainLookupStart
;
readonly attribute unsigned long long domainLookupEnd
;
readonly attribute unsigned long long connectStart
;
readonly attribute unsigned long long connectEnd
;
readonly attribute unsigned long long secureConnectionStart
;
readonly attribute unsigned long long requestStart
;
readonly attribute unsigned long long responseStart
;
readonly attribute unsigned long long responseEnd
;
readonly attribute unsigned long long domLoading
;
readonly attribute unsigned long long domInteractive
;
readonly attribute unsigned long long domContentLoadedEventStart
;
readonly attribute unsigned long long domContentLoadedEventEnd
;
readonly attribute unsigned long long domComplete
;
readonly attribute unsigned long long loadEventStart
;
readonly attribute unsigned long long loadEventEnd
;
[Default] object toJSON
();
};
本节定义的所有时间值均以1970年1月1日午夜(UTC)以来的毫秒数来测量。
navigationStart
该属性必须返回用户代理完成提示卸载 前一文档之后的时间。如果没有前一文档,该属性必须返回创建当前文档的时间。
此属性未为 PerformanceNavigationTiming
定义。
相反,作者可以使用 timeOrigin
来获取等效的时间戳。
unloadEventStart
如果前一个文档和当前文档具有相同的来源,则此属性必须返回用户代理开始前一个文档的 卸载事件的时间。如果没有前一个文档,或者前一个文档与当前文档的 来源不同,则此属性必须返回0。
unloadEventEnd
如果前一个文档和当前文档具有相同的相同来源,此属性必须返回用户代理完成前一个文档的 卸载事件后的时间。如果没有前一个文档,或者前一个文档与当前文档的 来源不同,或者卸载尚未完成,则此属性必须返回0。
如果导航过程中有HTTP重定向,并且并非所有重定向都来自相同的
来源,那么
PerformanceTiming
.unloadEventStart
和
PerformanceTiming
.unloadEventEnd
必须返回0。
redirectStart
如果导航过程中有HTTP重定向,并且所有重定向都来自相同的 来源,则此属性必须返回发起重定向的 fetch的起始时间。否则,此属性必须返回0。
redirectEnd
如果导航过程中有HTTP重定向,并且所有重定向都来自相同的 来源,此属性必须返回接收到最后一个重定向响应的最后一个字节后的时间。否则,此属性必须返回0。
fetchStart
如果新的资源是使用"GET" 请求方法来 获取的, 则fetchStart必须返回用户代理开始检查 HTTP缓存 之前的时间。否则,它必须返回用户代理开始 获取资源的时间。
domainLookupStart
此属性必须返回用户代理开始当前文档的域名查找之前的时间。如果使用了
持久连接 [RFC2616]
或者当前文档从 HTTP缓存
或本地资源中检索,则此属性必须返回与
PerformanceTiming
.fetchStart
相同的值。
domainLookupEnd
此属性必须返回用户代理完成当前文档的域名查找后的时间。如果使用了
持久连接 [RFC2616]
或者当前文档从 HTTP缓存
或本地资源中检索,则此属性必须返回与
PerformanceTiming
.fetchStart
相同的值。
从 HTTP缓存
[RFC2616]
检查和检索内容是获取资源过程的一部分。它包括
PerformanceTiming
.requestStart
,
PerformanceTiming
.responseStart
和
PerformanceTiming
.responseEnd
属性。
如果用户代理已经在缓存中拥有域名信息,domainLookupStart和domainLookupEnd表示用户代理开始和结束从缓存中检索域数据的时间。
connectStart
此属性必须返回用户代理开始建立连接以检索文档之前的时间。如果使用了
持久连接 [RFC2616]
或者当前文档从 HTTP缓存
或本地资源中检索,则此属性必须返回
PerformanceTiming
.domainLookupEnd
的值。
connectEnd
此属性必须返回用户代理完成与服务器建立连接以检索当前文档后的时间。如果使用了
持久连接 [RFC2616]
或者当前文档从 HTTP缓存
或本地资源中检索,则此属性必须返回
PerformanceTiming
.domainLookupEnd
的值。
如果传输连接失败并且用户代理重新打开连接,
PerformanceTiming
.connectStart
和
PerformanceTiming
.connectEnd
应该返回新连接的相应值。
PerformanceTiming
.connectEnd
必须包括建立传输连接的时间间隔以及其他时间间隔,例如SSL握手和SOCKS身份验证。
secureConnectionStart
此属性是可选的。没有此属性的用户代理必须将其设置为undefined。当此属性可用时,如果当前页面的 协议 [URL] 是"HTTPS",此属性必须返回用户代理开始握手过程以安全连接的时间。如果此属性可用但未使用HTTPS,则此属性必须返回0。
requestStart
此属性必须返回用户代理从服务器、HTTP 缓存或本地资源请求当前文档之前的时间。
如果传输连接在请求发送后失败,用户代理重新打开连接并重新发送请求,
PerformanceTiming
.requestStart
应该返回新请求的相应值。
此接口不包括表示请求完成发送的属性,例如 requestEnd。
responseStart
此属性必须返回用户代理从服务器、HTTP 缓存或本地资源接收响应的第一个字节后的时间。
responseEnd
此属性必须返回用户代理接收到当前文档的最后一个字节后的时间,或者在传输连接关闭之前的时间,以先发生者为准。此文档可以是从服务器、HTTP 缓存或本地资源中接收的。
domLoading
此属性必须返回用户代理将当前文档就绪状态设置为 "loading" 之前的时间。
由于现有用户代理在创建 Document 对象时的差异,domLoading
返回的值是实现特定的,不应用于有意义的指标。
domInteractive
此属性必须返回用户代理将当前文档就绪状态设置为 "interactive" 之前的时间。
domContentLoadedEventStart
此属性必须返回用户代理在 DOMContentLoaded 事件 在
Document
上触发之前的时间。
domContentLoadedEventEnd
此属性必须返回文档的 DOMContentLoaded 事件 完成后的时间。
domComplete
此属性必须返回用户代理将 当前文档就绪状态 设置为 "complete" 之前的时间。
如果 当前文档就绪状态
多次变为相同状态,
PerformanceTiming
.domLoading
、
PerformanceTiming
.domInteractive
、
PerformanceTiming
.domContentLoadedEventStart
、
PerformanceTiming
.domContentLoadedEventEnd
和
PerformanceTiming
.domComplete
必须返回相应的 文档就绪状态
变更的第一次出现时间。
loadEventStart
此属性必须返回当前文档的 load 事件触发之前的时间。当 load 事件尚未触发时,必须返回零。
loadEventEnd
此属性必须返回当前文档的 load 事件完成时的时间。当 load 事件尚未触发或未完成时,必须返回零。
toJSON()
WebIDL[Exposed=Window]
partial interface Performance
{
[SameObject]
readonly attribute PerformanceTiming
timing
;
};
Performance
接口在
[PERFORMANCE-TIMELINE-2] 中定义。
timing
timing
属性表示自上次非重定向导航以来与浏览上下文相关的计时信息。此属性由 PerformanceTiming
接口定义。
navigation
navigation
属性由 PerformanceNavigation
接口定义。
除了标记为非规范性的部分外,本规范中的所有作者指南、图表、示例和注释均为非规范性的。除此之外,规范中的其他内容都是规范性的。
本文档中的关键词 SHOULD 应按照 BCP 14 [RFC2119] [RFC8174] 的描述进行解释,并且只有当它们以全大写形式出现时,才按照这里所示的方式进行解释。
感谢 Anne Van Kesteren、Arvind Jain、Boris Zbarsky、Jason Weber、Jonas Sicking、James Simonsen、Karen Anderson、Nic Jansma、Philippe Le Hegaret、Steve Souders、Todd Reifsteck、Tony Gentilcore、William Chan 和 Zhiheng Wang 对本工作的贡献。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: