Migliore condivisione delle schede con l'handle di acquisizione

François Beaufort
François Beaufort

Browser Support

  • Chrome: 102.
  • Edge: 102.
  • Firefox: not supported.
  • Safari: not supported.

La piattaforma web ora viene fornita con Capture Handle, un meccanismo che facilita la collaborazione tra le app web di acquisizione e quelle acquisite. L'handle di acquisizione consente a un'app web di acquisizione di identificare in modo ergonomico e sicuro l'app web acquisita (se l'app web acquisita ha attivato questa opzione).

Alcuni esempi illustrano i vantaggi.

Esempio 1: se un'app web di videoconferenza acquisisce un'app web di presentazione, può esporre i controlli all'utente per navigare tra le slide. Poiché i controlli sono incorporati direttamente nell'app web di videoconferenza, l'utente non deve passare ripetutamente dalla scheda della videoconferenza a quella della presentazione. Con questo peso in meno, l'utente può ora concentrarsi maggiormente sulla presentazione.

Esempio 2: l'effetto "sala degli specchi" si verifica quando una superficie acquisita viene visualizzata di nuovo nella posizione di acquisizione. In particolare, se l'utente sceglie di acquisire la scheda in cui è in corso una chiamata di videoconferenza e l'app web di videoconferenza esegue il rendering di un'anteprima locale, si osserverà questo temuto effetto. Utilizzando Capture Handle, l'autoacquisizione può essere rilevata e mitigata, ad esempio tramite la soppressione dell'anteprima locale da parte dell'app web.

Illustrazione dell'effetto della galleria degli specchi

Informazioni sulla maniglia di acquisizione

Capture Handle è composto da due parti complementari:

  • Le app web acquisite possono attivare l'esposizione di determinate informazioni ad alcune origini con navigator.mediaDevices.setCaptureHandleConfig().
  • Le app web di acquisizione possono quindi leggere queste informazioni con getCaptureHandle() sugli oggetti MediaStreamTrack.

Lato acquisito

Le app web possono esporre informazioni a potenziali app web di acquisizione. Lo fa chiamando navigator.mediaDevices.setCaptureHandleConfig() con un oggetto facoltativo composto da questi membri:

  • handle: può essere qualsiasi stringa fino a 1024 caratteri.
  • exposeOrigin: se true, l'origine dell'app web acquisita potrebbe essere esposta alle app web di acquisizione.
  • permittedOrigins: i valori validi sono (i) un array vuoto, (ii) un array con il singolo elemento "*" o (iii) un array di origini. Se permittedOrigins è costituito dal singolo elemento "*", CaptureHandle è osservabile da tutte le app web di acquisizione. In caso contrario, è osservabile solo dalle app web di acquisizione la cui origine si trova in permittedOrigins.

L'esempio seguente mostra come esporre un UUID generato in modo casuale come handle e l'origine a qualsiasi app web di acquisizione.

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

Tieni presente che l'app web acquisita non sa se è in fase di acquisizione. A meno che l'app web di acquisizione non utilizzi le informazioni CaptureHandle per stabilire la comunicazione con l'app web acquisita (ad esempio, utilizzando la messaggistica tramite un worker o un'infrastruttura cloud condivisa).

Lato di acquisizione

L'app web di acquisizione contiene un video MediaStreamTrack e può leggere le informazioni sull'handle di acquisizione chiamando getCaptureHandle() su questo MediaStreamTrack. Questa chiamata restituisce null se non è disponibile alcun handle di acquisizione o se l'app web di acquisizione non è autorizzata a leggerlo. Se è disponibile un handle di acquisizione e l'app web di acquisizione viene aggiunta a permittedOrigins, questa chiamata restituisce un oggetto con i seguenti membri:

  • handle: il valore stringa impostato dall'app web acquisita con navigator.mediaDevices.setCaptureHandleConfig().
  • origin: l'origine dell'app web acquisita se exposeOrigin è stato impostato su true. In caso contrario, non è definito.

L'esempio seguente mostra come leggere le informazioni sull'handle di acquisizione da una traccia video.

// 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...
}

Monitora le modifiche di CaptureHandle ascoltando gli eventi "capturehandlechange" su un oggetto MediaStreamTrack. Le modifiche vengono apportate quando:

  • Le chiamate dell'app web acquisite navigator.mediaDevices.setCaptureHandleConfig().
  • Una navigazione tra documenti si verifica nell'app web acquisita.
videoTrack.addEventListener('capturehandlechange', event => {
  captureHandle = event.target.getCaptureHandle();
  // Consume new capture handle...
});

Sicurezza e privacy

La collaborazione tra le app web di acquisizione e quelle acquisite è teoricamente possibile oggi, ad esempio incorporando "pixel magici" nell'app web acquisita o codici QR nel flusso video. Capture Handle offre un meccanismo più semplice, affidabile e sicuro. Consente inoltre all'app web acquisita di selezionare il pubblico, scegliendo le origini o l'intero web.

Tieni presente che navigator.mediaDevices.setCaptureHandleConfig() è disponibile solo per i frame principali di primo livello in contesti di navigazione sicura (solo HTTPS).

Esempio

Puoi provare la funzionalità di acquisizione eseguendo l'esempio.

Demo

Alcune demo sono disponibili all'indirizzo:

Rilevamento delle funzionalità

Per verificare se getCaptureHandle() è supportato, utilizza:

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

Per verificare se navigator.mediaDevices.setCaptureHandleConfig() è supportato, utilizza:

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

Passaggi successivi

Ecco un'anteprima di ciò che ti aspetta nel prossimo futuro e che migliorerà la condivisione dello schermo sul web:

  • Acquisizione regione consentirebbe di ritagliare una traccia video derivata dall'acquisizione dello schermo della scheda corrente.
  • Conditional Focus consentirebbe all'app web di acquisizione di indicare al browser di spostare lo stato attivo sulla superficie di visualizzazione acquisita o di evitare tale modifica.

Feedback

Il team di Chrome e la community degli standard web vogliono conoscere la tua esperienza con la funzionalità di acquisizione.

Descrivi il design

C'è qualcosa in merito alla funzionalità di acquisizione della maniglia che non funziona come previsto? Oppure mancano metodi o proprietà che ti servono per implementare la tua idea? Hai una domanda o un commento sul modello di sicurezza?

  • Invia una segnalazione relativa alle specifiche nel repository GitHub o aggiungi i tuoi commenti a una segnalazione esistente.

Problemi con l'implementazione?

Hai trovato un bug nell'implementazione di Chrome? L'implementazione è diversa dalla specifica?

  • Invia una segnalazione di bug all'indirizzo https://new.crbug.com. Assicurati di includere il maggior numero di dettagli possibile e istruzioni semplici per la riproduzione.

Mostrare il proprio sostegno

Hai intenzione di utilizzare l'handle di acquisizione? Il tuo supporto pubblico aiuta il team di Chrome a dare la priorità alle funzionalità e mostra ad altri fornitori di browser quanto sia fondamentale supportarle.

Invia un tweet a @ChromiumDev e facci sapere dove e come lo utilizzi.

Ringraziamenti

Grazie a Joe Medley per aver esaminato questo articolo.