Compatibilidade com navegadores
A plataforma da Web agora inclui o Capture Handle, um mecanismo que ajuda a colaboração entre a captura e a captura de apps da Web. A alça de captura permite que um app da Web de captura identifique de forma ergonômica e com confiança o app da Web capturado. (Se o app da Web capturado tiver ativado essa opção.)
Alguns exemplos ilustram os benefícios.
Exemplo 1:se um app da Web de videoconferência estiver capturando um app de apresentação, ele poderá expor controles para que o usuário navegue entre os slides. Como os controles são incorporados diretamente no app da Web de videoconferência, o usuário não precisa alternar repetidamente entre a guia de videoconferência e a guia apresentada. Com essa sobrecarga, o usuário agora tem liberdade para se concentrar mais na apresentação.
Exemplo 2:a "Galeria de espelhos" ocorre quando uma superfície capturada é renderizada de volta para o local sendo capturado. Se o usuário escolher capturar a guia em que está ocorrendo uma chamada de videoconferência, e o app da Web de videoconferência renderizar uma visualização local, esse temido efeito será observado. Usando o Capture Handle, a autocaptura pode ser detectada e atenuada. por exemplo, ao suprimir a visualização local pelo app da Web.
Sobre a alça de captura
O identificador de captura é composto por duas partes complementares:
- Os apps da Web capturados podem ativar a exposição de determinadas informações a algumas origens com
navigator.mediaDevices.setCaptureHandleConfig()
. - A captura de apps da Web pode ler essas informações com
getCaptureHandle()
em objetosMediaStreamTrack
.
Lado da captura
Os aplicativos da Web podem expor informações a possíveis aplicativos da Web. Ele faz isso chamando navigator.mediaDevices.setCaptureHandleConfig()
com um objeto opcional composto pelos seguintes membros:
handle
: pode ser qualquer string com até 1.024 caracteres.exposeOrigin
: setrue
, a origem do app da Web capturado pode ser exposta para capturar apps da Web.permittedOrigins
: os valores válidos são (i) uma matriz vazia, (ii) uma matriz com um único item"*"
ou (iii) uma matriz de origens. Se apermittedOrigins
consistir no único item"*"
, oCaptureHandle
poderá ser observado por todos os apps da Web de captura. Caso contrário, ele será observável apenas para capturar apps da Web com origem empermittedOrigins
.
O exemplo a seguir mostra como expor um UUID gerado aleatoriamente como um identificador e a origem para qualquer app da Web de captura.
const config = {
handle: crypto.randomUUID(),
exposeOrigin: true,
permittedOrigins: ['*'],
};
navigator.mediaDevices.setCaptureHandleConfig(config);
O app da Web capturado não sabe se está sendo capturado. A menos que o app da Web de captura use informações de CaptureHandle
para estabelecer a comunicação com o app da Web capturado, usando mensagens por um worker ou uma infraestrutura em nuvem compartilhada, por exemplo.
Lado da captura
O app da Web de captura contém um MediaStreamTrack
de vídeo e pode ler as informações do identificador de captura chamando getCaptureHandle()
nessa MediaStreamTrack
. Essa chamada vai retornar null
se nenhum identificador de captura estiver disponível ou se o app da Web de captura não tiver permissão para fazer a leitura. Se um identificador de captura estiver disponível e o app da Web de captura for adicionado a permittedOrigins
, essa chamada vai retornar um objeto com os seguintes membros:
handle
: o valor da string definido pelo app da Web capturado comnavigator.mediaDevices.setCaptureHandleConfig()
.origin
: a origem do app da Web capturado seexposeOrigin
estivesse definido comotrue
. Caso contrário, ele não será definido.
O exemplo a seguir mostra como ler as informações do identificador de captura de uma faixa de vídeo.
// 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...
}
Monitore as mudanças no CaptureHandle
detectando eventos "capturehandlechange"
em um objeto MediaStreamTrack
. As mudanças acontecem quando:
- O app da Web capturado chama
navigator.mediaDevices.setCaptureHandleConfig()
. - Uma navegação entre documentos ocorre no app da Web capturado.
videoTrack.addEventListener('capturehandlechange', event => {
captureHandle = event.target.getCaptureHandle();
// Consume new capture handle...
});
Segurança e privacidade
A colaboração entre a captura e a captura de apps da Web é teoricamente possível hoje incorporando "pixels mágicos" no app da Web capturado ou incorporar códigos QR no stream de vídeo, por exemplo. O Identificador de captura oferece um mecanismo mais simples, confiável e seguro. Isso também permite que o app da Web capturado selecione o público-alvo, seja de origens selecionadas ou de toda a Web.
O navigator.mediaDevices.setCaptureHandleConfig()
só está disponível para frames principais de nível superior em contextos de navegação segura (somente HTTPS).
Exemplo
Você pode testar a alça de captura executando o sample no Glitch. Tenha confira o código-fonte.
Demonstrações
Algumas demonstrações estão disponíveis em:
Detecção de recursos
Para verificar se getCaptureHandle()
é compatível, use:
if ('getCaptureHandle' in MediaStreamTrack.prototype) {
// getCaptureHandle() is supported.
}
Para verificar se navigator.mediaDevices.setCaptureHandleConfig()
é compatível, use:
if ('setCaptureHandleConfig' in navigator.mediaDevices) {
// navigator.mediaDevices.setCaptureHandleConfig() is supported.
}
A seguir
Veja uma prévia do que vai melhorar o compartilhamento de tela na Web em um futuro próximo:
- A captura de região permite cortar uma faixa de vídeo derivada da captura de tela da guia atual.
- O foco condicional permite que o app da Web de captura instrui o navegador a mudar o foco para a superfície da tela capturada ou evitar essa mudança.
Feedback
A equipe do Chrome e a comunidade de padrões da Web querem saber sobre suas experiências com o Capture Handle.
Conte-nos sobre o design
Há algo no identificador de captura que não funciona como você esperava? Ou faltam métodos ou propriedades que você precisa para implementar sua ideia? Tem uma pergunta ou comentário sobre o modelo de segurança?
- Registre um problema de especificação no repositório do GitHub (link em inglês) ou adicione sua opinião a um problema.
Problemas com a implementação?
Você encontrou um bug na implementação do Chrome? Ou a implementação é diferente das especificações?
- Registre um bug em https://new.crbug.com. Certifique-se de incluir o máximo de detalhes possível e instruções simples para reproduzi-los. O Glitch é ótimo para compartilhar repetições rápidas e fáceis.
Mostrar apoio
Você planeja usar o identificador de captura? Seu apoio público ajuda a equipe do Chrome a priorizar recursos e mostra a outros fornecedores de navegadores como é essencial oferecer suporte a eles.
Envie um tweet para @ChromiumDev e informe onde e como você o está usando.
Links úteis
Agradecimentos
Agradecemos a João Medley por revisar este artigo.