画面キャプチャ

W3C ワーキングドラフト

この文書の詳細
この版:
https://www.w3.org/TR/2025/WD-screen-capture-20250717/
最新の公開版:
https://www.w3.org/TR/screen-capture/
最新の編集者草案:
https://w3c.github.io/mediacapture-screen-share/
履歴:
https://www.w3.org/standards/history/screen-capture/
コミット履歴
編集者:
Jan-Ivar Bruaroey (Mozilla)
Elad Alon (Google)
元編集者:
Martin Thomson (Mozilla)
Keith Griffin (Cisco)
Suhas Nandakumar (Cisco)
Henrik Boström (Google)
フィードバック:
GitHub w3c/mediacapture-screen-shareプルリクエスト, 新しい issue, オープンな issue
public-webrtc@w3.org 件名行 [screen-capture] … message topic …アーカイブ
参加
メーリングリスト

要旨

この文書は、ユーザーの表示、またはその一部を、 getDisplayMedia を使用してメディアストリームのソースとして利用する方法を定義します。これは Media Capture API の拡張です [GETUSERMEDIA].

この文書の状態

この節は、本書が公開された時点での状態を説明します。現在の W3C の出版物一覧および本技術報告書の最新版は、 W3C 標準・草案の索引で確認できます。

この文書は未完成です。大幅な変更が行われる可能性があり、初期の試験的利用は奨励されますが、実装を意図したものではありません。

この文書は Web Real-Time Communications Working Group により、 勧告トラック を用いてワーキングドラフトとして公開されました。

ワーキングドラフトとしての公開は、W3C およびそのメンバーによる支持を意味するものではありません。

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

この文書は、以下の W3C 特許ポリシー のもとで作成されました。 W3C は、当該グループの成果物に関連して行われた 特許開示の公開リスト を維持しています。 そのページには特許開示の手順も記載されています。個人が実際に「必須請求項(Essential Claim(s))」を含むと考える特許を知っている場合は、 W3C 特許ポリシーのセクション6 に従って情報を開示する必要があります。

この文書は 2023年11月03日付の W3C プロセス文書 によって運用されています。

1. 導入

この節は規範的ではありません。

この文書は、Media Capture API [GETUSERMEDIA] の拡張を説明しており、ユーザーの表示またはその一部をビデオトラックの形で取得できるようにします。場合によってはシステム、アプリケーション、もしくはウィンドウのオーディオもキャプチャされ、オーディオトラックの形で提供されます。これにより、WebRTC を用いた画面共有など多くのアプリケーションが可能になります [WEBRTC]。

この機能は重大なセキュリティ上の影響を持ちます。この API を使用してユーザーに表示されている情報へアクセスするアプリケーションは、アプリケーションの制御下にある場合、他のオリジンの機密情報にアクセスしてしまう可能性があります。これには、ユーザーエージェントのサンドボックスによる保護により通常はアクセス不能なコンテンツが含まれます。

この文書は主にビデオおよびオーディオのキャプチャに関する内容を扱います [GETUSERMEDIA]。しかしここで定義される一般的な仕組みは、現在定義されている depth [MEDIACAPTURE-DEPTH] のような他の種類のメディアへ拡張することもできます。

2. 適合性

非規範的と明記された節に加え、この仕様書のすべての作成ガイドライン、図、例、および注記は非規範的です。本仕様書のそれ以外のすべては規範的です。

本文書中のキーワード MAYMUSTMUST NOT、および SHOULD は、全て大文字で現れる場合に限り、BCP 14 に記載されているとおりに解釈されます [RFC2119] [RFC8174]。

この仕様は単一の製品に適用される適合基準を定義します:この仕様に含まれるインターフェイスを実装する user agent です。

本仕様で定義される API を実装するために ECMAScript [ECMA-262] を用いる実装は、Web IDL 仕様で定義される ECMAScript バインディングに従って実装する必要があります [WEBIDL]。本仕様はその仕様と用語を使用しています。

3.

次の例は、本文書で定義された navigator.mediaDevices.getDisplayMedia メソッドを使った表示キャプチャ要求を示します。

try {
  let mediaStream = await navigator.mediaDevices.getDisplayMedia({video:true});
  videoElement.srcObject = mediaStream;
} catch (e) {
  console.log('Unable to acquire screen capture: ' + e);
}

4. 用語

この文書は MediaStreamMediaStreamTrack および ConstrainablePattern の定義を [GETUSERMEDIA] から使用します。

画面キャプチャは、いくつかの異なる種類の画面ベースの表面のキャプチャを包含します。これらを総称して display surfaces と呼び、本書では次の型を定義します:

この文書は、各種の display surface の二つの変種を区別します:

一部のオペレーティングシステムでは、異なるアプリケーションのウィンドウが他のウィンドウを全部または一部で覆い隠すことが可能なため、visible display surfacelogical display surface の厳密な部分集合になります。

source pixel ratio は、display surface の垂直ピクセルサイズで割った 1/96 インチの値です。

The devicechange イベントは [GETUSERMEDIA] に定義されています。

5. 表示メディアのキャプチャ

表示されているメディアのキャプチャは、getDisplayMedia という新しいメソッドを MediaDevices インターフェイスに追加することで有効になります。これは getUserMedia() に類似していますが、呼び出されるたびにエンドユーザーが選択した単一の表示デバイスからメディアを取得する点が異なります。

5.1 MediaDevices の追加

WebIDLpartial interface MediaDevices {
  Promise<MediaStream> getDisplayMedia(optional DisplayMediaStreamOptions options = {});
};
getDisplayMedia

ユーザーに対して表示のライブキャプチャの許可を求めます。

ユーザーエージェントは、エンドユーザーが毎回利用可能な選択肢の中から共有する表示面を選べるようにしなければならず(MUST)、options.videooptions.audio に含まれるいかなる MediaTrackConstraints を用いてその選択を制限してはなりません(MUST NOT)。

ユーザーエージェントは、displaySurface 制約の存在およびその値を、ユーザーに提示するソースの表示に影響させることができます(MAY)。それでもユーザーエージェントは依然として任意の表示面を無制限に選択できるように提供しなければなりません(MUST)。ユーザーエージェントは、モニターの共有はリスクが高いためユーザーが選択しないよう促すことが強く推奨されます。

options.videooptions.audio に含まれるいかなる MediaTrackConstraints も、ユーザーが選択を行った後にのみユーザーが選択したメディアへ適用されなければなりません(MUST)。

音声に関しては、ユーザーエージェントはエンドユーザーに共有するオーディオソースを提示してもよい(MAY)ものとします。どの選択肢を提示するかはユーザーエージェント次第であり、提示される音声ソースが必ずしもビデオソースと同一であるとは限りません。オーディオソースは特定のウィンドウブラウザー、システム全体のオーディオ、あるいはそれらの組み合わせであり得ます。オーディオとビデオの両方を要求した場合でも、ユーザーエージェントはオーディオを返さないことが許されています。生涯にわたってオーディオが共有されないことが確実であるとユーザーエージェントが判断した場合、それは結果のストリームにオーディオトラックを含めてはなりません(MUST NOT)。ユーザーエージェントは、オーディオとビデオの要求に対してビデオトラックのみを返すか(MAY)、オーディオトラックとビデオトラックの両方を返すことができます(MAY)。ただし、オーディオのみの要求は拒否されなければなりません(MUST)。

