Copyright © 2021-2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この文書は、Screen Capture API [screen-capture] の拡張である
getViewportMedia を使用して、ブラウザーのビューポートをメディアストリームのソースとして使用する方法を定義します。
この節では、公開時点におけるこの 文書の位置付けについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新リビジョンは、 https://www.w3.org/TR/ にある W3C 技術 報告書インデックスで確認できます。
この文書は完成していません。
この文書は、Web Real-Time Communications Working Group によって、 Recommendation トラックを使用する 作業草案として公開されました。
作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を進行中の作業以外のものとして引用することは不適切です。
この文書は、 W3C Patent Policy の下で運営されるグループによって作成されました。 W3C は、当該グループの成果物に関連して行われた 特許開示の公開リスト を維持しています。そのページには、 特許を開示するための手順も含まれています。ある個人が、 Essential Claim(s) を含むと当該個人が考える特許について実際の知識を有している場合、その個人は W3C Patent Policy 第6節に従って その情報を開示しなければなりません。
この文書は、 2023年11月03日 W3C Process Document によって規定されます。
この節は非規範的です。
この文書は、Screen Capture API [screen-capture] の拡張について説明します。この拡張は、 ブラウザーのビューポート(現在のタブ)を動画トラックの形式で取得できるようにします。場合によっては、タブの音声も 音声トラックの形式でキャプチャされます。これにより、進行中の WebRTC [WEBRTC] ビデオ会議を録画する、またはビデオ会議中のユーザーがプレゼンテーションを ピッカーで探す必要なく、 代わりにプレゼンテーションアプリケーション内のボタンをクリックして共有する、といったユースケースが可能になります。
この機能は、「cross-origin isolated」な文書でのみ利用できます。これにより、アプリケーションがこの API を使用して他のオリジンからの潜在的に機密性の高い情報や、ユーザーエージェントのサンドボックスが提供する保護によって アクセス不能なままであるべきコンテンツへアクセスすることを防ぎます。
この機能にはセキュリティ上の影響があり、許可プロンプトが必要です。レンダリングされたビューポートを共有すると、 閲覧履歴(リンクの紫色表示を通じて)、住所や 支払い情報のような個人情報(フォームの自動入力のようなユーザーエージェントまたは Web 拡張機能を通じて)、または個人設定 (フォントサイズなど) といったユーザー情報が露出する可能性があります。
非規範的とマークされた節に加えて、この仕様に含まれるすべての作成ガイドライン、図、例、および注記は非規範的です。 この仕様におけるそれ以外のすべては規範的です。
この文書におけるキーワード MAY、MUST、および MUST NOT は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているように解釈されます。
この仕様は、単一の製品、すなわちこの仕様に含まれるインターフェイスを実装する ユーザー エージェントに適用される適合基準を定義します。
この仕様で定義される API を実装するために ECMAScript [ECMA-262] を使用する実装は、 Web IDL 仕様 [WEBIDL] で定義される ECMAScript Bindings と整合する方法で、 それらを実装しなければなりません。これは、この仕様がその仕様および 用語を使用しているためです。
次の例は、この文書で定義される
navigator.mediaDevices.getViewportMedia メソッドを使用してビューポートキャプチャを要求する方法を示しています。
try {
const stream = await navigator.mediaDevices.getViewportMedia();
videoElement.srcObject = stream;
} catch (e) {
console.log('Unable to acquire viewport capture: ' + e);
}
この文書は、[GETUSERMEDIA] からの
MediaStream、MediaStreamTrack、
MediaStreamConstraints
および
ConstrainablePattern
の定義、ならびに
[screen-capture] からの
display surface
および browser display surface
の定義を使用します。
ビューポートのキャプチャは、
getViewportMedia メソッドを
MediaDevices インターフェイスに新たに追加することによって可能になります。このメソッドは
getDisplayMedia()
に似ていますが、
ピッカーをユーザーに提示する代わりに許可プロンプトを使用して、最上位文書のビューポート(現在のタブ)のみを
キャプチャします。セキュリティ上の理由により、document-policy でオプトインした
「cross-origin isolated」な文書からのみ動作します。
WebIDLpartial interface MediaDevices {
Promise<MediaStream> getViewportMedia(
optional DisplayMediaStreamOptions options = {});
};
getViewportMedia
ビューポート(現在のタブ)をライブキャプチャする許可をユーザーに求めます。
ユーザーエージェントは、許可が 与えられた後に、指定された任意の options を生成されるメディアに MUST 適用します。
音声の場合、ユーザーエージェントは、利用可能であれば、現在のビューポートからの音声をキャプチャに含める
オプションをエンドユーザーに提示しても MAY かまいません。音声+動画に関して
getDisplayMedia()
と同様に、
ユーザーエージェントは、音声制約が存在する場合でも音声を返さないことが許されています。
ユーザーエージェントがストリームの存続期間中に音声が共有されないことを知っている場合、結果のストリームに
音声トラックを含めては MUST NOT なりません。ユーザーエージェントは、結果のストリームに動画トラックのみを返すことで
音声および動画の要求を受け入れても MAY かまいませんし、音声トラックと動画
トラックの両方を結果のストリームに返すことで要求を受け入れても MAY かまいません。
ユーザーエージェントは、音声のみの要求を拒否しなければ MUST なりません。
getDisplayMedia()
と同様に、
「granted」
許可は永続化できません。
getViewportMedia()
メソッドが呼び出されたとき、ユーザーエージェントは次の
手順を実行しなければ MUST なりません。
current
settings object の cross-origin
isolated capability が false の場合、
rejected された
promise を返します。その promise は、
DOMException
オブジェクトで拒否され、その
name
属性の値は SecurityError
です。
relevant
global object の associated
Document の top-level
browsing context の
required document policy
が Require-Document-Policy: viewport-capture および
Document-Policy: viewport-capture
を含まない場合(TODO: 正しいアルゴリズムを使用する)、
rejected された
promise を返します。その promise は、
DOMException
オブジェクトで拒否され、その
name
属性の値は SecurityError
です。
relevant
global object of this が transient
activation を持たない場合、promise を
rejected して返します。その
promise は、
DOMException
オブジェクトで拒否され、その name
属性の値は
InvalidStateError
です。
options をメソッドの最初の引数とします。
options.video が false の場合、新しく
created された TypeError
で rejected された promise を返します。
options 内の値 CS が辞書である各 existing メンバーについて、 次の手順を実行します。
CS が advanced という名前のメンバーを含む場合、新しく created された
TypeError
で
rejected された promise
を返します。
CS が、
display
surface に適用可能な制約可能プロパティを指定する名前のメンバーを含み、
さらにその値が
min または
exact という名前のメンバーを含む辞書である場合、新しく created された
TypeError
で
promise を rejected して返します。
CS が、
display
surface に適用可能な制約可能プロパティを指定する名前のメンバーを含み、
さらにその値が max という名前のメンバーを含む辞書であり、そのメンバーの値が
その制約可能プロパティの floor
value
より小さい場合、
failedConstraint をそのメンバー名とし、
message を
undefined または情報提供用の人間可読メッセージのいずれかとし、新しい
OverconstrainedError を
OverconstrainedError(failedConstraint, message)
を呼び出して作成し、それで promise を
rejected して返します。
requestedMediaTypes を、options 内で辞書値または
true の値を持つメディアタイプの集合とします。
relevant
global object の associated
Document が fully
active でない、または
フォーカスを持たない場合、
rejected された
promise を返します。その promise は
DOMException
オブジェクトで拒否され、その name
属性の値は InvalidStateError
です。
p を新しい promise とします。
次の手順を並列に実行します。
requestedMediaTypes 内の各メディアタイプ T について、
型 T のソースが利用できない場合、
新しい
DOMException
オブジェクトで p を
reject します。その
name
属性の値は NotFoundError
です。
現在の閲覧コンテキスト内で型 T のソースを取得するための現在の
permission
state を読み取ります。許可状態が「denied」
である場合、下の PermissionFailure とラベル付けされた
手順へジャンプします。
任意で、たとえば以前に確立されたユーザー設定、セキュリティ上の理由、または プラットフォームの制限に基づいて、下の Permission Failure とラベル付けされた手順へ ジャンプします。
Request
permission to use viewport capture を、
PermissionDescriptor
の
name
を "viewport-capture"
に設定して行い、提供されるメディアの集合を得ます。
提供されるメディアは、正確に 1 つの動画トラックを含まなければ MUST なりません。
その動画トラックは、
viewport の
browser
display
surface
のライブキャプチャでなければ MUST なりません。この viewport は、
relevant
global object の associated
Document の top-level
browsing context のものです。
提供されるメディアは、最大 1 つの音声トラックを含まなければ MUST なりません。
提供される場合、その音声トラックは、
relevant
global object の
associated
Document の top-level
browsing context の active
document、および
relevant
global object の associated
Document の top-level
browsing context のネストされた browsing
context 内にあるすべての active
documents
から成る文書群によって生成される音声の合計を合成したものでなければ MUST なりません。
この音声トラックは、音声が requestedMediaTypes で指定されていない場合、または
false として指定されている場合には、含めては MUST NOT
なりません。
MediaStreamTrack
のソースは変更されては MUST NOT なりません。
要求の結果が「granted」
である場合、提供されるメディアのソースとなっている各デバイスについて、そのデバイスの安定したプライベート ID
deviceId を使用して、
[[devicesLiveMap]][deviceId] を、まだ true でない場合は
true に設定し、[[devicesAccessibleMap]][deviceId] を、
まだ true でない場合は true に設定します。
ユーザーエージェントは、「granted」
許可エントリを保存しては MUST NOT なりません。
結果が「denied」
である場合、下の
Permission Failure とラベル付けされた手順へジャンプします。ユーザーが応答しない場合、このアルゴリズムは
この手順で停止します。
ユーザーが許可を与えたものの、OS、プログラム、または Web ページのロックのようなハードウェアエラーにより
アクセスが妨げられる場合、
p を新しい DOMException
オブジェクトで reject します。その name
属性の値は NotReadableError
であり、これらの手順を中止します。
結果が「granted」
であるものの、上記に列挙されたもの以外の理由でデバイスアクセスに失敗した場合、
p を新しい DOMException
オブジェクトで reject します。その
name
属性の値は AbortError
であり、これらの手順を中止します。
stream を、ユーザーが許可を与えた
MediaStream
オブジェクトとします。
stream 内のすべてのトラックに対し、適切な制約を用いて
ApplyConstraints
algorithm を実行します。これが失敗した場合、failedConstraint
を失敗したアルゴリズムの結果とし、
message を undefined または情報提供用の
人間可読メッセージのいずれかとし、
OverconstrainedError(failedConstraint, message)
を呼び出して作成した新しい OverconstrainedError
で
p を reject
します。
[[Restrictable]]
を true に設定します。p を stream で Resolve し、これらの手順を中止します。
Permission Failure: p を新しい
DOMException
オブジェクトで
Reject します。その
name
属性の値は NotAllowedError
です。
p を返します。
ユーザーエージェントは、 部分的に透明なキャプチャ対象の display surface の背後にあるコンテンツをキャプチャしては MUST NOT なりません。
ユーザーエージェントは、 キャプチャされたタブから発せられる音声以外の音声を共有しては MUST NOT ならず、システム全体の音声を共有しても MUST NOT なりません。
getViewportMedia に関連する制約は、
getDisplayMedia()
に関連するもののみです。これは
5.4 キャプチャされたディスプレイサーフェスの制約可能プロパティ
で定義されています。
Viewport Capture は、
"viewport-capture"
という name によって識別される
powerful feature であり、
使用するには express permission が必要です。
Permissions 仕様との統合に必要とされるように、この 仕様は次を定義します。
prompt」
および
「denied」です。
ユーザーエージェントは、この記述子の permission state を
「granted」
に設定しては決して MUST NOT なりません。
この仕様は、文字列 "viewport-capture"
によって識別される
policy-controlled
feature を定義します。
その default
allowlist は "self" です。
document の permissions
policy は、その文書内の任意のコンテンツが
getViewportMedia
を使用できるかどうかを決定します。
いずれかの文書で無効化されている場合、その文書内のどのコンテンツも
getViewportMedia を
allowed
to use されません。これは
request permission
to use
アルゴリズムによって強制されます。
この仕様は、
Privacy Indicator
Requirements of
getDisplayMedia()
を拡張し、getViewportMedia を含めます。
この節は参考情報です。ただし、ここに含まれる助言に従わない場合、プラットフォームのセキュリティに対する重大なリスクがあることを 指摘しています。
未定。
Referenced in: