キャプチャ ハンドルによるタブ共有の改善

François Beaufort
François Beaufort

対応ブラウザ

  • Chrome: 102。
  • Edge: 102.
  • Firefox: サポートされていません。
  • Safari: サポートされていません。

このウェブ プラットフォームには、ウェブアプリのキャプチャとキャプチャのコラボレーションを支援するメカニズムであるキャプチャ ハンドルが付属しています。キャプチャ ハンドルを使用すると、キャプチャ元のウェブアプリが、キャプチャ元のウェブアプリを人間工学的に確実に識別できます(キャプチャ元のウェブアプリがオプトインしている場合)。

いくつかの例でそのメリットを説明します。

例 1: ビデオ会議ウェブアプリがプレゼンテーション ウェブアプリをキャプチャしている場合、ビデオ会議ウェブアプリは、スライド間を移動するためのコントロールをユーザーに公開できます。コントロールはビデオ会議ウェブアプリに直接埋め込まれているため、ユーザーはビデオ会議タブとプレゼンテーション タブを繰り返し切り替える必要はありません。こうした負担が軽減されたことで、ユーザーはプレゼンテーションの実施に集中できるようになりました。

例 2: キャプチャされたサーフェスがキャプチャされている場所にレンダリングされると、「鏡の回廊」効果が発生します。特に、ユーザーがビデオ会議通話が行われているタブをキャプチャし、ビデオ会議ウェブアプリがローカル プレビューをレンダリングすると、この恐ろしい効果が発生します。キャプチャ ハンドルを使用すると、自己キャプチャを検出して軽減できます。たとえば、ウェブアプリでローカル プレビューを抑制します。

鏡の回廊効果のイラスト

ハンドルのキャプチャについて

キャプチャ ハンドルは、次の 2 つの補完的な部分で構成されています。

  • キャプチャされたウェブアプリでは、navigator.mediaDevices.setCaptureHandleConfig() を使用して、特定の情報を特定のオリジンに公開することを選択できます。
  • キャプチャしたウェブアプリは、MediaStreamTrack オブジェクトの getCaptureHandle() を使用してその情報を読み取ることができます。

キャプチャ面

ウェブアプリは、キャプチャする可能性のあるウェブアプリに情報を公開できます。次のメンバーで構成されるオプション オブジェクトを指定して navigator.mediaDevices.setCaptureHandleConfig() を呼び出します。

  • handle: 最大 1,024 文字の任意の文字列。
  • exposeOrigin: true の場合、キャプチャされたウェブアプリのオリジンがキャプチャ ウェブアプリに公開される可能性があります。
  • permittedOrigins: 有効な値は、(i)空の配列、(ii)単一の項目 "*" を含む配列、または(iii)オリジンの配列です。permittedOrigins が単一のアイテム "*" で構成されている場合、CaptureHandle はすべてのキャプチャ ウェブアプリで検出できます。それ以外の場合は、オリジンが permittedOrigins にあるウェブアプリをキャプチャした場合にのみ観測できます。

次の例は、ランダムに生成された UUID をハンドルとして、またオリジンをキャプチャするウェブアプリに公開する方法を示しています。

const config = {
  handle: crypto.randomUUID(),
  exposeOrigin: true,
  permittedOrigins: ['*'],
};
navigator.mediaDevices.setCaptureHandleConfig(config);

キャプチャされたウェブアプリは、キャプチャされているかどうかを認識しません。ただし、キャプチャ元のウェブアプリが CaptureHandle 情報を使用してキャプチャ先のウェブアプリとの通信を確立する場合(ワーカー経由のメッセージングや共有クラウド インフラストラクチャを使用する場合など)は除きます。

撮影側

キャプチャするウェブアプリは動画 MediaStreamTrack を保持し、その MediaStreamTrackgetCaptureHandle() を呼び出すことでキャプチャ ハンドル情報を読み取ることができます。キャプチャ ハンドルが使用できない場合、またはキャプチャ ウェブアプリがキャプチャ ハンドルの読み取りを許可されていない場合、この呼び出しは null を返します。キャプチャ ハンドルが使用可能で、キャプチャ ウェブアプリが permittedOrigins に追加されている場合、この呼び出しは次のメンバーを含むオブジェクトを返します。

  • handle: キャプチャされたウェブアプリが navigator.mediaDevices.setCaptureHandleConfig() で設定した文字列値。
  • origin: exposeOrigintrue に設定されている場合、キャプチャされたウェブアプリの生成元。それ以外の場合は定義されません。

