Resumo

  • Uma discussão pública no W3C em 2013 procurou uma maneira de avisar vários contextos da mesma origem. Um pedido de 2014 levou a ideia aos workers; correspondência pública de 2015 registrou a implementação em andamento.
  • Pelo HTML atual, o navegador procura outros canais aptos com o mesmo nome e a mesma chave de armazenamento, serializa o dado e agenda um evento de mensagem para cada um. A reação pertence ao aplicativo.

A aba A sabe que o leitor saiu. A aba B ainda mostra seus textos guardados. A C parece pronta para mudar suas preferências. Três janelas do mesmo serviço contam versões diferentes do minuto presente. Elas poderiam perguntar ao servidor uma por uma; também poderiam receber um bilhete de quem acabou de presenciar a mudança. Como o navegador já abriga todas, virou o lugar natural para organizar essa conversa de corredor.

O registro público aberto no W3C em 2013 mostra o desenho inicial. Entre as propostas havia um objeto criado com nome de canal e um postMessage() que chegaria aos outros ouvintes com origem e nome correspondentes. Vários detalhes ainda eram discutidos. O ganho central, porém, estava claro: uma página não precisaria colecionar referências diretas a todas as outras janelas para participar da mesma conversa.

O corredor ganhou uma porta para os bastidores. Um pedido registrado em janeiro de 2014 defendia BroadcastChannel também em workers; a atualização de junho registra a mudança no trabalho do HTML. Uma tarefa em segundo plano podia, assim, integrar a rede local de avisos quando estivesse apta a ouvir. A conversa deixava de depender apenas de janelas visíveis.

Em janeiro de 2015, uma troca pública na lista da WHATWG tratou de uma implementação a caminho do Firefox Nightly e apontou para o texto HTML. O índice da versão de trabalho HTML 5.1 do W3C, de outubro daquele ano, também listou BroadcastChannel e remeteu à definição da WHATWG. A ideia já tinha conversa técnica, endereço de especificação e gente trabalhando nela.

O padrão HTML atual descreve o carteiro em serviço. postMessage() serializa a mensagem. O navegador encontra outros objetos elegíveis com nome de canal e chave de armazenamento iguais, retira o remetente da lista e agenda eventos message para os destinos. Uma janela precisa ter documento plenamente ativo; um worker também precisa estar em condição de receber. Uma partição de armazenamento diferente equivale a outro prédio, mesmo que a placa na porta tenha o mesmo nome.

O próprio padrão conta a história da saída da conta em uma aba e do aviso à outra. O canal entrega o fato; o código do site muda a interface e administra a sessão. A mesma organização pode anunciar que o tema visual mudou ou que uma tarefa terminou. O navegador distribui bilhetes, enquanto cada equipe decide o que fazer quando um chega.

Há ainda o expediente de fechar o interfone. O texto normativo explica que um canal com ouvinte registrado pode permanecer vivo e ocupar memória. O aplicativo deve encerrar canais que já não usa. A invenção pôs as abas para conversar; cabe à redação não deixar todos os aparelhos tocando num escritório vazio.