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

W3C 勧告候補ドラフト

このドキュメントの詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-compute-pressure-20250521/
最新公開バージョン:
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 (インテル株式会社)
Arnaud Mandy (インテル株式会社)
元編集者:
Raphael Kubo da Costa (インテル株式会社)
フィードバック:
GitHub w3c/compute-pressure (プルリクエスト, 新しいイシュー, オープンイシュー)

概要

Compute Pressure APIは、ウェブサイトがターゲットデバイスのCPUプレッシャーの変化に反応し、ユーザーエクスペリエンスの向上のためにリソースとのトレードオフを行う方法を提供します。

この文書の位置付け

このセクションは、本書が公開された時点での位置付けを説明します。現在のW3C刊行物および本技術レポートの最新改訂版は、W3Cの標準およびドラフト一覧(https://www.w3.org/TR/)で確認できます。

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

この文書はデバイスおよびセンサー作業グループ勧告トラックを用いて公開した勧告候補ドラフトです。

勧告候補としての公開は、W3C またはその会員による支持を意味するものではありません。勧告候補ドラフトは、ワーキンググループが次の勧告候補スナップショットに含めることを意図した、以前の勧告候補からの変更点を統合したものです。

これはドラフト文書であり、今後更新・置換・廃止される場合があります。この文書を進行中の作業以外の形で引用するのは好ましくありません。

この文書は W3C特許ポリシーのもとで活動しているグループによって作成されました。 W3Cは、成果物に関連する特許開示の一覧(公開)を管理しています; またそのページには特許開示の手順も記載されています。特許が必須クレームを含むと信じるに足る知識がある者は、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

この文書は 2023年11月3日版W3Cプロセス文書に従います。

1. はじめに

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

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

例えば、多くのアプリケーションは、さまざまな精度の映像効果をレンダリングできます。これらのアプリケーションはユーザー体験を最適にしつつ、ユーザーのデバイスを高負荷状態へ導かないように工夫しています。

処理ユニットの使用率が100%近く、あるいは頻繁に100%に達すると、異なるタスクが処理時間を争うことになり、悪いユーザー体験につながりやすくなります。 これにより動作が遅くなり、とくに入力遅延が目立つようになります。 さらに、100%近い使用率が長時間続くと、処理ユニットが連続的な ブースト動作により発熱し、スロットリングが発生してユーザー体験がさらに悪化する場合があります。

熱的な制限の結果、多くのスマートフォン、タブレット、ノートパソコンは触れると不快なほど熱くなることがあります。ノートパソコンやデスクトップのファンは非常にうるさくなり、会話や集中の妨げになることもあります。

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

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

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

機能検出は、Web開発のベストプラクティスとして確立されています。この話題に関するリソースはオンライン・オフライン問わず多数存在し、本セクションの目的はそれをさらに議論することではなく、ハードウェア依存の機能検出の文脈で位置付けることです。

以下の機能検出例を考えてみましょう。

3. 概念

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

3.1 処理ユニット

コンピューティングデバイスは、中央処理装置(CPU)、グラフィックス処理装置(GPU)、その他の多くの特殊な処理ユニットで構成されています。後者には、機械学習やコンピュータビジョンのような特定タスクに特化したものも増えています。

3.2 プレッシャーソース

本仕様では現在、有効なソースタイプとして 中央処理ユニット(CPUとしても知られる)のみを定義します。 今後のレベルでは、追加のソースタイプが導入される可能性があります

PressureSource列挙は有効なソースタイプを表します。

3.3 サンプリングとレポートレート

要求サンプリング間隔は、ハードウェアからサンプルを取得する間隔(ミリ秒で表現)を示します。

間隔と周波数は逆数の関係にあるため、要求サンプリング間隔は、1000 を割ることでヘルツ(1秒あたりの回数)による要求サンプリングレートとしても表せます。

サンプリングレートは、プラットフォームコレクタユーザーエージェントが基盤プラットフォームからテレメトリ値を取得する頻度(ヘルツ)を示します。これはプレッシャーオブザーバごとの要求サンプリングレートとは異なる場合があります。

レポートレートは、プレッシャーオブザーバがデータ収集手順を実行する頻度(ヘルツ)であり、サンプリングレートを上回ることはありません。

サンプリングレートは、要求サンプリングレートが基盤プラットフォームまたはユーザーエージェントでサポートされる上限・下限を超える場合に異なります

仕様ではさらに、11.2.2 レート難読化で述べた通りレートを難読化します。

サンプリングレートがリクエストされていない場合、その値は実装依存です。

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

プレッシャーソースは、ハードウェアカウンタまたは 実装依存 の基盤フレームワークへの抽象インターフェイスであり、 PressureSourceで定義される ソースタイプについてのテレメトリデータを提供します。 プレッシャーソースは、より高精度な結果が得られる場合、他のソースのデータと融合を行うことができます。

プレッシャーソースが提供するテレメトリデータは、 本仕様ではプレッシャーソースサンプルと呼ばれる 構造体で表し、 以下の項目からなります:

プレッシャーソース最新サンプルpressure source sampleまたはnull)を持ちます。初期値はnullです。

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

プラットフォームコレクタは次のデータを持ちます:

プレッシャーソースが提供し 最新サンプルdataに保存されるテレメトリデータの形式 および プラットフォームコレクタがこれを プレッシャー状態へ変換する方法は、 実装依存です。

本仕様の目的では、プラットフォームコレクタグローバルオブジェクトごとに platform collector mapping でスコープされます。

オートメーションの目的で、プラットフォームコレクタ仮想プレッシャーソースに接続し、その dataプレッシャー状態として利用できる必要があります。 これは生のプラットフォームデータを 調整済プレッシャー状態へ変換する必要がないことを意味します。

テレメトリデータの収集はしばしばハードウェアカウンタのポーリングを伴うため、無償の操作ではありません。 したがって、監視者がいない場合は行うべきではありません。 詳細は10.5 ライフサイクルとガベージコレクションを参照してください。

プラットフォームコレクタは 一定のレートでデータをサンプリングします。 ユーザーエージェントは プライバシー理由でこのレートを変更したり(可能な場合)、特定の読み取り値を無視または融合させることがあります。

5. ユーザー通知

ユーザーエージェントは、プレッシャーオブザーバが有効なときにユーザーに通知し、 進行中の操作をブロックまたは通知を閉じる手段を提供する何らかのユーザー可視通知を 推奨します。

6. ポリシー制御

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

ワーカー(専用・共有)は、所有ドキュメントのパーミッションポリシーに従います。

共有ワーカーは、同一オリジンの他のドキュメントから取得できるため、 通常は複数の所有ドキュメントがあります。 この場合、全ての所有ドキュメントが本仕様で定義される 利用可ポリシー制御機能 でなければなりません。

専用ワーカーは他のワーカーから作成することもでき、その場合は所有チェーンの最初の ドキュメント(共有ワーカーの場合は全て)のパーミッションポリシーが適用されます。

7. 内部スロット定義

グローバルオブジェクトは次を持ちます:

登録済みオブザーバオブザーバPressureObserverオブジェクト)からなる。

ユーザーエージェントは以下を持ちます:

生成されたPressureObserverオブジェクトは以下の内部スロットを持ちます:

レート難読化対策のため、生成された PressureObserver オブジェクトはさらに以下の内部スロットを持ちます:

8. プレッシャー状態

プレッシャー状態は、ウェブサイトが計算資源やシステム負荷の変化に最小限の品質やサービス、ユーザー体験の低下で対応できるようにする、有用な最小限の状態セットを表します。

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

PressureState列挙型は、以下のプレッシャー状態を表します:

9. 寄与因子

寄与因子とは、現在のプレッシャー状態を決定するもととなる、ハードウェアやOSのメトリクスであり、実装依存です。

調整済みプレッシャー状態は、プレッシャー状態実装依存データ(ソースタイプ 及び他の実装依存データ)を入力として、実装依存アルゴリズムにより決定されるプレッシャー状態です。このアルゴリズムは、キャリブレーション解除対策の効果維持のため、決定的であってはなりません

寄与因子の変化が実質的であるステップは以下の通りです:

  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. relevantGlobal を、this関連グローバルオブジェクト とする。
  2. document について、relevantGlobal所有ドキュメント集合に含まれるものを反復する:
    1. もし document が、本仕様で定義された ポリシー制御機能 トークン "compute-pressure" を 利用可 でない場合、NotAllowedError で拒否された promise を返す
  3. this[[SampleIntervalMap]][source] を、optionssampleInterval に設定する。
  4. promise新しい promise とする。
  5. pendingPromiseTuple を (source, promise) とする。
  6. pendingPromiseTuple を追加 して、this[[PendingObservePromises]] に格納する。
  7. promise の確定に反応する:
  8. 次の手順を 並列で実行する:
    1. platformCollector を null とする。
    2. もし relevantGlobalプラットフォームコレクタマッピングsource を含む 場合:
      1. platformCollector を、relevantGlobalプラットフォームコレクタマッピング[source] に設定する。
    3. それ以外の場合:
      1. newCollector を新しい プラットフォームコレクタ とし、その 関連付けられたプレッシャーソース を null に設定する。
      2. virtualPressureSource を、仮想プレッシャーソースを取得するsourcerelevantGlobal を引数として呼び出した結果とする。
      3. もし virtualPressureSource が null でない場合:
        1. もし virtualPressureSourcecan provide samples が 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 の場合、グローバルタスクをキューに入れPressureObserver タスクソース 上で relevantGlobal を用いて promiseNotSupportedError で拒否し、これらの手順を中止する。
    5. データ収集を有効化するsourcerelevantGlobal を用いて呼び出す。
    6. グローバルタスクをキューに入れPressureObserver タスクソース 上で relevantGlobal を用いて次を実行する:
      1. もし promise が拒否されていた場合、次のサブ手順を実行する:
        1. もし relevantGlobal登録済みオブザーバリストsource に対応するものが であれば、 データ収集を無効化するsourcerelevantGlobal を用いて呼び出す。
        2. Return。
      2. 追加 により、新しい 登録済みオブザーバ を作成し、その observerthis に設定して、 relevantGlobal登録済みオブザーバリストsource に追加する。
      3. promise を解決する。
  9. promise を返す。

10.2.3 unobserve() メソッド

unobserve(source) の手順は次のとおりです:

  1. もし sourceサポートされるソースタイプ でない場合、"NotSupportedError" を投げる。
  2. 削除 により、this[[QueuedRecords]] から source に関連するすべての records を取り除く。
  3. 削除 により、this[[SampleIntervalMap]][source] を取り除く。
  4. 削除 により、this[[LastRecordMap]][source] を取り除く。
  5. 削除 により、this[[AfterPenaltyRecordMap]][source] を取り除く。
  6. (promiseSource, pendingPromise) について、this[[PendingObservePromises]] を反復し、 もし sourcepromiseSource と等しい場合、reject により pendingPromiseAbortError で拒否する。
  7. relevantGlobalthis関連グローバルオブジェクト とする。
  8. registeredObserverListrelevantGlobal登録済みオブザーバリスト のうち source に対応するものとする。
  9. 削除 により、registeredObserverList から 登録済みオブザーバ のうち、 その observerthis であるものを取り除く。
  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. (promiseSource, pendingPromise) について、this[[PendingObservePromises]] を反復し、 reject により pendingPromiseAbortError で拒否する。
  6. relevantGlobalthis関連グローバルオブジェクト とする。
  7. sourceregisteredObserverList について、 relevantGlobal登録済みオブザーバリスト順序付きマップを反復する:
    1. 削除 により、登録済みオブザーバ のうち、 その observerthis であるものを registeredObserverList から取り除く。
    2. もし registeredObserverList である場合:
      1. データ収集を無効化するsourcerelevantGlobal を用いて呼び出す。
      2. 削除 により、 relevantGlobalプラットフォームコレクタマッピング[source] を取り除く。

10.2.5 takeRecords() メソッド

takeRecords() の手順は次のとおりです:

  1. records を、クローン により observer[[QueuedRecords]] の複製とする。
  2. 空にする により、observer[[QueuedRecords]] を空にする。
  3. records を返す。

10.2.6 knownSources 属性

knownSources ゲッターの手順は次のとおりです:

  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 属性

sourceゲッター手順 は、その [[Source]] 内部スロットを返すことである。

10.3.2 state 属性

stateゲッター手順 は、その [[State]] 内部スロットを返すことである。

10.3.3 time 属性

timeゲッター手順 は、その [[Time]] 内部スロットを返すことである。

10.3.4 toJSON メンバー

PressureRecord.toJSON が呼び出されたときは、Web IDL Standard既定の toJSON 手順 を実行する。

10.4 PressureObserverOptions 辞書

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

10.4.1 sampleInterval メンバー

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

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

グローバルオブジェクト は、 自身の 登録済みオブザーバ に対して強参照を持ち、登録済みオブザーバリスト(ソースごとに 1 つ)に格納されます。

10.6 処理モデル

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

10.6.1 補助アルゴリズム

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

観測ウィンドウをリセットする 手順を実行し、観測者の [[ObservationWindow]] の時間が経過したときに異なる乱数化値で再度手順を実行するタイマーを開始する。

関連グローバルオブジェクト relevantGlobal所有ドキュメント集合 を決定するには:

  1. owningDocumentSet を空の 集合 とする。
  2. もし relevantGlobalWindow であるなら、追加 により relevantGlobal関連付けられたドキュメントowningDocumentSet に追加する。
  3. それ以外の場合、 owner について WorkerGlobalScoperelevantGlobal所有者集合 を反復する:
    1. もし ownerDocument であるなら、追加 により ownerowningDocumentSet に追加する。
    2. もし ownerWorkerGlobalScope であるなら、 owningDocumentSet を、和集合 により owningDocumentSetowner所有ドキュメント集合 の和集合に設定する。
  4. owningDocumentSet を返す。

引数 document を与えた 暗黙のフォーカスを持つドキュメント 手順は次のとおりです:

  1. もし documentfully active でない場合、false を返す。
  2. relevantGlobaldocument関連グローバルオブジェクト とする。
  3. origin について、 アクティブな Picture-in-Picture セッションの開始者 を反復する:
    1. もし relevantGlobal関連設定オブジェクトoriginoriginsame origin であるなら、true を返す。
  4. もし relevantGlobalブラウジングコンテキストキャプチャ中 であるなら、true を返す。
  5. topLevelBC を、relevantGlobalブラウジングコンテキストトップレベルブラウジングコンテキスト とする。
  6. もし topLevelBCシステムフォーカス を持たないなら、false を返す。
  7. focusedDocument を、topLevelBC 現在フォーカスされている領域ノードドキュメント とする。
  8. もし relevantGlobal関連設定オブジェクトorigin が、 focusedDocumentoriginsame origin であるなら、true を返す。
  9. それ以外の場合、false を返す。

引数 observer を与えた データ受信可能 手順は次のとおりです:

  1. relevantGlobal を、observer関連グローバルオブジェクト とする。
  2. もし relevantGlobalWindow オブジェクトであるなら:
    1. 暗黙のフォーカスを持つドキュメント を、 relevantGlobal関連付けられた Document に対して実行した結果を返す。
  3. もし relevantGlobalWorkerGlobalScope オブジェクトであるなら:
    1. owningDocuments を、relevantGlobal所有ドキュメント集合 とする。
    2. document について、owningDocuments を反復する:
      1. もし 暗黙のフォーカスを持つドキュメントdocument に対する実行結果が true であるなら、 true を返す。
      2. それ以外の場合、continue する。
  4. false を返す。

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

ソースタイプ sourcerelevantGlobal を与えた、 仮想プレッシャーソースを取得する 手順は次のとおりです。戻り値は 仮想プレッシャーソース または null です。

  1. topLevelTraversable を null とする。
  2. もし relevantGlobalWindow オブジェクトであるなら:
    1. topLevelTraversable を、relevantGlobalnavigableトップレベルトラバーサブル に設定する。
  3. もし relevantGlobalDedicatedWorkerGlobalScope オブジェクトであるなら:
    1. owningDocuments を、relevantGlobal所有ドキュメント集合 とする。
    2. もし owningDocuments であるなら、null を返す。
    3. アサート: owningDocumentsサイズ は 1 である。
    4. topLevelTraversable を、owningDocuments[0] の node navigableトップレベルトラバーサブル に設定する。
  4. もし topLevelTraversable が null なら、null を返す。
  5. topLevelVirtualPressureSourceMapping を、topLevelTraversable仮想プレッシャーソースマッピング とする。
  6. virtualPressureSource を null とする。
  7. もし topLevelVirtualPressureSourceMapping含む source を持つなら:
    1. virtualPressureSourcetopLevelVirtualPressureSourceMapping[source] に設定する。
  8. virtualPressureSource を返す。

10.6.2 データ収集と配信

ソースタイプ sourcerelevantGlobal を与えた データ収集を有効化する 手順は次のとおりです:

  1. もし relevantGlobalプラットフォームコレクタマッピング含まない source なら、これらの手順を中止する。
  2. platformCollector を、relevantGlobalプラットフォームコレクタマッピング[source] とする。
  3. もし platformCollectoractivated が true なら、 これらの手順を中止する。
  4. platformCollectoractivated を true に設定する。
  5. 実装依存の方法で、 データ収集 の手順を relevantGlobalsource、および platformCollector とともに開始する。

ソースタイプ sourcerelevantGlobal を与えた データ収集を無効化する 手順は次のとおりです:

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

relevantGlobalsourceplatformCollector を与えた データ収集 手順は次のとおりです:

  1. pressureSource を、platformCollector関連付けられたプレッシャーソース とする。
  2. もし pressureSource が null なら、これらの手順を中止する。
  3. sample を、pressureSource最新サンプル とする。
  4. もし sample が null なら、これらの手順を中止する。
  5. state を null とする。
  6. もし pressureSource仮想プレッシャーソース であるなら:
    1. state を、sampledata に格納された PressureState に設定する。
  7. それ以外の場合:
    1. もし 寄与因子の変化が実質的である が false なら、これらの手順を中止する。
    2. state を、調整済みプレッシャー状態 に設定する。これは sourcesampledata から計算される。
  8. アサート: state は null ではない。
  9. rawTimestamp を、sampletimestamp とする。
  10. timeValue を、相対高解像度時刻 に基づき、 rawTimestamprelevantGlobal から算出した値とする。
  11. observer について、relevantGlobal登録済みオブザーバリストsource に対応するものを反復する:
    1. もし データ受信可能observer に対して実行した結果が false なら、continue する。
    2. もし レートテストに合格するobserversourcetimeValue に対して実行した結果が false なら、continue する。
    3. もし ディスパッチすべきかobserversourcestate に対して実行した結果が false なら、continue する。
    4. record を新しい PressureRecord オブジェクトとし、 その [[Source]]source に、 [[State]]state に、 そして [[Time]]timeValue に設定する。
    5. もし observer[[AfterPenaltyRecordMap]][source] が 存在する 場合:
      1. observer[[AfterPenaltyRecordMap]][source] を record に設定する。
      2. Continue する。
    6. もし レート難読化テストに合格するobserversource に対して実行した結果が false なら:
      1. observer[[AfterPenaltyRecordMap]][source] を record に設定する。
      2. observer[[ChangesCountMap]][source] を 0 に設定する。
      3. observer[[PenaltyDuration]] の期間でタイマーを作成し、次のコールバックを設定する:
        1. もし observer[[AfterPenaltyRecordMap]][source] が 存在する 場合:
          1. record を、observer[[AfterPenaltyRecordMap]][source] とする。
          2. 削除 により、observer[[AfterPenaltyRecordMap]][source] を取り除く。
          3. レコードをキューに入れる を、 observersourcerecord を用いて実行する。
      4. Continue する。
    7. レコードをキューに入れる を、observersourcerecord で実行する。

10.6.3 PressureRecord をキューに入れる

引数 observersourcerecord を与えた レコードをキューに入れる 手順は次のとおりです:

  1. もし サイズobserver[[QueuedRecords]] において 最大キュー済レコード数 を超える場合、削除 により最初の 項目 を取り除く。
  2. 追加 により、recordobserver[[QueuedRecords]] に追加する。
  3. observer[[LastRecordMap]][source] を record に設定する。
  4. Pressure Observer タスクをキューに入れる を、 observer関連グローバルオブジェクト で実行する。

10.6.4 Pressure Observer タスクをキューに入れる

PressureObserver タスクソース は、タスクソースであり、10.6.5 Pressure Observer へ通知する タスクをスケジュールするために使用されます。

入力として relevantGlobal を与えた Pressure Observer タスクをキューに入れる 手順は次のとおりです:

  1. もし relevantGlobalpressure observer task queued が true なら、 何もせずに戻る。
  2. relevantGlobalpressure observer task queued を true に設定する。
  3. グローバルタスクをキューに入れPressureObserver タスクソース 上で relevantGlobal を用いて Pressure Observer へ通知する を実行する。

10.6.5 Pressure Observer へ通知する

入力として relevantGlobal を与えた Pressure Observer へ通知する 手順は次のとおりです:

  1. relevantGlobalpressure observer task queued を false に設定する。
  2. notifySet を、新しい 集合 とし、 relevantGlobal のすべての observer登録済みオブザーバリスト から集めて含める。
  3. observer について、notifySet を反復する:
    1. records を、 クローン により observer[[QueuedRecords]] の複製とする。
    2. 空にする により、observer[[QueuedRecords]] を空にする。
    3. もし records空でない なら、invoke により、observer[[Callback]] を « records, observer » と "report" を引数として呼び出す。

10.6.6 fully active 状態の変更の扱い

本仕様は、Document document に対する次の ドキュメントのアンロード時クリーンアップ手順 を定義します:

  1. relevantGlobal を、document関連グローバルオブジェクト とする。
  2. sourceキー について、relevantGlobal登録済みオブザーバリスト順序付きマップ を反復する:
    1. データ収集を無効化するsourcerelevantGlobal を用いて呼び出す。
    2. 削除 により、relevantGlobalプラットフォームコレクタマッピング[source] を取り除く。
Issue 275: bfcache 統合戦略の適切な決定

本仕様には以前、Document が再び fully active になるケース(すなわち Documentreactivate 手順との統合)をカバーする手順が含まれていました。これらの手順は、意図する挙動について議論されている間、削除されています。

10.6.7 ワーカーステータスの変更の扱い

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

  1. sourceキー について、relevantGlobal登録済みオブザーバリスト順序付きマップ を反復する:
    1. データ収集を無効化するsourcerelevantGlobal を用いて呼び出す。
    2. 削除 により、relevantGlobalプラットフォームコレクタマッピング[source] を取り除く。

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

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

本作業部会は、理論的・実世界の双方における既知の攻撃ベクターを、本節に列挙します。

11.1.1 タイミング攻撃

共有されていないオリジン間、すなわち非同一オリジンのサイト同士でも、同時にアクセス可能な一意または極めて高精度の値があると、ユーザーを識別できてしまう可能性があります。 この攻撃は、11.2.1 データ最小化11.2.2 レート難読化、 および 11.2.7 同一オリジン制限 により緩和されます。

11.1.2 クロスサイト秘匿チャネル

コンピュータセキュリティにおいて、秘匿チャネルは、本来通信が許可されないプロセス間で情報を転送する能力を生み出します。現代のマルチプロセス Web エンジンでは一般的に、各ウィンドウやタブは独自プロセスで実行されます(同一オリジンのドキュメントや、同一サイトは通常同じプロセスを共有します)。本 API を用いると、タブ A 上のサイト A がまず CPU の状態を操作した後、チャネル C に向けて送信を行い、続いて別タブ上の(サイト A と同一サイトではない)サイト B が本 API を使って CPU 状態の変化時刻を読み取り、チャネル C から送られたデータを受信する、といったクロスサイト秘匿チャネル C を構成できてしまう可能性があります。 この処理は、サイト A と B のスクリプトが稼動し続ける限り繰り返されます。

この攻撃は、11.2.2 レート難読化11.2.5 キャリブレーション解除 により緩和されます。 実装者は、長時間実行されるスクリプトに対して、これらすべての緩和策を検討することが推奨されます。

スクリプトの実行が長くなるほど、提案されたクロスサイト秘匿チャネルで送信できる情報量は増えます。例えば、ユーザーがビデオ会議サイトと、通常の閲覧シナリオと比べてより多くの情報が転送され得る別の長時間実行サイトを同時に開いている場合などです。一方で、ビデオ会議セッションのようなワークロードは一般に CPU に持続的な負荷を与えるため、プレッシャー状態を予測的に操作することは難しくなります。

11.1.3 標的型匿名性解除攻撃

標的型匿名性解除攻撃は、ユーザーの匿名性を危険に晒す重大な脅威クラスに該当します。これらの攻撃により、悪意のある、または一部が侵害された Web サイト(以下「悪性サイト」)は、訪問者が特定の公開識別子(例えばメールアドレスやソーシャルメディアのハンドル)を持っているかどうかを把握できるようになります。

匿名性は一部の人にとっては贅沢かもしれませんが、ある人々にとっては生存に関わる問題です。例えば、政治的抗議活動に参加する人や、機微なテーマを扱うジャーナリストなどが該当します。

一例として、攻撃者が被害者に対して公開のリソース共有サービス(以下「被害者サイト」)を用いてリソースを個別共有し、埋め込みリソースの読み込みによる副作用(アクセス成功を示唆)をサイドチャネルで測定することが挙げられます。ログイン済みの訪問者が埋め込まれたリソースにアクセスできた場合、現在の訪問者がまさに意図した標的であることが示されます。

とりわけ、総合的な CPU プレッシャーに関する信頼できる情報が露出すると、攻撃サイトはクロスオリジン遷移(例: 他サイトの iframe やポップアップ)先のターゲットが CPU 集約的な処理を実行したかどうかを把握できる可能性があります。

ポップアンダータブアンダー の手法は、ユーザーから読み込みを隠すために用いられ得ます。

可能な攻撃としては、悪性サイトがポップアップなどを開き、ユーザーがログインしている被害者サイト上のリソース(例: 動画配信サイトやオンラインドキュメントエディタ)において、特定ユーザーと共有されたリソースを指し示す、というものがあります。

リソースの読み込みが CPU への負荷増を招くと仮定すると、これはサイドチャネルを形成し、ユーザーが当該リソースへのアクセス権を持つアカウントにログインしているかどうかを攻撃サイトに明かし、ユーザーの匿名性を失わせます。

近年の CPU は高負荷からの回復が速いため、考えられる緩和策の一つとして、ポップアップや iframe コンテンツの読み込み後、数秒間は読み取りを一時的に無効化することが挙げられます。

11.2 緩和戦略

本節では、本仕様に適用可能な緩和戦略の高水準の見取り図を示します。これらの緩和策の規範的定義は、本仕様の各アルゴリズムに統合されています。 実装者は、本仕様で定義される緩和策を実装する際、TAG による プライベートブラウジングモードに関するガイダンスを考慮することが推奨されます。

11.2.1 データ最小化

本仕様は、基盤プラットフォームの低レベルな詳細に関するデータの露出を、高価値ユースケースに対応するために必要最小限に抑えるため、一般的な データ最小化 原則に従います。これには、デバイス識別情報の露出抑制に関する検討も含まれます。

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

11.2.2 レート難読化

本仕様は、レート難読化の緩和策の実装を要求します。これは、実装依存のスライディング観測ウィンドウに渡るプレッシャー変化回数を追跡し、その回数が実装依存の閾値を超えた場合にフラグを設定するものです。同様に、複数の状態にまたがる多数のプレッシャー状態変化など、異常な活動を観測した場合にも、同様にこのフラグを設定することが推奨されます。

このフラグが設定された場合、実装は、通常であればスクリプトにプレッシャー状態変化を通知するプレッシャーオブザーバに対して、一定期間ペナルティを与えることが推奨されます。このペナルティの期間は 実装依存であり、ランダム化することが推奨されます。 ペナルティ後に プレッシャーオブザーバへ通知 が再開された際には、直近のプレッシャー状態のみが報告され、ペナルティ中にプラットフォームコレクタから受信した中間状態情報は無視されます。

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

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

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

本節は非規範的です。

実装経験に基づき、実装者には次の使用が推奨されます:

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

11.2.5 キャリブレーション解除

キャリブレーション過程では、攻撃者が CPU を操作して、託されたワークロードにより本 API が特定のプレッシャー状態へ遷移すると報告する確率を最大化しようとします。 この キャリブレーション解除 の緩和策は、ランタイムにおいてこれらのプレッシャー状態遷移に寄与する 実装依存の低レベルハードウェア指標をわずかに変化させることで、キャリブレーションの成功を遅らせたり阻止したりします。 たとえ初期キャリブレーションが成功しても、本緩和策が継続的に動作している場合、その結果はランタイムで無効化されます。再キャリブレーションの試みも同様に緩和されます。

11.2.6 キャリブレーション解除のパラメータ

本節は非規範的です。

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

11.2.7 同一オリジン制限

既定では、データ配信は、 アクティブな Picture-in-Picture セッションの開始者 と同一オリジンで配信されるドキュメント、キャプチャ中のドキュメント、 あるいは(存在する場合)システムフォーカスを持つドキュメントに制限されます。

上記の規則に基づきデータ配信の資格を満たすドキュメントは、子ナビゲーブル内のドキュメントに配信を委譲できます。

この機能を iframe などのサードパーティコンテキストに拡張するには、宣言済みポリシーが必要です。

共有ワーカーは、トップレベルドキュメントや、それに関連付けられた iframe などのドキュメント間で共有できます。所有者集合内のいずれかのドキュメントが上記のデータ配信要件を満たす場合、その共有ワーカーはデータ配信の資格を得ます。これは、埋め込み iframe が、埋め込み先ドキュメントにデータを受け渡せることを意味します。

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

Compute Pressure API はユーザー体験の向上に注力しています。API を利用するアプリケーションがアクセシビリティに良い影響を与える方法は二つあります。

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

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

13. 自動化

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

この課題に対処するため、本ドキュメントは [WEBDRIVER2] 拡張コマンド を定義しており、実際のもののように振る舞い、特定のプロパティを持ち、その読み取り値をユーザーが完全に定義できる仮想プレッシャーソースを定義・制御することを可能にします。

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

A virtual pressure source は、制御された方法で実際のものの動作をシミュレートする プレッシャーソース であり、接続された プラットフォームコレクタ に対してプレッシャーの変化を報告します。

しかし、実際の プレッシャーソース とは異なり、仮想プレッシャーソースは実装依存の値をプラットフォームコレクタが 実装依存 の値として報告するのではなく、プレッシャー状態 の値を直接報告します。言い換えれば、仮想プレッシャーソースの pressure source sampledataPressureState です。

全ての プレッシャーソース に関連付けられたデータ(例えば pressure source sample など)に加えて、各 仮想プレッシャーソース は以下を持ちます:

トップレベルトラバーサブル仮想プレッシャーソースマッピング を持ち、これは 順序付きマップ で、ソースタイプ から 仮想プレッシャーソース への対応を保持します。

13.1.1 拡張コマンド

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

この 拡張コマンド は、指定された 仮想プレッシャーソース をある ソースタイプ で作成します。同じ ソースタイプobserve() を呼ぶと、該当する 仮想プレッシャーソース がそれらの裏側の プレッシャーソース として使用され、13.1.1.2 仮想プレッシャーソースを削除 が実行されるまでそのままになります。

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

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

  1. virtualPressureSourceTypeparameters から "type" プロパティを取得した結果とする。
  2. もし ユーザーエージェントsupported source typesvirtualPressureSourceType を含まない場合、WebDriver エラーコード invalid argument のエラーを返す。
  3. topLevelTraversable を現在のブラウジングコンテキストの トップレベルトラバーサブル とする。
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable仮想プレッシャーソースマッピング とする。
  5. もし topLevelVirtualPressureSourceMappingvirtualPressureSourceType を含んでいる場合、WebDriver エラーコード invalid argument のエラーを返す。
  6. supportedparameters から "supported" プロパティをデフォルト true で取得した結果とする。
  7. virtualPressureSource を新しい 仮想プレッシャーソース とする。
  8. virtualPressureSourcecan provide samplessupported に設定する。
  9. topLevelVirtualPressureSourceMapping[virtualPressureSourceType] を virtualPressureSource に設定する。
  10. 成功を示す応答(data null)を返す。
13.1.1.2 仮想プレッシャーソースを削除
HTTP メソッド URI テンプレート
DELETE /session/{session id}/pressuresource/{type}

この 拡張コマンド は指定された 仮想プレッシャーソース を削除します。つまり、利用可能であれば指定された ソースタイプ のデータは、非仮想の通常の手段で配信されるようになります。

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

  1. virtualPressureSourceTypeURL variables["type"] の値とする。
  2. もし ユーザーエージェントsupported source typesvirtualPressureSourceType を含まない場合、WebDriver エラーコード invalid argument のエラーを返す。
  3. topLevelTraversable を現在のブラウジングコンテキストのトップレベルトラバーサブルとする。
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable の仮想プレッシャーソースマッピングとする。
  5. pressureSourcetopLevelVirtualPressureSourceMapping[virtualPressureSourceType] とする。
  6. For each platformCollector of pressureSource's connected platform collectors:
    1. platformCollectorassociated pressure source を null に設定する。
  7. Remove topLevelVirtualPressureSourceMapping[virtualPressureSourceType].
  8. 成功を示す応答(data null)を返す。
13.1.1.3 仮想プレッシャーソースを更新
HTTP メソッド URI テンプレート
POST /session/{session id}/pressuresource/{type}

この 拡張コマンド は、新しい pressure source sample をプッシュすることで、仮想プレッシャーソース の状態を更新することを可能にします。

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

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

  1. virtualPressureSourceTypeURL variables["type"] の値とする。
  2. もし ユーザーエージェントsupported source typesvirtualPressureSourceType を含まない場合、WebDriver エラーコード invalid argument のエラーを返す。
  3. topLevelTraversable を現在のブラウジングコンテキストのトップレベルトラバーサブルとする。
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable の仮想プレッシャーソースマッピングとする。
  5. もし topLevelVirtualPressureSourceMappingvirtualPressureSource を含まない場合、エラーunsupported operation のエラーコードで返す。
  6. virtualPressureSourcetopLevelVirtualPressureSourceMapping[virtualPressureSourceType] とする。
  7. sampleparameters から "sample" プロパティを取得した結果とする。
  8. もし samplePressureState の型でない場合、WebDriver エラーコード invalid argument のエラーを返す。
  9. virtualPressureSourcelatest sample を、新しい pressure source sample に設定し、その data とし、timestampunsafe shared current time に設定する。
  10. 実装定義の方法で、virtualPressureSourcelatest samplevirtualPressureSourceconnected platform collectors に利用可能にする。
  11. 成功を示す応答(data null)を返す。

14.

この節は非規範的です。

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

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

    // We only want 20 samples.
    if (samples.length == 20) {
      observer.disconnect();
      return;
    }
  }
}

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

次の例では、プレッシャーがクリティカルになったときに同時に配信するビデオストリームの数を減らしたいと考えています。簡潔にするためにここではこの一つの状態のみを考慮します。

ストリーム数を減らしてもクリティカル状態から抜けられない、あるいはすぐには抜けられない可能性があるため、クリティカル状態が続いている間は30秒ごとに一度ずつストリームを一つずつ減らすという戦略を用います。

これを実現するために、コールバックが少なくとも30秒ごとに一度呼ばれるようにし、あるいは状態が実際に変化したときにも呼ばれるようにします。状態が変化したときにはインターバルタイマーをリセットします。