getDisplayMedia は、異なるソース集合からメディアを取得しユーザー選択を要求する点に加え、getUserMedia() と異なり、"granted" の権限を永続化することはできません。

getDisplayMedia() が呼び出されると、ユーザーエージェントは次の手順を実行しなければなりません(MUST):

  1. mediaDevices をこの操作の this とします。

  2. controlleroptions.controller が存在すればそれに、存在しなければ null にします。

  3. もし controllernull でない場合、次の手順を実行します:

    1. もし controller.[[IsBound]]true であれば、reject された promise を、DOMException オブジェクト(そのname 属性が InvalidStateError の値を持つ)で返して終了します。

    2. controller.[[IsBound]]true に設定します。

  4. もしこの操作の relevant global objecttransient activation を持たない場合、reject された promise を、DOMException オブジェクト(そのname 属性が InvalidStateError の値を持つ)で返して終了します。

  5. このメソッドの第一引数を options とします。

  6. constraints[options.audio, options.video] とします。

  7. もし constraints.videofalse であれば、新たに作成された reject された promise を、作成された TypeError で返します。

  8. constraints の中で値 CS が辞書である既存の各メンバーについて、次の手順を実行します:

    1. もし CSadvanced というメンバーを含むなら、新たに作成された 作成された TypeError で拒否された promise を返します。

    2. もし CS が表示面に適用可能な制約可能プロパティを指定する名前のメンバーを含み、その値がさらに min または exact というメンバーを含む辞書であるなら、新たに作成された 作成された TypeError で拒否された promise を返します。

    3. もし CS が表示面に適用可能な制約可能プロパティを指定する名前のメンバーを含み、その値がさらに max というメンバーを含み、そのメンバーの値が制約可能プロパティの floor value 未満であるなら、failedConstraint をそのメンバー名とし、messageundefined か説明的な人間可読のメッセージのいずれかとし、OverconstrainedError(failedConstraint, message) によって作成された新しいエラーで拒否された promise を返します。

  9. requestedMediaTypes を、constraints のうち辞書値または true の値を持つメディア型の集合とします。

  10. もしこの操作の current settings objectrelevant global object に関連付けられた Document が完全にアクティブでない(fully active でない)か、フォーカスを持っていない(have focus でない)場合、reject された promise を、DOMException オブジェクト(そのname 属性が InvalidStateError の値を持つ)で返して終了します。

  11. p を新しい promise とします。

  12. 次の手順を並列で実行します:

    1. requestedMediaTypes の各メディア型 T について、

      1. もし型 T のソースが存在しない場合、ユーザーインタラクションタスクソースに対してタスクをキューし、p を新しい DOMException(そのname 属性が NotFoundError の値を持つ)で reject し、これらの手順を中止します。

      2. 現在の閲覧コンテキストで型 T のソースを取得するための権限状態を読み取ります。もし権限状態が "denied" であれば、下のラベル 許可失敗 にジャンプします。

    2. 任意で、例えば事前に確立されたユーザープリファレンス、セキュリティ上の理由、あるいはプラットフォームの制約に基づいて、下のラベル 許可失敗 にジャンプしてもよい。

    3. ユーザーに表示デバイスを選択させるよう 促し、その結果として提供されるメディアの集合を得ます。これは PermissionDescriptorname が "display-capture" に設定されたものとして扱います。

      提供されるメディアは正確に1つのビデオトラックを含まなければなりません(MUST)。

      提供されるメディアは最大で1つのオーディオトラックを含むことができます。このオーディオトラックは、requestedMediaTypes に音声が指定されていなかった場合、あるいはそれが false と指定されていた場合は含めてはなりません(MUST NOT)。

      選択されたデバイスはユーザーによって決定されたものでなければなりません(MUST)。一度選択されたら、ユーザーがユーザーエージェントとの相互作用を通じて許可しない限り、MediaStreamTrack のソースは変更してはなりません(MUST NOT)。

      ユーザーエージェントは、ブラウザーのウィンドウが可視であるブラウザー表示デバイスや、その他共有時に著しくリスクが高いと考えられるモニター表示デバイスの共有をユーザーに警告すること、またはそれらの選択を抑制しようとすることを推奨します。

      もし要求の結果が "granted" であれば、提供されたメディアのソースとなっている各デバイスについて、デバイスの安定かつプライベートな識別子である deviceId を用いて [[devicesLiveMap]][deviceId] を true に、もしまだ true でなければ [[devicesAccessibleMap]][deviceId] を true に設定します。

      ユーザーエージェントは "granted" の権限エントリを保存してはなりません(MUST NOT)。

      もし結果が "denied" であれば、下のラベル 許可失敗 にジャンプします。ユーザーが応答しない場合、このアルゴリズムはこのステップで停止します。

      ユーザーが許可したが、OS/プログラム/ウェブページのロック等のハードウェアエラーによりアクセスできない場合は、ユーザーインタラクションタスクソースにタスクをキューして p を新しい DOMException(そのname 属性が NotReadableError の値を持つ)で reject し、これらの手順を中止します。

      もし結果が "granted" であるにもかかわらず、上記以外の理由でデバイスアクセスが失敗した場合は、ユーザーインタラクションタスクソースにタスクをキューして p を新しい DOMException(そのname 属性が AbortError の値を持つ)で reject し、これらの手順を中止します。

    4. streamMediaStream オブジェクトとします。

    5. ユーザーが許可した各 source について、次の手順を実行します:

      1. tracksourcemediaDevices を用いて MediaStreamTrack を作成 した結果とします。

      2. trackstream のトラック集合に追加します。

      3. Tie track source to MediaDevicessourcemediaDevices で実行します。

    6. 適切な制約を用いて stream の全てのトラックに対して ApplyConstraints アルゴリズム を実行します。これが失敗した場合、失敗した結果を failedConstraint に、人間が読める説明を message にそれぞれ設定し、ユーザーインタラクションタスクソースにタスクをキューして pOverconstrainedError(failedConstraint, message) で拒否し、これらの手順を中止します。

    7. この getDisplayMedia() の呼び出しは、現在新しい キャプチャセッション を生成したものと見なされます。

    8. ユーザーインタラクションタスクソースにタスクをキューして、次の手順を実行します:

      1. もし controllernull でない場合、次の手順を実行します:

        1. controller.[[Source]]stream のビデオトラックの [[Source]] に設定します。

        2. controller.[[DisplaySurfaceType]] を、stream のビデオトラックの DisplayCaptureSurfaceType に設定します。

      2. last activation timestamp を現在の高解像度時刻に設定します。

      3. Resolve pstream で完了させます。

    9. もし controllernull でない場合、ユーザーインタラクションタスクソースにタスクをキューして controller に対して finalize focus decision algorithm を実行します。

    10. これらの手順を中止します。

    11. 許可失敗: ユーザーインタラクションタスクソースにタスクをキューして、p を新しい DOMException(そのname 属性が NotAllowedError の値を持つ)で reject します。

  13. p を返します。

トップレベルのドキュメントがフォーカスを失ったとき、そのドキュメント内およびネストされた閲覧コンテキストのドキュメントにあるすべての CaptureController オブジェクトに対して次の手順を実行します:

  1. もし [[Source]]undefined であれば、これらの手順を中止します。

  2. [[FocusChangeDisabled]]true に設定します。

ユーザーエージェントは、部分的に透明なキャプチャされた 表示面 の背後にあるコンテンツをキャプチャしてはなりません(MUST NOT)。

新しく作成された MediaStreamTrack について、ユーザーエージェントはプロンプトとしてユーザーに表示した内容をキャプチャしてはなりません(MUST NOT)。

現在スクリーンにレンダリングされていない情報は、アプリケーションが明示的にそのコンテンツへアクセスする許可を得ていない限り(例:昇格された権限 のような手段で)、キャプチャでは隠蔽されるべきです(SHOULD)。

ユーザーエージェントは、アクティブなユーザーの同意(例:active user consent)なしにオーディオを共有してはなりません(MUST NOT)。例えば、あるウィンドウのビデオをキャプチャする際にシステム全体のオーディオ(そのウィンドウに無関係なアプリケーションを含む)を同時にキャプチャするような場合が該当します。

5.2 クローズまたは最小化された表示面

共有されている 表示面 は、オペレーティングシステムやユーザーエージェントによる操作により、アプリケーションから一時的または永久にアクセスできなくなることがあります。どのような状態が 表示面 をアクセス不能とみなすかは本仕様の範囲外ですが、例としては MAY モニターが切断される、ウィンドウブラウザ が閉じられるまたは最小化される、あるいは電話の着信による場合などがあります。

注記

ユーザーエージェントは最終的にこの文脈で「アクセス不能」が何を意味するかを決定しますが、外部要因による中断に対してのみミュートおよびミュート解除イベントを発火することが推奨されます。

表示面が必ずしも永続的ではないアクセス不能状態に入ると、ユーザーエージェント MUST タスクをキューに登録 し、 ユーザー相互作用タスクソース 上で、その対応するメディアトラックのミュート状態を true に設定するように 操作します

表示面がアクセス不能状態を抜けて再びアクセス可能になると、ユーザーエージェント MUST タスクをキューに登録 し、 ユーザー相互作用タスクソース 上で、その対応するメディアトラックのミュート状態を false に設定するように 操作します

表示面が永続的なアクセス不能状態(例えばソースの ウィンドウ の閉鎖)の状態に入ると、ユーザーエージェント MUST タスクをキューに登録 し、 ユーザー相互作用タスクソース 上で、その対応するメディアトラックを 終了 させなければなりません。

直前に getDisplayMedia によって返されたストリームは、デフォルトでミュートされているトラックを含むことが MAY あります。 同じストリームに属するオーディオトラックとビデオトラックは、互いに独立してミュート/ミュート解除される MAY あります。

5.3 制約のない表示面の選択

ソース選択のための制約を受け付けないということは、getDisplayMedia が音声、映像、または音声と映像の表示ソースが存在するかどうかを公開するフィンガープリンティングの側面のみを提供することを意味します。 (これはフィンガープリンティングのベクトルです。)

displaySurface 制約を受け入れても、ユーザーの選択を制限するものではない点に注意してください。

5.4 キャプチャされた表示面に対する制約可能なプロパティ

制約は、getDisplayMedia においては、 getUserMedia() とは異なる目的を持ちます。 それらは探索を助けるものではなく、ユーザー選択の後にのみ適用されます。

このセクションは、getDisplayMedia のトラックに どの制約が適用されるかを定義します;ここに記載されていない getUserMedia() 用に定義された制約は適用されません。

これらの制約のいくつかは、ダウンスケーリングやフレーム間引きなどのユーザーエージェントによる処理や、表示固有の機能を可能にします。その他は、ユーザーが選択した display surface の固有の特性を、機能や設定として観測可能にします。

以下の新規および既存の MediaStreamTrackConstrainable Properties は、ユーザーが選択したビデオの display surface に適用され、以下の動作を持ちます:

Property Name Type Behavior
width unsigned long ピクセル単位の幅。能力として、max は MUSTdisplay surface の幅を反映し、min はユーザーエージェントによるダウンスケーリングで利用可能な最小のアスペクト比を保持した表現の幅を反映しなければなりません。
height unsigned long ピクセル単位の高さ。能力として、max は MUSTdisplay surface の高さを反映し、min はユーザーエージェントによるダウンスケーリングで利用可能な最小のアスペクト比を保持した表現の高さを反映しなければなりません。
frameRate double フレームレート(毎秒フレーム数)。能力として、max は MUSTdisplay surface のフレームレートを反映し、min はユーザーエージェントによるフレーム間引きで利用可能な最低フレームレートを反映しなければなりません。
aspectRatio double 正確なアスペクト比(ピクセル単位の幅を高さで割った値で、小数点第十位まで四捨五入した double)またはアスペクト比の範囲。設定としては width / height を表します。能力としては、min と max の両方が MUST で現在の設定値であり、このプロパティはアプリケーション側から見て変更不可能になります。
resizeMode DOMString この文字列は VideoResizeModeEnum のメンバーの一つです。設定として、"none" は MediaStreamTrack が表示を完全な詳細でレンダリングするために必要な全てのビットを含むことを意味します。もし source pixel ratio > 1 であれば、widthheight はエンドユーザーの見た目よりも大きくなります。一方で "crop-and-scale" は MediaStreamTrack がユーザーエージェントによってダウンスケールされた、ただしクロップされていないアスペクト比を保持した表示面の表現を含むことを意味します。能力として、値 "none" と "crop-and-scale" の両方が MUST で存在しなければなりません。
deviceId DOMString キャプチャされている表示面の識別子。

設定としては、キャプチャされている display surface を識別します。識別子は各 document ごとに一意に生成されなければなりません。

能力としては、設定値が単独の値であることが MUST であり、このプロパティはアプリケーション側から見て変更不可能になります。

displaySurface DOMString

この文字列は DisplayCaptureSurfaceType のメンバーの一つです。

設定としては、キャプチャされている display surface の種類を示します。

能力としては、設定値が単独の値であることが MUST であり、このプロパティはアプリケーション側から見て変更不可能になります。

制約としては、その値はアプリケーションが特定の display surface 種類をユーザーエージェントに好意的に示すことを意味します;ユーザーエージェントはその好みに従ってユーザーに提示するオプションの順序を並べ替えることを MAY あります。この制約は他の目的では無視され、したがって副作用(たとえば OverconstrainedError の原因になるなど)を引き起こすことはできません。

logicalSurface boolean 設定として、true の値は logical display surface のキャプチャを示し、false の値は visible display surface のキャプチャを示します。能力として、この同じ値が単独で存在することが MUST であり、このプロパティはアプリケーション側から見て変更不可能になります。
cursor DOMString この文字列は CursorCaptureConstraint のメンバーの一つです。設定としては、キャプチャされる display surface にカーソルが含まれるかおよびそのタイミングを示します。能力として、ユーザーエージェントはこの CursorCaptureConstraint の中から、この display surface でサポート可能な値だけを含めなければなりません。
screenPixelRatio double 設定として、これはページズームが 1.0、スケールファクターが 1.0 のときの CSS ピクセル のサイズを、ページズームスケールファクター を用いて表示面のピクセルの垂直サイズで割った結果です。これは制約や能力として使用することはできません。

以下の新規および既存の MediaStreamTrackConstrainable Properties は、ユーザーが選択したオーディオソースに適用され、以下の動作を持ちます:

Property Name Type Behavior
restrictOwnAudio boolean

設定として、この値はユーザーエージェントがソースに対して own audio restriction を適用しているかどうかを示します。

制約として、このプロパティを制約することで、own audio restriction を有効または無効にしたソースを得ることができます。

own audio restriction が適用されている場合、ユーザーエージェントは MUSTgetDisplayMedia を呼び出したドキュメントによって生成された音声をキャプチャ音声から除去しようと試みなければなりません。ユーザーエージェントが処理によって音声を除去できない場合は、そのドキュメントの音声をキャプチャ対象から除外することで音声を除去することを SHOULD します。これにより音声がまったくキャプチャされなくなる場合、ユーザーエージェントは再び音声をキャプチャできるようになるまでトラックをミュートしたままにしておくことが MUST です。

suppressLocalAudioPlayback boolean

設定として、この値はアプリケーションがユーザーエージェントに対してソースに local audio playback suppression を適用するよう指示したかどうかを示します。

制約として、この値はユーザーが browserdisplay surface のキャプチャを選択した場合にのみ意味を持ちます。その場合、true の値はユーザーエージェントがキャプチャされた browserdisplay surface に対して local audio playback suppression を行うことを SHOULD であることを示します。

local audio playback suppression が適用されている場合、ユーザーエージェントはローカルスピーカーへの音声の中継を停止することを SHOULD しますが、その音声は進行中のオーディオキャプチャの capture-sessions によっては引き続きキャプチャされなければなりません。この抑制はキャプチャされるドキュメントに対して観測可能であってはなりません。さらに、キャプチャしているドキュメントは自分が suppressLocalAudioPlayback を適用しているかどうかのみを観測でき、ユーザーエージェントでユーザーがこれを上書きしているかどうか(すなわち抑制が効果を持っているかどうか)は観測できません。

複数の同時キャプチャが同じ browserdisplay surface に対して行われている場合、local audio playback suppression は、少なくとも一つのアクティブなオーディオキャプチャの capture-sessionsuppressLocalAudioPlaybacktrue に制約している限り適用することを SHOULD あります。

ユーザーが選択した display surface の基になるソースの固有のプロパティが変化する場合(例えばエンドユーザーがキャプチャされたウィンドウのサイズを変更した場合)や、これらの変化が一つ以上の制約可能プロパティの能力や設定を古くさせる場合、ユーザーエージェントは MUST タスクをキューに登録 して ユーザー相互作用タスクソース 上で次の手順を実行する必要があります:

  1. 影響を受けるすべての制約可能プロパティを同時に更新します。

    これが「過度の制約(overconstrained)」状況を引き起こす場合、ユーザーエージェントはその過度に制約している制約を、その過度の制約が続く限り無視しなければなりません。ユーザーエージェントはトラックをミュートしてはなりません。

注記

min や exact の制約が getDisplayMedia() 上で TypeError を発生させる一方、この仕様は track.applyConstraints() メソッドを変更しません。したがって、それらは値によって OverconstrainedError を発生させるか成功するかのいずれかになり得て、この「過度の制約」状況を引き起こす可能性があります。max 制約も例えば aspectRatio のようにこれを引き起こす可能性があります。本仕様はこれらを有用でないエッジケースと見なします。

5.4.1 ダウンスケーリングとフレーム間引き

SelectSettings アルゴリズムの目的のために、ユーザーエージェントは元の display surface のアスペクト比を保持する(最も近いピクセル単位まで)すべてのダウンスケールされた寸法の組み合わせと、フレーム間引きによって利用可能なフレームレートを、利用可能な settings dictionaries として考慮することを SHOULD です。

制約によるダウンスケーリングと間引きの効果は、実質的に fitness distance アルゴリズムによって支配されます。

意図としては、ユーザーエージェントが ideal の width、ideal height、および/または ideal frameRate が指定されている場合に、それらに近い出力を生成しつつ、常に元の display surface のアスペクト比を保持することです。

ユーザーエージェントは、明示的な制約が適用されていない限り、デフォルトで source pixel ratio によってダウンスケールすることを SHOULD です。

ユーザーエージェントはキャプチャされた出力を切り抜いては MUST NOT です。

ユーザーエージェントは、集約された display surface における高解像度や高フレームレートを保持する必要がある場合を除き、キャプチャされた出力をアップスケールしたり追加のフレームを生成しては MUST NOT です。

注記

max 制約タイプは、web アプリケーションが width や height のような制約可能なプロパティに対する最大の境界を提供できるようにします。これは、エンドユーザーがキャプチャ中に windowbrowser の表面を極端にリサイズした場合の極端なアスペクト比を制限するのに役立ちます。

本仕様の正の数値型の各制約可能プロパティについて、ユーザーエージェントはソースに関わらずサポートされる最小許容値を表す floor value を確立しなければなりません。この値は一定であり MUSTMUST 0 より大きくなければなりません。ユーザーエージェントは、ソースに関係なく floor value より大きいすべての値をサポートすることが推奨されます。

注記

floor value の目的は、ユーザーが既にプロンプトされた後に getDisplayMedia()OverconstrainedError で失敗するのを回避し、ユーザーのシステムに関する情報漏洩を避ける手助けをすることです。

5.4.2 CaptureStartFocusBehavior

これは、アプリケーションが setFocusBehavior() を呼び出したときに、ユーザーエージェントが当該 display surface に関連付けられたその CaptureControllercapture-session にフォーカスするかどうかを記述します。

WebIDLenum CaptureStartFocusBehavior {
  "focus-capturing-application",
  "focus-captured-surface",
  "no-focus-change"
};
列挙の説明
focus-capturing-application アプリケーション自身がフォーカスされることを優先します。
focus-captured-surface この display surface に関連付けられたこの CaptureControllercapture-session がフォーカスされることをアプリケーションが希望していることを示します。
no-focus-change アプリケーションは、ユーザーエージェントがフォーカスを変更せず、ユーザーのエージェントやオペレーティングシステムとのやり取りの結果で最後にフォーカスを持っていた表面にフォーカスを残すことを希望します。
注記
ワーキンググループは "no-focus-change" を非推奨にする可能性を検討しています。

5.4.3 CaptureController

CaptureController オブジェクトは capture-session に関連付けられる場合があります。これは、getDisplayMedia() の呼び出しやその結果のストリームやトラックではなく、capture-session 自体に関連付けられた機能を公開するために使用されます。

任意の capture-session は、最多で1つの CaptureController に関連付けられます。

任意の CaptureController は、最多で1つの capture-session に関連付けられます。

WebIDL[Exposed=Window, SecureContext]
interface CaptureController : EventTarget {
  constructor();
  undefined setFocusBehavior(CaptureStartFocusBehavior focusBehavior);
};
(実現可能性のリスク) Issue 1

CaptureController はまだイベントハンドラーを定義していないため、EventTarget を継承する必要はありません。これは、将来的に CaptureController をイベントハンドラー属性で拡張する仕様のためのメリットです。継承が使用されていない場合、それを削除することができます。

constructor
新しい CaptureController オブジェクトを次の内部スロットで作成します:
内部スロット 初期値 説明 (非規範的)
[[IsBound]] false アプリケーションが thiscapture-session に関連付けようとしたかどうか。
[[Source]] null 関連付けられた capture-session のソース。
[[DisplaySurfaceType]] null キャプチャが開始された後、キャプチャされた display surface のタイプに設定されます。
[[FocusChangeDisabled]] false 外部イベントやユーザーエージェントの考慮により、フォーカス変更が無効化されたかどうか。
[[FocusDecisionFinalized]] false フォーカスの決定が確定されたときに true に設定されます。
[[FocusBehavior]] null アプリケーションによって希望されるフォーカス動作。

ユーザーエージェントは、自身のロジックに基づいて任意の時点で [[FocusChangeDisabled]]true に設定することを MAY です。

setFocusBehavior

次の手順を実行します:

  1. メソッドの最初の引数を focusBehavior とする。

  2. もし this.[[Source]]null である場合、this.[[FocusBehavior]]focusBehavior を設定し、これらのステップを中止する。

  3. もし this.[[Source]] が停止されていた場合、throw an "InvalidStateError" DOMException をスローする。

  4. もし this.[[DisplaySurfaceType]] が "browser" または "window" のいずれでもない場合、throw an "InvalidStateError" DOMException をスローする。

  5. もし this.[[FocusDecisionFinalized]]true である場合、throw an "InvalidStateError" DOMException をスローする。

  6. this.[[FocusBehavior]]focusBehavior を設定する。

  7. finalize focus decision algorithmthis に対して実行する。

finalize focus decision algorithm とは、与えられた controller に対して次の手順を実行することを指します:

  1. もし capture-session が開始されてから過度の時間が経過している場合、ユーザーエージェントは SHOULD [[FocusDecisionFinalized]]true に設定する。時間の範囲はユーザーエージェントに委ねられていますが、1秒の値を使用することが推奨されます。

  2. もし controller.[[FocusDecisionFinalized]]true の場合、これらのステップを中止する。

  3. controller.[[FocusDecisionFinalized]]true に設定する。

  4. もし controller.[[FocusChangeDisabled]]true の場合、これらのステップを中止する。

  5. もし controller.[[DisplaySurfaceType]] が "browser" または "window" のいずれでもない場合、これらのステップを中止する。

  6. controller.[[FocusBehavior]]focusBehavior とする。

  7. 次のステップを 並行して 実行する:

    1. もし focusBehavior が "focus-capturing-application" の場合、キャプチャ文書を表す display surface にフォーカスする。

    2. もし focusBehavior が "focus-captured-surface" の場合、 controller.[[Source]] によって参照される display surface にフォーカスする。

5.4.4 SelfCapturePreferenceEnum

アプリケーションが、自身が存在する display surface を、ユーザーに提示される選択肢に含めるべきかどうかについて提供できるさまざまなヒントを記述します。

WebIDLenum SelfCapturePreferenceEnum {
  "include",
  "exclude"
};
列挙値 説明
include アプリケーションは、表示面が提示される選択肢に含まれることを希望します。
exclude アプリケーションは、表示面が提示される選択肢から除外されることを希望します。

5.4.5 SystemAudioPreferenceEnum

アプリケーションが getDisplayMedia() を呼び出す際、monitor display surfaces に対して、ユーザーに提示されるオーディオソースにシステムオーディオを含めるかどうかを記述します。他の種類の display surface には適用されません。

WebIDLenum SystemAudioPreferenceEnum {
  "include",
  "exclude"
};
列挙の説明
include アプリケーションは、monitor display surfaces に対して、システムオーディオを共有するオプションがユーザーに提示されることを希望します。
exclude アプリケーションは、monitor display surfaces に対して、システムオーディオを共有するオプションがユーザーに提示されないことを希望します。

5.4.6 WindowAudioPreferenceEnum

アプリケーションが getDisplayMedia() を呼び出す際、window display surfaces に対して、ユーザーに提示されるオーディオソースにウィンドウまたはシステムオーディオを含めるかどうかを記述します。

WebIDLenum WindowAudioPreferenceEnum {
  "system",
  "window",
  "exclude"
};
列挙の説明
system アプリケーションは、window display surfaces に対して、システムオーディオを共有するオプションがユーザーに提示されることを希望します。
window アプリケーションは、window display surfaces に対して、ウィンドウオーディオを共有するオプションがユーザーに提示されることを希望します。
exclude アプリケーションは、window display surfaces に対して、オーディオを共有するオプションがユーザーに提示されないことを希望します。

5.4.7 SurfaceSwitchingPreferenceEnum

アプリケーションが getDisplayMedia() を呼び出す際、キャプチャ中にソースの display surface を動的に切り替えるオプションをユーザーに提供するかどうかを記述します。

WebIDLenum SurfaceSwitchingPreferenceEnum {
  "include",
  "exclude"
};
列挙の説明
include アプリケーションは、キャプチャ中にソースの display surface を動的に切り替えるオプションがユーザーに提示されることを希望します。
exclude アプリケーションは、キャプチャ中にソースの display surface を動的に切り替えるオプションがユーザーに提示されないことを希望します。

5.4.8 MonitorTypeSurfacesEnum

アプリケーションが、ユーザーエージェントに対して、その種類が monitor である display surfaces をユーザーに選択肢として提示するオプションを提供することを希望するかどうかを記述します。

WebIDLenum MonitorTypeSurfacesEnum {
  "include",
  "exclude"
};
列挙の説明
include アプリケーションは、ユーザーに提示される display surfaces に、種類が monitor のものが含まれることを希望します。
exclude アプリケーションは、ユーザーに提示される display surfaces に、種類が monitor のものが含まれないことを希望します。

5.4.9 DisplayMediaStreamOptions

DisplayMediaStreamOptions 辞書は、ユーザーエージェントに対して、MediaStreamTrack を含める方法を指定します。 MediaStream によって返される getDisplayMedia

