Phase d'évaluation pour un nouvel élément HTML "permission>"

Il existe un certain nombre de méthodes impératives pour demander l'autorisation d'utiliser des fonctionnalités puissantes telles que l'accès à la position dans les applications Web. Ces méthodes présentent un certain nombre de défis. C'est pourquoi l'équipe Chrome chargée des autorisations teste une nouvelle méthode déclarative: un élément HTML <permission> dédié. Cet élément est en phase d'évaluation à partir de Chrome 126 et nous espérons le standardiser à terme.

Méthodes impératives pour demander des autorisations

Lorsque les applications Web ont besoin d'accéder à des fonctionnalités puissantes, elles doivent demander l'autorisation. Par exemple, lorsque Google Maps requiert la position de l'utilisateur à l'aide de l'API Geolocation, les navigateurs affichent une invite l'utilisateur, souvent avec la possibilité de stocker cette décision. Il s'agit d'un concept bien défini dans la spécification des autorisations.

Demander implicitement la première utilisation plutôt que demander explicitement à l'avance

L'API Geolocation est une API performante qui repose sur l'approche implicite de la demande de première utilisation. Par exemple, lorsqu'une application appelle la méthode navigator.geolocation.getCurrentPosition(), l'invite d'autorisation s'affiche automatiquement lors du premier appel. Un autre exemple est navigator.mediaDevices.getUserMedia().

D'autres API, comme l'API Notification ou l'API Device Orientation and Motion, disposent généralement d'un moyen explicite de demander une autorisation via une méthode statique comme Notification.requestPermission() ou DeviceMotionEvent.requestPermission().

Difficultés liées aux méthodes impératives de demande d'autorisation

Spam lié aux autorisations

Auparavant, les sites Web pouvaient appeler des méthodes telles que navigator.mediaDevices.getUserMedia() ou Notification.requestPermission(), mais aussi navigator.geolocation.getCurrentPosition() immédiatement lorsqu'un site Web était chargé. Une invite d'autorisation apparaissait avant que l'utilisateur n'ait interagi avec le site Web. Cela est parfois décrit comme du spam d'autorisation et affecte les deux approches : demander implicitement lors de la première utilisation ainsi que demander explicitement en amont.

Invite d&#39;autorisation du micro affichée lors du chargement d&#39;un site Web.

Mesures d'atténuation des risques du navigateur et exigences des utilisateurs concernant les gestes

Le spam lié aux autorisations a conduit les fournisseurs de navigateurs à exiger un geste de l'utilisateur (comme un clic sur un bouton ou un événement de clavier) avant d'afficher une invite d'autorisation. Le problème de cette approche est qu'il est très difficile, voire impossible, pour le navigateur de déterminer si un geste donné de l'utilisateur doit entraîner ou non l'affichage d'une invite d'autorisation. Peut-être que l'utilisateur cliquait simplement sur la page en raison de la frustration du fait que la page mettait beaucoup de temps à se charger, ou qu'il cliquait en effet sur le bouton Me localiser. Certains sites Web sont également devenus très efficaces pour inciter les utilisateurs à cliquer sur le contenu afin de déclencher l'invite.

Une autre mesure d'atténuation consiste à ajouter des mesures d'atténuation des utilisations abusives des invites, telles que le blocage complet de fonctionnalités au départ, ou l'affichage de la demande d'autorisation de manière non modale et moins intrusive.

Navigateur Chrome affichant un

Contexte des autorisations

Un autre défi, en particulier sur les grands écrans, est la façon dont l'invite d'autorisation s'affiche couramment: au-dessus de la ligne de mort, c'est-à-dire en dehors de la zone de la fenêtre du navigateur sur laquelle l'application peut s'afficher. Il n'est pas rare que les utilisateurs passent à côté de l'invite en haut de la fenêtre du navigateur lorsqu'ils viennent de cliquer sur un bouton en bas de celle-ci. Ce problème est souvent exacerbé lorsque des mesures d'atténuation du spam dans les navigateurs sont en place.

Google Maps avec l&#39;invite d&#39;autorisation d&#39;accéder à la position ouverte. Le bouton d&#39;accès à la position qui a déclenché l&#39;invite est éloigné.

Annulation facile

Enfin, il est trop facile pour les utilisateurs de naviguer dans une impasse. Par exemple, une fois que l'utilisateur a bloqué l'accès à une fonctionnalité, il doit connaître la liste déroulante des informations sur le site, dans lequel il peut Réinitialiser les autorisations ou réactiver les autorisations bloquées. Dans le pire des cas, les deux options nécessitent une actualisation complète de la page jusqu'à ce que le paramètre modifié prenne effet. Les sites ne peuvent pas fournir de raccourci simple permettant aux utilisateurs de modifier un état d'autorisation existant et doivent leur expliquer minutieusement comment modifier leurs paramètres, comme indiqué en bas de la capture d'écran Google Maps suivante.

Commandes Chrome relatives aux sites sur Google Maps pour révoquer des autorisations.

Si l'autorisation est essentielle à l'expérience, par exemple l'accès au micro pour une application de visioconférence, les applications telles que Google Meet affichent des boîtes de dialogue intrusives qui indiquent à l'utilisateur comment débloquer l'autorisation.

Instructions Google Meet pour ouvrir les commandes de site Chrome.

Un élément <permission> déclaratif

Pour résoudre les problèmes décrits dans cet article, l'équipe Chrome chargée des autorisations a lancé une phase d'évaluation pour un nouvel élément HTML, <permission>. Cet élément permet aux développeurs de demander de manière déclarative l'autorisation d'utiliser un sous-ensemble des puissantes fonctionnalités disponibles pour les sites Web. Dans sa forme la plus simple, utilisez-la comme dans l'exemple suivant:

<permission type="camera" />

La question de savoir si <permission> doit être ou non un élément vide est toujours activement débattue. Un élément vide est un élément HTML qui se ferme spontanément et qui ne peut pas avoir de nœuds enfants. En HTML, il ne peut donc pas comporter de balise de fin.

Attribut type

L'attribut type contient une liste d'autorisations que vous demandez, séparées par un espace. Au moment de la rédaction de ce document, les valeurs autorisées sont 'camera', 'microphone' et camera microphone (séparées par un espace). Par défaut, cet élément s'affiche de la même manière que les boutons avec un style user-agent épuré.

Divers boutons d&#39;éléments d&#39;autorisation permettant d&#39;accéder à l&#39;appareil photo, au micro, à l&#39;appareil photo et au micro.

Attribut type-ext

Pour certaines autorisations autorisant des paramètres supplémentaires, l'attribut type-ext accepte des paires clé/valeur séparées par un espace, comme precise:true pour l'autorisation de géolocalisation.

Attribut lang

Le texte du bouton est fourni par le navigateur et destiné à être cohérent. Il ne peut donc pas être personnalisé directement. Le navigateur modifie la langue du texte en fonction de la langue héritée du document ou de la chaîne d'éléments parent, ou d'un attribut lang facultatif. Cela signifie que les développeurs n'ont pas besoin de localiser l'élément <permission> eux-mêmes. Si l'élément <permission> dépasse l'étape d'évaluation, plusieurs chaînes ou icônes peuvent être acceptées pour chaque type d'autorisation afin d'accroître la flexibilité. Si vous souhaitez utiliser l'élément <permission> et que vous avez besoin d'une chaîne ou d'une icône spécifique, contactez-nous.

Comportement

Lorsque l'utilisateur interagit avec l'élément <permission>, il peut passer par différentes étapes:

  • S'il n'avait pas autorisé une fonctionnalité auparavant, il peut l'autoriser à chaque visite ou pour la visite en cours.

    Invite d&#39;autorisation permettant d&#39;autoriser un élément géographique cette fois-ci ou à chaque visite.

  • S'il avait autorisé cette fonctionnalité auparavant, il peut continuer à l'autoriser ou cesser de l'autoriser.

    Invite d&#39;autorisation permettant de continuer à accorder ou de ne plus accorder d&#39;autorisation.

  • S'il avait précédemment désactivé une fonctionnalité, il peut continuer ou l'autoriser cette fois-ci.

    Message d&#39;autorisation vous invitant à ne pas l&#39;accorder ou à l&#39;autoriser cette fois-ci.

Le texte de l'élément <permission> est automatiquement mis à jour en fonction de l'état. Par exemple, si l'autorisation d'utiliser une fonctionnalité a été accordée, le texte change pour indiquer que l'élément est autorisé. Si l'autorisation doit d'abord être accordée, le texte change pour inviter l'utilisateur à utiliser la fonctionnalité. Comparez la capture d'écran précédente avec celle suivante pour voir les deux états.

Boutons d&#39;autorisation contenant les textes

Conception CSS

Pour que les utilisateurs puissent facilement reconnaître le bouton comme une surface permettant d'accéder à de puissantes fonctionnalités, le style de l'élément <permission> est limité. Si les restrictions de style ne sont pas adaptées à votre cas d'utilisation, n'hésitez pas à nous contacter pour en savoir plus. Bien que tous les besoins de style ne puissent pas être satisfaits, nous espérons trouver des moyens sûrs d'appliquer davantage de styles à l'élément <permission> après la phase d'évaluation. Le tableau suivant détaille certaines propriétés auxquelles des restrictions ou des règles spéciales sont appliquées. En cas de non-respect de l'une des règles, l'élément <permission> sera désactivé et vous ne pourrez pas interagir avec celui-ci. Toute tentative d'interaction avec ce fichier entraînera des exceptions qui pourront être interceptées par JavaScript. Le message d'erreur contiendra plus de détails sur le non-respect détecté.

Propriété Règles

color, background-color

Permet de définir la couleur du texte et de l'arrière-plan, respectivement. Le contraste entre les deux couleurs doit être suffisant pour que le texte soit clairement lisible (rapport de contraste d'au moins 3). Le canal alpha doit être 1.

font-size, zoom

Doit être défini de manière équivalente à small et xxxlarge. Sinon, l'élément est désactivé. Le zoom sera pris en compte lors du calcul de font-size.

outline-offset

Les valeurs négatives seront corrigées en 0.
margin (tout) Les valeurs négatives seront corrigées en 0.

font-weight

Les valeurs sous 200 seront remplacées par 200.

font-style

Les valeurs autres que normal et italic seront remplacées par normal.

word-spacing

Les valeurs supérieures à 0.5em seront corrigées en 0.5em. Les valeurs sous 0 seront corrigées en 0.

display

Les valeurs autres que inline-block et none seront corrigées en inline-block.

letter-spacing

Les valeurs supérieures à 0.2em seront corrigées en 0.2em. Les valeurs sous -0.05em seront remplacées par -0.05em.

min-height

La valeur par défaut est 1em. Si elle est fournie, la valeur maximale calculée entre les valeurs par défaut et les valeurs fournies sera prise en compte.

max-height

La valeur par défaut est 3em. Si elle est fournie, la valeur minimale calculée entre les valeurs par défaut et les valeurs fournies sera prise en compte.

min-width

La valeur par défaut est fit-content. Si elle est fournie, la valeur calculée maximale entre les valeurs par défaut et les valeurs fournies sera prise en compte.

max-width

Sa valeur par défaut sera 3 fois fit-content. Si elle est fournie, la valeur minimale calculée entre les valeurs par défaut et les valeurs fournies sera prise en compte.

padding-top

Ne prendra effet que si height est défini sur auto. Dans ce cas, les valeurs supérieures à 1em seront remplacées par 1em et padding-bottom sur la valeur de padding-top.

padding-left

Ne prendra effet que si width est défini sur auto. Dans ce cas, les valeurs supérieures à 5em seront remplacées par 5em et padding-right sur la valeur de padding-left..

transform

Les effets visuels déformés ne seront pas autorisés. Pour le moment, nous n'acceptons que la traduction en 2D et l'augmentation proportionnelle à la hausse.

Les propriétés CSS suivantes peuvent être utilisées normalement:

  • font-kerning
  • font-optical-sizing
  • font-stretch
  • font-synthesis-weight
  • font-synthesis-style
  • font-synthesis-small-caps
  • font-feature-settings
  • forced-color-adjust
  • text-rendering
  • align-self
  • anchor-name aspect-ratio
  • border (et toutes les propriétés border-*)
  • clear
  • color-scheme
  • contain
  • contain-intrinsic-width
  • contain-intrinsic-height
  • container-name
  • container-type
  • counter-*
  • flex-*
  • float
  • height
  • isolation
  • justify-self
  • left
  • order
  • orphans
  • outline-* (à l'exception notée précédemment pour outline-offset)
  • overflow-anchor
  • overscroll-behavior-*
  • page
  • position
  • position-anchor
  • content-visibility
  • right
  • scroll-margin-*
  • scroll-padding-*
  • text-spacing-trim
  • top
  • visibility
  • x
  • y
  • ruby-position
  • user-select
  • width
  • will-change
  • z-index

En outre, toutes les propriétés logiquement équivalentes peuvent être utilisées (par exemple, inline-size équivaut à width), en suivant les mêmes règles que leurs équivalents.

Pseudo-cours

Il existe deux pseudo-classes spéciales qui permettent de styliser l'élément <permission> en fonction de l'état:

  • :granted: la pseudo-classe :granted permet un style spécial lorsqu'une autorisation a été accordée.
  • :invalid: la pseudo-classe :invalid permet d'appliquer un style spécial à l'élément lorsque son état n'est pas valide, par exemple lorsqu'il est diffusé dans un iFrame multi-origine.
permission {
  background-color: green;
}

permission:granted {
  background-color: light-green;
}

/* Not supported during the origin trial. */
permission:invalid {
  background-color: gray;
}

Événements JavaScript

L'élément <permission> est destiné à être utilisé avec l'API Permissions. Un certain nombre d'événements peuvent être écoutés:

  • onpromptdismiss: cet événement est déclenché lorsque l'invite d'autorisation déclenchée par l'élément a été ignorée par l'utilisateur (par exemple, en cliquant sur le bouton de fermeture ou en cliquant en dehors de l'invite).

  • onpromptaction: cet événement est déclenché lorsque l'invite d'autorisation déclenchée par l'élément a été résolue par l'utilisateur qui effectue lui-même une action sur l'invite. Cela ne signifie pas nécessairement que l'état de l'autorisation a changé. L'utilisateur peut avoir effectué une action qui maintient le statu quo (par exemple, continuer à accorder une autorisation).

  • onvalidationstatuschange: cet événement est déclenché lorsque l'élément passe de "valid" à "invalid". L'élément est considéré comme "valid" lorsque le navigateur fait confiance à l'intégrité du signal si l'utilisateur clique dessus, et "invalid" dans le cas contraire, par exemple lorsqu'il est partiellement masqué par un autre contenu HTML.

Vous pouvez enregistrer des écouteurs d'événements pour ces événements directement intégrés dans le code HTML (<permission type="…" onpromptdismiss="alert('The prompt was dismissed');" />) ou en utilisant addEventListener() sur l'élément <permission>, comme illustré dans l'exemple suivant.

<permission type="camera" />
<script>
  const permission = document.querySelector('permission');
  permission.addEventListener('promptdismiss', showCameraWarning);

  function showCameraWarning() {
    // Show warning that the app isn't fully usable
    // unless the camera permission is granted.
  }

  const permissionStatus = await navigator.permissions.query({name: "camera"});
  
  permissionStatus.addEventListener('change', () => {
    // Run the check when the status changes.
    if (permissionStatus.state === "granted") {
      useCamera();
    }
  });

  // Run the initial check.
  if (permissionStatus.state === "granted") {
    useCamera();
  }
</script>

Détection de caractéristiques

Si un navigateur n'accepte pas un élément HTML, il ne l'affichera pas. Cela signifie que si l'élément <permission> figure dans votre code HTML, rien ne se passe si le navigateur ne le connaît pas. Vous souhaitez peut-être toujours détecter la prise en charge à l'aide de JavaScript, par exemple pour créer une invite d'autorisation déclenchée par un clic sur un <button> standard.

if ('HTMLPermissionElement' in window) {
  // The `<permission>` element is supported.
}

Phase d'évaluation

Pour tester l'élément <permission> sur votre site avec des utilisateurs réels, inscrivez-vous à la phase d'évaluation. Consultez Premiers pas avec les phases d'évaluation pour savoir comment préparer votre site à les utiliser. La phase d'évaluation s'exécutera de Chrome 126 à la version 131 (du 19 février 2025).

Démonstration

Explorez la démonstration et consultez le code source sur GitHub. Voici une capture d'écran de l'expérience sur un navigateur compatible.

Démonstration de l&#39;élément d&#39;autorisation affichant trois boutons d&#39;autorisation.

Commentaires

Nous aimerions savoir comment <permission> fonctionne pour votre cas d'utilisation. N'hésitez pas à répondre à l'un des problèmes du dépôt ou à en signaler un nouveau. Les signaux publics dans le dépôt de l'élément <permission> nous permettront, ainsi qu'aux autres navigateurs, de savoir qu'il vous intéresse.

Questions fréquentes

  • En quoi cette méthode est-elle plus efficace qu'un <button> standard associé à l'API Permissions ? Un clic sur une <button> est un geste de l'utilisateur, mais les navigateurs ne peuvent pas vérifier qu'il est connecté à la requête de demande d'autorisation. Si l'utilisateur a cliqué sur un <permission>, le navigateur peut être sûr que le clic est lié à une demande d'autorisation. Cela permet au navigateur de faciliter des flux qui, autrement, seraient beaucoup plus risqués. Par exemple, elle permet à l'utilisateur d'annuler facilement le blocage d'une autorisation.
  • Que se passe-t-il si d'autres navigateurs ne sont pas compatibles avec l'élément <permission> ? L'élément <permission> peut être utilisé comme amélioration progressive. Sur les navigateurs non compatibles, vous pouvez utiliser un flux d'autorisations classique. (par exemple, en fonction du clic sur un <button> standard). L'équipe chargée des autorisations travaille également sur un polyfill. Ajoutez le dépôt GitHub à vos favoris pour être averti lorsqu'il sera prêt.
  • Avez-vous discuté de ce point avec d'autres fournisseurs de navigateurs ? L'élément <permission> a fait l'objet d'une discussion active lors d'une session en petit groupe lors du W3C TPAC en 2023. Vous pouvez consulter les notes de session publique. L'équipe Chrome a également demandé des positions officielles de la part des deux fournisseurs concernant les normes. Consultez la section Liens associés. L'élément <permission> fait l'objet de discussions en cours avec d'autres navigateurs, et nous espérons le standardiser.
  • L'élément devrait-il être considéré comme vide ? La question de savoir si <permission> doit être ou non un élément vide est toujours en cours de débat. Si vous avez des commentaires, intervenez au sujet du problème.

Remerciements

Ce document a été examiné par Balázs Engedy, Thomas Nguyen, Penelope McLachlan, Marian Harbach, David Warren et Rachel Andrew.