次の例は、動画トラックからキャプチャ ハンドル情報を読み取る方法を示しています。

// Prompt the user to capture their display (screen, window, tab).
const stream = await navigator.mediaDevices.getDisplayMedia();

// Check if the video track is exposing information.
const [videoTrack] = stream.getVideoTracks();
const captureHandle = videoTrack.getCaptureHandle();
if (captureHandle) {
  // Use captureHandle.origin and captureHandle.handle...
}

MediaStreamTrack オブジェクトの "capturehandlechange" イベントをリッスンして、CaptureHandle の変更をモニタリングします。変更が発生するタイミング:

  • キャプチャされたウェブアプリが navigator.mediaDevices.setCaptureHandleConfig() を呼び出します。
  • キャプチャされたウェブアプリでドキュメント間のナビゲーションが発生します。
videoTrack.addEventListener('capturehandlechange', event => {
  captureHandle = event.target.getCaptureHandle();
  // Consume new capture handle...
});

セキュリティとプライバシー

現在、キャプチャしたウェブアプリとキャプチャしたウェブアプリのコラボレーションは、キャプチャしたウェブアプリに「マジック ピクセル」を埋め込むか、動画ストリームに QR コードを埋め込むことで理論的には可能です。キャプチャ ハンドルは、よりシンプルで信頼性が高く、安全なメカニズムを提供します。また、キャプチャされたウェブアプリでオーディエンスを指定することもできます(特定のオリジンまたはウェブ全体)。

navigator.mediaDevices.setCaptureHandleConfig() は、安全なブラウジング コンテキスト(HTTPS のみ)のトップレベル メインフレームでのみ使用できます。

サンプル

キャプチャ ハンドルを試すには、Glitch でサンプルを実行します。ソースコードをチェックアウトしてください。

デモ

デモは次の場所で利用できます。

機能検出

getCaptureHandle() がサポートされているかどうかを確認するには、次のコマンドを使用します。

if ('getCaptureHandle' in MediaStreamTrack.prototype) {
  // getCaptureHandle() is supported.
}

navigator.mediaDevices.setCaptureHandleConfig() がサポートされているかどうかを確認するには、次のコマンドを使用します。

if ('setCaptureHandleConfig' in navigator.mediaDevices) {
  // navigator.mediaDevices.setCaptureHandleConfig() is supported.
}

次のステップ

ウェブでの画面共有を改善する、今後予定されている機能のプレビューは次のとおりです。

  • 領域キャプチャでは、現在のタブのディスプレイ キャプチャから取得した動画トラックを切り抜くことができます。
  • 条件付きフォーカスを使用すると、キャプチャ ウェブアプリは、キャプチャされたディスプレイ サーフェスにフォーカスを切り替えるか、そのようなフォーカス変更を回避するようブラウザに指示できます。

フィードバック

Chrome チームとウェブ標準コミュニティは、Capture Handle に関するご意見をお待ちしています。

デザインについて

キャプチャ ハンドルが想定どおりに動作しない点はありますか?または、アイデアを実装するために必要なメソッドやプロパティが不足している場合は、セキュリティ モデルに関するご質問やご意見がございましたら、

  • GitHub リポジトリで仕様に関する問題を報告するか、既存の問題にコメントを追加してください。

実装に関する問題

Chrome の実装にバグが見つかりましたか?それとも、実装が仕様と異なるのでしょうか?

  • https://new.crbug.com でバグを報告します。できるだけ詳細な情報を含め、再現手順を簡単に記載してください。Glitch は、簡単な再現手順をすばやく共有するのに適しています。

クリエイターを応援する

キャプチャ ハンドルを使用する予定ですか?公開されている機能のサポートは、Chrome チームが機能の優先順位を決める際に役立ちます。また、他のブラウザ ベンダーに、その機能のサポートがどれほど重要であるかを示します。

@ChromiumDev にツイートして、どこでどのように使用しているかをお知らせください。

謝辞

この記事を確認していただいた Joe Medley に感謝いたします。