コンピュート・プレッシャー レベル 1

W3C 勧告候補草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/CRD-compute-pressure-20260514/
最新の公開バージョン:
https://www.w3.org/TR/compute-pressure/
最新の編集者草案:
https://w3c.github.io/compute-pressure/
履歴:
https://www.w3.org/standards/history/compute-pressure/
コミット履歴
テストスイート:
https://github.com/web-platform-tests/wpt/labels/compute-pressure
実装レポート:
https://wpt.fyi/results/compute-pressure
編集者:
Kenneth Rohde Christiansen (Intel Corporation)
Arnaud Mandy (Intel Corporation)
前編集者:
Raphael Kubo da Costa (Intel Corporation)
フィードバック:
GitHub w3c/compute-pressure (プルリクエスト, 新しい Issue, 未解決の Issue)

概要

Compute Pressure API は、対象デバイスの CPU プレッシャーの変化にウェブサイトが反応する方法を提供し、 ウェブサイトがリソースを調整することで、 ユーザー体験を向上できるようにします。

この文書のステータス

このセクションでは、この文書の公開時点における ステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新リビジョンは、 W3C 標準および草案 インデックスで確認できます。

この仕様は Chromium ベースのブラウザーに実装されています。WebKit はこの仕様に反対する立場を 公表しています。Mozilla の立場は保留中です。

この仕様が CR 段階を終了するには、 この仕様で定義されているすべての機能について、少なくとも 2 つの独立した実装が実装レポートに 文書化される必要があります。

この文書は、Devices and Sensors Working Group によって、 勧告 トラックを使用した勧告候補草案として公開されました。

勧告候補としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。勧告候補草案には、 ワーキンググループが 後続の勧告候補スナップショットに含めることを意図している、 前回の勧告候補からの変更が統合されています。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、 グループの成果物に関連して行われた 特許開示の公開一覧を 維持しています。そのページには、 特許を開示するための手順も含まれています。ある特許が 必須クレームを含むと考え、その特許について実際の 知識を有する個人は、 W3C 特許ポリシーのセクション 6に従って情報を開示しなければなりません。

この文書は、 2025年8月18日付 W3C プロセス文書に準拠します。

1. 序論

このセクションは非規範的です。

最新のアプリケーションでは、現代的で快適なユーザー体験を提供するために、 システムのコンピューティングリソースを最大限に活用することによるトレードオフと利点のバランスを取る必要があることがよくあります。

たとえば、多くのアプリケーションでは、さまざまな精巧さのビデオエフェクトをレンダリングできます。 これらのアプリケーションは、ユーザーのデバイスを高プレッシャー状態に陥らせることを避けながら、 最高のユーザー体験を提供することを目指します。

処理ユニットの使用率が 100% に近づき、頻繁に 100% に達すると、さまざまなタスクが処理時間を奪い合うため、 悪い ユーザー体験につながる可能性があります。 これは動作の遅さにつながる可能性があり、特に入力遅延として顕著に現れます。 さらに、100% に近い使用率が長時間続くと、長時間の ブーストによって 処理 ユニットが発熱する可能性があり、スロットリングにつながり、その結果、さらに悪いユーザー体験となる可能性があります。

熱的制約の結果、多くのスマートフォン、タブレット、ノートパソコンは、触れると不快なほど熱くなることがあります。 ノートパソコンやデスクトップのファンは、会話を妨げたり、 ユーザーの集中を妨げたりするほど大きな音になることがあります。

多くの場合、高プレッシャー下のデバイスは応答していないように見えます。これは、オペレーティング システムが、ユーザーが待っているタスクを進行させるスレッドのスケジューリングに失敗する可能性があるためです。ユースケースも参照してください。

2. 機能検出に関する注記

このセクションは非規範的です。

機能検出は、確立されたウェブ開発のベストプラクティスです。このトピックに関するリソースはオンラインにも オフラインにも 豊富に存在し、このセクションの目的はそれについてさらに議論することではなく、ハードウェア依存機能の 検出という文脈に位置付けることです。

以下の機能検出の例を考えてみます。

注記

3. 概念

この仕様では、次の概念を定義します。

3.1 処理ユニット

コンピューティングデバイスは、中央 処理装置 (CPU)、グラフィックス処理装置 (GPU)、および多数の特殊な 処理ユニットなど、多数の異なる 処理 ユニットで構成されています。後者は、機械学習やコンピュータービジョンなどの特定の タスクを高速化するよう設計されたものなどが普及しつつあります。

3.2 プレッシャーソース

この仕様では現在、有効なソース型を CPU とも呼ばれる中央処理ユニットとして定義しています。 この仕様の将来のレベルでは、追加のソース型を導入してもよい

PressureSource 列挙型は、有効なソース型を表します。

注記

3.3 サンプリングレートおよび報告レート

要求されたサンプリング間隔は、ハードウェアから取得するサンプル間の望ましい 間隔を表し、 ミリ秒単位で表されます。

間隔と周波数は互いに逆数であるため、 要求されたサンプリング間隔は、 要求されたサンプリングレートとして、ヘルツ(1 秒あたりの サイクル数)で、 1000 を 要求されたサンプリング間隔の 値で割ることによって表すこともできます。

プラットフォームコレクターサンプリング レートは、 ユーザーエージェントが基盤となる プラットフォームからテレメトリー読み取り値を取得するレートとして定義され、 プレッシャーオブザーバーの要求されたサンプリングレートとは異なる場合があります。 このレートはヘルツ(1 秒あたりのサイクル数)で測定されます。

プレッシャーオブザーバーの報告 レートは、 データ収集手順を実行するレートであり、サンプリングレートを超えることはありません。

要求されたサンプリングレートが、基盤となるプラットフォームとユーザーエージェントによって サポートまたは受け入れられるサンプリングレートの上限または下限を超える場合、 サンプリングレート要求されたサンプリングレートとは異なります。

この仕様では、11.2.2 レート難読化で説明されているとおり、レートをさらに難読化します。

ユーザーがサンプリングレートを要求しなかった場合、サンプリングレート実装定義です。

注記

4. プラットフォームプリミティブ

プレッシャーソースは、ハードウェアカウンターまたは ソース型に関するテレメトリーデータを提供する基盤フレームワークへの抽象的な実装定義の インターフェイスであり、 PressureSourceによって定義されます。プレッシャーソースは、 より正確な結果が得られる場合には、追加のソースからのデータとの データフュージョンを利用できます。

プレッシャーソースによって提供されるテレメトリーデータは、この 仕様ではプレッシャーソースサンプルとして表され、次の項目から構成される構造体です。

プレッシャーソースには、関連付けられた最新サンプルがあり、これはプレッシャーソースサンプルまたは null です。初期値は null です。

プラットフォームコレクターは、 プレッシャーソースからテレメトリーサンプルを取得し、それらを プレッシャー状態に変換して、ユーザーエージェントに提供する抽象インターフェイスです。

プラットフォームコレクターには、次の関連データがあります。

プレッシャーソースによって提供され、その最新サンプルデータに保存されるテレメトリーデータの形式は実装定義であり、プラットフォームコレクターがそれをプレッシャー状態へ変換する プロセスも同様です。

この仕様の目的上、プラットフォームコレクターは、プラットフォームコレクターマッピングを介して グローバルオブジェクトにスコープされます。

自動化の目的では、プラットフォームコレクターは、 仮想プレッシャーソースに接続し、そのシミュレートされたデータを、 調整済みプレッシャー状態に変換する必要がある生のプラットフォームデータではなく、 プレッシャー状態として使用できなければなりません。

テレメトリーデータの収集は、ハードウェアカウンターをポーリングすることを意味する場合が多いため、コストのかからない処理ではなく、 データを監視している者が誰もいない場合には実行すべきではありません。詳細については、10.5 ライフサイクルおよび ガベージコレクションを参照してください。

プラットフォームコレクターは、特定のレートでデータをサンプリングします。ユーザーエージェントは、プライバシー上の理由からこのレートを (可能であれば)変更したり、特定の読み取り値を無視して統合したりしてもかまいません。

5. ユーザー通知

ユーザーエージェントは、プレッシャーオブザーバーがアクティブになっていることをユーザーに知らせる、 何らかのユーザーに見える通知を表示するとともに、 進行中の操作をブロックする手段、または単に通知を閉じる手段を ユーザーに提供することが推奨されます

6. ポリシー制御

Compute Pressure API は、トークン "compute-pressure" で識別される ポリシー制御機能を定義します。 そのデフォルト許可リスト'self' です。

ワーカー(専用および共有)は、その所有 文書によって設定された権限ポリシーに従います。

共有ワーカーは、同一オリジンの他の文書から取得できるため、複数の所有文書を持つことがよくあります。 この場合、すべての所有文書が、この仕様で定義されたポリシー制御機能使用を許可されていなければなりません。

専用ワーカーは他のワーカーから作成できます。 この場合、所有者チェーンを上にたどった最初の所有文書 (共有ワーカーの場合は所有文書群)の権限ポリシーが 使用されます。

注記
注記

7. 内部スロットの定義

グローバルオブジェクトには、次のものがあります。

登録済みオブザーバーは、オブザーバーPressureObserver オブジェクト)で構成されます。

ユーザーエージェントには、次のものがあります。

構築されたPressureObserver オブジェクトには、次の 内部スロットがあります。

レート難読化の緩和策のため、構築されたPressureObserver オブジェクトにはさらに 次の内部スロットがあります。

8. プレッシャー状態

プレッシャー状態は、ウェブサイトが 品質、サービス、またはユーザー体験の低下を最小限に抑えながら、 コンピューティングおよびシステムプレッシャーの変化に対応できる、有用な状態の最小集合を表します。

WebIDLenum PressureState { "nominal", "fair", "serious", "critical" };

PressureState 列挙型は、次の状態を持つプレッシャー状態を表します。

注記

9. 寄与要因

寄与 要因は、現在のプレッシャー状態に寄与する基盤となるハードウェアおよびオペレーティングシステムのメトリクスを表し、実装定義とすることができます。

調整済み プレッシャー状態は、ソース型および寄与要因からのその他の実装定義データを入力として受け取る実装定義の アルゴリズムによって決定されるプレッシャー状態です。このアルゴリズムは、 キャリブレーション破壊緩和策の有効性を確保するため、 決定論的であってはなりません

寄与要因の変化が実質的である手順は次のとおりです。

  1. 現在のプレッシャー状態に寄与する実装定義の低レベルハードウェア メトリクスが、各メトリクスについて、 現在のプレッシャー状態に対する実装定義のしきい値を 下回るか上回る場合、true を返します。
  2. false を返します。
注記

10. プレッシャーオブザーバー

Compute Pressure API により、開発者は CPU などの システムリソースのプレッシャーを把握できます。

10.1 PressureUpdateCallback コールバック

WebIDLcallback PressureUpdateCallback = undefined (
  sequence<PressureRecord> changes,
  PressureObserver observer
);
このコールバックは、プレッシャー状態が変化したときに呼び出されます。

10.2 PressureObserver オブジェクト

PressureObserverは、プレッシャー状態の変化を監視するために使用できます。

WebIDL[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureObserver {
  constructor(PressureUpdateCallback callback);

  Promise<undefined> observe(PressureSource source, optional PressureObserverOptions options = {});
  undefined unobserve(PressureSource source);
  undefined disconnect();
  sequence<PressureRecord> takeRecords();

  [SameObject] static readonly attribute FrozenArray<PressureSource> knownSources;
};

PressureObserver インターフェイスは、PressureObserverを表します。

10.2.1 constructor() メソッド

new PressureObserver(callback) コンストラクターの手順は次のとおりです。

  1. this.[[Callback]]callbackに設定します。

10.2.2 observe() メソッド

observe(source, options) メソッドの手順は次のとおりです。

  1. relevantGlobalthis関連するグローバルオブジェクトとします。
  2. relevantGlobal所有文書集合内のdocumentそれぞれについて、
    1. documentがトークン "compute-pressure" のポリシー制御機能使用を許可されていない場合、 NotAllowedError拒否された promiseを返します。
    注記
  3. this.[[SampleIntervalMap]][source]を、 optionssampleIntervalに設定します。
  4. promise新しい promiseとします。
  5. pendingPromiseTupleを (source, promise) とします。
  6. pendingPromiseTuplethis.[[PendingObservePromises]]追加します。
  7. promise反応します。
  8. 次の手順を並行して実行します。
    1. platformCollectorを null とします。
    2. relevantGlobalプラットフォームコレクターマッピングsource含む場合、
      1. platformCollectorrelevantGlobalプラットフォーム コレクターマッピング[source]に設定します。
    3. そうでない場合、
      1. newCollectorを、関連付けられた プレッシャーソースが null である新しいプラットフォームコレクターとします。
      2. virtualPressureSourceを、 sourcerelevantGlobalを指定して仮想プレッシャー ソースを取得するを呼び出した結果とします。
      3. virtualPressureSourceが null でない場合、
        1. virtualPressureSourceサンプルを 提供できるが true の場合、
          1. newCollector関連付けられた プレッシャーソースvirtualPressureSourceに設定します。
          2. newCollectorvirtualPressureSource接続済み プラットフォームコレクター追加します。
      4. そうでない場合、
        1. realPressureSourceを、 sourceについてテレメトリーデータを提供する実装定義プレッシャー ソースとし、存在しない場合は null とします。
        2. newCollector関連付けられたプレッシャー ソースrealPressureSourceに設定します。
      5. newCollector関連付けられたプレッシャーソースが null でない場合、
        1. platformCollectornewCollectorに設定します。
        2. relevantGlobalプラットフォームコレクター マッピング[source]をplatformCollectorに設定します。
    4. platformCollectorが null の場合、relevantGlobalを指定して PressureObserver タスクソース上にグローバルタスクをキューに追加し、 promiseNotSupportedErrorで拒否して、 これらの手順を中止します。
    5. sourcerelevantGlobalを指定して、データ 収集をアクティブ化するを呼び出します。
    6. relevantGlobalを指定して、PressureObserver タスクソース上にグローバルタスクをキューに追加し、 次の手順を実行します。
      1. promiseが拒否された場合、次の サブ手順を実行します。
        1. relevantGlobalsourceに対する登録済みオブザーバー リストの場合、 sourcerelevantGlobalを指定してデータ 収集を非アクティブ化するを呼び出します。
        2. 戻ります。
      2. オブザーバーthisである新しい登録済み オブザーバーを、 relevantGlobalsourceに対する登録済みオブザーバーリスト追加します。
      3. promiseを解決します。
  9. promiseを返します。

10.2.3 unobserve() メソッド

unobserve(source) メソッドの手順は次のとおりです。

  1. sourceサポートされるソース型でない場合、"NotSupportedError" をスローします。
  2. sourceに関連付けられたすべての recordsthis.[[QueuedRecords]]から削除します。
  3. this.[[SampleIntervalMap]][source]を削除します。
  4. this.[[LastRecordMap]][source]を削除します。
  5. this.[[AfterPenaltyRecordMap]][source]を削除します。
  6. this.[[PendingObservePromises]]の (promiseSource, pendingPromise)をそれぞれについて、 sourcepromiseSourceと等しい場合、pendingPromiseAbortError拒否します。
  7. relevantGlobalthis関連するグローバルオブジェクトとします。
  8. registeredObserverListを、relevantGlobalsourceに対する登録済みオブザーバーリストとします。
  9. thisであるオブザーバーを持つ登録済みオブザーバーregisteredObserverListから削除します。
  10. registeredObserverListの場合、
    1. sourcerelevantGlobalを指定して、データ 収集を非アクティブ化するを呼び出します。
    2. relevantGlobalプラットフォームコレクター マッピング[source]を削除します。

10.2.4 disconnect() メソッド

disconnect() メソッドの 手順は次のとおりです。

  1. observer.[[QueuedRecords]]空にします
  2. this.[[SampleIntervalMap]]クリアします。
  3. this.[[LastRecordMap]]クリアします。
  4. this.[[AfterPenaltyRecordMap]]クリアします。
  5. this.[[PendingObservePromises]]の (promiseSource, pendingPromise)をそれぞれについて、 pendingPromiseAbortError拒否します。
  6. relevantGlobalthis関連するグローバルオブジェクトとします。
  7. relevantGlobal登録済みオブザーバーリスト順序付きマップsourceregisteredObserverListそれぞれについて、
    1. thisであるオブザーバーを持つ 登録済みオブザーバーregisteredObserverListから削除します。
    2. registeredObserverListの場合、
      1. sourcerelevantGlobalを指定して、データ収集を非アクティブ化するを 呼び出します。
      2. relevantGlobalプラットフォームコレクター マッピング[source]を削除します。

10.2.5 takeRecords() メソッド

注記

takeRecords() メソッドの手順は次のとおりです。

  1. recordsobserver.[[QueuedRecords]]クローンとします。
  2. observer.[[QueuedRecords]]空にします
  3. recordsを返します。

10.2.6 knownSources 属性

knownSources getter の手順は次のとおりです。

  1. ユーザーエージェントサポートされるソース型をアルファベット順で返します。

注記

10.3 PressureRecord インターフェイス

WebIDL[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureRecord {
  readonly attribute PressureSource source;
  readonly attribute PressureState state;
  readonly attribute DOMHighResTimeStamp time;
  [Default] object toJSON();
};

構築された PressureRecord オブジェクトには、 次の内部スロットがあります。

10.3.1 source 属性

sourcegetter 手順は、その [[Source]] 内部スロットを返すことです。

10.3.2 state 属性

stategetter 手順は、その [[State]] 内部スロットを返すことです。

10.3.3 time 属性

timegetter 手順は、その [[Time]] 内部スロットを返すことです。

10.3.4 toJSON メンバー

PressureRecord.toJSON が呼び出されたとき、Web IDL 標準デフォルトの toJSON 手順を実行します。

10.4 PressureObserverOptions 辞書

WebIDLdictionary PressureObserverOptions {
  [EnforceRange] unsigned long sampleInterval = 0;
};

10.4.1 sampleInterval メンバー

sampleInterval メンバーは、 ミリ秒で表される 要求されたサンプリング 間隔を表します。値が 0 に設定されている場合、システムは PressureState に変更があった場合にのみ、 PressureUpdateCallback を呼び出します。

注記

10.5 ライフサイクルおよびガベージ コレクション

グローバルオブジェクトは、その 登録済みオブザーバーリスト内の 登録済みオブザーバーへの 強参照を保持します (ソースごとに 1 つ)。

注記

10.6 処理モデル

このセクションでは、この仕様を実装するときにユーザーエージェントが実行しなければならない手順の概要を示します。

10.6.1 補助アルゴリズム

引数 observer が与えられたときの 観測ウィンドウをリセットする手順は、次のとおりです。

観測ウィンドウをリセットする手順を実行し、observer.[[ObservationWindow]] の時間が経過したときに、異なるランダム化された値を使用して手順を再実行するタイマーを開始します。

注記

関連するグローバルオブジェクト relevantGlobal所有文書集合を決定するには、次を行います。

  1. owningDocumentSet を空の 集合とします。
  2. relevantGlobalWindow の場合、relevantGlobal関連付けられた文書owningDocumentSet追加します。
  3. そうでない場合、WorkerGlobalScope relevantGlobal所有者集合内の各 owner についてそれぞれ
    1. ownerDocument の場合、ownerowningDocumentSet追加します。
    2. ownerWorkerGlobalScope の場合、 owningDocumentSetowningDocumentSetowner所有文書集合との和集合に設定します。
  4. owningDocumentSet を返します。

引数 document が与えられたときの 文書が暗黙のフォーカスを持つ手順は、次のとおりです。

  1. document完全にアクティブでない場合、false を返します。
  2. relevantGlobaldocument関連するグローバルオブジェクトとします。
  3. アクティブな Picture-in-Picture セッションの開始元内の各 origin についてそれぞれ
    1. relevantGlobal関連設定オブジェクトオリジンorigin同一オリジンである場合、true を返します。
  4. relevantGlobalブラウジングコンテキストキャプチャ中である場合、true を返します。
  5. topLevelBCrelevantGlobalブラウジングコンテキストトップレベルブラウジングコンテキストとします。
  6. topLevelBCシステムフォーカスを持たない場合、false を返します。
  7. focusedDocumenttopLevelBC 現在フォーカスされている領域ノード文書とします。
  8. relevantGlobal関連設定オブジェクトオリジンが、 focusedDocumentオリジン同一オリジンである場合、true を返します。
  9. そうでない場合、false を返します。

引数 observer が与えられたときの データを 受信してよい手順は、 次のとおりです。

  1. relevantGlobalobserver関連するグローバルオブジェクトとします。
  2. relevantGlobalWindow オブジェクトの場合、
    1. relevantGlobal関連付けられた Documentを指定して、 文書が暗黙のフォーカスを持つを実行した結果を返します。
  3. relevantGlobalWorkerGlobalScope オブジェクトの場合、
    1. owningDocumentsrelevantGlobal所有文書集合とします。
    2. owningDocuments 内の各 document についてそれぞれ
      1. document を指定して文書が暗黙の フォーカスを持つを実行した結果が true の場合、 true を返します。
      2. そうでない場合、続行します。
  4. false を返します。
注記

引数 observersource、および timestamp が与えられたときの レートテストに 合格する手順は、次のとおりです。
  1. observer.[[LastRecordMap]][source] が存在しない場合、true を返します。
  2. recordobserver.[[LastRecordMap]][source] とします。
  3. sampleIntervalobserver.[[SampleIntervalMap]][source] とします。
  4. timeDeltaMilliseconds = timestamp - record.[[Time]] とします。
  5. timeDeltaMillisecondssampleInterval の場合、 true を返し、そうでない場合は false を返します。
引数 observersourcestate が与えられたときの ディスパッチ すべきである手順は、次のとおりです。
  1. observer.[[SampleIntervalMap]][source] > 0 の場合、true を返します。
  2. observer.[[LastRecordMap]][source] が存在しない場合、true を返します。
  3. recordobserver.[[LastRecordMap]][source] とします。
  4. record.[[State]]state と等しくない場合、true を返します。
  5. false を返します。
引数 observersource が与えられたときの レート難読化テストに合格する手順は、次のとおりです。
  1. observer.[[ChangesCountMap]][source] をインクリメントします。
  2. observer.[[ChangesCountMap]][source] ≤ observer.[[MaxChangesThreshold]] を返します。

ソース型 sourcerelevantGlobal が与えられたとき、仮想プレッシャーソースを取得するには、次の 手順を実行します。これらは 仮想プレッシャーソースまたは null を返します。

  1. topLevelTraversable を null とします。
  2. relevantGlobalWindow オブジェクトの場合、
    1. topLevelTraversablerelevantGlobalナビゲータブルトップレベル traversableに設定します。
  3. relevantGlobalDedicatedWorkerGlobalScope オブジェクトの場合、
    1. owningDocumentsrelevantGlobal所有文書集合とします。
    2. owningDocumentsの場合、null を返します。
    3. 表明: owningDocumentsサイズは 1 です。
    4. topLevelTraversableowningDocuments[0] のノードナビゲータブルトップレベル traversableに設定します。
  4. topLevelTraversable が null の場合、null を返します。
  5. topLevelVirtualPressureSourceMappingtopLevelTraversable仮想プレッシャー ソースマッピングとします。
  6. virtualPressureSource を null とします。
  7. topLevelVirtualPressureSourceMappingsource含む場合、
    1. virtualPressureSourcetopLevelVirtualPressureSourceMapping[source] に設定します。
  8. virtualPressureSource を返します。

10.6.2 データの収集および 配信

ソース型 sourcerelevantGlobal が与えられたとき、データ収集をアクティブ化するには、次の手順を実行します。

  1. relevantGlobalプラットフォームコレクターマッピングsource含まない場合、これらの手順を中止します。
  2. platformCollectorrelevantGlobalプラットフォームコレクター マッピング[source] とします。
  3. platformCollectorアクティブ化済みが true の場合、 これらの手順を中止します。
  4. platformCollectorアクティブ化済みを true に設定します。
  5. 実装定義の方法で、 relevantGlobalsource、および platformCollectorを指定して、データ収集手順の実行を開始します。
    注記

ソース型 sourcerelevantGlobal が与えられたとき、データ収集を非アクティブ化するには、次の手順を実行します。

  1. relevantGlobalプラットフォームコレクターマッピングsource含まない場合、これらの手順を中止します。
  2. platformCollectorrelevantGlobalプラットフォームコレクター マッピング[source] とします。
  3. platformCollectorアクティブ化済みが false の場合、 これらの手順を中止します。
  4. 実装定義の方法で、 relevantGlobalsource、および platformCollectorを指定したデータ収集手順の実行を停止します。
  5. platformCollectorアクティブ化済みを false に設定します。
  6. platformCollector関連付けられたプレッシャーソース仮想プレッシャーソースである場合、
    1. platformCollector を、その関連付けられた プレッシャーソース接続済みプラットフォームコレクターから削除します。
  7. そうでない場合、 platformCollector関連付けられたプレッシャーソースに テレメトリーデータの取得を停止するよう通知するための、実装定義の手順を実行します。

relevantGlobalsource、および platformCollector が与えられたときの データ 収集手順は、次のとおりです。

  1. pressureSourceplatformCollector関連付けられたプレッシャーソースとします。
  2. pressureSource が null の場合、これらの手順を中止します。
  3. samplepressureSource最新 サンプルとします。
  4. sample が null の場合、これらの手順を中止します。
  5. state を null とします。
  6. pressureSource仮想プレッシャーソースである場合、
    1. state を、 sampleデータに格納されているPressureState に設定します。
  7. そうでない場合、
    1. 寄与要因の 変化が実質的であるが false の場合、これらの手順を中止します。
    2. state を、 sourcesampleデータから計算された調整済みプレッシャー状態に設定します。
      注記
  8. 表明: state は null ではありません。
  9. rawTimestampsampleタイムスタンプとします。
  10. timeValue を、 rawTimestamprelevantGlobal に基づく相対高解像度時刻とします。
  11. relevantGlobalsource に対する登録済みオブザーバーリスト内の各 observer についてそれぞれ
    1. observer を指定してデータを受信してよいを 実行した結果が false の場合、続行します。
    2. observersource、および timeValue を指定してレートテストに合格するを 実行した結果が false の場合、続行します。
    3. observersourcestate を指定してディスパッチすべきであるを実行した結果が false の場合、続行します。
    4. record を、新しい PressureRecord オブジェクトとし、その [[Source]]source に設定し、 [[State]]state に設定し、 [[Time]]timeValue に設定します。
    5. observer.[[AfterPenaltyRecordMap]][source] が存在する場合、
      1. observer.[[AfterPenaltyRecordMap]][source] を record に設定します。
      2. 続行します。
    6. observersource を指定してレート 難読化テストに合格するを実行した結果が false の場合、
      1. observer.[[AfterPenaltyRecordMap]][source] を record に設定します。
      2. observer.[[ChangesCountMap]][source] を 0 に設定します。
      3. observer.[[PenaltyDuration]] の期間のタイマーを、次のコールバックで作成します。
        1. observer.[[AfterPenaltyRecordMap]][source] が存在する場合、
          1. recordobserver.[[AfterPenaltyRecordMap]][source] とします。
          2. observer.[[AfterPenaltyRecordMap]][source] を削除します。
          3. observersourcerecord を指定して レコードをキューに追加するを実行します。
      4. 続行します。
    7. observersourcerecord を指定してレコードをキューに追加するを実行します。

10.6.3 PressureRecord をキューに追加する

引数 observersourcerecord が与えられたとき、 レコードを キューに追加するには、次の手順を実行します。

  1. observer.[[QueuedRecords]]サイズキューに追加できる最大レコード数より大きい場合、最初の項目削除します。
  2. recordobserver.[[QueuedRecords]]追加します。
  3. observer.[[LastRecordMap]][source] を record に設定します。
  4. observer関連するグローバルオブジェクトを指定して、 プレッシャー オブザーバータスクをキューに追加するを実行します。

10.6.4 プレッシャー オブザーバータスクをキューに追加する

PressureObserver タスクソースは、10.6.5 プレッシャーオブザーバーに通知するためのタスクをスケジュールする際に使用されるタスクソースです。

relevantGlobal が入力として与えられたとき、プレッシャーオブザーバータスクをキューに追加するには、次の手順を実行します。

  1. relevantGlobalプレッシャーオブザーバータスクがキューに追加済みが true の場合、 戻ります。
  2. relevantGlobalプレッシャーオブザーバータスクがキューに追加済みを true に設定します。
  3. relevantGlobal を指定して、PressureObserver タスク ソース上にグローバルタスクをキューに追加し、プレッシャーオブザーバーに通知します。

10.6.5 プレッシャーオブザーバーに通知する

relevantGlobal が入力として与えられたとき、プレッシャーオブザーバーに通知するには、 次の手順を実行します。

  1. relevantGlobalプレッシャーオブザーバータスクがキューに追加済みを false に設定します。
  2. notifySet を、 relevantGlobal登録済みオブザーバーリスト内のすべてのオブザーバーからなる新しい集合とします。
  3. notifySet の各 observer についてそれぞれ
    1. recordsobserver.[[QueuedRecords]]クローンとします。
    2. observer.[[QueuedRecords]]空にします
    3. recordsでない場合、« records, observer » と "report" を指定して observer.[[Callback]]呼び出します

10.6.6 完全にアクティブな状態の変更の処理

この仕様では、Document document が与えられた場合の、次の文書アンロード時のクリーンアップ手順を 定義します。

  1. relevantGlobaldocument関連するグローバルオブジェクトとします。
  2. relevantGlobal登録済みオブザーバーリスト順序付きマップの各 source キーについてそれぞれ
    1. sourcerelevantGlobal を指定してデータ収集を 非アクティブ化するを呼び出します。
    2. relevantGlobalプラットフォーム コレクターマッピング[source] を削除します。
Issue 275: bfcache 統合戦略を適切に決定する

この仕様には以前、 Document が再び完全にアクティブになる場合(すなわち、 Document再アクティブ化手順との統合)を対象とする手順が含まれていました。これらの手順は、 意図する動作について議論している間、 削除されています。

10.6.7 ワーカー状態の変更の 処理

注記

WorkerGlobalScope relevantGlobalclosing フラグが true に設定されるたびに、次の 手順を実行します。

  1. relevantGlobal登録済みオブザーバーリスト順序付きマップの各 source キーについてそれぞれ
    1. sourcerelevantGlobal を指定してデータ収集を 非アクティブ化するを呼び出します。
    2. relevantGlobalプラットフォーム コレクターマッピング[source] を削除します。

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

11.1 プライバシーおよび セキュリティ上の脅威の種類

注記
ワーキンググループは、理論上および現実世界のものを含め、既知の攻撃ベクトルを このセクションに列挙します。

11.1.1 タイミング攻撃

一意または非常に精密な値に、オリジンを共有していないサイトから同時にアクセスできる場合、 同一オリジンではないサイトをまたいでユーザーを識別できる 可能性があります。 この攻撃は、11.2.1 データ最小化11.2.2 レート 難読化、 および 11.2.7 同一オリジン制限によって緩和されます。

11.1.2 クロスサイト隠れチャネル

コンピューターセキュリティにおいて、隠れチャネルは、本来通信を許可されるべきでないプロセス間で情報を転送する能力を 作り出します。現代のマルチプロセスウェブエンジンでは、一般的な ケースとして各ウィンドウまたはタブは独自のプロセス内に存在します(同一オリジンの文書、または 同一サイトのサイトは、通常同じプロセスを共有します)。この API を使用すると、クロスサイト隠れチャネル C を作成できる可能性があります。あるタブ上のサイト A がまず CPU の状態を 操作した後、チャネル C にブロードキャストします。次に、別のタブ上のサイト B(サイト A と同一サイトではない)が、 この API を使用して CPU の状態がいつ変化したかを知ることで、 チャネル C からブロードキャストされたデータを読み取ります。 このプロセスは、サイト A と B の両方でスクリプトが実行されている限り繰り返されます。

この攻撃は、11.2.2 レート難読化および11.2.5 キャリブレーション破壊によって緩和されます。 実装者は、長時間実行されるスクリプトについて、これらすべての緩和策を考慮することが推奨されます。

注記
スクリプトの実行時間が長いほど、提案されているクロスサイト 隠れチャネルを使用してより多くの情報を送信できます。 たとえば、ユーザーがビデオ会議サイトと別の長時間実行されるサイトを利用している場合、通常のブラウジングシナリオと比べて より多くの 情報を転送できます。一方、 ビデオ会議セッションのようなワークロードは通常、CPU に持続的なプレッシャーをかけるため、 プレッシャー状態を予測可能な方法で操作することが 難しくなります。

11.1.3 標的型 匿名解除攻撃

標的型匿名解除攻撃は、ユーザーの 匿名性を危険にさらす重大な脅威の一種です。 これらの攻撃により、悪意のある、または部分的に侵害されたウェブサイト(以下「悪意のある サイト」)は、 ウェブサイト訪問者がメールアドレスや ソーシャルメディアのハンドルなど、特定の公開識別子を所有しているかどうかを確認できます。

匿名性は一部の人にとっては贅沢かもしれませんが、特定の人々にとってはそれ以上のものであり、 生存に関わる問題です。たとえば、政治的抗議活動に参加する人、機密性の高い話題を扱う ジャーナリストとして働く人などを考えてください。

例として、攻撃者は公開 リソース共有サービス(「被害者サイト」)などを使用して標的とリソースを非公開で共有し、その後、サイドチャネルを介してリソースを読み込む際の 副作用(アクセス成功を示すもの)を測定できます。ログイン済みの訪問者が埋め込まれたリソースに 正常にアクセスできる場合、現在の訪問者が実際に意図された標的であることを示します。

特に、CPU 全体のプレッシャーに関する信頼できる情報を公開すると、攻撃サイトは クロスオリジンナビゲーションの対象(たとえば別の サイトの iframe またはポップアップウィンドウ)が CPU 負荷の高い操作を実行したかどうかを把握できるようになります。

ポップアンダータブアンダーなどの手法を使用して、 読み込みを ユーザーから隠すことができます。

考えられる攻撃の 1 つは、悪意のあるウェブサイトが、ユーザーがログインしている被害者サイト上のリソース (たとえば動画ストリーミングサイトやオンライン文書エディター)へのポップアップを開き、 特定のユーザーと共有されたリソースを指すようにすることです。

リソースの読み込みによって CPU へのプレッシャーが増加すると仮定すると、これによって、 ユーザーがそのリソースへのアクセス権を持つアカウントにログインしているかどうかを攻撃サイトに明らかにする サイドチャネルが形成され、 ユーザーの匿名性が解除されます。

現代の CPU は高プレッシャー状態から速やかに回復するため、考えられる緩和策の 1 つとして、 ポップアップや iframe コンテンツを読み込んだ後、数秒間 読み取りを一時的に無効化する方法があります。

11.2 緩和策

注記
このセクションでは、この仕様に適用可能な緩和策の概要を示します。 これらの緩和策の規範的な定義は、この 仕様の各アルゴリズムに組み込まれています。 実装者は、この仕様で定義される緩和策を実装する際に、 プライベートブラウジングモードに関する TAG の ガイダンスを考慮することが推奨されます。

11.2.1 データ最小化

この仕様は、その高価値なユースケースに対処するために必要な最小限まで、 基盤となるプラットフォームの低レベルな詳細に関連するデータの公開を制限するという一般的な データ最小化 原則に 従います。これには、 デバイスに関する識別情報の公開を制限することへの考慮も含まれます。

この仕様の文脈におけるデータ最小化原則の具体的な適用については、 11.2.2 レート難読化および11.2.7 同一オリジン制限で説明します。

11.2.2 レート難読化

この仕様では、実装定義の スライド式観測ウィンドウにわたるプレッシャー変化の回数を追跡し、 プレッシャー 変化回数に対する実装定義のしきい値を超えた場合にフラグを設定する レート難読化緩和策を実装することを要求します。同様に、複数の状態にまたがる大量のプレッシャー状態変更などの 異常な活動を実装が監視し、同様にこのフラグを設定することも推奨されます。

このフラグが設定された場合、実装はプレッシャーオブザーバーに ペナルティを与えることが推奨され、その期間中は通常どおり プレッシャー状態の変化をスクリプトに通知できなくなります。このペナルティの期間は 実装定義であり、ランダム化することが 推奨されます。 ペナルティ後にプレッシャーオブザーバーに通知するが動作を再開すると、 最新のプレッシャー状態のみを 報告し、このペナルティ中にプラットフォームコレクターから受信した中間状態の情報は 無視します。

11.2.3 レート 難読化の規範的パラメーター

実装経験に基づき、実装者は次を使用しなければなりません。

  • PressureObserver の [[MaxChangesThreshold]] 内部 スロットには、50 回から 100 回の変更の範囲。
  • PressureObserver の [[PenaltyDuration]] 内部スロットには、5000 ミリ秒から 10000 ミリ秒の範囲。
注記

11.2.4 レート 難読化の非規範的パラメーター

このセクションは非規範的です。

実装経験に基づき、実装者は次を使用することが推奨されます。

  • PressureObserver の [[ObservationWindow]] 内部スロットには、 300000 ミリ秒(5 分)から 600000 ミリ秒(10 分)の範囲。
注記

11.2.5 キャリブレーション破壊

キャリブレーションプロセスでは、攻撃者は、作り出したワークロードによって加えられたプレッシャーに応じて、 この API が特定のプレッシャー状態への遷移を最も高い確率で報告するように CPU を操作しようとします。 この キャリブレーション 破壊緩和策は、これらのプレッシャー状態遷移に寄与する実装定義の 低レベルハードウェアメトリクスを実行時にわずかに変更することで、このキャリブレーションプロセスの 成功を遅らせるか、防止できます。 初期キャリブレーションが成功したとしても、この緩和策が継続的に動作している間は、 その結果は実行時に無効化されます。再キャリブレーションの試みも 同様に緩和されます。

注記

11.2.6 キャリブレーション破壊 パラメーター

このセクションは非規範的です。

実装経験に基づき、実装者は 120000 ミリ秒(2 分)から 240000 ミリ秒(4 分)の範囲内でランダム化された時間値に対して、この緩和策を適用することが推奨されます。

注記

11.2.7 同一オリジン制限

デフォルトでは、データ配信は、 アクティブな Picture-in-Picture セッションの開始元キャプチャ中の文書、 または存在する場合はシステムフォーカスを持つ文書と同一オリジンから提供された文書に制限されます。

上記の規則の下でデータ配信の条件を満たす文書は、子ナビゲータブル内の文書にデータ配信を委譲できます。

この機能を iframe などのサードパーティーコンテキストに拡張できるのは、 宣言された ポリシーによってのみです。

共有ワーカーは、トップレベル文書とそれに関連付けられた iframe など、複数の文書間で共有できます。所有者集合内の文書の 1 つが上記のデータ 配信要件を満たす場合、共有ワーカーも データ配信の条件を満たします。これは、埋め込まれた iframe が埋め込み側の文書へデータを渡せることを意味します。

12. アクセシビリティに関する考慮事項

Compute Pressure API は、ユーザー体験の向上に重点を置いています。この API を基盤として構築される アプリケーションがアクセシビリティに良い影響を与えられる方法は 2 つあります。

  1. API を使用して収集した情報に基づいて判断を行う際に、ユーザーのアクセスニーズを考慮すること。
  2. API から得た情報に基づいて、アクセシビリティを 考慮したユーザーインターフェイスを設計し、作成すること。

API の利用者として、これら両方の機会を考慮することが重要です。以下にいくつか例を示します。

13. 自動化

Compute Pressure API は、インターフェイスを完全に テストするには予測可能な方法で応答する物理ハードウェアデバイスが必要となるため、 テスト作成者に課題をもたらします。

この課題に対処するため、この文書では [WEBDRIVER2] の拡張コマンドを定義します。これにより、実際のものと同様に 動作し、特定のプロパティを持たせることができ、その読み取り値を ユーザーが完全に定義できる仮想プレッシャーソースを定義および制御できます。

13.1 仮想プレッシャーソース

仮想プレッシャーソースは、 実際のものの挙動を制御された方法で シミュレートするプレッシャーソースです。それに接続された 0 個以上のプラットフォームコレクターに プレッシャーの変化を報告します。

ただし、実際のプレッシャーソースとは異なり、 プラットフォームコレクターによってプレッシャー状態へ処理する必要がある実装定義の値ではなく、 プレッシャー状態の値を直接報告します。つまり、 仮想プレッシャーソースプレッシャーソースサンプルデータPressureState です。

すべてのプレッシャー ソースに関連付けられたデータ( プレッシャーソースサンプルなど)に加えて、各仮想プレッシャーソースには次のものがあります。

トップレベル traversableには、 仮想プレッシャーソースマッピングがあります。これは、 ソース型から仮想プレッシャーソースへの順序付き マップです。

注記
注記

13.1.1 拡張コマンド

13.1.1.1 仮想プレッシャーソースを作成する
HTTP メソッド URI テンプレート
POST /session/{session id}/pressuresource

この拡張コマンドは、指定された ソース型の新しい仮想プレッシャーソースを作成します。同じソース型PressureObserver インスタンスから observe() を呼び出すと、 13.1.1.2 仮想プレッシャーソースを削除するが実行されるまで、この仮想プレッシャーソースが、それらの基盤となるプレッシャーソースとして使用されます。

このアルゴリズムで使用される parameters 引数のプロパティ
パラメーター名 値の型 必須
type String はい
supported Boolean いいえ

sessionURL variables、および parameters が与えられたときのリモートエンド手順は次のとおりです。

  1. virtualPressureSourceType を、 parameters から "type" のプロパティを取得するを呼び出した結果とします。
  2. ユーザーエージェントサポートされるソース型virtualPressureSourceType含まない場合、 WebDriver エラーコード 無効な引数エラーを返します。
  3. topLevelTraversable を、現在のブラウジング コンテキストトップレベル traversableとします。
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable仮想プレッシャー ソースマッピングとします。
  5. topLevelVirtualPressureSourceMappingvirtualPressureSourceType を含む場合、 WebDriver エラーコード 無効な引数エラーを返します。
  6. supported を、parameters から "supported" と true を指定してデフォルト値付きで プロパティを取得するを 呼び出した結果とします。
  7. virtualPressureSource を新しい仮想プレッシャーソースとします。
  8. virtualPressureSourceサンプルを提供できるsupported に設定します。
  9. topLevelVirtualPressureSourceMapping[virtualPressureSourceType] を virtualPressureSource に設定します。
  10. データ null とともに成功を返します。
13.1.1.2 仮想プレッシャーソースを削除する
HTTP メソッド URI テンプレート
DELETE /session/{session id}/pressuresource/{type}

この拡張コマンドは、指定された仮想プレッシャーソースを削除します。つまり、 使用可能であれば、指定されたソース型のデータは、 仮想ではない通常の方法で配信されます。

sessionURL variables、および parameters が与えられたときのリモートエンド手順は次のとおりです。

  1. virtualPressureSourceTypeURL variables["type"] の値とします。
  2. ユーザーエージェントサポートされるソース型virtualPressureSourceType含まない場合、 WebDriver エラーコード 無効な引数エラーを返します。
  3. topLevelTraversable を、現在のブラウジング コンテキストトップレベル traversableとします。
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable仮想プレッシャー ソースマッピングとします。
  5. pressureSourcetopLevelVirtualPressureSourceMapping[virtualPressureSourceType] とします。
  6. pressureSource接続済みプラットフォームコレクターの各 platformCollector についてそれぞれ
    1. platformCollector関連付けられたプレッシャーソースを null に設定します。
  7. topLevelVirtualPressureSourceMapping[virtualPressureSourceType] を 削除します。
  8. データ null とともに成功を返します。
13.1.1.3 仮想プレッシャーソースを更新する
HTTP メソッド URI テンプレート
POST /session/{session id}/pressuresource/{type}

この拡張コマンドを使用すると、新しいプレッシャーソースサンプルをプッシュすることで、 仮想プレッシャーソースの状態を更新できます。

注記
このアルゴリズムで使用される parameters 引数のプロパティ
パラメーター名 値の型 必須
sample PressureState はい

sessionURL variables、および parameters が与えられたときのリモートエンド手順は次のとおりです。

  1. virtualPressureSourceTypeURL variables["type"] の値とします。
  2. ユーザーエージェントサポートされるソース型virtualPressureSourceType含まない場合、 WebDriver エラーコード 無効な引数エラーを返します。
  3. topLevelTraversable を、現在のブラウジング コンテキストトップレベル traversableとします。
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable仮想プレッシャー ソースマッピングとします。
  5. topLevelVirtualPressureSourceMappingvirtualPressureSource含まない場合、 WebDriver エラーコード サポートされていない操作エラーを返します。
  6. virtualPressureSourcetopLevelVirtualPressureSourceMapping[virtualPressureSourceType] とします。
  7. sample を、 parameters から "sample" のプロパティを取得するを呼び出した結果とします。
  8. samplePressureState 型でない場合、 WebDriver エラーコード 無効な引数エラーを返します。
  9. virtualPressureSource最新 サンプルを、新しい プレッシャーソースサンプルに設定します。そのデータ であり、タイムスタンプ安全でない共有現在時刻です。
  10. 実装定義の方法で、 virtualPressureSource最新サンプルvirtualPressureSource接続済みプラットフォーム コレクターで利用可能にします。
  11. データ null とともに成功を返します。

14.

このセクションは非規範的です。

2: コールバックからオブザーバーにアクセスする方法
const samples = [];

function pressureChange(records, observer) {
  for (const record of records) {
    samples.push(record.state);

    // 必要なサンプルは 20 個だけです。
    if (samples.length == 20) {
      observer.disconnect();
      return;
    }
  }
}

const observer = new PressureObserver(pressureChange);
observer.observe("cpu");

次の例では、プレッシャーが critical になったときに、同時実行するビデオストリームの数を減らします。 簡単にするため、この 1 つの状態のみを考慮します。

ストリーム数を減らしても critical 状態を抜けられない可能性があり、 少なくとも直ちには抜けられない可能性があるため、critical 状態の間は 30 秒ごとに一度に 1 つずつストリームを減らす戦略を使用します。

これは、コールバックが少なくとも 30 秒ごとに 1 回、 または状態が実際に変化したときに呼び出されるようにすることで実現します。状態が変化したときは、インターバルタイマーをリセットします。

3: CPU プレッシャーに基づいてビデオフィードの数を調整する方法
let timerId = -1;
function pressureChange(records) {
  // 実際の状態変化による場合でも、setTimeout(以下を参照)から呼び出された場合でも、
  // 呼び出されるたびにタイマーをクリアします。
  if (timerId > 0) {
    clearTimeout(timerId);
  }

  // critical 状態に入ったとき、30 秒ごとに critical 状態のままかどうかを再確認し、
  // そうであれば、同時実行するストリームをさらに減らします。
  // このため、30 秒後に再度呼び出すタイマーを作成し、
  // 変化がなかった場合は最後の結果を渡します。
  const lastRecordArray = [records.at(records.length - 1)];
  timerId = setTimeout(pressureChange.bind(this, lastRecordArray), 30_000);

  for (const record of records) {
    if (record.state == "critical") {
      let streamsCount = getStreamsCount();
      setStreamsCount(streamsCount--);
    }
  }
}

const observer = new PressureObserver(pressureChange);
observer.observe("cpu");

次の例では、コールバックが最後に 呼び出されて以降に蓄積された残りの records を取得することで、takeRecords() の使用方法を示します。

disconnect() の前にこれを行うことが推奨されます。 そうしないと、disconnect() によってそれらがクリアされ、 永久に失われます。

たとえば、ベンチマークワークロード中のプレッシャーを測定し、 ワークロードの正確な継続時間にわたるプレッシャーテレメトリーが必要になる場合があります。これは、タスクが完了したらすぐにすべての オブザーバーを切断し、その時点までに保留され、イベントループサイクルの一部としてまだ配信されていない可能性のあるプレッシャー テレメトリーを手動で要求することを意味します。

4: disconnect する直前までのすべての状態変更を処理する方法
function logWorkloadStatistics(records) {
  // records を使用して何らかの処理を行います。
}

const observer = new PressureObserver(logWorkloadStatistics);
observer.observe("cpu");

// 保留中の状態変更レコードを読み取ります。そうしないと、それらは
// 切断時にクリアされます。
const records = observer.takeRecords();
logWorkloadStatistics(records);

observer.disconnect();

次の例では、source を指定して unobserve() を呼び出すことで、特定の source の監視を停止するようオブザーバーに指示する方法を示します。

注記
5: 特定のソースの状態 変更の監視を停止するようオブザーバーに指示する方法
const observer = new PressureObserver(records => { /* records を使用して何らかの処理を行います。 */ });

observer.observe("cpu");
observer.observe("gpu");

// これで、'cpu' または 'gpu' のプレッシャー状態が変化するたびにコールバックが呼び出されます。

observer.unobserve("gpu");

// これで、'cpu' のプレッシャー状態が変化したときだけコールバックが呼び出されます。

次の例では、disconnect() を呼び出すことで、すべての 状態変更の監視を停止するようオブザーバーに指示する方法を示します。 disconnect() を呼び出すと、 以前の observe() 呼び出しによって監視されていたすべてのソースの監視が停止されます。

さらに、最後にコールバックが呼び出されて以降に収集されたすべての保留中レコードもクリアされます。

6: すべての状態 変更の監視を停止するようオブザーバーに指示する方法
const observer = new PressureObserver(records => { // records を使用して何らかの処理を行います。 });
observer.observe("cpu");
observer.observe("gpu");

// しばらくしてから...

observer.disconnect();

// 直前に disconnect() したため、records は空の配列になります。
const records = observer.takeRecords();

15. 適合性

非規範的と明示されたセクションに加えて、この仕様のすべてのオーサリングガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべては規範的です。

この文書内のキーワード MAYMUST、および RECOMMENDED は、 ここに示すようにすべて 大文字で表記されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。

この仕様は、単一の製品、すなわちこの仕様に含まれるインターフェイスを実装する ユーザーエージェントについて適合基準を定義します。

A. 謝辞

このセクションは非規範的です。

貴重なフィードバックと助言をいただいた Anssi Kostiainen、 Asaf Yaffe、 Benjamin VanderSloot、 Chen Xing、 Evan Shrubsole、 Florian Scholz、 François Beaufort、 Jan Gora、 Jesse Barnes、 Joshua Bell、 Kamila Hasanbega、 Matt Menke、 Moh Haghighat、 Nicolás Peña Moreno、 Opal Voravootivat、 Paul Jensen、 Peter Djeu、 Reilly Grant、 Ulan Degenbaev、 Victor Miura、 Wei Wang、 および Zhenyao Mo に深く感謝します

プライバシーレビュー、フィードバック、提案されたクロスサイト隠れチャネル 攻撃とその緩和策について、W3C Privacy Interest Group (PING)、特に Peter Snyder に感謝します。同様に、プライベートブラウジングのプライバシーに関する研究と この仕様への関連する貢献について、Ehsan Toreini に感謝します。

実環境のシナリオでこの API の改善に役立つフィードバックと実践的な実験を行ってくださった、 Zoom エンジニアリングチームの Amanda Zhao、 Fidel Tian、 Zhiliang Wang およびその他の皆様に特に感謝します。

B. 実質的な変更の概要

このセクションは非規範的です。

B.2 索引

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

B.2.2 参照によって定義される用語

  • [DOM] は、次を 定義します。
    • Document インターフェイス
    • 文書
    • ノード
    • ノード 文書(Node の場合)
  • [ECMASCRIPT] は、次を定義します。
    • エージェント( ECMAScript の場合)
    • globalThis 属性( globalThis の場合)
  • [HR-TIME] は、 次を定義します。
    • DOMHighResTimeStamp
    • 相対高解像度時刻
    • 安全でない現在時刻(単調時計の場合)
    • 安全でない共有現在時刻
  • [HTML] は、次を 定義します。
    • 使用を 許可されている
    • 関連付けられた 文書
    • ブラウジング コンテキスト
    • 子 ナビゲータブル
    • closing(WorkerGlobalScope の場合)
    • DedicatedWorkerGlobalScope インターフェイス
    • 完全に アクティブ(Document の場合)
    • グローバル オブジェクト
    • iframes 要素
    • 並行して
    • ナビゲータブル (Window の場合)
    • ノード ナビゲータブル
    • オリジン
    • 所有者集合(WorkerGlobalScope の場合)
    • ポリシーコンテナー(WorkerGlobalScope の場合)
    • グローバル タスクをキューに追加する
    • 再アクティブ化する(Document の場合)
    • 関連する グローバルオブジェクト
    • 関連設定オブジェクト
    • 同一オリジン
    • 同一サイト
    • システムフォーカス(トップレベル traversable の場合)
    • タスクソース
    • 時刻起点(環境設定オブジェクトの場合)
    • トップレベルブラウジングコンテキスト
    • トップレベル traversable
    • トップレベル traversable(ブラウジングコンテキストの場合)
    • 文書アンロード時のクリーンアップ手順
    • Window インターフェイス
    • WorkerGlobalScope インターフェイス
  • [INFRA] は、次を 定義します。
    • 追加( list の場合)
    • 追加( set の場合)
    • 表明
    • クリア( map の場合)
    • クローン( list の場合)
    • 含む( list の場合)
    • 含む( map の場合)
    • 続行( iteration の場合)
    • 空( list の場合)
    • それぞれ( list の場合)
    • それぞれ( map の場合)
    • 実装定義
    • 項目( list の場合)
    • 項目( struct の場合)
    • キー( map の場合)
    • リスト
    • 順序付きマップ
    • キュー
    • 削除( list の場合)
    • 削除( map の場合)
    • 集合
    • サイズ( list の場合)
    • 構造体
    • タプル
    • 和集合( set の場合)
    • 値( map の場合)
  • [MEDIACAPTURE-STREAMS] は、次を定義します。
    • コンテキストが キャプチャ中
  • [PERMISSIONS-POLICY] は、次を定義します。
    • デフォルト許可リスト(ポリシー制御機能の場合)
    • ポリシー制御機能
  • [WEBDRIVER2] は、次を定義します。
    • 現在の ブラウジングコンテキスト
    • エラー
    • エラーコード
    • 拡張コマンド URI テンプレート
    • 拡張 コマンド
    • プロパティを 取得する
    • デフォルト値付きで プロパティを取得する
    • 無効な 引数
    • リモートエンド 手順
    • 成功
    • サポートされていない操作
  • [WEBIDL] は、 次を定義します。
    • 新しい promise
    • 指定された理由で拒否された promise
    • AbortError 例外
    • [Default] 拡張属性
    • デフォルトの toJSON 手順
    • [EnforceRange] 拡張属性
    • [Exposed] 拡張属性
    • FrozenArray インターフェイス
    • getter 手順
    • 呼び出す
    • NotAllowedError 例外
    • NotSupportedError 例外
    • object
    • Promise インターフェイス
    • 反応する( promise の場合)
    • 拒否された
    • 解決された
    • [SameObject] 拡張属性
    • [SecureContext] 拡張属性
    • シーケンス
    • this
    • TypeError 例外
    • undefined
    • unsigned long

B.3 IDL 索引

WebIDLenum PressureSource { "cpu" };

enum PressureState { "nominal", "fair", "serious", "critical" };

callback PressureUpdateCallback = undefined (
  sequence<PressureRecord> changes,
  PressureObserver observer
);

[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureObserver {
  constructor(PressureUpdateCallback callback);

  Promise<undefined> observe(PressureSource source, optional PressureObserverOptions options = {});
  undefined unobserve(PressureSource source);
  undefined disconnect();
  sequence<PressureRecord> takeRecords();

  [SameObject] static readonly attribute FrozenArray<PressureSource> knownSources;
};

[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureRecord {
  readonly attribute PressureSource source;
  readonly attribute PressureState state;
  readonly attribute DOMHighResTimeStamp time;
  [Default] object toJSON();
};

dictionary PressureObserverOptions {
  [EnforceRange] unsigned long sampleInterval = 0;
};

C. 参考文献

C.1 規範的な参考文献

[dom]
DOM 標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[hr-time]
高解像度時刻. Yoav Weiss. W3C. 2026年3月24日. W3C ワーキングドラフト. URL: https://www.w3.org/TR/hr-time-3/
[html]
HTML 標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行 標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[mediacapture-streams]
メディアキャプチャとストリーム. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2025年10月9日. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[PERMISSIONS-POLICY]
権限ポリシー. Ian Clelland. W3C. 2025年10月6日. W3C ワーキングドラフト. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
要件レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧さ. B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBDRIVER2]
WebDriver. Simon Stewart; David Burns. W3C. 2026年5月11日. W3C ワーキングドラフト. URL: https://www.w3.org/TR/webdriver2/
[WEBIDL]
Web IDL 標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

C.2 参考情報の参考文献

[ECMAScript]
ECMAScript 言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/