WebIDLdictionary DisplayMediaStreamOptions {
  (boolean or MediaTrackConstraints) video = true;
  (boolean or MediaTrackConstraints) audio = false;
  CaptureController controller;
  SelfCapturePreferenceEnum selfBrowserSurface;
  SystemAudioPreferenceEnum systemAudio;
  WindowAudioPreferenceEnum windowAudio;
  SurfaceSwitchingPreferenceEnum surfaceSwitching;
  MonitorTypeSurfacesEnum monitorTypeSurfaces;
};
辞書 DisplayMediaStreamOptions メンバー
video(boolean or MediaTrackConstraints), デフォルト値は true

true の場合、返される MediaStream にビデオトラックを含むようにリクエストします。Constraints 構造体が提供されている場合、ユーザーが選択した表示面のビデオトラック表現に適用される必要な処理オプションをさらに指定します。false の場合、リクエストは 拒否 され、TypeError として、getDisplayMedia アルゴリズム に従いエラーになります。

audio(boolean or MediaTrackConstraints), デフォルト値は false

true の場合、返される MediaStream にオーディオトラックが含まれることを示します(サポートされている場合)。Constraints 構造体が提供されている場合、オーディオトラックに適用される必要な処理オプションをさらに指定します。false の場合、MediaStream にオーディオトラックは含まれません。

controllerCaptureController

存在する場合、この CaptureController オブジェクトは capture-session に関連付けられます。このオブジェクトで公開されるメソッドを通じて、capture-session を操作できます。

selfBrowserSurfaceSelfCapturePreferenceEnum
存在する場合、ブラウザ表示面 がユーザーに提示される選択肢に含まれるべきかどうかについて、アプリケーションの希望を示します。ユーザーエージェントはこのヒントを無視することが MAY あります。
systemAudioSystemAudioPreferenceEnum
存在する場合、選択肢に対してシステムオーディオを含めるべきかどうか、アプリケーションの意図を示します。ユーザーエージェントはこのヒントを無視することが MAY あります。
windowAudioWindowAudioPreferenceEnum
存在する場合、ウィンドウまたはシステムオーディオを選択肢に含めるべきかどうか、アプリケーションの意図を示します。ユーザーエージェントはこのヒントを無視することが MAY あります。
surfaceSwitchingSurfaceSwitchingPreferenceEnum
存在する場合、キャプチャされた表示面を動的に切り替えるオプションを提供するべきかどうか、アプリケーションの意図を示します。ユーザーエージェントはこのヒントを無視することが MAY あります。
monitorTypeSurfacesMonitorTypeSurfacesEnum

存在する場合、モニター型の表示面を選択肢に含めるべきかどうか、アプリケーションの意図を示します。ユーザーエージェントはこのヒントを無視することが MAY あります。

注記

ユーザーエージェントは、モニター型の表示面を選択肢に含めるオプションをユーザーに提示することが依然として可能です。そのため、アプリケーションは受け取ったトラックの displaySurface 設定を確認することが推奨されます。

MediaTrackSupportedConstraints は、ユーザーエージェントが認識する制約リストでここで拡張されます。

WebIDLpartial dictionary MediaTrackSupportedConstraints {
  boolean displaySurface = true;
  boolean logicalSurface = true;
  boolean cursor = true;
  boolean restrictOwnAudio = true;
  boolean suppressLocalAudioPlayback = true;
};
displaySurfaceboolean, デフォルト値は true

displaySurface 制約が認識されるかどうか。

logicalSurfaceboolean, デフォルト値は true

logicalSurface 制約が認識されるかどうか。

cursorboolean, デフォルト値は true

cursor 制約が認識されるかどうか。

restrictOwnAudioboolean, デフォルト値は true

restrictOwnAudio 制約が認識されるかどうか。

suppressLocalAudioPlaybackboolean, デフォルト値は true

suppressLocalAudioPlayback 制約が認識されるかどうか。

5.4.11 MediaTrackConstraintSet の拡張

MediaTrackConstraintSet は、制約の現在の状態を読み取るために使用されます。

WebIDLpartial dictionary MediaTrackConstraintSet {
  ConstrainDOMString displaySurface;
  ConstrainBoolean logicalSurface;
  ConstrainDOMString cursor;
  ConstrainBoolean restrictOwnAudio;
  ConstrainBoolean suppressLocalAudioPlayback;
};
displaySurfaceConstrainDOMString

キャプチャされている 表示面 のタイプ。これは DisplayCaptureSurfaceType 列挙から値を取得します。

logicalSurfaceConstrainBoolean

true の値は、論理表示面 のキャプチャを示し、false の値は 可視表示面 のキャプチャを示します。

cursorConstrainDOMString

CursorCaptureConstraint 列挙から値を取得し、キャプチャされた表示面にカーソルを含めるか及びそのタイミングを決定します。

restrictOwnAudioConstrainBoolean

この制約はオーディオトラックにのみ適用されます。詳細は restrictOwnAudio を参照してください。

suppressLocalAudioPlaybackConstrainBoolean

この制約はオーディオトラックにのみ適用されます。詳細は suppressLocalAudioPlayback を参照してください。

5.4.12 MediaTrackSettings の拡張

getSettings() メソッドがビデオストリームトラックで呼び出された場合、ユーザーエージェントは基盤となるユーザーエージェントの現在の状態を表す拡張された MediaTrackSettings 辞書を返さなければなりません。

WebIDLpartial dictionary MediaTrackSettings {
  DOMString displaySurface;
  boolean logicalSurface;
  DOMString cursor;
  boolean restrictOwnAudio;
  boolean suppressLocalAudioPlayback;
  double screenPixelRatio;
};
displaySurfaceDOMString

キャプチャされている 表示面 のタイプ。これは DisplayCaptureSurfaceType 列挙から値を取得します。

logicalSurfaceboolean

true の値は 論理表示面 のキャプチャを示し、false の値は 可視表示面 のキャプチャを示します。

cursorDOMString

CursorCaptureConstraint 列挙から値を取得し、キャプチャされた表示面にカーソルを含めるか及びそのタイミングを決定します。

restrictOwnAudioboolean

restrictOwnAudio 制約が適用されているか (true)、されていないか (false) を示します。

suppressLocalAudioPlaybackboolean

アプリケーションがソースに対して ローカルオーディオ再生抑制 を適用するようユーザーエージェントに指示したかどうかを示します。

screenPixelRatiodouble

キャプチャされている 表示面 の画素比。

5.4.13 MediaTrackCapabilities の拡張

getCapabilities() メソッドがビデオストリームトラックで呼び出された場合、ユーザーエージェントは基盤となるユーザーエージェントの機能を表す拡張された MediaTrackCapabilities 辞書を返さなければなりません。

WebIDLpartial dictionary MediaTrackCapabilities {
  DOMString displaySurface;
  boolean logicalSurface;
  sequence<DOMString> cursor;
};
displaySurfaceDOMString

MUSTgetSettings() によって返される値と同じでなければならず、アプリケーションの観点からこのプロパティは変更不可能です。

logicalSurfaceboolean

MUSTgetSettings() によって返される値と同じでなければならず、アプリケーションの観点からこのプロパティは変更不可能です。

cursor 型 sequence<DOMString>

MUST は、ユーザーエージェントがこのトラックのためにサポート可能な CursorCaptureConstraint からの値の正確なセットで構成されなければなりません。

5.4.14 DisplayCaptureSurfaceType

DisplayCaptureSurfaceType 列挙は、異なる種類の表示面を記述します。

WebIDLenum DisplayCaptureSurfaceType {
  "monitor",
  "window",
  "browser"
};
列挙値 説明
monitor モニター表示面、物理的表示、または物理的表示の集合
window ウィンドウ表示面、または単一のアプリケーションウィンドウ
browser ブラウザ表示面、または単一のブラウザウィンドウ

5.4.15 CursorCaptureConstraint

CursorCaptureConstraint 列挙は、カーソルがキャプチャされる条件を列挙します。

WebIDLenum CursorCaptureConstraint {
  "never",
  "always",
  "motion"
};
列挙値 説明
never "never" カーソルキャプチャ制約は、キャプチャされた表示面からカーソルを省略します。
always "always" カーソルキャプチャ制約は、キャプチャされた表示面にカーソルを含めます。
motion "motion" カーソルキャプチャ制約は、カーソル/ポインターが移動したときにキャプチャされた表示面にカーソルを含めます。ポインター/カーソルの移動が一定時間(ユーザーエージェント によって決定される)停止すると、キャプチャされたカーソルは削除されます。

5.5 デバイス識別子

キャプチャの潜在的なソースは、このAPIによって個別のメディアソースとして扱われます。しかし、表示キャプチャソースは、ホストシステムに関する過剰な情報を明らかにするため、enumerateDevices() によって列挙されてはなりません

したがって、表示キャプチャソースは、その deviceId が公開されていないため、deviceId 制約を使用して選択することはできません。

注記

これは、プライバシーインジケーターを実装するアルゴリズムで使用される同名の安定かつプライベートなIDと混同しないでください。

6. 権限の統合

画面キャプチャ は、強力な機能 として識別され、"display-capture" という名前で識別され、使用するには明示的な許可が必要です。

Permissions仕様との統合に必要なように、 本仕様は次の事項を定義します:

権限状態制約
この記述子の権限状態に対する有効な値は "prompt" と "denied" です。ユーザー エージェントは、この記述子の権限状態を "granted" に設定してはなりません

7. 権限ポリシーの統合

本仕様は、文字列"display-capture" で識別されるポリシー制御機能を定義します。その デフォルト許可リスト"self" です。

注記

ドキュメント権限ポリシーは、そのドキュメント内のコンテンツがgetDisplayMediaを使用することを許可されているかどうかを決定します。どのドキュメント内であっても無効化されている場合、そのドキュメント内のコンテンツは使用を許可されません getDisplayMedia。これはユーザーに選択を促すアルゴリズムによって強制されます。

8. プライバシーインジケーター要件

本仕様は、プライバシーインジケーター要件を拡張し、getUserMedia() に加え getDisplayMedia を含めます。

本仕様での[[devicesLiveMap]]、[[devicesAccessibleMap]]、および[[kindsAccessibleMap]]への参照は、getUserMedia()のプライバシーインジケーター要件をサポートするために既に作成された定義を指します。

getDisplayMedia が公開する各kindのデバイスについて、デバイスの安定したプライベートID deviceId を使用し、kind"Display" + kind に設定し、以下を実行します:

次に、上記の新しい定義に基づいて、ユーザーエージェントに対する要件は、プライバシーインジケーター要件において指定されたものと同じです。getUserMedia()

注記

単一の権限記述子がgetDisplayMediaに対して存在するにもかかわらず、上記の定義は種類によって区別し、ユーザーエージェントがエンドユーザーにどの種類の表示ソースが共有されているのかを示すプライバシーインジケーターを実装できるようにします。

注記

本仕様は、ユーザーエージェントが"granted" 権限を永続的に保存することを禁じているため、「Live」インジケーターのみが重要です。

ユーザーエージェントは、getDisplayMedia から利用可能なソースのセットの変更に基づいて、devicechange イベントを発生させてはなりません

9. セキュリティと権限

このセクションは情報提供のためのものであり、ここに含まれるアドバイスに従わない場合、プラットフォームセキュリティに重大なリスクをもたらすことを指摘しています。

表示されるコンテンツのキャプチャによって引き起こされるユーザープライバシーとセキュリティへのリスクは二重です。即座に明らかなリスクは、ユーザーが意図せずに共有するつもりのなかったコンテンツを共有してしまうこと、または共有されることに気付いていなかったことです。

表示キャプチャは、ブラウザのサンドボックスが提供するクロスサイトリクエストフォージェリ保護に対するあまり明確でないリスクを提示します。アプリケーションが直接的にはアクセスできない情報を間接的にでも制御可能な表示やキャプチャが許可されると、そのアプリケーションが本来アクセスできない情報にアクセスできる可能性があります。例えば、Canvas APIは、オリジンがクリーンではない場合、キャンバスのサンプリングやアクセス可能な形式への変換を許可しません[2DCONTEXT]。

この問題は[RTCWEB-SECURITY-ARCH]および[RTCWEB-SECURITY]で詳細に議論されています。

特にアプリケーションによって何らかの形で制御されているブラウザウィンドウを含む表示キャプチャは、これらの基本的なセキュリティ保護の違反リスクを伴います。このリスクはブラウザウィンドウに限定されるものではなく、オペレーティングシステムに依存するブラウザアプリケーションと他のアプリケーション間の制御チャネルにも影響を及ぼします。重要な考慮事項は、キャプチャされた表示面が、結果として得られるメディアを受け取るアプリケーションには本来秘匿されるべき情報を何らかの方法で表示する可能性があるかどうかです。

9.1 論理的または可視的な表示面のキャプチャ

論理的表示面のキャプチャは、ユーザーが意識していないコンテンツが共有される可能性を引き起こします。論理的表示面は、ユーザーが公開する意図がなかった情報をレンダリングする可能性があります。この情報が目に見える場合にはより容易に認識できます。このような手段は機械に対しては効果が薄いですが、人間の受信者は一瞬だけ表示されるコンテンツを処理する能力が低いです。

現在画面にレンダリングされていない情報は、昇格された権限を通じてそのコンテンツにアクセスすることが明示的に許可されていない限り、キャプチャで隠されるよう推奨されます。

論理的表示面の隠された領域がどのようにして可視的表示面のキャプチャを生成するかは、異なる場合があります。プレゼンテーションソフトウェアのようなアプリケーションは、隠された部分が隠される前に表示されていた画像をレンダリングすることで利益を得る可能性があります。画像を固定すると、変化するコンテンツに視覚的なアーティファクトを引き起こすか、コンテンツが隠されていることを隠す可能性があります。キャプチャの固定部分はバグと誤解されることがあります。代わりに、隠された領域は灰色やハッチングなどで隠されていることを示すコンテンツに置き換えられる場合があります。

