Règles Chromium concernant les boîtes de dialogue JavaScript

Historique des boîtes de dialogue JavaScript

JavaScript a été introduit en 1995. Dans la toute première version de JavaScript, il s'agissait de méthodes sur l'objet de fenêtre nommé alert(), confirm() et prompt().

Bien qu'elles s'intègrent au code JavaScript de l'époque, leur API synchrone pose problème pour les navigateurs modernes. Étant donné que le moteur JavaScript doit s'interrompre jusqu'à l'obtention d'une réponse de l'utilisateur, les boîtes de dialogue JavaScript sont modales de l'application. Comme ces boîtes de dialogue sont modales pour l'application, elles sont généralement utilisées (et malheureusement, malheureusement) pour nuire nos utilisateurs.

C'est pourquoi l'équipe Chromium vous recommande vivement de ne pas utiliser de boîtes de dialogue JavaScript.

Autres solutions

Il existe de nombreuses options pour remplacer la boîte de dialogue.

Plusieurs options s'offrent à vous pour alert()/confirm()/prompt(). Pour avertir l'utilisateur d'événements (par exemple, les sites d'agenda), vous devez utiliser l'API Notifications. Pour obtenir une entrée utilisateur, vous devez utiliser l'élément HTML <dialog>. Pour les démonstrations de faisabilité XSS, vous pouvez utiliser l'élément console.log(document.origin) de l'outil de développement.

Notez que onbeforeunload n'est déjà pas fiable. Comme Ilya Grigorik le souligne : "Vous ne pouvez pas compter sur les événements pagehide, beforeunload et unload pour se déclencher sur des plates-formes mobiles." Si vous devez enregistrer l'état, utilisez l'API Page Visibility.

Changements

La possibilité pour une page de spécifier la chaîne onbeforeunload a été supprimée dans la version 51 de Chrome. (Elle a également été supprimée par Safari à partir de Safari 9.1 et dans Firefox 4.)

Les boîtes de dialogue de alert()/confirm()/prompt() ne sont plus modales pour l'application, mais sont masquées lorsque l'onglet est déplacé. Cette modification a été appliquée à l'ensemble des canaux au début du mois de mai 2017.

Les boîtes de dialogue beforeunload nécessitent un geste sur la page pour qu'elles s'affichent à partir de Chrome 60. (Cela ne modifie pas l'envoi de l'événement beforeunload.) Cela correspond à Chromium avec Firefox, qui a effectué cette modification avec Firefox 44.

L'affichage d'une boîte de dialogue alert()/confirm()/prompt() en plein écran entraîne la perte du mode plein écran à partir de Chrome 61.

Les boîtes de dialogue prompt() n'activent pas leur onglet. Si prompt() est appelé à partir d'un onglet en arrière-plan, l'appel est immédiatement renvoyé, et aucune boîte de dialogue ne s'affiche. Cette modification a été appliquée à l'ensemble des canaux au début du mois de mai 2017.

Les boîtes de dialogue alert() n'activent pas leur onglet. Si alert() est appelé à partir d'un onglet en arrière-plan, l'appel est immédiatement renvoyé. L'onglet est marqué d'un indicateur, et l'utilisateur verra la boîte de dialogue lorsqu'il passera à l'onglet. Ce changement de comportement est visible à partir de Chrome 64.

Les boîtes de dialogue confirm() n'activent pas leur onglet. Si confirm() est appelé à partir d'un onglet en arrière-plan, l'appel est immédiatement renvoyé, et aucune boîte de dialogue ne s'affiche. Ce changement de comportement est visible à partir de Chrome 69.

En raison de ces modifications, si votre site utilise des boîtes de dialogue, nous vous recommandons vivement de passer aux alternatives mentionnées précédemment afin que cela ne vous concerne pas.