ロングタスク API

W3C 作業草案

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2024/WD-longtasks-1-20240524/
最新の公表バージョン:
https://www.w3.org/TR/longtasks-1/
編集者草案:
https://w3c.github.io/longtasks/
過去のバージョン:
履歴:
https://www.w3.org/standards/history/longtasks-1/
テストスイート:
http://w3c-test.org/longtask-timing/
フィードバック:
GitHub
仕様内でインライン
編集者:
(Google)
以前の編集者:
(Google)
(Google)
(Google)

概要

本書は、ウェブページの作成者が「ロングタスク」(UIスレッドを長時間占有し、他の重要なタスクの実行を妨げるもの―例: ユーザー入力への反応)を検出するために使用できるAPIを定義します。

この文書のステータス

このセクションは、本書が公開された時点でのステータスを説明します。 最新のW3C出版物の一覧および本技術レポートの最新版は W3C技術レポートインデックス https://www.w3.org/TR/ でご確認いただけます。

本書は Webパフォーマンス作業グループ により、作業草案として 勧告トラックを用いて公開されました。 作業草案としての公開は、W3Cおよびその会員による承認を意味するものではありません。

本書はドラフト文書であり、随時更新、置換、または他の文書により廃止される可能性があります。 本書を進行中の作業以外として引用するのは適切ではありません。

本仕様の議論には、GitHub Issuesの利用が推奨されています。

本書は2023年11月3日版W3Cプロセス文書に従って管理されています。

本書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを管理しています。 そのページには特許の開示方法も記載されています。 特許の「必須クレーム」が含まれていると考えられる特許を実際に知っている個人は、 W3C特許ポリシー第6節に従い情報を開示しなければなりません。

本書に関するコメントは、public-web-perf@w3.org購読, アーカイブ)宛にメールの件名先頭に[LongTasks]を付けて送信してください。

1. はじめに

ページの読み込み中やユーザーがページとやり取りしている間、アプリケーションやブラウザーは様々なイベントをキューに入れ、ブラウザーがそれらを実行します。例えば、ユーザーエージェントはユーザーの操作に基づいて入力イベントをスケジュールし、アプリケーションは requestAnimationFrame や他のコールバックのためにコールバックをスケジュールします。キューに入ったイベントは、ブラウザーによって一つずつ取り出されて実行されます。

しかし、いくつかのタスクは長時間(複数フレーム)かかる場合があり、その際UIスレッドがブロックされ、他のすべてのタスクもブロックされることがあります。ユーザーにとっては、これはしばしば「固まった」ページとして現れ、ブラウザーがユーザー入力に応答できなくなります。これは現在ウェブ上でのユーザー体験の大きな悪化要因です:

「操作可能になるまでの時間」の遅延:

ページの読み込み中や、完全に視覚的に表示されていても、ロングタスクがメインスレッドを占有し、ユーザーがページとやり取りするのを妨げます。設計の悪いサードパーティコンテンツが原因となることが多いです。

入力遅延の増加・ばらつき:

重要なユーザー操作イベント(例:タップ、クリック、スクロール、ホイールなど)がロングタスクの後ろに並べられるため、体験がぎこちなく予測困難になります。

イベント処理遅延の増加・ばらつき:

入力イベントと同様、イベントコールバック(例:onloadイベントなど)の処理が遅れ、アプリケーションの更新が遅延します。

アニメーションやスクロールのカクつき:

一部のアニメーションやスクロール操作は、コンポジタスレッドとメインスレッドの協調が必要ですが、メインスレッドがロングタスクでブロックされると、アニメーションやスクロールの応答性に影響します。

一部のアプリケーションやRUMベンダーは、すでに「ロングタスク」が発生したケースの特定や追跡を試みています。例えば、既知のパターンとして、短い周期的なタイマーを設置し、連続するタイマーの満了間の経過時間を調べる方法があります。経過時間がタイマー周期を超えていれば、ロングタスクによってイベントループの実行が遅延した可能性が高いです。この方法は一応機能しますが、パフォーマンス面で多くの問題があります:ロングタスク検出のためにポーリングすると、アイドル状態や長時間の休止が防げてしまい(requestIdleCallback参照)、バッテリー寿命に悪影響を及ぼします。また、遅延の原因(ファーストパーティかサードパーティのコードか)は分かりません。

RAILパフォーマンスモデルは、アプリケーションがユーザー入力に100ms以内で応答するべきだと提案しています(タッチ移動やスクロールの場合は16ms)。このAPIの目的は、アプリケーションがこれらの目標を達成できなくなる原因となるタスクについて通知を提供することです。本APIは50ms以上かかるタスクを検出します。これらのタスクがないウェブサイトは、ユーザー入力に100ms以内で応答できるはずです:ユーザー入力が発生したとき実行中のタスクを50ms未満で終了し、入力への反応タスクも50ms未満で実行できます。

1.1. 利用例

const observer = new PerformanceObserver(function(list) {
    for (const entry of list.getEntries()) {
        // ロングタスク通知の処理:
        // 分析や監視のための報告
        // ...
    }
});
// 過去および今後のロングタスク通知用にオブザーバーを登録
observer.observe({type: "longtask", buffered: true});
// この後に長いスクリプト実行があると、
// "longtask" エントリがオブザーバーにキューされ受け取れる

2. 用語

ロングタスクは、以下のいずれかの事象で50msを超えて継続するものを指します:

ブラウジングコンテナは、ブラウジングコンテキストbcアクティブドキュメントノードナビゲータブルコンテナです。

注: この用語は古くなっており、改訂時には新しい用語を再利用すべきです。

原因となるブラウジングコンテナは、ブラウジングコンテナiframe, objectなど)が、ロングタスクの主な原因として特定される場合を指します。

アトリビューションは、ロングタスクに大きく寄与した作業(スクリプト、レイアウト等)の種類の特定と、その作業の責任を持つ原因となるブラウジングコンテナの特定を指します。

3. ロングタスクタイミング

ロングタスクタイミングには次の新しいインターフェースが含まれます:

3.1. PerformanceLongTaskTiming インターフェース

[Exposed=Window]
interface PerformanceLongTaskTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute FrozenArray<TaskAttributionTiming> attribution;
    [Default] object toJSON();
};

PerformanceLongTaskTiming の属性値は、§ 4.1 ロングタスクの報告にある処理モデル内で設定されます。以下は、それらがどのように設定されるかの説明(参考)です。

name 属性のgetterは、次のいずれかの文字列を返します:

"unknown"

ロングタスクが、ユーザーエージェントがイベントループ外で行った作業から発生した場合。

"self"

ロングタスクが、このイベントループタスク内で、現在のブラウジングコンテキストで発生した場合。

"same-origin-ancestor"

ロングタスクが、イベントループタスク内で、同一オリジン祖先ナビゲーブルで発生した場合。

"same-origin-descendant"

ロングタスクが、イベントループタスク内で、同一オリジン子孫ブラウジングコンテキストで発生した場合。

"same-origin"

ロングタスクが、イベントループタスク内で、祖先でも子孫でもない同一オリジンブラウジングコンテキストで発生した場合。

"cross-origin-ancestor"

ロングタスクが、イベントループタスク内で、クロスオリジンの祖先ナビゲーブルで発生した場合。

"cross-origin-descendant"

ロングタスクが、イベントループタスク内で、クロスオリジンの子孫ブラウジングコンテキストで発生した場合。

"cross-origin-unreachable"

ロングタスクが、イベントループタスク内で、祖先でも子孫でもないクロスオリジンのブラウジングコンテキストで発生した場合。

"multiple-contexts"

ロングタスクが、複数のブラウジングコンテキストをまたぐイベントループタスクから発生した場合。

注: これらの名前には「-unreachable」や「-contexts」など、いくつか一貫性がないものがあります。 互換性維持のため、これらの名前はそのままとされています。

entryType 属性のgetterは、"longtask" を返します。

startTime 属性のgetterは、タスクの開始時刻のDOMHighResTimeStamp を返します。

duration 属性のgetterは、タスク開始から終了までの経過時間を、1msの粒度で表したDOMHighResTimeStamp を返します。

attribution 属性のgetterは、TaskAttributionTiming エントリの凍結された配列を返します。

3.2. TaskAttributionTiming インターフェース

[Exposed=Window]
interface TaskAttributionTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute DOMString containerType;
    readonly attribute DOMString containerSrc;
    readonly attribute DOMString containerId;
    readonly attribute DOMString containerName;
    [Default] object toJSON();
};

TaskAttributionTiming の属性値は、§ 4.1 ロングタスクの報告にある処理モデル内で設定されます。以下は、それらがどのように設定されるかの説明(参考)です。

name 属性のgetterは常に"unknown"を返します。

entryType 属性のgetterは常に"taskattribution"を返します。

startTime 属性のgetterは常に0を返します。

duration 属性のgetterは常に0を返します。

containerType 属性のgetterは、原因となるブラウジングコンテナの種類("iframe"、"embed"、"object"など)を返します。単一の原因となるブラウジングコンテナが見つからない場合は、"window"を返します。

containerName 属性のgetterは、コンテナname コンテンツ属性の値を返します。単一の原因となるブラウジングコンテナが見つからない場合は、空文字列を返します。

containerId 属性のgetterは、コンテナid コンテンツ属性の値を返します。単一の原因となるブラウジングコンテナが見つからない場合は、空文字列を返します。

containerSrc 属性のgetterは、コンテナsrc コンテンツ属性の値を返します。単一の原因となるブラウジングコンテナが見つからない場合は、空文字列を返します。

3.3. 原因の特定

このセクションは規定ではありません。

ロングタスクは、スクリプト・レイアウト・スタイルなど様々な種類の作業を含む場合があり、異なるブラウジングコンテキスト内で実行されたり、全体的(ガベージコレクションなど)なものもあり、 エージェントクラスタブラウジングコンテキストグループセット全体にまたがる場合もあります。

このため、アトリビューションにはいくつかの側面があります:

したがって、name フィールドと attribution フィールド(PerformanceLongTaskTiming)で、ロングタスクの責任箇所を示します。 この情報を提供する際はWebの同一オリジンポリシーを遵守する必要があります。

これらのフィールドは独立していません。以下はそれらの関係の概要です:

name 原因となるブラウジングコンテナattributionで示される)
"self"
"same-origin-ancestor" 同一オリジンの原因
"same-origin-descendant" 同一オリジンの原因
"same-origin" 同一オリジンの原因
"cross-origin-ancestor"
"cross-origin-descendant"
"cross-origin-unreachable"
"multiple-contexts"
"unknown"

4. 処理モデル

注: Long Tasks API を実装するユーザーエージェントは、"longtask"supportedEntryTypesWindow コンテキスト用として含める必要があります。

これにより、開発者はロングタスクのサポートを検出できます。

4.1. ロングタスクの報告

start time, end time, top-level browsing contexts, task を受け取り、次のアルゴリズムを実行する:
  1. タスク終了時刻を記録する(end timetaskdocument を用いる)。

  2. end time から start time を引いた値がロングタスクの閾値(50ms)未満なら、この手順を中止する。

  3. destinationRealms を空の集合とする。

  4. レポートを配信する JavaScript Realm の集合を決定する:

    トップレベルブラウジングコンテキスト topmostBCtop-level browsing contexts の要素)について:

    1. topmostBCアクティブドキュメント関連RealmdestinationRealms に加える。

    2. descendantBCstopmostBCアクティブドキュメント子孫ブラウジングコンテキストのリスト とする。

    3. documentdescendantBCアクティブドキュメント とする。

    4. descendantBCdescendantBCs の要素)について、(document関連Realm, document関連設定オブジェクトクロスオリジン分離機能) を destinationRealms に加える。

  5. ユーザーエージェントは、JavaScript Realm の一部を destinationRealms から除外できる。

注: この除外は、ユーザーエージェントが別プロセスで扱う JavaScript Realm のロングタスク報告を回避するために利用される可能性がある。しかしこの概念は厳密には規定されていない。

どの Document がどのロングタスクに可視性を持つかについて、議論が続いているため、このロジックは将来的に変更される可能性がある。 [Issue #75]

  1. 各 (destinationRealm, crossOriginIsolatedCapability)(destinationRealms の要素)について:

    1. name を空文字列とする。これは下記の最小限の原因特定用に使われる。

    2. culpritSettingsnull とする。

    3. taskスクリプト評価環境設定オブジェクト集合 を処理して、以下の通り nameculpritSettings を決定する:

      1. taskスクリプト評価環境設定オブジェクト集合 が空なら、name を "unknown" に、culpritSettingsnull に設定する。

      2. そうでなく、taskスクリプト評価環境設定オブジェクト集合 の長さが 1 より大きいなら:name を "multiple-contexts" に、culpritSettingsnull に設定する。

      3. そうでなく、すなわち taskスクリプト評価環境設定オブジェクト集合 の長さが 1 の場合:

        1. culpritSettingstaskスクリプト評価環境設定オブジェクト集合 の唯一の項目に設定する。

        2. destinationSettingsdestinationRealm関連設定オブジェクト に設定する。

        3. destinationOrigindestinationSettingsオリジン に設定する。

        4. destinationBCdestinationSettingsグローバルオブジェクトブラウジングコンテキスト に設定する。

        5. culpritBCculpritSettingsグローバルオブジェクトブラウジングコンテキスト に設定する。

        6. Assert: culpritBCnull ではない。

        7. culpritSettingsdestinationSettings と同じなら、name を "self" に設定する。

        8. そうでなく、culpritSettingsオリジンdestinationOrigin同一オリジン の場合:

          1. destinationBCnull なら、name を "same-origin" に設定する。

          2. そうでなく、culpritBC祖先destinationBC の)なら、name を "same-origin-ancestor" に設定する。

          3. そうでなく、destinationBC祖先culpritBC の)なら、name を "same-origin-descendant" に設定する。

          4. それ以外の場合、name を "same-origin" に設定する。

        9. それ以外の場合:

          1. destinationBCnull なら、name を "cross-origin-unreachable" に設定する。

          2. そうでなく、culpritBC祖先destinationBC の)なら、name を "cross-origin-ancestor" にし、culpritSettingsnull に設定する。

            注: これはセキュリティ上報告されない。開発者は自分で調べるべき。

          3. そうでなく、destinationBC祖先culpritBC の)なら、name を "cross-origin-descendant" に設定する。

          4. それ以外の場合、name を "cross-origin-unreachable" に設定する。

    4. attribution を新しい TaskAttributionTiming オブジェクトとして destinationRealm で生成し、属性を次のように設定する:

      1. attributionname 属性を "unknown" に設定する。

        注: 今後このAPIのバージョンでは name 属性に追加値が加わる予定だが、現時点では値は1つのみ。

      2. attributionentryType 属性を "taskattribution" に設定する。

      3. attributionstartTime および duration を 0 に設定する。

      4. attributioncontainerType 属性を "window" に設定する。

      5. attributioncontainerName および containerSrc 属性を空文字列に設定する。

      6. culpritSettingsnull でない場合:

        1. culpritBCculpritSettingsグローバルオブジェクトブラウジングコンテキスト に設定する。

        2. Assert: culpritBCnull ではない。

        3. containerculpritBCブラウジングコンテナ に設定する。

        4. Assert: containernull ではない。

        5. attributioncontainerId 属性を containerID の値に設定する(IDが未設定なら空文字列)。

        6. containeriframe 要素の場合:

          1. attributioncontainerType 属性を "iframe" に設定する。

          2. attributioncontainerName 属性を containername コンテンツ属性の値に(属性がなければ空文字列)。

          3. attributioncontainerSrc 属性を containersrc コンテンツ属性の値に(属性がなければ空文字列)。

          注: ここで記録するのは frame の src 属性の値であり、現在のURLではない。これは主にフレーム識別のためであり、クロスオリジン iframe の現在URLを発見可能にすることはセキュリティ上問題。

        7. containerframe 要素の場合:

          1. attributioncontainerType 属性を "frame" に設定する。

          2. attributioncontainerName 属性を containername コンテンツ属性の値に(なければ空文字列)。

          3. attributioncontainerSrc 属性を containersrc コンテンツ属性の値に(なければ空文字列)。

        8. containerobject 要素の場合:

          1. attributioncontainerType 属性を "object" に設定する。

          2. attributioncontainerName 属性を containername コンテンツ属性の値に(なければ空文字列)。

          3. attributioncontainerSrc 属性を containerdata コンテンツ属性の値に(なければ空文字列)。

        9. containerembed 要素の場合:

          1. attributioncontainerType 属性を "embed" に設定する。

          2. attributioncontainerName 属性を空文字列に設定する。

          3. attributioncontainerSrc 属性を containersrc コンテンツ属性の値に(なければ空文字列)。

    5. 新しい PerformanceLongTaskTiming オブジェクト newEntrydestinationRealm で生成し、属性を次のように設定する:

      1. newEntryname 属性を name に設定する。

      2. newEntryentryType 属性を "longtask" に設定する。

      3. newEntrystartTime 属性を coarsening start timecrossOriginIsolatedCapability 指定)で求めた値に設定する。

      4. durcoarsening end timecrossOriginIsolatedCapability 指定)で求めた値から newEntrystartTime を引いた値とする。

      5. newEntryduration 属性を dur の整数部分に設定する。

      6. attributionnull でない場合、newEntryattribution 属性を attribution 1つのみを含む新しい凍結配列に設定する。

        注: 今後このAPIのバージョンでは attribution 属性に追加値が加わる予定だが、現時点では値は1つのみ。

    6. PerformanceEntry をキュー する(newEntry)。

5. セキュリティおよびプライバシーに関する考慮事項

Long Tasks APIは、ロングタスクの発生元についてオリジンが安全なアトリビューション情報を含めることで、同一オリジンポリシーに従っています。ロングタスクの閾値は50msです。継続時間は1msの粒度でのみ提供されます。これらを組み合わせることで、クロスオリジン漏洩に対して十分な保護を提供しています。

Long Tasks APIは、ユーザーによって実行されたタスクの継続時間や種類のタイミング情報、および関数呼び出しを引き起こしたブラウジングコンテキストなどのアトリビューションを提供します。これにより、攻撃者がユーザーの行動を推測したり特定したりするためのサイドチャネルタイミング攻撃を行える可能性があります。たとえば、長いスクリプトの後に長いレンダーが続くパターンから、ユーザーのソーシャルウィジェットへの操作を推測できます。詳細な関数呼び出しのアトリビューションは、ユーザーの行動を特定するために利用されます。

このAPIが新たなプライバシー攻撃を導入することはありませんが、既存のプライバシー攻撃をより迅速にする可能性があります。これに対する緩和策は必要に応じて実装できます:

5.1. 観測者に公開される内容

トップレベルページ内のすべての観測者(すなわちページ内のすべてのiframeとメインフレーム)は、ロングタスクの存在について通知を受け取ります。タスクの開始時刻、継続時間(1ms粒度)、および原因となるフレームへのポインタを公開します。これらの情報は、今日でもsetTimeoutを使えばより高い精度で観測可能です。攻撃者は、ページ上の他の要素をすべて除去し、脆弱なクロスオリジンリソースのみを追加することで、setTimeoutの遅延がそのリソースによるものであると確認できます。他ページ(タブやウィンドウ)の観測者は、ユーザーエージェントのアーキテクチャに関わらず、通知を受け取るべきではありません。

クロスオリジンで公開される内容のルール:

5.2. 考慮された攻撃シナリオ

考慮されたタイミング攻撃は以下の通りです:

  1. 従来のタイミング攻撃:外部リソースのロード時間を利用して、プライベートデータのサイズを明らかにする。例えば、ギャラリー内の隠し画像の数やユーザー名の有効性など。参照。

  2. サイドチャネルタイミング攻撃:動画解析、スクリプト解析、App Cacheの読み取りやCache API(Service Worker)利用の時間を使って、ユーザーの特定や年齢・性別・地域・興味などのプロファイルを作成する。として、ソーシャルネットワークのステータス更新が特定の属性(例:20~30歳の女性)に限定される場合、パーマリンクページのファイルサイズによってユーザーがその属性かどうかが判別できる。

これらのシナリオは、50msの閾値とクロスオリジン境界の遵守、すなわちタスクタイプや追加のアトリビューションを信頼できないクロスオリジン観測者に公開しないことで対応しています。

適合性

文書の慣例

適合性要件は、記述的な断定文とRFC 2119の用語の組み合わせで表現されます。 本書の規定部分における “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” のキーワードはRFC 2119で定義された通りに解釈されます。 ただし可読性のため、これらの語はすべて大文字にはしていません。

この仕様書の本文は、明示的に非規定とされたセクション、例、および注記を除き、すべて規定です。[RFC2119]

例は “for example” という語で導入するか、class="example" のように 規定文とは区別して表示されます。

これは参考例の一例です。

参考注記は “Note” で始まり、class="note" のように 規定文と区別して表示されます。

注:これは参考注記です。

適合するアルゴリズム

アルゴリズムの一部として命令形で記述された要件(例:「先頭の空白文字をすべて取り除く」「falseを返してこれらの手順を中止する」)は、 そのアルゴリズムの導入部で用いられるキーワード("must", "should", "may" など)の意味に従って解釈されます。

アルゴリズムや特定の手順として記述された適合性要件は、同等の結果となる限り、どのような方法で実装しても構いません。 特に本仕様のアルゴリズムは分かりやすさを重視しており、パフォーマンスは重視していません。 実装者は最適化を推奨します。

索引

本仕様で定義される用語

参照により定義される用語

参考文献

規定参考文献

[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[HR-TIME-2]
Ilya Grigorik. High Resolution Time Level 2. 2019年11月21日. REC. URL: https://www.w3.org/TR/hr-time-2/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2023年7月19日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 他. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[LONG-ANIMATION-FRAMES]
Long Animation Frames API. 編集者草案. URL: https://w3c.github.io/long-animation-frames/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. 2024年2月16日. CR. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/

IDL索引

[Exposed=Window]
interface PerformanceLongTaskTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute FrozenArray<TaskAttributionTiming> attribution;
    [Default] object toJSON();
};

[Exposed=Window]
interface TaskAttributionTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute DOMString containerType;
    readonly attribute DOMString containerSrc;
    readonly attribute DOMString containerId;
    readonly attribute DOMString containerName;
    [Default] object toJSON();
};

課題索引

どの Document がどのロングタスクに可視性を持つかについて、議論が続いているため、このロジックは将来的に変更される可能性があります。[Issue #75]
MDN

PerformanceLongTaskTiming/attribution

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PerformanceLongTaskTiming/toJSON

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PerformanceLongTaskTiming

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerId

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerName

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerSrc

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerType

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/toJSON

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?