Política do Chromium em caixas de diálogo do JavaScript

Histórico de caixas de diálogo JavaScript

O JavaScript foi introduzido em 1995 e, na primeira versão do JavaScript, eram os métodos no objeto da janela chamados alert(), confirm() e prompt().

Embora elas se encaixem no JavaScript da época, a API síncrona é problemática para os navegadores modernos. Como o mecanismo JavaScript precisa pausar até que uma resposta do usuário seja recebida, as caixas de diálogo JavaScript são modais de app. Além disso, como as caixas de diálogo são modais de apps, elas geralmente são (e infelizmente) usadas para prejudicar nossos usuários.

Por isso, a equipe do Chromium recomenda que você não use caixas de diálogo JavaScript.

Alternativas

Há muitas opções para a substituição de caixas de diálogo.

Há várias opções para alert()/confirm()/prompt(). Para notificar o usuário sobre eventos (por exemplo, sites de agenda), a API Notifications precisa ser usada. Para receber a entrada do usuário, use o elemento HTML <dialog>. Para provas de conceito XSS, o console.log(document.origin) do devtool pode ser usado.

Quanto a onbeforeunload, é importante observar que ele não é confiável. Como Ilya Grigorik aponta, "Não é possível confiar em eventos pagehide, beforeunload e unload para disparar em plataformas para dispositivos móveis". Se você precisar salvar o estado, use a API Page Visibility.

Mudou

A capacidade de uma página especificar a string onbeforeunload foi removida no Chrome 51. Ele também foi removido pelo Safari, a partir do Safari 9.1 e no Firefox 4.

As caixas de diálogo do alert()/confirm()/prompt() mudaram de moda de app para sendo dispensadas quando a guia é trocada. Essa mudança ocorreu em todos os canais no início de maio de 2017.

As caixas de diálogo beforeunload exigem um gesto do usuário na página para permitir a exibição a partir do Chrome 60. Isso não altera o envio do evento beforeunload. Isso alinha o Chromium ao Firefox, que fez essa mudança no Firefox 44.

Mostrar uma caixa de diálogo alert()/confirm()/prompt() no modo de tela cheia fará com que ela seja perdida a partir do Chrome 61.

As caixas de diálogo prompt() não ativam a guia. Se prompt() for chamado em uma guia em segundo plano, a chamada será retornada imediatamente e nenhuma caixa de diálogo será exibida. Essa mudança ocorreu em todos os canais no início de maio de 2017.

As caixas de diálogo alert() não ativam a guia. Se alert() for chamado em uma guia em segundo plano, a chamada será retornada imediatamente. A guia é marcada com um indicador, e o usuário verá a caixa de diálogo quando mudar para ela. Essa mudança de comportamento será observada a partir do Chrome 64.

As caixas de diálogo confirm() não ativam a guia. Se confirm() for chamado em uma guia em segundo plano, a chamada será retornada imediatamente e nenhuma caixa de diálogo será exibida. Essa mudança de comportamento será observada a partir do Chrome 69.

Devido a essas mudanças, caso seu site use caixas de diálogo, é altamente recomendável usar as alternativas mencionadas anteriormente para que isso não afete você.