Example 3: CPU プレッシャーに基づいてビデオフィードの数を調整する方法
let timerId = -1;
function pressureChange(records) {
  // Clear timer every time we are called, either by an actual state change,
  // or when called by setTimeout (see below).
  if (timerId > 0) {
    clearTimeout(timerId);
  }

  // When entering critical state, we want to recheck every 30sec if we are
  // still in critical state and if so, further reduce our concurrent streams.
  // For this reason we create a timer for 30 seconds that will call us back
  // with the last result in there were no change.
  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() によってそれらは消去されて永遠に失われてしまいます。

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

Example 4: 切断直前までのすべての状態変化を処理する方法
function logWorkloadStatistics(records) {
  // do something with records.
}

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

// Read pending state change records, otherwise they will be cleared
// when we disconnect.
const records = observer.takeRecords();
logWorkloadStatistics(records);

observer.disconnect();

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

Example 5: 特定のソースの状態変化の監視をオブザーバに停止させる方法
const observer = new PressureObserver(records => { /* do something with records. */ });

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

// Callback now gets called whenever the pressure state changes for 'cpu' or 'gpu'.

observer.unobserve("gpu");

// Callback now only gets called whenever the pressure state changes for 'cpu'.

次の例では、disconnect() を呼び出して、オブザーバに任意の状態変化の監視を停止させる方法を示します。disconnect() を呼び出すと、これまでの observe() 呼び出しによって監視されていた全てのソースの監視を停止します。

さらに、最後のコールバックが呼ばれて以来収集された保留中の全てのレコードを消去します。

Example 6: 任意の状態変化の監視をオブザーバに停止させる方法
const observer = new PressureObserver(records => { // do something with records. });
observer.observe("cpu");
observer.observe("gpu");

// some time later...

observer.disconnect();

// records will be an empty array, because of the previous disconnect().
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 に感謝します。

Zoom のエンジニアリングチームの Amanda Zhao、Fidel Tian、Zhiliang Wang およびその他の方々には、フィードバックと実地の実験を通じて本 API を実世界のシナリオで改善するのに役立てていただき、特に感謝します。

B. 実質的な変更の概要

この節は非規範的です。

B.1 最初の公開作業草案(2022/12/20)以降の変更

B.2 インデックス

B.2.1 本仕様で定義された用語

B.2.2 参照で定義された用語

  • [DOM] は次を定義します:
    • Document インターフェース
    • ドキュメント
    • ノード
    • ノードドキュメント(Node 用)
  • [ECMASCRIPT] は次を定義します:
    • エージェント(ECMAScript 用)
    • globalThis 属性(globalThis 用)
  • [HR-TIME] は次を定義します:
    • DOMHighResTimeStamp
    • 相対高精度時間
    • unsafe current time(単調クロック用)
    • unsafe shared current time
  • [HTML] は次を定義します:
    • 使用が許可されている
    • 関連付けられたドキュメント
    • ブラウジングコンテキスト
    • 子ナビゲーブル
    • 閉じる(WorkerGlobalScope 用)
    • DedicatedWorkerGlobalScope インターフェース
    • fully active(Document 用)
    • グローバルオブジェクト
    • iframe 要素
    • 並列で(in parallel)
    • ナビゲーブル(Window 用)
    • ノードナビゲーブル
    • オリジン
    • オーナーセット(WorkerGlobalScope 用)
    • ポリシーコンテナ(WorkerGlobalScope 用)
    • グローバルタスクをキューに入れる
    • 再アクティブ化(ドキュメント用)
    • 関連するグローバルオブジェクト
    • 関連する設定オブジェクト
    • same origin(同一オリジン)
    • same site(同一サイト)
    • システムフォーカス(トップレベルトラバーサブル用)
    • タスクソース
    • time origin(環境設定オブジェクト用)
    • トップレベルブラウジングコンテキスト
    • トップレベルトラバーサブル
    • トップレベルトラバーサブル(ブラウジングコンテキスト用)
    • アンロード中のドキュメントクリーンアップ手順
    • Window インターフェース
    • WorkerGlobalScope インターフェース
  • [INFRA] は次を定義します:
    • Append(リスト用)
    • Append(セット用)
    • Assert
    • Clear(マップ用)
    • clone(リスト用)
    • contain(リスト用)
    • contains(マップ用)
    • continue(反復用)
    • empty(リスト用)
    • For each(リスト用)
    • For each(マップ用)
    • implementation-defined(実装定義)
    • item(リスト用)
    • items(構造体用)
    • keyed(マップ用)
    • list(リスト)
    • ordered map(順序付きマップ)
    • queue(キュー)
    • Remove(リスト用)
    • Remove(マップ用)
    • set(セット)
    • size(リスト用)
    • struct(構造体)
    • tuples(タプル)
    • union(セット用)
    • value(マップ用)
  • [MEDIACAPTURE-STREAMS] は次を定義します:
    • コンテキストがキャプチャ中である
  • [PERMISSIONS-POLICY] は次を定義します:
    • デフォルト許可リスト(ポリシー制御機能用)
    • ポリシー制御機能
  • [WEBDRIVER2] は次を定義します:
    • 現在のブラウジングコンテキスト
    • エラー
    • エラーコード
    • 拡張コマンド URI テンプレート
    • 拡張コマンド
    • プロパティの取得
    • デフォルト付きプロパティ取得
    • 無効な引数
    • リモートエンド手順
    • 成功
    • サポートされていない操作
  • [WEBIDL] は次を定義します:
    • 新しい Promise
    • とともに拒否された Promise
    • AbortError 例外
    • [Default] 拡張属性
    • デフォルトの toJSON 手順
    • [EnforceRange] 拡張属性
    • [Exposed] 拡張属性
    • FrozenArray インターフェース
    • getter 手順
    • コールバックの呼び出し
    • NotAllowedError 例外
    • NotSupportedError 例外
    • object
    • Promise インターフェース
    • Promise の解決・拒否後の処理
    • 拒否された
    • 解決された
    • [SameObject] 拡張属性
    • [SecureContext] 拡張属性
    • sequence(列)
    • 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. Living Standard. URL: https://dom.spec.whatwg.org/
[hr-time]
High Resolution Time. Yoav Weiss. W3C. 7 November 2024. W3C Working Draft. 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. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[mediacapture-streams]
Media Capture and Streams. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 24 April 2025. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[PERMISSIONS-POLICY]
Permissions Policy. Ian Clelland. W3C. 6 May 2025. W3C Working Draft. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBDRIVER2]
WebDriver. Simon Stewart; David Burns. W3C. 12 May 2025. W3C Working Draft. URL: https://www.w3.org/TR/webdriver2/
[WEBIDL]
Web IDL 標準. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

C.2 情報参照

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