ソフトナビゲーションと Interaction Contentful Paint

ドラフトコミュニティグループ報告書,

このバージョン:
https://wicg.github.io/soft-navigations/
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/soft-navigation-heuristics
課題追跡:
GitHub
編集者:
(Google)
(Google)
以前の編集者:
(Shopify)

概要

この文書は、インタラクションによって開始された効果を測定するための仕組みを定義し、ユーザーエージェントが ページの変更およびパフォーマンスエントリを、それらを引き起こしたユーザーインタラクションに帰属できるようにします。

この文書のステータス

この仕様は、Web Platform Incubator コミュニティグループによって公開されました。 これは 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

navigation id は、global object の存続期間内の各ナビゲーション(ハードおよびソフトの両方)に割り当てられる一意な 識別子です。

global object は、current navigation 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 は、単一のインタラクションからソフトナビゲーションを 検出するために必要なデータを維持するために使用される struct です。 これは次の items を持ちます:
この仕様の将来のバージョンでは、ナビゲーションのより完全な履歴を提供するために、 インタラクションコンテキスト中に発生するすべての URL 更新を追跡する可能性があります。 last URL value は、現在 SoftNavigationEntry の name で first URL value のみが公開されている場合でも、効果をインタラクションの最終状態に正確に帰属させるために 内部的に追跡されます。
total painted area の概念は、[CONTAINER-TIMING] 統合の一部として洗練されることが期待されており、 特定の更新領域の追跡へ移行する可能性があります。

2.4. 基盤アルゴリズム

get current interaction context するには、次の手順を実行します:
  1. context を、内部 AsyncContext.Variable [[ActiveInteractionContext]] の値とします。

  2. context を返します。

Document documentinteraction id、および Event event が与えられたとき、 get or create context for interaction するには、次の手順を実行します:
  1. documentinteraction id to interaction context[interaction id] が exists する場合、 documentinteraction id to interaction context[interaction id] を返します。

  2. interaction context を新しい InteractionContext とします。

  3. interaction contextidinteraction id に設定します。

  4. interaction contextstart timeeventstartTime に設定します。

  5. documentinteraction id to interaction context[interaction id] を interaction contextSet します。

  6. interaction context を返します。

Document documentEvent event が与えられたとき、update interaction contexts for event するには、次の手順を実行します:
  1. timestamp を、documentrelevant global object が与えられた current high resolution time とします。

  2. is scroll を、event の型が "scroll" の場合は true、そうでない場合は false とします。

  3. is input を、event の型が([EVENT-TIMING] で定義される)has dispatched input event をトリガーするイベント型の場合は true、 そうでない場合は false とします。

  4. is scroll が false かつ is input が false の場合、返します。

  5. documentinteraction id to interaction context の値の各 interaction context について:

    1. is scroll が true で、interaction contextfirst scroll timestamp が 未設定の場合:

      1. interaction contextfirst scroll timestamptimestamp に設定します。

    2. is input が true で、interaction contextfirst input timestamp が 未設定の場合:

      1. interaction contextfirst input timestamptimestamp に設定します。

Document documentinteraction id、および Event event が与えられたとき、interaction event processing start するには、次の手順を実行します:
  1. interaction id が null の場合、null を返します。

  2. interaction context を、documentinteraction id、および eventget or create context for interaction を呼び出した結果とします。

  3. 内部 AsyncContext.Variable [[ActiveInteractionContext]] の値を interaction context に設定します。

  4. interaction context を返します。

null または InteractionContext interaction context が与えられたとき、interaction event timing processing end するには、次の手順を実行します:
  1. interaction context が null の場合、返します。

  2. 内部 AsyncContext.Variable [[ActiveInteractionContext]] の値を null に設定します。

3. Interaction Contentful Paint

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 は、関連付けられた paint timing info を持ちます。

現在これは Largest Contentful Paint (LCP) パフォーマンスエントリをモデルにしていますが、将来的な方向性としては Container Timing パフォーマンスエントリをモデルにすることです。
renderTime 属性の getter は、this に関連付けられた paint timing inforendering update end time を返さなければなりません。

loadTime 属性の getter は、this に関連付けられた paint timing infoimplementation-defined presentation time を返さなければなりません。

size 属性の getter は、コンテンツフルペイントの size を返さなければなりません。

id 属性の getter は、コンテンツフルペイントの ID を返さなければなりません。

url 属性の getter は、コンテンツフルペイントの URL を返さなければなりません。

element 属性の getter は、コンテンツフルペイントに関連付けられた Element を返さなければならず、その要素が文書から削除されている場合は null を返さなければなりません。

interactionId 属性の getter は、この paint を引き起こしたインタラクションの interaction id を返さなければなりません。

3.2. Interaction Contentful Paint アルゴリズム

global object globalInteractionContext interaction context、および Element element が与えられたとき、create an interaction contentful paint entry するには、次の手順を実行します:
  1. entry を、globalrealm 内の新しい InteractionContentfulPaint オブジェクトとします。

  2. entryentryType を "interaction-contentful-paint" に設定します。

  3. entryelementelement に設定します。

  4. entryinteractionIdinteraction contextid に設定します。

  5. entry に関連付けられた paint timing info を新しい paint timing info に設定します。

  6. entry の renderTimeloadTimesizeid、 および url を、report largest contentful paint アルゴリズム ([LARGEST-CONTENTFUL-PAINT] 内で定義)のコンテンツフルペイント候補の対応する値に設定します。

  7. entrystartTimeinteraction contextstart time に設定します。

  8. entryduration を、entryrenderTimeentrystartTime の差に設定します。

  9. entry を返します。

Element elementDocument document、および InteractionContext interaction context が与えられたとき、emit interaction contentful paint entry するには、次の手順を実行します:
  1. globaldocumentrelevant global object とします。

  2. paint entry を、globalinteraction context、および elementcreate an interaction contentful paint entry を呼び出した結果とします。 注: リソース読み込みを必要とする要素(例: 新しい src を持つ画像)の場合、[PAINT-TIMING] 仕様は、最終的にこのアルゴリズムを呼び出す コンテンツフルペイント検出をトリガーする前に、"is loaded" 条件が満たされることを保証する責任を持ちます。

  3. interaction contextfirst scroll timestamp が設定されており、 paint entryrenderTimeinteraction contextfirst scroll timestamp より大きい場合、返します。

  4. interaction contextfirst input timestamp が設定されており、 paint entryrenderTimeinteraction contextfirst input timestamp より大きい場合、返します。

  5. paint entryQueue します。

  6. paint entryglobalperformance entry buffer に追加します。

  7. interaction contextfirst contentful paint が null の場合:

    1. interaction contextfirst contentful paintpaint entry に設定します。

  8. interaction contextlargest contentful paintpaint entry に設定します。

  9. interaction contexttotal painted areapaint 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 は、関連付けられた paint timing info を持ちます。

navigationType 属性の getter は、ソフトナビゲーションを引き起こしたインタラクションの navigation type を返さなければなりません。

interactionId 属性の getter は、ソフトナビゲーションを引き起こしたインタラクションの interaction id を返さなければなりません。

largestInteractionContentfulPaint 属性の getter は、そのインタラクションの結果として発生した最大のコンテンツフルペイントを表す InteractionContentfulPaint エントリを返さなければならず、そのような paint が発生していない場合は null を返さなければなりません。

name 属性の getter は、ソフトナビゲーションを引き起こしたインタラクションの first URL value を返さなければなりません。

startTime 属性の getter は、ソフトナビゲーションを引き起こしたインタラクションの start time を返さなければなりません。

duration 属性の getter は、発行時点の thispresentationTimethisstartTime の差を返さなければなりません。

実際には、確認済みのソフトナビゲーションは、その発行をトリガーするために少なくとも 1 つの検出済み インタラクションコンテンツフルペイントを必要とするため、largestInteractionContentfulPaint は non-null であることが期待されます。

ただし、将来の反復では、最初の paint より前に、URL 変更時点で直ちにソフトナビゲーションを committed とみなせるかどうかを評価する可能性があります。そのようなモデルでは、このフィールドは発行時点で null になる可能性があります。

このタイミングにおける主な設計上の考慮事項は、URL 変更と最初の paint の間の区間で発生する他のタイムラインエントリ (例: LayoutShiftPerformanceResourceTimingLongAnimationFrameTiming など)の帰属です。たとえば多くのサイトは、 現在のページが以前のナビゲーション状態に残っている間でも、fetch リクエストを開始した直後に新しい URL を commit します。 一貫したタイムライン分割を保証するため、この仕様は、最初の paint が遷移を確認するまで、 そのようなすべてのエントリを以前のナビゲーション識別子に帰属させます。

4.2. ソフトナビゲーションアルゴリズム

soft navigation は、 次の条件を満たす同一文書ナビゲーションです:

Document document および InteractionContext interaction context が与えられたとき、evaluate soft navigation emission するには、次の手順を実行します:
  1. interaction contextemitted が true の場合、返します。

  2. documentactive soft navigation candidateinteraction context でない場合、返します。

  3. interaction contextfirst URL value が未設定の場合、返します。

  4. interaction contextfirst contentful paint が null の場合、 返します。

  5. globaldocumentrelevant global object とします。

  6. urlinteraction contextfirst URL value とします。

  7. entry を、globalinteraction contexturl、および interaction contextstart timecreate a soft navigation entry を呼び出した結果とします。

  8. global および entryemit soft navigation entry を呼び出します。

  9. interaction contextemitted を true に設定します。

global object globalInteractionContext interaction contextstring url、および DOMHighResTimeStamp start time が与えられたとき、create a soft navigation entry するには、次の手順を実行します:
  1. entry を、globalrealm 内の新しい SoftNavigationEntry オブジェクトとします。

  2. entrynameurl に設定します。

  3. entryentryType を "soft-navigation" に設定します。

  4. entrystartTimestart time に設定します。

  5. first paintinteraction contextfirst contentful paint とします。

  6. first paint が null でない場合:

    1. entry に関連付けられた paint timing info を、first paint に 関連付けられた paint timing info に設定します。

  7. entryinteractionIdinteraction contextid に設定します(利用可能な場合)。

  8. entrylargestInteractionContentfulPaintinteraction contextlargest contentful paint に設定します。

  9. entry を返します。

注: navigationId は、さらに後の queue a PerformanceEntry で設定されます。
global object globalSoftNavigationEntry entry が与えられたとき、emit soft navigation entry するには、次の手順を実行します:
  1. entrynavigation identryinteractionId に設定します。

  2. globalcurrent navigation identryinteractionId に設定します。

  3. entryQueue します。

  4. entryglobalperformance entry buffer に追加します。

Document documentstring url、および string navigation type が与えられたとき、process same document commit するには、次の手順を実行します:
  1. interaction context を、get current interaction context を呼び出した結果とします。

  2. interaction context が null の場合、返します。

  3. interaction contextlast URL valueurl に設定します。

  4. interaction contextfirst URL update timestamp が 未設定の場合:

    1. interaction contextfirst URL update timestamp を、documentrelevant global object が与えられた current high resolution time に設定します。

    2. interaction contextfirst URL valueurl に設定します。

    3. interaction contextnavigation typenavigation type に設定します。

  5. documentactive soft navigation candidateinteraction context に設定します。

  6. document および interaction contextevaluate soft navigation emission を呼び出します。

5. PerformanceEntry 拡張

[Exposed=(Window,Worker)]
partial interface PerformanceEntry {
    readonly attribute unsigned long long navigationId;
};
PerformanceEntry は、関連付けられた navigation id、すなわち unsigned long long を持ち、初期値は 0 です。

navigationId 属性の getter は、thisnavigation id を返さなければなりません。

6. 仕様の統合

6.1. HTML 統合

6.1.1. Document

document は、interaction id to interaction context、すなわち map を持ち、初期状態では空です。

document は、active soft navigation candidate、すなわち InteractionContext または null を持ち、初期値は null です。

6.1.2. History

update document for history step application において、5.5.1(documentsEntryChanged が true であり、 documentIsNew が false の場合)の前に、 process same document commit を、Documententryurl、および "traverse" で呼び出します。
[HTML] で定義される)shared history push/replace steps において、URL が更新された後、 process same document commit を、Document、新しい URL、および操作の種類("push" または "replace")で呼び出します。

6.1.3. Node

node は、associated interaction context を持ち、初期値は null です。

6.1.4. ハードナビゲーション

新しい global object global が作成されると(例: 「ハード」ナビゲーション中)、 その current navigation id§ 2.1 ナビゲーション ID で指定されるとおりに初期化されます。

[NAVIGATION-TIMING] において、初期ナビゲーションの PerformanceNavigationTiming エントリを作成するとき、ユーザーエージェントはその navigationIdglobal objectcurrent navigation id に設定しなければなりません。

6.2. Event Timing 統合

この仕様は、現代の Web アプリケーションおよびシングルページアプリケーションに関連する追加のイベント型を含めるために、 [EVENT-TIMING] のインタラクション定義を拡張します。

次のイベント型は、([EVENT-TIMING] で定義される)interaction の一部とみなされます:

これらのイベントがユーザーインタラクションの結果としてディスパッチされる場合、ユーザーエージェントは、 文書の relevant global object について get the next interactionId の手順を実行して取得した一意の interaction id を割り当てなければなりません。あるイベントが、すでに interaction id が割り当てられている以前のインタラクションによってトリガーされた場合、ユーザーエージェントは同じ識別子を再利用するべきです。

これらのイベントは、ユーザー操作から開始されるイベント(例: ブラウザー UI の戻るボタンをクリックする)である場合にのみ、 主要なインタラクションとして報告されます。その他ほとんどのシナリオ、たとえば click ハンドラーが手動で履歴を操作する場合には、その後の popstate または navigate イベントは独立した ユーザーインタラクションとはみなされません。

これらのプログラムによってトリガーされたイベントには isTrusted フラグが設定されていない可能性がありますが、履歴およびナビゲーション API は開始タスクの非同期継続として扱われるため、 [ASYNC-CONTEXT] を介して元のインタラクションに正しく帰属されます。

注: イベント navigatepopstate、および hashchange は、ソフトナビゲーションの追跡と interactionId の割り当てのための内部シグナルとして使用されます。この仕様は、これらのイベント型を PerformanceEventTiming エントリとしてパフォーマンスタイムラインに公開することを要求せず、 その判断は [EVENT-TIMING] 仕様に委ねます。
[EVENT-TIMING] 仕様は、processingStart および processingEnd フックを明示的に定義し、この統合に十分早い段階で interactionId の割り当てが行われるように更新されることが期待されます。現在、 interactionId の割り当ては、通常、イベント処理の終わりまで遅延されます。
TODO/Bugfix: この仕様は、安全なグローバルカウンターを保証するために interactionIdunsigned long long を使用しますが、 [EVENT-TIMING] は現在これを unsigned long と定義しています。この不一致は、 両仕様の将来のバージョンで解決されることが期待されます。
Window window について get the next interactionId するには:
  1. windowinteraction count を、windowinteraction count に 1 を加えた値に設定します。

  2. windowinitial interactionId value に (windowinteraction count × windowinteractionId increment)を加えた値を返します。

[EVENT-TIMING] で定義される processingStart において、 Document documentEvent event が与えられたとき、次の手順を追加します:
  1. document および eventupdate interaction contexts for event を呼び出します。

  2. interaction id を、eventinteraction id とします。

  3. documentinteraction id、および eventinteraction event processing start を呼び出します。

[EVENT-TIMING] で定義される processingEnd において、 Document documentInteractionContext interaction context が与えられたとき、次の手順を追加します:
  1. interaction contextinteraction event timing processing end を呼び出します。

6.3. Largest Contentful Paint (LCP) 統合

この仕様は、paint をインタラクションに帰属させるために [LARGEST-CONTENTFUL-PAINT] アルゴリズムにフックします。

report largest contentful paint において:
  1. contextToNewLargestCandidate を新しい map とします。

  2. paintedImages の各 record について:

    1. element を、recordpending image record element とします。

    2. interaction context を、elementassociated interaction context とします。

    3. interaction context が null の場合、continue します。

    4. size を、elementeffective visual size とします。

    5. size が null の場合、continue します。

    6. interaction contextlargest contentful paint が null でなく、かつ sizeinteraction contextlargest contentful paintsize 以下の場合、 continue します。

    7. contextToNewLargestCandidate[interaction context] が未設定、または sizecontextToNewLargestCandidate[interaction context] の size より大きい場合:

      1. contextToNewLargestCandidate[interaction context] を elementSet します。

  3. paintedTextNodes の各 textNode について:

    1. interaction context を、textNodeassociated interaction context とします。

    2. interaction context が null の場合、continue します。

    3. size を、 textNodeeffective visual size とします。

    4. size が null の場合、continue します。

    5. interaction contextlargest contentful paint が null でなく、かつ sizeinteraction contextlargest contentful paintsize 以下の場合、 continue します。

    6. contextToNewLargestCandidate[interaction context] が未設定、または sizecontextToNewLargestCandidate[interaction context] の size より大きい場合:

      1. contextToNewLargestCandidate[interaction context] を textNodeSet します。

  4. contextToNewLargestCandidate 内の各 interaction contextnewLargestElement について:

    1. newLargestElementdocument、および interaction contextemit interaction contentful paint entry を呼び出します。

    2. document および interaction contextevaluate soft navigation emission を呼び出します。

§ 6.4 Container Timing 統合 節は、DOM の変更が影響を受ける要素の previously reported paints をリセットし、それらが [LARGEST-CONTENTFUL-PAINT] アルゴリズムによって再評価され、 現在のインタラクションに正しく帰属されるようにする方法を定義します。
[LARGEST-CONTENTFUL-PAINT] アルゴリズムは、関連付けられた インタラクションコンテキストを持つ任意の paint を無視することが期待されます。これらは、この仕様の § 3.1 InteractionContentfulPaint インターフェイス によって処理されるためです。

6.4. Container Timing 統合

[CONTAINER-TIMING] API は、共通の DOM 祖先によってレンダリング効果を グループ化する仕組みを提供します。この仕様は、その仕組みと統合して、レンダリングの変更をユーザーインタラクションに 帰属させます。

node insert において、または node が 次のいずれかの方法で変更されたとき:

次の手順を実行します:

  1. interaction context を、get current interaction context を呼び出した結果とします。

  2. interaction context が null でない場合:

    1. node の associated interaction contextinteraction context に設定します。

    2. node を([CONTAINER-TIMING] で定義される)コンテナールートとして指定します。

    3. node とその各子孫について、([PAINT-TIMING] で定義される)Documentpreviously reported paints からそれらを削除します。

変更されたサブツリーを previously reported paints の集合から削除することで、 ユーザーエージェントは、これらの要素に対する次のコンテンツフルペイントが再検出され、新しい InteractionContext に正しく帰属されることを保証します。
注: "node insert" への参照は、文書構造に新しい要素を追加するすべての操作 (例: appendChildinnerHTML 更新など)を含む高レベルの説明です。これらを文書構造の変更を追跡する 内部実装フックに対応付けることは、ユーザーエージェントに委ねられます。
ユーザーエージェントは、コンテナールートのスパースツリーを維持することが推奨されます。 変更された node が、同じインタラクションコンテキストに関連付けられた既存のコンテナールートの子孫である場合、 ユーザーエージェントは新しい冗長なルートを作成しないことを選択できます。

さらに、大規模な DOM 変更中に高コストなメインスレッド作業を避けるため、ユーザーエージェントは 子孫を previously reported paints から削除する処理を最適化することが推奨されます。 即時の網羅的な走査の代わりに、ユーザーエージェントは変更されたルートを "dirty" としてマークし、 後続のツリー走査(例: layout または paint 中)でこの状態を遅延伝播できます。 非表示であることが分かっているサブツリー、または content-visibility や CSS containment のような既存の仕組みによって スキップされるサブツリーも、このリセット処理中にスキップできます。

6.5. Performance Timeline 統合

queue a PerformanceEntry において、ステップ 1(entry の初期化)の後、 次の手順を追加します:

  1. newEntrynavigation id が 0 の場合:

    1. newEntrynavigation idglobalcurrent navigation id に設定します。

7. 重複するインタラクションと競合状態

この節は非規範的です。

Web アプリケーションは、多くの場合、複数のユーザーインタラクションを短時間で連続して処理します。この仕様は、 次のモデルを通じてそのような重複するインタラクションを扱います:

8. セキュリティとプライバシーに関する考慮事項

ソフトナビゲーションをパフォーマンスタイムラインに公開すること自体には、セキュリティおよびプライバシー上の影響はありません。 ただし、検出されたソフトナビゲーションの結果としてさまざまな paint timing エントリをリセットすることは、 影響を持つ可能性があります。 特に、visited links が partitioned される前はそうです。 そのため、:visited キャッシュを partitioning することなくそのような paint 操作を公開することは、 問題となる paint 操作を慎重に分析し、それらがオリジンをまたいでユーザーの履歴を露出しないことを確認した後にのみ 行う必要があります。

索引

この仕様で定義される 用語

参照先で定義される 用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. Living 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. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living 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. Living 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. 17 December 2012. 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;
};