一部のシステムでは、論理的表示面のみをキャプチャする場合があります。小さな画面を持つデバイスなどは、通常ウィンドウの概念を持たず、全画面モードでのみアプリケーションをレンダリングします。これらのシステムは、現在表示されていないアプリケーションのキャプチャを提供する可能性がありますが、論理的表示面をキャプチャしないと使用できない場合があります。

ウィンドウやその他の表示面をキャプチャする際に、部分的に透明な場合、その背後にあるコンテンツはキャプチャされません。

ユーザープロンプトが新しく作成されたMediaStreamTrackによって短時間ウェブページに公開されるリスクがあります。例えば、ユーザーがユーザープロンプトが表示されている画面を選択した場合です。ユーザープロンプトが選択可能なさまざまな表示面のプレビューを表示する場合、これらのプレビューは新しく作成されたMediaStreamTrackによってキャプチャされません。

9.1.1 オーディオのキャプチャ

getDisplayMediaは、ビデオと一緒にオーディオをキャプチャすることを許可しますが、これはプライバシーとセキュリティの懸念を引き起こします。これは、システムアプリケーションに関する追加情報を露出する可能性があり、共有されるオーディオソースのセットが必ずしも共有されるビデオソースのセットと同じではないためです。例えば、ウィンドウのビデオのキャプチャに全システムのオーディオ(そのウィンドウに関連しないアプリケーションを含む)が付随する場合、アクティブなユーザーの同意なしでは共有されません。ユーザーが共有する内容、特に可能なオーディオについて認識していることが重要です。ユーザーがビデオには同意するがオーディオには同意しないことができるようにすることが強く推奨されます。これにより、ビデオ専用のストリームが生成されます。これにより、オーディオのリクエストが常にオプションとなり、ビデオ専用のリクエストと比較してユーザーの選択肢が制限されることがありません。

9.2 ディスプレイキャプチャの許可

この文書は、ユーザーの同意を確認するために使用されるメカニズムに追加の制限を設けることを推奨します。これらの制限は、APIがもたらすセキュリティおよびプライバシーリスクを軽減することを目的としています。

2つの同意の形式が説明されています:アクティブなユーザーの同意と、さまざまな昇格された権限です。これらは規範的ではなく、推奨事項のみです。

9.2.2 昇格された権限

昇格された権限を必要とすることを強く推奨します。これにより、コンテンツのクロスオリジン保護を回避するために使用される可能性のある表示面へのアクセスが制限されます。この同意プロセスの主な目標は、ユーザーがコンテンツを共有する意図を示すだけでなく、アクセスを許可されるアプリケーションに対する信頼の向上を確認することです。

いくつかの異なるコントロールが昇格された権限を付与するために提供される可能性があります。このセクションでは、独立して付与できるいくつかの異なる能力を説明します。ユーザーエージェントは、昇格された権限を必要とする能力へのアクセスを禁止することを選択する場合があります。

これらの表示面へのアクセスがサポートされている場合、昇格された権限を取得するためのメカニズムが単純なユーザー同意プロンプトにのみ依存しないことを強く推奨します。いかなるアクションも、アプリケーションに昇格された権限を付与する決定が意図的であることを保証する必要があります。たとえば、ユーザーエージェントは、昇格された権限が付与されることを示すためにソフトウェアインストールに相当するプロセスを要求する場合があります。

昇格された権限の体験は、ユーザーエージェントがこの機能を有効にすることに関連するリスクを伝えるか、少なくともアプリケーションに対する信頼の向上の必要性を伝えることを可能にする場合があります。

ただし、昇格された権限アクティブなユーザーの同意の代替ではありません。ユーザーエージェントが、昇格された権限を持つアプリケーションであっても、共有する内容を選択する機能を引き続きユーザーに提供することを推奨します。

9.2.3 昇格された権限に依存する能力

昇格された権限は、モニターまたはブラウザ表示面のキャプチャへのアクセスの前提条件として推奨されます。完全なモニターのキャプチャが含まれるのは、これにユーザーエージェントのウィンドウが含まれる可能性があるためです。

同様に、昇格された権限は、通常提供されない場合の論理的表示面へのアクセスの前提条件として推奨されます。

昇格された権限がオリジンに付与された場合、それを永続化することを推奨します。昇格された権限プロセスは部分的にその新規性に依存しており、それがユーザーの意図を正確に捉えていることを保証します。

9.3 キャプチャ中のフィードバックとインターフェース

実装では、[GETUSERMEDIA]で推奨されているように、カメラやマイクを共有する際にユーザーに提供されるものと同様のフィードバックとコントロール機構を提供することが推奨されます。

コンテンツがアクティブにキャプチャされているとき、ユーザーがコンテンツが共有されていることを認識することが重要です。ユーザーエージェントは、コンテンツがキャプチャされている間、目立つインジケーターを表示することが推奨されます。インジケーターに加えて、ユーザーエージェントが、正確に何が共有されているかを確認する手段を提供することが推奨されます。この機能は、キャプチャされたコンテンツをレンダリングすることでアプリケーションが簡単に提供できるものですが、ユーザーが共有されている内容を正確に評価することを可能にします。

フィードバック機構に加えて、ユーザーがアクティブなキャプチャを停止する手段を提供することが推奨されます。

A. 参考文献

A.1 規範的参考文献

[2DCONTEXT]
HTML Canvas 2D Context. Rik Cabanier; Jatinder Mann; Jay Munro; Tom Wiltzius; Ian Hickson. W3C. 2021年1月28日. W3C勧告. URL: https://www.w3.org/TR/2dcontext/
[css-values]
CSS Values and Units Module Level 3. Tab Atkins Jr.; Elika Etemad. W3C. 2024年3月22日. CRD. URL: https://www.w3.org/TR/css-values-3/
[dom]
DOM Standard. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[GETUSERMEDIA]
Media Capture and Streams. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2025年6月24日. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[hr-time]
High Resolution Time. Yoav Weiss. W3C. 2024年11月7日. W3C作業草案. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[Permissions]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2025年6月24日. W3C作業草案. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2025年5月6日. W3C作業草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997年3月. 最良現行規範. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017年5月. 最良現行規範. URL: https://www.rfc-editor.org/rfc/rfc8174
[RTCWEB-SECURITY]
Security Considerations for WebRTC. E. Rescorla. IETF. 2021年1月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8826
[RTCWEB-SECURITY-ARCH]
WebRTC Security Architecture. E. Rescorla. IETF. 2021年1月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8827
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

A.2 参考情報

[MEDIACAPTURE-DEPTH]
Media Capture Depth Stream Extensions. Anssi Kostiainen; Ningxin Hu; Rijubrata Bhaumik; Rob Manson. W3C. 2022年2月1日. W3C作業草案. URL: https://www.w3.org/TR/mediacapture-depth/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 2025年3月13日. W3C勧告. URL: https://www.w3.org/TR/webrtc/