Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、ウェブアプリケーションがドキュメントのナビゲーションに関する完全なタイミング情報へアクセスするためのインターフェースを定義します。
このセクションは、この文書が公開された時点でのステータスについて説明します。現在の W3C 公開物と、この技術レポートの最新改訂版は W3C 標準および草案一覧 で確認できます。
Navigation Timing 2 は初版([NAVIGATION-TIMING])を置き換え、以下の変更を含みます:
この文書は Web Performance Working Group により、 勧告トラック を用いた作業草案として公開されました。
作業草案としての公開は、W3C およびそのメンバーによる支持を意味するものではありません。
この文書はドラフトであり、今後随時更新、差し替え、または廃止される可能性があります。この文書を進行中の作業以外のものとして引用するのは適切ではありません。
この文書は W3C 特許ポリシー の下で運営されているグループによって作成されました。 W3C は 関連成果物に関する特許開示の公開リスト を管理しています。このページには特許開示の方法についても記載されています。個人が、必須特許請求項 を含むと信じる特許について実際に知っている場合、その情報は W3C特許ポリシー第6節 に従って開示する必要があります。
この文書は 2025年8月18日 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]を利用しているため、
すべての時刻値はエントリーの
time
origin(タイムオリジン)、
および
relevant settings
object(関連設定オブジェクト)を基準に測定されます。
例えば、レスポンス終了がナビゲーション開始から100ms後に発生する場合、PerformanceNavigationTiming
のデータは以下のようになります:
startTime: 0.000 // ナビゲーションリクエストの開始時刻
responseEnd: 100.000 // 最後の受信バイトの高精度時刻
次のスクリプトは、PerformanceNavigationTiming
インターフェースを使って、
ドキュメントのナビゲーションに関する正確なタイミングデータを取得する方法を示しています:
<script>
function showNavigationDetails() {
// 最初のエントリーを取得
const [entry] = performance.getEntriesByType("navigation");
// 開発者コンソールで表として表示
console.table(entry.toJSON());
}
</script>
<body onload="showNavigationDetails()">
実際にはインターフェースであるFoo
について、「a Foo
object」という表現が使われることがありますが、より正確には「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
();
};
このセクションで定義されるすべての時刻値は、の午前0時からのミリ秒単位で測定されます。
navigationStart
この属性は、ユーザーエージェントが前のドキュメントのアンロードのプロンプトを完了した直後の時刻を返します。前のドキュメントが存在しない場合は、現在のドキュメントが作成された時刻を返します。
この属性は
PerformanceNavigationTiming
には定義されていません。代わりに、著者は
timeOrigin
を使用して同等のタイムスタンプを取得できます。
unloadEventStart
前のドキュメントと現在のドキュメントが同じ オリジンの場合、この属性はユーザーエージェントが前のドキュメントの unload イベントを開始する直前の時刻を返します。前のドキュメントが存在しない場合や、前のドキュメントのオリジンが現在のドキュメントと異なる場合、この属性は0を返します。
unloadEventEnd
前のドキュメントと現在のドキュメントが同一オリジンの場合、この属性はユーザーエージェントが前のドキュメントの unload イベントを完了した直後の時刻を返します。前のドキュメントが存在しない場合や、オリジンが異なる場合、またはunloadがまだ完了していない場合、この属性は0を返します。
ナビゲーション時にHTTPリダイレクトがあり、すべてのリダイレクトが同じオリジンからではない場合、
PerformanceTiming
.unloadEventStart
および
PerformanceTiming
.unloadEventEnd
はどちらも0を返します。
redirectStart
ナビゲーション時にHTTPリダイレクトがあり、すべてのリダイレクトが同じ オリジンの場合、この属性はリダイレクトを開始する フェッチの開始時刻 を返します。そうでない場合、この属性は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イベントがまだ発火していない場合は0を返します。
loadEventEnd
この属性は、現在のドキュメントのloadイベントが完了した時刻を返します。loadイベントが発火していない場合や完了していない場合は0を返します。
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: