Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
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 プロセス文書に準拠します。
このセクションは非規範的です。
最新のアプリケーションでは、現代的で快適なユーザー体験を提供するために、 システムのコンピューティングリソースを最大限に活用することによるトレードオフと利点のバランスを取る必要があることがよくあります。
たとえば、多くのアプリケーションでは、さまざまな精巧さのビデオエフェクトをレンダリングできます。 これらのアプリケーションは、ユーザーのデバイスを高プレッシャー状態に陥らせることを避けながら、 最高のユーザー体験を提供することを目指します。
処理ユニットの使用率が 100% に近づき、頻繁に 100% に達すると、さまざまなタスクが処理時間を奪い合うため、 悪い ユーザー体験につながる可能性があります。 これは動作の遅さにつながる可能性があり、特に入力遅延として顕著に現れます。 さらに、100% に近い使用率が長時間続くと、長時間の ブーストによって 処理 ユニットが発熱する可能性があり、スロットリングにつながり、その結果、さらに悪いユーザー体験となる可能性があります。
熱的制約の結果、多くのスマートフォン、タブレット、ノートパソコンは、触れると不快なほど熱くなることがあります。 ノートパソコンやデスクトップのファンは、会話を妨げたり、 ユーザーの集中を妨げたりするほど大きな音になることがあります。
多くの場合、高プレッシャー下のデバイスは応答していないように見えます。これは、オペレーティング システムが、ユーザーが待っているタスクを進行させるスレッドのスケジューリングに失敗する可能性があるためです。ユースケースも参照してください。
このセクションは非規範的です。
機能検出は、確立されたウェブ開発のベストプラクティスです。このトピックに関するリソースはオンラインにも オフラインにも 豊富に存在し、このセクションの目的はそれについてさらに議論することではなく、ハードウェア依存機能の 検出という文脈に位置付けることです。
以下の機能検出の例を考えてみます。
この仕様では、次の概念を定義します。
コンピューティングデバイスは、中央 処理装置 (CPU)、グラフィックス処理装置 (GPU)、および多数の特殊な 処理ユニットなど、多数の異なる 処理 ユニットで構成されています。後者は、機械学習やコンピュータービジョンなどの特定の タスクを高速化するよう設計されたものなどが普及しつつあります。
この仕様では現在、有効なソース型を CPU とも呼ばれる中央処理ユニットとして定義しています。 この仕様の将来のレベルでは、追加のソース型を導入してもよい。
PressureSource 列挙型は、有効なソース型を表します。
要求されたサンプリング間隔は、ハードウェアから取得するサンプル間の望ましい 間隔を表し、 ミリ秒単位で表されます。
間隔と周波数は互いに逆数であるため、 要求されたサンプリング間隔は、 要求されたサンプリングレートとして、ヘルツ(1 秒あたりの サイクル数)で、 1000 を 要求されたサンプリング間隔の 値で割ることによって表すこともできます。
プラットフォームコレクターのサンプリング レートは、 ユーザーエージェントが基盤となる プラットフォームからテレメトリー読み取り値を取得するレートとして定義され、 プレッシャーオブザーバーの要求されたサンプリングレートとは異なる場合があります。 このレートはヘルツ(1 秒あたりのサイクル数)で測定されます。
プレッシャーオブザーバーの報告 レートは、 データ収集手順を実行するレートであり、サンプリングレートを超えることはありません。
要求されたサンプリングレートが、基盤となるプラットフォームとユーザーエージェント†によって サポートまたは受け入れられるサンプリングレートの上限または下限を超える場合、 サンプリングレートは要求されたサンプリングレートとは異なります。
†この仕様では、11.2.2 レート難読化で説明されているとおり、レートをさらに難読化します。
ユーザーがサンプリングレートを要求しなかった場合、サンプリングレートは 実装定義です。
プレッシャーソースは、ハードウェアカウンターまたは
ソース型に関するテレメトリーデータを提供する基盤フレームワークへの抽象的な実装定義の
インターフェイスであり、
PressureSourceによって定義されます。プレッシャーソースは、
より正確な結果が得られる場合には、追加のソースからのデータとの
データフュージョンを利用できます。
プレッシャーソースによって提供されるテレメトリーデータは、この 仕様ではプレッシャーソースサンプルとして表され、次の項目から構成される構造体です。
PressureState
。
プレッシャーソースには、関連付けられた最新サンプルがあり、これはプレッシャーソースサンプルまたは null です。初期値は null です。
プラットフォームコレクターは、 プレッシャーソースからテレメトリーサンプルを取得し、それらを プレッシャー状態に変換して、ユーザーエージェントに提供する抽象インターフェイスです。
プラットフォームコレクターには、次の関連データがあります。
プレッシャーソースによって提供され、その最新サンプルのデータに保存されるテレメトリーデータの形式は実装定義であり、プラットフォームコレクターがそれをプレッシャー状態へ変換する プロセスも同様です。
この仕様の目的上、プラットフォームコレクターは、プラットフォームコレクターマッピングを介して グローバルオブジェクトにスコープされます。
自動化の目的では、プラットフォームコレクターは、 仮想プレッシャーソースに接続し、そのシミュレートされたデータを、 調整済みプレッシャー状態に変換する必要がある生のプラットフォームデータではなく、 プレッシャー状態として使用できなければなりません。
テレメトリーデータの収集は、ハードウェアカウンターをポーリングすることを意味する場合が多いため、コストのかからない処理ではなく、 データを監視している者が誰もいない場合には実行すべきではありません。詳細については、10.5 ライフサイクルおよび ガベージコレクションを参照してください。
プラットフォームコレクターは、特定のレートでデータをサンプリングします。ユーザーエージェントは、プライバシー上の理由からこのレートを (可能であれば)変更したり、特定の読み取り値を無視して統合したりしてもかまいません。
ユーザーエージェントは、プレッシャーオブザーバーがアクティブになっていることをユーザーに知らせる、 何らかのユーザーに見える通知を表示するとともに、 進行中の操作をブロックする手段、または単に通知を閉じる手段を ユーザーに提供することが推奨されます。
Compute Pressure API は、トークン "compute-pressure" で識別される
ポリシー制御機能を定義します。
そのデフォルト許可リストは
'self' です。
ワーカー(専用および共有)は、その所有 文書によって設定された権限ポリシーに従います。
共有ワーカーは、同一オリジンの他の文書から取得できるため、複数の所有文書を持つことがよくあります。 この場合、すべての所有文書が、この仕様で定義されたポリシー制御機能を使用を許可されていなければなりません。
専用ワーカーは他のワーカーから作成できます。 この場合、所有者チェーンを上にたどった最初の所有文書 (共有ワーカーの場合は所有文書群)の権限ポリシーが 使用されます。
各グローバルオブジェクトには、次のものがあります。
PressureObserver オブジェクト)で構成されます。
ユーザーエージェントには、次のものがあります。
PressureSource 値のリストです。
構築されたPressureObserver オブジェクトには、次の
内部スロットがあります。
PressureUpdateCallbackで、作成時に設定される[[Callback]]。
PressureSource 文字列を保持し、
promise はPromise オブジェクトを保持します。
PressureRecord
オブジェクトのキューで、初期状態では空です。
PressureSourceから最新の
PressureRecordへの順序付きマップです。
PressureSourceから
正の数への順序付きマップです。指定されたソース型のサンプル間隔を表します。
レート難読化の緩和策のため、構築されたPressureObserver オブジェクトにはさらに
次の内部スロットがあります。
PressureSourceをキーとする順序付きマップで、
現在のプレッシャー状態への遷移を引き起こしたソース型を表します。
順序付きマップの値は、
現在の観測ウィンドウの時間枠内における状態変更回数を表す整数です。
PressureSourceをキーとする順序付きマップで、
最後のPressureRecordのソース型を表します。
順序付きマップの値は、
PressureRecordです。
プレッシャー状態は、ウェブサイトが 品質、サービス、またはユーザー体験の低下を最小限に抑えながら、 コンピューティングおよびシステムプレッシャーの変化に対応できる、有用な状態の最小集合を表します。
WebIDLenum PressureState { "nominal", "fair", "serious", "critical" };
PressureState 列挙型は、次の状態を持つプレッシャー状態を表します。
nominal": 対象
デバイスの状態は許容可能なレベルにあり、ユーザーに対する顕著な
悪影響はありません。
fair": 対象デバイスのプレッシャー、温度
および/またはエネルギー使用量がやや上昇しており、バッテリー持続時間が短くなったり、
ファン(またはファンを備えたシステム)が作動して音が聞こえるようになったりする可能性があります。
それ以外では、対象デバイスは問題なく動作しており、追加の処理を引き受けることができます。
serious": 対象デバイスのプレッシャー、
温度および/またはエネルギー使用量が継続的に非常に高くなっています。
システムは、温度を下げるための対策としてスロットリングしている可能性があります。
critical": 対象
デバイスまたはシステムの温度が著しく上昇しており、潜在的な問題を回避するために
冷却する必要があります。
寄与 要因は、現在のプレッシャー状態に寄与する基盤となるハードウェアおよびオペレーティングシステムのメトリクスを表し、実装定義とすることができます。
調整済み プレッシャー状態は、ソース型および寄与要因からのその他の実装定義データを入力として受け取る実装定義の アルゴリズムによって決定されるプレッシャー状態です。このアルゴリズムは、 キャリブレーション破壊緩和策の有効性を確保するため、 決定論的であってはなりません。
寄与要因の変化が実質的である手順は次のとおりです。
PressureUpdateCallback コールバックWebIDLcallback PressureUpdateCallback = undefined (
sequence<PressureRecord> changes,
PressureObserver observer
);
このコールバックは、プレッシャー状態が変化したときに呼び出されます。
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を表します。
new PressureObserver(callback)
コンストラクターの手順は次のとおりです。
[[Callback]]をcallbackに設定します。
observe(source, options)
メソッドの手順は次のとおりです。
NotAllowedErrorで拒否された promiseを返します。
[[SampleIntervalMap]][source]を、
optionsのsampleIntervalに設定します。
[[PendingObservePromises]]に追加します。
[[PendingObservePromises]]から削除します。
NotSupportedErrorで拒否して、
これらの手順を中止します。
unobserve(source)
メソッドの手順は次のとおりです。
NotSupportedError"
をスローします。
[[QueuedRecords]]から削除します。
[[SampleIntervalMap]][source]を削除します。
[[LastRecordMap]][source]を削除します。
[[AfterPenaltyRecordMap]][source]を削除します。
[[PendingObservePromises]]の
(promiseSource,
pendingPromise)をそれぞれについて、
sourceがpromiseSourceと等しい場合、pendingPromiseをAbortErrorで拒否します。
disconnect() メソッドの
手順は次のとおりです。
[[QueuedRecords]]を空にします。
[[SampleIntervalMap]]をクリアします。
[[LastRecordMap]]をクリアします。
[[AfterPenaltyRecordMap]]をクリアします。
[[PendingObservePromises]]の
(promiseSource,
pendingPromise)をそれぞれについて、
pendingPromiseをAbortErrorで拒否します。
takeRecords()
メソッドの手順は次のとおりです。
[[QueuedRecords]]のクローンとします。
[[QueuedRecords]]を空にします。
knownSources getter
の手順は次のとおりです。
WebIDL[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureRecord {
readonly attribute PressureSource source;
readonly attribute PressureState state;
readonly attribute DOMHighResTimeStamp time;
[Default] object toJSON();
};
構築された PressureRecord オブジェクトには、
次の内部スロットがあります。
PressureSource の [[Source]] 値。
PressureState の [[State]] 値。
DOMHighResTimeStamp の [[Time]] 値。
これは、通知を生成した
PressureObserver
インスタンスに関連付けられたグローバルオブジェクトの
時刻起点を基準として、
データがシステムから取得された
時刻に対応します。
source の getter 手順は、その [[Source]] 内部スロットを返すことです。
PressureRecord.toJSON が呼び出されたとき、Web IDL
標準の デフォルトの toJSON 手順を実行します。
WebIDLdictionary PressureObserverOptions {
[EnforceRange] unsigned long sampleInterval = 0;
};
sampleInterval メンバーは、
ミリ秒で表される 要求されたサンプリング
間隔を表します。値が 0 に設定されている場合、システムは
PressureState に変更があった場合にのみ、
PressureUpdateCallback を呼び出します。
各 グローバルオブジェクトは、その 登録済みオブザーバーリスト内の 登録済みオブザーバーへの 強参照を保持します (ソースごとに 1 つ)。
このセクションでは、この仕様を実装するときにユーザーエージェントが実行しなければならない手順の概要を示します。
引数 observer が与えられたときの 観測ウィンドウをリセットする手順は、次のとおりです。
[[ObservationWindow]] を、
実装定義の範囲内にある、ミリ秒単位の
実装定義のランダム化された
整数値に設定します。
[[MaxChangesThreshold]] を、
実装定義の範囲内で、
observationWindow 内に許可される最大変更回数を示す 実装定義のランダム化された整数
値に設定します。
[[PenaltyDuration]] を、
実装定義の範囲内にある、ミリ秒単位の
実装定義のランダム化された
整数値に設定します。
[[ChangesCountMap]]
マップを空にします。
[[ObservationWindow]]
の時間が経過したときに、異なるランダム化された値を使用して手順を再実行するタイマーを開始します。
関連するグローバルオブジェクト relevantGlobal の 所有文書集合を決定するには、次を行います。
Window
の場合、relevantGlobal の 関連付けられた文書を
owningDocumentSet に追加します。
WorkerGlobalScope
relevantGlobal の 所有者集合内の各 owner
についてそれぞれ、
Document
の場合、owner を
owningDocumentSet に追加します。
WorkerGlobalScope
の場合、
owningDocumentSet を
owningDocumentSet と owner の 所有文書集合との和集合に設定します。
引数 document が与えられたときの 文書が暗黙のフォーカスを持つ手順は、次のとおりです。
引数 observer が与えられたときの データを 受信してよい手順は、 次のとおりです。
Window オブジェクトの場合、
WorkerGlobalScope
オブジェクトの場合、
[[LastRecordMap]][source] が存在しない場合、true を返します。
[[LastRecordMap]][source] とします。
[[SampleIntervalMap]][source] とします。
[[Time]] とします。
[[SampleIntervalMap]][source] > 0 の場合、true を返します。
[[LastRecordMap]][source] が存在しない場合、true を返します。
[[LastRecordMap]][source] とします。
[[State]] が
state と等しくない場合、true を返します。
[[ChangesCountMap]][source] をインクリメントします。
[[ChangesCountMap]][source]
≤ observer.[[MaxChangesThreshold]] を返します。
ソース型 source と relevantGlobal が与えられたとき、仮想プレッシャーソースを取得するには、次の 手順を実行します。これらは 仮想プレッシャーソースまたは null を返します。
Window オブジェクトの場合、
DedicatedWorkerGlobalScope
オブジェクトの場合、
ソース型 source と relevantGlobal が与えられたとき、データ収集をアクティブ化するには、次の手順を実行します。
ソース型 source と relevantGlobal が与えられたとき、データ収集を非アクティブ化するには、次の手順を実行します。
relevantGlobal、source、および platformCollector が与えられたときの データ 収集手順は、次のとおりです。
PressureState に設定します。
PressureRecord オブジェクトとし、その
[[Source]] を
source に設定し、
[[State]] を state に設定し、
[[Time]] を
timeValue に設定します。
[[AfterPenaltyRecordMap]][source]
が存在する場合、
[[AfterPenaltyRecordMap]][source]
を record に設定します。
[[AfterPenaltyRecordMap]][source]
を record に設定します。
[[ChangesCountMap]][source]
を 0 に設定します。
[[PenaltyDuration]]
の期間のタイマーを、次のコールバックで作成します。
[[AfterPenaltyRecordMap]][source]
が存在する場合、
[[AfterPenaltyRecordMap]][source]
とします。
[[AfterPenaltyRecordMap]][source]
を削除します。
引数 observer、 source、record が与えられたとき、 レコードを キューに追加するには、次の手順を実行します。
[[QueuedRecords]] のサイズが
キューに追加できる最大レコード数より大きい場合、最初の項目を削除します。
[[QueuedRecords]] に追加します。
[[LastRecordMap]][source] を record
に設定します。
PressureObserver タスクソースは、10.6.5 プレッシャーオブザーバーに通知するためのタスクをスケジュールする際に使用されるタスクソースです。
relevantGlobal が入力として与えられたとき、プレッシャーオブザーバータスクをキューに追加するには、次の手順を実行します。
relevantGlobal が入力として与えられたとき、プレッシャーオブザーバーに通知するには、 次の手順を実行します。
[[QueuedRecords]] のクローンとします。
[[QueuedRecords]] を空にします。
report" を指定して observer.[[Callback]] を呼び出します。
この仕様では、Document document
が与えられた場合の、次の文書アンロード時のクリーンアップ手順を
定義します。
WorkerGlobalScope
relevantGlobal の
closing フラグが true に設定されるたびに、次の
手順を実行します。
一意または非常に精密な値に、オリジンを共有していないサイトから同時にアクセスできる場合、 同一オリジンではないサイトをまたいでユーザーを識別できる 可能性があります。 この攻撃は、11.2.1 データ最小化、11.2.2 レート 難読化、 および 11.2.7 同一オリジン制限によって緩和されます。
コンピューターセキュリティにおいて、隠れチャネルは、本来通信を許可されるべきでないプロセス間で情報を転送する能力を 作り出します。現代のマルチプロセスウェブエンジンでは、一般的な ケースとして各ウィンドウまたはタブは独自のプロセス内に存在します(同一オリジンの文書、または 同一サイトのサイトは、通常同じプロセスを共有します)。この API を使用すると、クロスサイト隠れチャネル C を作成できる可能性があります。あるタブ上のサイト A がまず CPU の状態を 操作した後、チャネル C にブロードキャストします。次に、別のタブ上のサイト B(サイト A と同一サイトではない)が、 この API を使用して CPU の状態がいつ変化したかを知ることで、 チャネル C からブロードキャストされたデータを読み取ります。 このプロセスは、サイト A と B の両方でスクリプトが実行されている限り繰り返されます。
この攻撃は、11.2.2 レート難読化および11.2.5 キャリブレーション破壊によって緩和されます。 実装者は、長時間実行されるスクリプトについて、これらすべての緩和策を考慮することが推奨されます。
標的型匿名解除攻撃は、ユーザーの 匿名性を危険にさらす重大な脅威の一種です。 これらの攻撃により、悪意のある、または部分的に侵害されたウェブサイト(以下「悪意のある サイト」)は、 ウェブサイト訪問者がメールアドレスや ソーシャルメディアのハンドルなど、特定の公開識別子を所有しているかどうかを確認できます。
匿名性は一部の人にとっては贅沢かもしれませんが、特定の人々にとってはそれ以上のものであり、 生存に関わる問題です。たとえば、政治的抗議活動に参加する人、機密性の高い話題を扱う ジャーナリストとして働く人などを考えてください。
例として、攻撃者は公開 リソース共有サービス(「被害者サイト」)などを使用して標的とリソースを非公開で共有し、その後、サイドチャネルを介してリソースを読み込む際の 副作用(アクセス成功を示すもの)を測定できます。ログイン済みの訪問者が埋め込まれたリソースに 正常にアクセスできる場合、現在の訪問者が実際に意図された標的であることを示します。
特に、CPU 全体のプレッシャーに関する信頼できる情報を公開すると、攻撃サイトは クロスオリジンナビゲーションの対象(たとえば別の サイトの iframe またはポップアップウィンドウ)が CPU 負荷の高い操作を実行したかどうかを把握できるようになります。
ポップアンダーや タブアンダーなどの手法を使用して、 読み込みを ユーザーから隠すことができます。
考えられる攻撃の 1 つは、悪意のあるウェブサイトが、ユーザーがログインしている被害者サイト上のリソース (たとえば動画ストリーミングサイトやオンライン文書エディター)へのポップアップを開き、 特定のユーザーと共有されたリソースを指すようにすることです。
リソースの読み込みによって CPU へのプレッシャーが増加すると仮定すると、これによって、 ユーザーがそのリソースへのアクセス権を持つアカウントにログインしているかどうかを攻撃サイトに明らかにする サイドチャネルが形成され、 ユーザーの匿名性が解除されます。
現代の CPU は高プレッシャー状態から速やかに回復するため、考えられる緩和策の 1 つとして、 ポップアップや iframe コンテンツを読み込んだ後、数秒間 読み取りを一時的に無効化する方法があります。
この仕様は、その高価値なユースケースに対処するために必要な最小限まで、 基盤となるプラットフォームの低レベルな詳細に関連するデータの公開を制限するという一般的な データ最小化 原則に 従います。これには、 デバイスに関する識別情報の公開を制限することへの考慮も含まれます。
この仕様の文脈におけるデータ最小化原則の具体的な適用については、 11.2.2 レート難読化および11.2.7 同一オリジン制限で説明します。
この仕様では、実装定義の スライド式観測ウィンドウにわたるプレッシャー変化の回数を追跡し、 プレッシャー 変化回数に対する実装定義のしきい値を超えた場合にフラグを設定する レート難読化緩和策を実装することを要求します。同様に、複数の状態にまたがる大量のプレッシャー状態変更などの 異常な活動を実装が監視し、同様にこのフラグを設定することも推奨されます。
このフラグが設定された場合、実装はプレッシャーオブザーバーに ペナルティを与えることが推奨され、その期間中は通常どおり プレッシャー状態の変化をスクリプトに通知できなくなります。このペナルティの期間は 実装定義であり、ランダム化することが 推奨されます。 ペナルティ後にプレッシャーオブザーバーに通知するが動作を再開すると、 最新のプレッシャー状態のみを 報告し、このペナルティ中にプラットフォームコレクターから受信した中間状態の情報は 無視します。
実装経験に基づき、実装者は次を使用しなければなりません。
[[MaxChangesThreshold]] 内部
スロットには、50 回から 100 回の変更の範囲。
[[PenaltyDuration]]
内部スロットには、5000 ミリ秒から 10000 ミリ秒の範囲。
このセクションは非規範的です。
実装経験に基づき、実装者は次を使用することが推奨されます。
[[ObservationWindow]] 内部スロットには、
300000 ミリ秒(5 分)から 600000 ミリ秒(10 分)の範囲。
キャリブレーションプロセスでは、攻撃者は、作り出したワークロードによって加えられたプレッシャーに応じて、 この API が特定のプレッシャー状態への遷移を最も高い確率で報告するように CPU を操作しようとします。 この キャリブレーション 破壊緩和策は、これらのプレッシャー状態遷移に寄与する実装定義の 低レベルハードウェアメトリクスを実行時にわずかに変更することで、このキャリブレーションプロセスの 成功を遅らせるか、防止できます。 初期キャリブレーションが成功したとしても、この緩和策が継続的に動作している間は、 その結果は実行時に無効化されます。再キャリブレーションの試みも 同様に緩和されます。
このセクションは非規範的です。
実装経験に基づき、実装者は 120000 ミリ秒(2 分)から 240000 ミリ秒(4 分)の範囲内でランダム化された時間値に対して、この緩和策を適用することが推奨されます。
デフォルトでは、データ配信は、 アクティブな Picture-in-Picture セッションの開始元、 キャプチャ中の文書、 または存在する場合はシステムフォーカスを持つ文書と同一オリジンから提供された文書に制限されます。
上記の規則の下でデータ配信の条件を満たす文書は、子ナビゲータブル内の文書にデータ配信を委譲できます。
この機能を iframe などのサードパーティーコンテキストに拡張できるのは、 宣言された ポリシーによってのみです。
共有ワーカーは、トップレベル文書とそれに関連付けられた iframe など、複数の文書間で共有できます。所有者集合内の文書の 1 つが上記のデータ 配信要件を満たす場合、共有ワーカーも データ配信の条件を満たします。これは、埋め込まれた iframe が埋め込み側の文書へデータを渡せることを意味します。
Compute Pressure API は、ユーザー体験の向上に重点を置いています。この API を基盤として構築される アプリケーションがアクセシビリティに良い影響を与えられる方法は 2 つあります。
API の利用者として、これら両方の機会を考慮することが重要です。以下にいくつか例を示します。
Compute Pressure API は、インターフェイスを完全に テストするには予測可能な方法で応答する物理ハードウェアデバイスが必要となるため、 テスト作成者に課題をもたらします。
この課題に対処するため、この文書では [WEBDRIVER2] の拡張コマンドを定義します。これにより、実際のものと同様に 動作し、特定のプロパティを持たせることができ、その読み取り値を ユーザーが完全に定義できる仮想プレッシャーソースを定義および制御できます。
仮想プレッシャーソースは、 実際のものの挙動を制御された方法で シミュレートするプレッシャーソースです。それに接続された 0 個以上のプラットフォームコレクターに プレッシャーの変化を報告します。
ただし、実際のプレッシャーソースとは異なり、
プラットフォームコレクターによってプレッシャー状態へ処理する必要がある実装定義の値ではなく、
プレッシャー状態の値を直接報告します。つまり、
仮想プレッシャーソースのプレッシャーソースサンプルの
データは PressureState です。
すべてのプレッシャー ソースに関連付けられたデータ( プレッシャーソースサンプルなど)に加えて、各仮想プレッシャーソースには次のものがあります。
各トップレベル traversableには、 仮想プレッシャーソースマッピングがあります。これは、 ソース型から仮想プレッシャーソースへの順序付き マップです。
| HTTP メソッド | URI テンプレート |
|---|---|
| POST | /session/{session id}/pressuresource |
この拡張コマンドは、指定された
ソース型の新しい仮想プレッシャーソースを作成します。同じソース型のPressureObserver
インスタンスから
observe() を呼び出すと、
13.1.1.2
仮想プレッシャーソースを削除するが実行されるまで、この仮想プレッシャーソースが、それらの基盤となるプレッシャーソースとして使用されます。
| パラメーター名 | 値の型 | 必須 |
|---|---|---|
| type | String | はい |
| supported | Boolean | いいえ |
session、 URL variables、および parameters が与えられたときのリモートエンド手順は次のとおりです。
| HTTP メソッド | URI テンプレート |
|---|---|
| DELETE | /session/{session id}/pressuresource/{type} |
この拡張コマンドは、指定された仮想プレッシャーソースを削除します。つまり、 使用可能であれば、指定されたソース型のデータは、 仮想ではない通常の方法で配信されます。
session、 URL variables、および parameters が与えられたときのリモートエンド手順は次のとおりです。
| HTTP メソッド | URI テンプレート |
|---|---|
| POST | /session/{session id}/pressuresource/{type} |
この拡張コマンドを使用すると、新しいプレッシャーソースサンプルをプッシュすることで、 仮想プレッシャーソースの状態を更新できます。
| パラメーター名 | 値の型 | 必須 |
|---|---|---|
| sample |
PressureState
|
はい |
session、 URL variables、および parameters が与えられたときのリモートエンド手順は次のとおりです。
PressureState 型でない場合、
WebDriver エラーコード 無効な引数のエラーを返します。
このセクションは非規範的です。
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 回、 または状態が実際に変化したときに呼び出されるようにすることで実現します。状態が変化したときは、インターバルタイマーをリセットします。
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() によってそれらがクリアされ、
永久に失われます。
たとえば、ベンチマークワークロード中のプレッシャーを測定し、 ワークロードの正確な継続時間にわたるプレッシャーテレメトリーが必要になる場合があります。これは、タスクが完了したらすぐにすべての オブザーバーを切断し、その時点までに保留され、イベントループサイクルの一部としてまだ配信されていない可能性のあるプレッシャー テレメトリーを手動で要求することを意味します。
function logWorkloadStatistics(records) {
// records を使用して何らかの処理を行います。
}
const observer = new PressureObserver(logWorkloadStatistics);
observer.observe("cpu");
// 保留中の状態変更レコードを読み取ります。そうしないと、それらは
// 切断時にクリアされます。
const records = observer.takeRecords();
logWorkloadStatistics(records);
observer.disconnect();
次の例では、source を指定して unobserve()
を呼び出すことで、特定の
source の監視を停止するようオブザーバーに指示する方法を示します。
const observer = new PressureObserver(records => { /* records を使用して何らかの処理を行います。 */ });
observer.observe("cpu");
observer.observe("gpu");
// これで、'cpu' または 'gpu' のプレッシャー状態が変化するたびにコールバックが呼び出されます。
observer.unobserve("gpu");
// これで、'cpu' のプレッシャー状態が変化したときだけコールバックが呼び出されます。
次の例では、disconnect() を呼び出すことで、すべての
状態変更の監視を停止するようオブザーバーに指示する方法を示します。
disconnect() を呼び出すと、
以前の observe()
呼び出しによって監視されていたすべてのソースの監視が停止されます。
さらに、最後にコールバックが呼び出されて以降に収集されたすべての保留中レコードもクリアされます。
const observer = new PressureObserver(records => { // records を使用して何らかの処理を行います。 });
observer.observe("cpu");
observer.observe("gpu");
// しばらくしてから...
observer.disconnect();
// 直前に disconnect() したため、records は空の配列になります。
const records = observer.takeRecords();
非規範的と明示されたセクションに加えて、この仕様のすべてのオーサリングガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべては規範的です。
この文書内のキーワード MAY、MUST、および RECOMMENDED は、 ここに示すようにすべて 大文字で表記されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。
この仕様は、単一の製品、すなわちこの仕様に含まれるインターフェイスを実装する ユーザーエージェントについて適合基準を定義します。
このセクションは非規範的です。
貴重なフィードバックと助言をいただいた 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 およびその他の皆様に特に感謝します。
このセクションは非規範的です。
PressureObserver の
[[AfterPenaltyRecordMap]] 内部スロット
§7.
PressureObserver の
[[Callback]] 内部スロット
§7.
PressureObserver の
[[ChangesCountMap]] 内部
スロット
§7.
PressureObserver の
constructor()
§10.2.1
PressureSource の
"cpu" 列挙値
§3.2
PressureState の
"critical" 列挙値
§8.
PressureObserver の
disconnect()
メソッド
§10.2.4
PressureState の
"fair" 列挙値
§8.
PressureObserver の
knownSources
属性
§10.2.6
PressureObserver の
[[LastRecordMap]] 内部スロット
§7.
PressureObserver の
[[MaxChangesThreshold]]
内部スロット
§7.
PressureState の
"nominal" 列挙値
§8.
PressureObserver の
[[ObservationWindow]]
内部スロット
§7.
PressureObserver の
observe() メソッド
§10.2.2
PressureObserver の
[[PenaltyDuration]] 内部
スロット
§7.
PressureObserver の
[[PendingObservePromises]] 内部スロット
§7.
PressureObserver インターフェイス
§10.2
PressureObserverOptions 辞書
§10.4
PressureRecord インターフェイス
§10.3
PressureSource 列挙型
§3.2
PressureState 列挙型
§8.
PressureUpdateCallback
§10.1
PressureObserver の
[[QueuedRecords]] 内部スロット
§7.
PressureObserverOptions の
sampleInterval メンバー
§10.4.1
PressureObserver の
[[SampleIntervalMap]]
内部スロット
§7.
PressureState の
"serious" 列挙値
§8.
PressureRecord の
source 属性
§10.3.1
PressureRecord の
[[Source]] 内部スロット
§10.3
PressureRecord の
state 属性
§10.3.2
PressureRecord の
[[State]] 内部スロット
§10.3
PressureObserver の
takeRecords()
メソッド
§10.2.5
PressureRecord の
time 属性
§10.3.3
PressureRecord の
[[Time]] 内部スロット
§10.3
PressureRecord の
toJSON メソッド
§10.3.4
PressureObserver の
unobserve() メソッド
§10.2.3
Document インターフェイス
Node の場合)
ECMAScript の場合)
globalThis 属性(
globalThis の場合)
DOMHighResTimeStamp
WorkerGlobalScope の場合)
DedicatedWorkerGlobalScope インターフェイス
Document の場合)
iframes 要素
WorkerGlobalScope の場合)
WorkerGlobalScope の場合)
Document の場合)
Window インターフェイス
WorkerGlobalScope インターフェイス
list の場合)
set の場合)
map の場合)
list の場合)
list の場合)
map の場合)
iteration の場合)
list の場合)
list の場合)
map の場合)
list の場合)
struct の場合)
map の場合)
list の場合)
map の場合)
list の場合)
set の場合)
map の場合)
AbortError 例外
[Default] 拡張属性
[EnforceRange] 拡張属性
[Exposed] 拡張属性
FrozenArray インターフェイス
NotAllowedError 例外
NotSupportedError 例外
object
型
Promise インターフェイス
promise の場合)
[SameObject] 拡張属性
[SecureContext] 拡張属性
TypeError 例外
undefined 型
unsigned long 型
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;
};
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: