Je développe un scanner d'accessibilité pour WordPress. La semaine dernière, le
relecteur d'une place de marché l'a rejeté, et parmi les motifs figurait celui-ci :
Les règles de conformité doivent être corrigées. « Langue des passages » ne
valide que les attributs lang déjà présents et ne peut pas détecter les
passages en langue étrangère non balisés ; la règle du landmark principal est
WCAG 1.3.6 de niveau AAA mais elle est présentée comme un contrôle AA ; et les
id en double ne devraient pas être présentés comme un manquement WCAG 2.2 au
titre du 4.1.1.
Trois constats. Tous les trois justes. Ce qui suit est ce qui s'est passé quand
j'ai cessé de corriger les trois et vérifié les vingt-deux autres.
La règle qui n'existe plus
Je commence par le troisième, parce que c'est le plus facile à vérifier et le
plus largement faux.
Le critère de succès 4.1.1 Parsing a été retiré des WCAG 2.2. Ni déprécié ni
assoupli : retiré. La Recommandation du W3C le mentionne dans la
section conformité comme « Parsing (Obsolete and removed) ». Il est parti parce
que ce contre quoi il protégeait — les technologies d'assistance qui butaient sur
un balisage mal formé — a cessé d'être un mode de défaillance réel dès lors que
les navigateurs et les API d'accessibilité ont convergé sur la façon de récupérer
un HTML incorrect.
Mon scanner signalait les attributs id en double comme un manquement au WCAG
4.1.1. Au regard des WCAG 2.2, ce critère n'est plus là pour être enfreint.
Les id en double méritent toujours d'être corrigés. Ils cassent les associations
label for et les références aria-labelledby, si bien que c'est le mauvais
élément qui est annoncé, ou aucun. Mais c'est un problème de 4.1.2 lorsqu'il
casse réellement un nom accessible, et le détecter est un contrôle différent du
comptage des id en double. Ce que j'avais était un contrôle générique d'id en
double portant le numéro d'un critère retiré.
Puis j'ai vérifié le reste
Le relecteur en avait trouvé trois. J'aurais pu en corriger trois. À la place,
j'ai pris les 25 règles et vérifié chacune face à la Recommandation WCAG 2.2 et
face à la manière dont axe-core classe la règle équivalente — parce
qu'axe-core est l'implémentation de référence sur laquelle repose une grande
partie de ce secteur, et qu'elle fait une distinction que j'avais perdue.
Huit règles étaient fausses.
| Règle | Annonçait | En réalité |
|---|---|---|
| Id en double | 4.1.1 | Retiré des WCAG 2.2 |
Un seul landmark main
|
1.3.6 AAA | 1.3.6 est Identify Purpose, un critère sans rapport |
| Langue des passages | 3.1.2 AA | 3.1.2 est de niveau A — et le contrôle ne faisait pas ce que son titre promettait |
| Texte de lien vague | 2.4.4 | Le 2.4.4 est satisfait par le contexte |
| Niveaux de titre sautés | 1.3.1 | Les WCAG n'imposent pas de niveaux séquentiels |
h1 manquant |
1.3.1 | Bonne pratique |
| Titre vide | 1.3.1 | Bonne pratique |
tabindex positif |
2.4.3 | Bonne pratique |
Certaines méritent une phrase.
Texte de lien vague. Le 2.4.4 s'appelle Link Purpose (In Context). En
contexte. Un lien qui dit « en savoir plus » le satisfait si le paragraphe,
l'élément de liste ou la cellule qui l'entoure rend la destination claire — ce
qui est généralement le cas. Le critère qui exige que le texte du lien tienne
seul est le 2.4.9, et il est AAA. « En savoir plus » répété au fil d'une page est
donc un vrai problème d'utilisabilité pour qui parcourt les liens au clavier, et
ce n'est pas un manquement de niveau A.
Niveaux de titre. Aucun critère de succès n'exige qu'un h2 suive un h1.
Le 1.3.1 Info and Relationships exige que la structure véhiculée visuellement
soit disponible par programme — utiliser des titres tout court est la façon de
le satisfaire. Passer de h1 à h3 est brouillon et dégrade la navigation au
lecteur d'écran, mais ce n'est pas ce que dit le 1.3.1. axe-core classe
heading-order en bonne pratique, et ce depuis des années.
Langue des passages. Celle-ci était fausse deux fois. Le 3.1.2 est de niveau
A, pas AA — je m'étais trompé de niveau. Et le contrôle s'intitulait « Les
passages en langue étrangère doivent déclarer leur langue », ce qui promettait
une chose qu'aucun contrôle automatique ne peut faire : savoir qu'un passage est
dans une autre langue quand rien ne le signale. Ce que le code faisait vraiment,
c'était valider les attributs lang déjà présents. C'est un contrôle utile. Ce
n'est pas le contrôle qu'annonçait le titre.
Quels sont donc les vrais chiffres
25 contrôles. Dix-huit correspondent à un critère de succès WCAG 2.2,
répartis sur quatorze critères distincts de niveaux A et AA : 1.1.1, 1.3.1,
1.3.5, 1.4.2, 1.4.3, 1.4.4, 2.4.1, 2.4.2, 2.4.4, 2.5.8, 3.1.1, 3.1.2, 3.3.2 et
4.1.2.
Sept relèvent des bonnes pratiques. À corriger, mais pas des manquements à la
conformité.
Avant l'audit, la page produit annonçait « 25 contrôles automatisés sur les
niveaux A et AA des WCAG 2.2 » et listait le 4.1.1 parmi les critères couverts.
Les deux affirmations étaient fausses, et la seconde était vérifiablement fausse
par quiconque avait lu la Recommandation 2.2.
Pourquoi ce n'est pas du pinaillage
Voici la partie qui m'a fait cesser de traiter cela comme un problème
d'étiquettes.
L'extension comporte un générateur pour les informations d'accessibilité
qu'exige l'Acte européen sur l'accessibilité. Il pré-remplit la section des
« obstacles connus » à partir de la dernière analyse et — c'était l'argument de
vente — associe à chaque obstacle son critère de succès WCAG.
Huit règles citant des critères erronés, obsolètes ou sans rapport écrivaient
donc ces numéros dans un document que le propriétaire du site publie comme une
déclaration juridique sur son propre service.
Une déclaration de conformité n'est pas un rapport. Un rapport qui exagère vous
gâche l'après-midi. Une déclaration publiée qui cite un critère inexistant, dans
un document que vous êtes légalement tenu de maintenir, relève d'une autre
catégorie d'erreur — et de celles que découvre votre client, pas vous.
C'est l'argument en faveur de la distinction, et c'est le seul qui compte. Un
outil qui présente chaque signalement comme un manquement WCAG gonfle deux
chiffres : le sien — 25 contrôles WCAG se lit mieux que 18 — et le vôtre. Et
c'est votre chiffre gonflé qui devient public.
Ce que j'ai changé
Chaque règle déclare désormais ce qu'elle est :
{
id: 'heading_order',
wcag: '',
level: '',
standard: 'best-practice',
...
}
Le rapport affiche le critère là où il en existe un, et Bonne pratique là où
il n'y en a pas, au lieu d'un WCAG () vide.
Le générateur exige maintenant deux conditions indépendantes avant d'écrire
un critère dans un document juridique : la règle doit être marquée comme
rattachée aux WCAG, et sa valeur doit correspondre à ^\d+\.\d+\.\d+$. L'une
ou l'autre aurait suffi à empêcher ce qui s'est produit. Je voulais celle qui
survit à quelqu'un modifiant l'autre.
Et les textes commerciaux disent désormais 18 et 7, dans le readme, la
documentation et la fiche de la place de marché. Ce fut le commit le moins
agréable de la semaine, et celui que je referais.
Si vous construisez ou achetez l'un de ces outils
Trois questions qui valent la peine, dont aucune n'exige de me croire.
Signale-t-il encore le 4.1.1 ? Trente secondes de vérification, et cela vous
dit quand le jeu de règles a été lu face à la norme plutôt que copié d'un autre
outil.
Distingue-t-il les critères de succès des bonnes pratiques ? Si chaque
signalement porte un numéro de critère, une partie au moins de ces numéros est
décorative. L'implémentation de référence sur laquelle tourne ce secteur classe
environ un quart de ses règles en bonne pratique. Un outil qui n'en a aucune
n'est pas plus strict : il est moins rigoureux.
Où va le critère après le rapport ? S'il alimente une déclaration, un badge,
un PDF ou quoi que ce soit qu'un client publie, son exactitude cesse d'être une
affaire de qualité interne.
Ce qui n'a pas changé
Les tests automatisés trouvent environ un tiers des obstacles réels
d'accessibilité. Corriger les étiquettes ne déplace pas ce chiffre. Un rapport
propre est bon signe, pas une déclaration de conformité, et les tests au clavier
et au lecteur d'écran par une personne restent le seul moyen de savoir.
Ce que l'audit a changé est plus étroit et valait, je crois, la semaine :
quand mon outil dit WCAG, désormais, il le pense.
À propos de cet article
Il est écrit par la personne qui développe l'extension dont il parle. C'est dit clairement plutôt que caché, pour que vous puissiez en tenir compte.
Accessibility Audit — WCAG & EAA Compliance Checker
Publié à l’origine sur groundedwp.com.
Top comments (0)