1. 序論
現代のウェブアプリケーションは、多くの場合、完全なページナビゲーションを 実行することなく、ユーザーインタラクションに応じてコンテンツを動的に更新します。 これらのインタラクションによって開始される効果—構造的な DOM 変更、コンテンツフル・ペイント、履歴状態の変更など—は、従来、 測定し、正しいユーザー操作に帰属させることが困難でした。
典型的な Single Page Application のパターンを考えてみます。ユーザーが商品リンクをクリックすると、
click イベントハンドラーが起動されます。このハンドラーは商品の詳細を取得するためのネットワーク fetch を開始します。
応答が到着すると、コールバックが実行され、新しいコンテンツを DOM に動的に挿入し、
History または Navigation API を使用して URL を更新します。これはユーザーには
ナビゲーションのように見えますが、Largest Contentful Paint (LCP) ([LARGEST-CONTENTFUL-PAINT]) のような既存の指標は
初回ページ読み込みのみを測定し、Interaction to Next Paint (INP) はクリック自体の直後の
視覚的フィードバックのみを測定するため、その後に発生する重要なレンダリングや「ソフト」
ナビゲーションは捕捉されません。
この仕様は、[EVENT-TIMING] API を活用してインタラクションを定義し、 [ASYNC-CONTEXT] 提案を用いて非同期タスク境界をまたいだ因果関係を追跡し、変更された DOM ノードをインタラクションに対応付けることで、それらを引き起こしたインタラクションへの コンテンツフル・ペイントの帰属を可能にします。この仕様は、ブラウザーが「ソフトナビゲーション」を含む これらの効果を識別し報告する方法を定義し、[PAINT-TIMING] および [LARGEST-CONTENTFUL-PAINT] と統合して、レンダリングの変更を パフォーマンスタイムラインに帰属させます。
2. Performance Timeline のスライシング
性能指標(イベントタイミング、レイアウトシフト、リソース読み込み、または
長いアニメーションフレームなど)を、それらの起点となるナビゲーションに帰属させるため、
performance timeline は、navigationId
属性を PerformanceEntry
上で用いて
セグメントに分割される。
時間にまたがる遷移の正確なスライス点を決定することは複雑である。一貫した 帰属を確保するため、この仕様は、URL の変更があるたびに timeline を ただちにスライスするのではなく、遷移を ソフトナビゲーション が performance timeline に発行される準備が整うまで遅延させるモデルを採用する。
設計上のトレードオフ、帰属規則、およびエッジケースの詳細な議論については、 [PERFORMANCE-TIMELINE] issue の コメントを参照のこと。
2.1. ナビゲーション ID
navigation id は、 global object の存続期間内において各ナビゲーション(ハードおよび ソフトの両方)に割り当てられる一意の識別子である。
各 Window
は、以下を持つ。
-
current navigation id。これは 64-bit unsigned integer であり、 初期値は
Windowの initial navigation id value に設定される。 -
navigation count。これは 64-bit unsigned integer であり、初期値は 0 である。
-
initial navigation id value。これは 64-bit unsigned integer であり、 初期値は 100 から 10000 までのランダムな整数に設定される。
-
navigation id increment。これは 64-bit unsigned integer であり、 初期値はユーザーエージェントにより選択される小さい正の整数に設定される。
注: initial
navigation id value と navigation id increment は、
navigationId
値を計算するために用いられる(
increment the current navigation id を参照)。
これにより、開発者がそれをナビゲーションの正確な回数を数えるために利用したり、
それが 0 から始まると仮定したりすることを抑止する。
ユーザーエージェントは、異なる Window
オブジェクト間で共有されるグローバルなナビゲーション値を用いないことが期待される。これは
クロスオリジン漏えいを防ぐためである。
Window
window が与えられたとき、
increment the current navigation id するには、次を実行する。
-
window の navigation count を、window の navigation count に 1 を加えた値に設定する。
-
newId を、window の initial navigation id value に、 (window の navigation count と window の navigation id increment の積)を加えた値とする。
-
window の current navigation id を newId に設定する。
2.2. PerformanceEntry 拡張
[Exposed =(Window ,Worker )]partial interface PerformanceEntry {readonly attribute unsigned long long ; };navigationId
PerformanceEntry
は、関連付けられた navigation id を持つ。
これは 64-bit unsigned integer であり、初期値は 0 である。
navigationId
属性の getter は、this の navigation id を返さなければならない。
2.3. Performance Timeline との統合
queue a PerformanceEntry において、手順 1(entry の初期化)の後に、 以下の手順を追加する。
-
newEntry の navigation id が 0 である場合:
-
global が
Windowオブジェクトである場合:-
newEntry の navigation id を、 global の current navigation id に設定する。
-
-
3. インタラクション基盤
3.1. Interaction Context の導入
この仕様は、この伝播を処理するために TC39 の [ASYNC-CONTEXT] 提案を活用する。すべての
新しいユーザーインタラクション(Event Timing によって定義されるもの)または関連するナビゲーションイベントは、
新しい InteractionContext を作成する。この context は、隠された内部専用の AsyncContext
( と表記される)に格納される。
Web プラットフォームの AsyncContext との統合により、この変数は非同期の継続
(例: setTimeout、fetch、)に自動的に
付加され、ブラウザーが
後続の効果を元のインタラクションに帰属させることを可能にする。
スクリプト伝播に加えて、この仕様は、DOM を変更するユーザー操作が、操作に関連付けられた変更済みノードの集合を 確立する方法を定義し、 非同期スクリプトが現在実行されていない場合でも、コンテンツのあるペイントなどの後続のレンダリング効果を、 それを開始した操作コンテキストまでたどれるようにします。
3.2. InteractionContext 構造体
-
id、このコンテキストに関連付けられた
interactionIdを表す 64 ビット符号なし整数。 -
コンテキスト文書、Document。
-
開始時刻、数値。
-
ナビゲーション型、
NavigationTypeまたは null。初期値は null。 -
最初の URL 値、文字列または null。初期値は null。
-
最初の URL 更新タイムスタンプ、 数値。初期値は 0。
-
最初のスクロールタイムスタンプ、数値。 初期値は 0。
-
最初の入力タイムスタンプ、数値。 初期値は 0。
-
最初のコンテンツフルペイント、
InteractionContentfulPaintまたは null。初期値は null。 -
最大コンテンツフルペイント、
InteractionContentfulPaintまたは null。初期値は null。 -
現在の最大 コンテンツフルペイント候補、最大コンテンツフルペイント候補 または null。初期値は null。
-
最後の URL 値、文字列または null。初期値は null。
-
発行済み、真偽値。初期値は false。
注: この仕様の将来のバージョンでは、
navigation のより完全な履歴を提供するために、interaction context 中に発生する
すべての URL 更新を追跡する可能性がある。last URL
value は、
現在 PerformanceSoftNavigation
の
name で公開されるのが first URL value のみであっても、効果を
interaction の最終状態へ正確に帰属させることを確保するため、内部的に追跡される。
3.3. 基盤アルゴリズム
-
context を、内部
AsyncContext. Variableの値とする。[[ ActiveInteractionContext]] -
context が null でなく、かつ context の コンテキスト文書 が document と等しくない場合、null を返す。
-
context を返す。
PerformanceEventTiming
timing entry が与えられたとき、次を実行する:
-
interaction id を、timing entry の
interactionIdとする。 -
interaction id が 0 より大きいことを 表明する。
-
document の 操作 ID から操作コンテキストへの写像[interaction id] が 存在する場合、 document の 操作 ID から操作コンテキストへの写像[interaction id] を返す。
-
interaction context を新しい InteractionContext とする。
-
interaction context の id を interaction id に設定する。
-
interaction context の コンテキスト文書 を document に設定する。
-
interaction context の 開始 時刻 を timing entry の
startTimeに設定する。 -
document の 操作 ID から操作コンテキストへの写像[interaction id] を interaction context に 設定する。
-
interaction context を返す。
-
timestamp を、document の 関連するグローバルオブジェクト を指定して得られる 現在の高分解能時刻 とする。
-
is scroll を、event の型が "scroll" であれば true、そうでなければ false とする。
-
is input を、event の型が 入力イベントを配送済みである を引き起こすイベント型 ([EVENT-TIMING] で定義される)であれば true、そうでなければ false とする。
-
is scroll が false で、かつ is input が false である場合、返る。
-
document の 操作 ID から操作 コンテキストへの写像 の 値の各 interaction context について:
-
is scroll が true で、かつ interaction context の 最初のスクロールタイムスタンプ が 0 である場合:
-
interaction context の 最初のスクロール タイムスタンプ を timestamp に設定する。
-
-
is input が true で、かつ interaction context の 最初の入力タイムスタンプ が 0 である場合:
-
interaction context の 最初の入力 タイムスタンプ を timestamp に設定する。
-
-
PerformanceEventTiming
オブジェクト timing entry が与えられたとき、次を実行する:
-
timing entry が null である場合、null を返す。
-
interaction id を、timing entry の
interactionIdとする。 -
interaction id が 0 である場合、null を返す。
-
event を、timing entry の 関連付けられたイベント とする。
-
document を、event の 関連するグローバルオブジェクト の 関連付けられた Document とする。
-
document と event が与えられたものとして、イベントの操作コンテキストを 更新する。
-
interaction context を、document と timing entry が与えられたものとして 操作のコンテキストを取得または作成する 結果とする。
-
内部
AsyncContext. Variableの値を interaction context に設定する。[[ ActiveInteractionContext]] -
interaction context を返す。
-
内部
AsyncContext. Variableの値を null に設定する。[[ ActiveInteractionContext]]
4. インタラクションの Contentful Paint
4.1. InteractionContentfulPaint インターフェイス
[Exposed =Window ]interface :InteractionContentfulPaint PerformanceEntry {readonly attribute LargestContentfulPaint ;largestContentfulPaint readonly attribute unsigned long long ;interactionId object (); };toJSON InteractionContentfulPaint includes PaintTimingMixin ;
各 InteractionContentfulPaint
は、以下を持つ。
-
関連付けられた context。これは InteractionContext である。
-
関連付けられた largest contentful paint。これは
LargestContentfulPaintentry である。 -
関連付けられた paint timing info。
largestContentfulPaint
属性のゲッターは、this
の
最大コンテンツフルペイントを返さなければならない。
interactionId
属性のゲッターは、this
の
コンテキストの id を返さなければならない。
name
属性のゲッターは空文字列を返さなければならない。
entryType
属性のゲッターは を返さなければならない。
startTime
属性のゲッターは、this
の
コンテキストの 開始時刻を返さなければならない。
duration
属性のゲッターは、this
の ペイント
タイミング情報に対する
既定のペイントタイムスタンプと、this の
コンテキストの 開始時刻との差を返さなければならない。
注: このエントリは、静的な
操作プロパティ(interactionId や
startTime など)を、関連付けられた InteractionContext から動的に照会する一方で、
その視覚的更新の正確な状態をこれらのメトリクスが反映するように、
作成時にペイントの ペイントタイミング情報と候補 LargestContentfulPaint
エントリの静的なスナップショットを取得する。
4.2. Interaction Contentful Paint アルゴリズム
Window
window、InteractionContext interaction
context、LargestContentfulPaint
lcpEntry、および
paint timing info paintTimingInfo が与えられたとき、
create an interaction contentful paint entry
するには、次を実行する。
-
entry を、window の realm 内の新しい
InteractionContentfulPaintオブジェクトとする。 -
entry の context を interaction context に設定する。
-
entry の largest contentful paint を lcpEntry に設定する。
-
entry に関連付けられた paint timing info を paintTimingInfo に設定する。
-
entry を返す。
-
interaction context の 最初のスクロールタイムスタンプ が 0 より大きく、かつ lcpEntry の
renderTimeが interaction context の 最初のスクロールタイムスタンプ より大きい場合、返る。 -
interaction context の 最初の入力タイムスタンプ が 0 より大きく、 かつ lcpEntry の
renderTimeが interaction context の 最初の入力タイムスタンプ より大きい場合、返る。 -
lcpEntry を、lcpCandidate、paintTimingInfo、および document で LargestContentfulPaint エントリを作成する結果とする。
-
global を document の 関連するグローバルオブジェクト とする。
-
paint timing info を、lcpEntry に関連付けられた ペイントタイミング情報 とする。
-
icpEntry を、global、interaction context、lcpEntry、および paint timing info が与えられたものとして、操作コンテンツフル ペイントエントリを作成する結果とする。
-
icpEntry をキューに入れる。
-
icpEntry を global の パフォーマンスエントリバッファ に追加する。
-
interaction context の 最初のコンテンツフルペイント が null である場合:
-
interaction context の 最初のコンテンツフルペイント を icpEntry に設定する。
-
-
interaction context の 最大コンテンツフルペイント を icpEntry に設定する。
-
interaction context の 現在の最大 コンテンツフルペイント候補 を lcpCandidate に設定する。
注: InteractionContentfulPaint エントリは、インタラクションが最終的に
ソフトナビゲーションになるかどうかとは独立して、
検出されるとパフォーマンスタイムラインへ送出されます。これにより、
開発者はすべてのインタラクションについてレンダリング更新を監視できます。
Document
document、ペイントタイミング情報 paintTimingInfo、
順序付き
セットである
保留中の画像レコード paintedImages、および
順序付き
セットである 要素
paintedTextNodes が与えられたとき:
-
contextToCandidateSets を新しい マップとする。
-
paintedImages の各 record について反復する:
-
element を record の 要素とする。
-
interaction context を、element について ペイント帰属インタラクション コンテキストを取得する結果とする。
-
interaction context が null でない場合:
-
-
paintedTextNodes の各 element について反復する:
-
interaction context を、element について ペイント帰属インタラクション コンテキストを取得する結果とする。
-
interaction context が null でない場合:
-
-
contextToCandidateSets 内の各 interaction context → candidateSets について反復する:
-
newCandidate を、document、candidateSets[0]、 candidateSets[1]、および interaction context の 現在の 最大コンテンツフル・ペイント候補が与えられたときの 新しい 最大コンテンツフル・ペイント候補を計算する結果とする。
-
newCandidate が null でない場合:
-
newCandidate、document、 interaction context、および paintTimingInfo が 与えられたとき、 新しい 帰属済みコンテンツフル・ペイント候補を処理する。
-
document および interaction context が与えられたとき、 ソフトナビゲーションの送出を 評価する。
-
-
4.3. インタラクション・コンテンツフル・ペイントの帰属
-
context、InteractionContext、初期値は null。
-
modification id、 64 ビット符号なし整数、初期値は 0。
-
other node state が null である場合、または node state の modification id が other node state の modification id より大きい場合は true を返し、 それ以外の場合は false を返す。
-
document を node の ノード文書とする。
-
target node が、document を与えたときの ペイントタイミング用に公開されるものでない場合、 return する。
-
interaction context を、document が与えられたときの 現在のインタラクションコンテキストを取得する結果とする。
-
interaction context が null の場合、return する。
-
document の 最後の変更コンテキストが interaction context と等しくない場合:
-
document の 最後の変更コンテキストを interaction context に設定する。
-
document の 現在の変更世代 IDを 1 増やす。
-
-
previous node state を、document の マーク済みノード 状態[target node] の デフォルト値付き null とする。
-
previous node state が null でなく、かつ previous node state の modification id が document の 現在の変更世代 IDと等しい場合、return する。
-
node state を新しい InteractionPaintTimingNodeState とする。
-
node state の context を interaction context に設定する。
-
node state の modification id を document の 現在の変更世代 IDに設定する。
-
document の マーク済みノード 状態[node] を node state に設定する。
-
document の インタラクション・ペイントタイミングが dirty であるを true に設定する。
-
document の インタラクション・ペイントタイミングが dirty であるが false の場合、return する。
-
document および null が与えられたとき、 ノードとその子孫の インタラクションコンテキストを更新する。
-
document の インタラクション・ペイントタイミングが dirty であるを false に設定する。
-
document を node の ノード文書とする。
-
node state を、document の マーク済みノード 状態[node] の デフォルト値付き null とする。
-
node state が null でない場合:
-
node state が inherited node state より 新しい場合:
-
inherited node state を node state に設定する。
-
node が
Textノードである場合、document の マーク済みノード 状態[node] を削除する。
-
-
そうでなければ、document の マーク済み ノード状態[node] を削除する。
-
-
inherited node state が null でなく、かつ node が タイミング対象である場合:
-
attribution element を、node について 帰属要素を取得する結果とする。
-
previous propagated state を 伝播済みノード 状態[attribution element] の デフォルト値付き null とする。
-
inherited node state が previous propagated state より新しい場合:
-
伝播済みノード 状態[attribution element] を inherited node state に設定する。
-
previous propagated state が null である、または previous propagated state の context が inherited node state の context と等しくない場合、 attribution element について ペイント追跡をリセットする。
-
-
-
node の各 子 child node について反復し、 child node および inherited node state が与えられたとき、 ノードとその子孫の インタラクションコンテキストを更新する。
注: 単純化のため、このアルゴリズムは、
伝播済み状態を再処理する必要があるたびに DOM 全体を走査します。これは、ペイント可能な DOM の一部のみを
処理するように最適化できます。たとえば、既知の非表示サブツリーや、
content や CSS containment などの既存の仕組みによって
スキップされるサブツリーも、この処理中にスキップできます。ただし、それらは次回ペイントされる前に
更新されている必要があります。また、関連する状態がペイント前に更新される限り、
これらの手順を別の(ペイント前の)ツリー走査と統合することで、さらに最適化できることにも注意してください。
注: [CONTAINER-TIMING] API は、 レンダリング効果を共通の DOM 祖先ごとにグループ化し、集約されたペイント情報を パフォーマンスタイムラインへ報告する仕組みを提供します。この仕様の将来バージョンでは、 Container Timing を拡張して、単一のコンテナーに対する複数のクライアント (すなわち、グローバルな "containertiming" 属性とインタラクションごとのタイミング)を サポートし、Container Timing に基づいてインタラクション・ペイントタイミングを実装できるようにする予定です。 記録された各ノードは、 それを変更したインタラクションに対するコンテナーとみなされ、 各インタラクションがコンテナーの集合と関連付けられるようになります。その後、 この仕様は、各インタラクションについて、マーク済みコンテナー内で発生する最大コンテンツフル・ペイントを 追跡します。さらに、Container Timing が追跡するその他の有用な情報、 たとえば各インタラクションについてのコンテナーの集約総ペイント面積なども公開できる可能性があります。
5. ソフトナビゲーション
5.1. PerformanceSoftNavigation インターフェイス
[Exposed =Window ]interface :PerformanceSoftNavigation PerformanceEntry {readonly attribute NavigationType ;navigationType readonly attribute unsigned long long ;interactionId InteractionContentfulPaint ?(); };getLargestInteractionContentfulPaint PerformanceSoftNavigation includes PaintTimingMixin ;
各 PerformanceSoftNavigation
は次を持つ:
-
関連付けられた コンテキスト、すなわち InteractionContext。
-
関連付けられた ペイントタイミング情報。
navigationType
属性のゲッターは、this
の
コンテキストの ナビゲーション型を返さなければならない。
interactionId
属性のゲッターは、this
の
コンテキストの id を返さなければならない。
getLargestInteractionContentfulPaint()
メソッドは、this の
コンテキストの 最大コンテンツフルペイントを返さなければならない。
name
属性のゲッターは、this
の
コンテキストの 最初の URL
値を返さなければならない。
entryType
属性のゲッターは を返さなければならない。
startTime
属性のゲッターは、this の
コンテキストの 開始時刻を返さなければならない。
duration
属性のゲッターは、発行時点での this の
presentationTime
と this の
コンテキストの
開始時刻との差を返さなければならない。
注: 実際には、getLargestInteractionContentfulPaint()
は非 null のエントリを返すことが期待される。確認済みのソフトナビゲーションは、
その送出をトリガーするために、少なくとも 1 つの検出されたインタラクション・コンテンツフル・ペイントを
必要とするためである。
しかし、将来の反復では、ソフトナビゲーションを、最初のペイントより前の URL 変更時点で
ただちにコミット済みとみなせるかどうかを評価する可能性がある。そのようなモデルでは、このメソッドは
送出時点で null を返す場合がある。
このタイミングに関する主な設計上の考慮事項は、URL 変更から最初のペイントまでの
区間で発生する他のタイムラインエントリ(例:
LayoutShift、PerformanceResourceTiming、LongAnimationFrameTiming など)の帰属である。多くのサイトでは、
たとえば fetch リクエストを開始した直後に新しい URL をコミットするが、その間も現在のページは
以前のナビゲーション状態に留まる。タイムラインの切り分けを一貫させるため、この仕様は、
最初のペイントが遷移を確認するまで、そのようなすべてのエントリを以前のナビゲーション識別子に帰属させる。
5.2. ソフトナビゲーションのアルゴリズム
ソフトナビゲーションとは、 以下の条件を満たす同一文書ナビゲーションである:
-
InteractionContext がアクティブな間に、同一文書 URL 変更が発生する。
-
同じ InteractionContext に帰属されるコンテンツフル・ペイントが発生する。
-
interaction context の 発行済み が true である場合、返る。
-
document の アクティブなソフトナビゲーション候補 が interaction context でない場合、返る。
-
interaction context の 最初の URL 値 が null である場合、返る。
-
interaction context の 最初のコンテンツフルペイント が null である場合、返る。
-
window を document の 関連するグローバルオブジェクト とする。
-
entry を、window と interaction context が与えられたものとして ソフトナビゲーション エントリを作成する結果とする。
-
window と entry が与えられたものとして、ソフトナビゲーションエントリを発行する。
-
interaction context の 発行済み を true に設定する。
Window
window, and an
InteractionContext interaction
context:
-
entry を、window の realm 内の新しい
PerformanceSoftNavigationオブジェクトとする。 -
entry の コンテキスト を interaction context に設定する。
-
first paint を interaction context の 最初のコンテンツフルペイント とする。
-
first paint が null でないことを 表明する。
-
entry に関連付けられた ペイントタイミング情報 を、first paint に関連付けられた ペイントタイミング情報 に設定する。
-
entry を返す。
Window
window and a
PerformanceSoftNavigation
entry:
-
window が与えられたものとして、現在のナビゲーション ID を増加させる。
-
entry をキューに入れる。
-
entry を window の パフォーマンスエントリバッファ に追加する。
注: この navigationId
for this PerformanceSoftNavigation
エントリは、他の
PerformanceEntry
型の挙動と一致するように、パフォーマンスタイムラインへキューに入れられる一部として自動的に設定される。
NavigationType
navigation type:
-
url が document の url と等しい場合、返る。
-
interaction context を、document が与えられたものとして 現在の操作 コンテキストを取得する結果とする。
-
interaction context が null である場合、返る。
-
interaction context の 最後の URL 値 を url に設定する。
-
interaction context の 最初の URL 更新タイムスタンプ が null である場合:
-
interaction context の 最初の URL 更新 タイムスタンプ を、document の 関連するグローバルオブジェクト が与えられたものとして得られる 現在の高分解能時刻 に設定する。
-
interaction context の 最初の URL 値 を url に設定する。
-
interaction context の ナビゲーション型 を navigation type に設定する。
-
-
document の アクティブなソフトナビゲーション候補 を interaction context に設定する。
-
document と interaction context が与えられたものとして、ソフトナビゲーション発行を評価する。
6. 仕様統合
6.1. DOM 統合
6.1.1. Document
各 文書 は、操作 ID から 操作コンテキストへの写像、すなわち マップを持ち、 初期状態では空である。
各 文書 は、アクティブなソフトナビゲーション 候補、すなわち InteractionContext または null を持ち、初期状態では null である。
各 文書 は、現在の変更 生成 ID、すなわち 64 ビット符号なし整数を持ち、0 に初期化される。
注: 現在の変更生成 ID は、関連する DOM 変更が、前回の 変更とは異なる InteractionContext で発生したときに 変化する。これにより、関連する変更をまとめて グループ化できるようになり、InteractionPaintTimingNodeState オブジェクトを 新しさの観点から比較し、追跡が必要なノードを最適化できるようになる。
各 文書 は、最後の変更 コンテキスト、すなわち InteractionContext または null を持ち、初期状態では null である。
各 文書 は、マークされたノード状態、すなわち マップ であり、Node から InteractionPaintTimingNodeState への対応を持ち、 初期状態では空である。
各 文書 は、伝播されたノード状態、すなわち マップ であり、Node から InteractionPaintTimingNodeState への対応を持ち、 初期状態では空である。
各 文書 は、操作ペイント タイミングがダーティであるか、すなわち真偽値を持ち、 初期状態では false である。
6.1.2. Node
-
要素の
またはclass style属性が変更された。 -
リソース属性(たとえば
imgまたはvideo要素のsrcなど)が変更された。
次の手順を実行する:
-
node が与えられたとき、インタラクション・ペイントタイミング用に 変更済みのノードとして記録する。
6.2. HTML 統合
6.2.1. History
documentsEntryChanged が
true であり、かつ documentIsNew が false である場合)の前に、同一
文書コミットを処理するを、Document、
対象エントリの url、および "traverse"
が与えられたものとして実行する。
push"
または
"replace"
のいずれか)が与えられたものとして実行する。
6.2.2. ハードナビゲーション
新しい Window
が作成されたとき(例:"hard" navigation の間)、
現在のナビゲーション ID は § 2.1 ナビゲーション
ID で指定されるとおりに初期化される。
PerformanceNavigationTiming
エントリを作成するとき、ユーザーエージェントは、その navigationId を Window
の
現在のナビゲーション ID に設定しなければならない。
6.3. Event Timing 統合
この仕様は、[EVENT-TIMING] における操作の定義を拡張し、現代の Web アプリケーションおよび シングルページアプリケーションに関連する追加の イベント型を含める。
次のイベント型は、操作([EVENT-TIMING] で定義される)の一部とみなされる:
-
navigate -
popstate -
hashchange
これらのイベントがユーザー操作の結果として配送される場合、ユーザーエージェントは、それらに
文書の 関連するグローバルオブジェクト について 次の interactionId を取得する
ことによって得られる一意の interactionId
を割り当てなければならない。イベントが、すでに interactionId
が割り当てられている以前の操作によってトリガーされた場合、ユーザーエージェントは
その同じ識別子を再利用するべきである。
注:これらのイベントは、ユーザー操作から始まる
開始イベントである場合にのみ、一次的なインタラクションとして報告される
(例:ブラウザー UI の戻るボタンをクリックする場合)。その他のほとんどのシナリオ、たとえば
click ハンドラーが手動で履歴を操作する場合では、その後の popstate または
navigate イベントは
独立したユーザーインタラクションとはみなされない。
これらのプログラム的に発火されたイベントには isTrusted
フラグが設定されていない場合があるが、履歴 API および
ナビゲーション API は開始タスクの非同期継続として扱われるため、[ASYNC-CONTEXT] を介して元のインタラクションに
正しく帰属される。
注: イベント navigate、popstate、および hashchange は、
ソフトナビゲーションを追跡し interactionId を割り当てるための内部シグナルとして
使用される。この仕様は、これらの
イベント種別を PerformanceEventTiming エントリとして
パフォーマンスタイムラインへ公開することを要求せず、
その判断を [EVENT-TIMING]
仕様に委ねる。
注: [EVENT-TIMING] 仕様は、
processingStart および processingEnd フックを明示的に定義し、
interactionId の割り当てがこの統合に十分な早さで
発生することを保証するよう更新されることが期待される。現在、interactionId の割り当ては通常、
イベント処理の終了まで
遅延される。
この仕様は、
安全なグローバルカウンターを保証するため、interactionId に対して
unsigned を使用する一方、[EVENT-TIMING] は現在、それを unsigned として定義している。この不一致は、
両仕様の将来バージョンで解決されることが期待される。
Window
window について、
次の
interactionId を取得するには:
-
window の interaction count を、window の interaction count に 1 を加えた値に設定する。
-
window の initial interactionId value に、 (window の interaction count と window の interactionId increment の積)を加えた値を返す。
-
timingEntry を イベントタイミング処理開始を初期化して記録する 結果に設定する手順の直後に、次の手順を実行する:
-
timingEntry が与えられたとき、イベント配送用の現在の インタラクションコンテキストを設定する。
-
-
イベントタイミング処理終了を記録するを呼び出す手順の 直前に、次の手順を実行する:
6.4. Paint Timing 統合
この仕様は、[PAINT-TIMING] 仕様を拡張し、インタラクションによって変更された要素について ペイント追跡をリセットし、レンダリングされた文書に対するペイント帰属をトリガーする。
Document
document が与えられたとき、手順 1 の後に次の手順を追加する:
-
document が与えられたとき、文書とその子孫の インタラクションコンテキストを更新する。
Mark paint time は、UA が文書をペイントする前に来るべき手順と 後に来るべき手順を混在させている。ここで追加される手順は、ペイント前に発生することが期待される。[w3c/paint-timing Issue #126]
Document
document、ペイントタイミング情報 paintTimingInfo、
順序付きセットである 保留中の画像レコード paintedImages、および
順序付き
セットである
要素 paintedTextNodes を与える:
-
document、 paintTimingInfo、paintedImages、および paintedTextNodes が与えられたとき、 インタラクション・ コンテンツフル・ペイントおよびソフトナビゲーションを報告する。
次のアルゴリズムを追加する:
-
node のテキスト要素追跡をリセットする。
-
node の画像要素追跡をリセットする。
これはプレースホルダー アルゴリズムである。関連する要素について再ペイントを許可する必要があるが、 その再ペイントは Element Timing または LCP に影響してはならない。テキストと画像は、 関連するペイントが発生したことを検出する仕組みが異なり、どちらも再ペイントをサポートするよう 更新される必要がある。
次のアルゴリズムを追加する:
6.5. Largest Contentful Paint(LCP)統合
7. セキュリティとプライバシーの考慮事項
Soft Navigations を performance timeline に公開すること自体には、セキュリティおよびプライバシー上の影響はありません。 しかし、検出された soft navigation の結果としてさまざまな paint timing エントリをリセットすることには、 影響があり得ます。特に visited links が パーティション化される前はそうです。そのため、 :visited cache をパーティション化せずにそのような paint 操作を公開することは、対象となる paint 操作を慎重に分析し、それらが origin をまたいでユーザーの履歴を公開しないことを確認した後に 限って行う必要があります。同様に、詳細な paint timing 情報(Interaction Contentful Paint を通じたものなど)を公開すると、
spelling または grammar error decorations(
または による)が適用されたときの
paint 更新を観測するために使用される可能性があります。緩和策がない場合、これにより
攻撃者がテキストフィールド内の単語をプログラムによって順に試し、それらがユーザーの辞書に
存在するかどうかを確認できる可能性があります。しかし、ブラウザーは spelling および grammar
checks をユーザー操作(例: キー押下またはクリック)ごとに 1 回だけ発生するように制限することで、ユーザー辞書の
リークを防止しています。timing および paint
情報は、他の標準 API を通じて開発者がすでに観測可能であるため、これらの timing
entries を公開しても、ブラウザーの spelling/grammar highlight rate limits によってすでに制約されている
ものを超える新たな情報漏えいは導入されません。
8. 付録: 重複するインタラクションと競合状態
ウェブアプリケーションは、多くの場合、複数のユーザーインタラクションを短時間に連続して処理します。 この仕様は、次のモデルを通じて、そのような重なり合うインタラクションを扱います:
-
コンテキストの独立性:各インタラクションは、それぞれ独自の InteractionContext を独立して管理します。 複数のコンテキストが同時に「進行中」になり、それぞれが独自の URL 変更と コンテンツフル・ペイントを追跡できます。
-
アクティブ候補のシングルトン:多くのインタラクションがアクティブになり得る一方で、Document は任意の時点で 1 つの アクティブなソフトナビゲーション候補 だけを認識します。
-
プリエンプション:インタラクションコンテキストは、最初の同一文書 URL 変更を引き起こした瞬間に、アクティブなソフトナビゲーション候補 になります。後続のインタラクション変更が発生した場合、それは以前のものを置き換え、 新しい候補になります。
-
送出の検証:
PerformanceSoftNavigationは、送出条件(URL 変更 + コンテンツフル・ペイント)が満たされた瞬間に アクティブなソフトナビゲーション候補 であるインタラクションコンテキストについてのみ送出されます。これにより、ソフトナビゲーションの報告が、 文書の現在の視覚状態およびナビゲーション状態と一貫したままであることが保証されます。 -
持続的な帰属:あるインタラクションがソフトナビゲーション候補として置き換えられた場合でも、 それがアクティブである限り、そのインタラクションは独自の
InteractionContentfulPaintエントリの帰属と報告を継続します。これにより、それ自体は「ナビゲーション」と みなされない同時並行のレンダリング更新を正確に測定できます。