Blog ·
Een toegankelijkheidsuitzondering die zichzelf meet
Elke toegankelijkheidscontrole krijgt een uitzonderingenlijst. De onze telt er twee, elk met een meting erbij, en de ronde faalt zodra er een niet meer past.
Door Provibr
Richt een geautomatiseerde toegankelijkheidscontrole op een echt product en je krijgt een getal. Repareer alles wat hij vond en je krijgt een kleiner getal. Ergens in dat proces stuit je op een bevinding die werkelijk geen defect is, en op dat moment schrijf je je eerste uitzondering.
Dat is het interessante deel, want een uitzonderingenlijst is de plek waar een toegankelijkheidsprogramma stilletjes sterft. Hij begint met twee goed beargumenteerde regels. Een jaar later staan er elf, waarvan er drie nergens meer op passen, waarvan er één een echt probleem verbergt, en niemand kan zich nog herinneren waarom ze er staan. Het rapport zegt nul en betekent niets.
We hebben de controle voor ons paneel deze maand gebouwd. Hij meldt geen enkele bevinding, op welke ernstgraad dan ook, en dit stuk gaat vooral over waarom we dat getal op zichzelf niet geloven.
Drie regels stonden standaard uit, en twee ervan verborgen bevindingen
De bibliotheek die we gebruiken levert een aantal regels standaard uitgeschakeld. We hebben gecontroleerd welke, door het te vragen in plaats van het aan te nemen: naam en inhoud die niet overeenkomen, tabelcellen zonder koppen, en doelgrootte staan alle drie standaard uit.
Twee daarvan leverden echte bevindingen op ons paneel op, samen 36, waaronder allebei de twee punten die een eerdere ronde had laten openstaan. Een controle die de standaardregelset draait is dus groen op precies de fouten waar iemand al naar was gaan zoeken, en dat is de ergste soort groen: hij is niet te onderscheiden van een product dat in orde is.
Ze staan nu expliciet aan, en die ene beslissing veranderde de nulmeting meer dan welke andere configuratiekeuze ook.
Negen talen, want één taal is kruis of munt
De taalkiezer in onze kopbalk toont een code van twee letters en heeft een toegankelijke naam die zegt om welke taal het gaat. In het Engels leest de knop EN en heet hij "Language: English", en de regel slaagt, want en komt toevallig voor in English.
In het Nederlands faalt hij. Hetzelfde component, dezelfde code, dezelfde opmaak.
Gemeten over alle negen talen die we leveren: drie falen en zes slagen, en elk van die zes slaagt bij toeval: en in English, de in Deutsch, fr in Français, it in Italiano, es in Español, ro in Română. Eén taal testen is hier vacuüm groen.
Dus draait de marketingroute elke taal op de regels waarvan de uitkomst van taal kan afhangen. Het kost tijd en het is de enige manier waarop die bevinding bestaat.
De nulmeting, en waar hij uit bestond
De eerste volledige ronde over marketing, inloggen en het ingelogde paneel meldde 3 kritieke, 51 ernstige, 72 gemiddelde en 6 lichte bevindingen. Acht regels waren samen goed voor het geheel.
| Regel | Bevindingen |
|---|---|
| inhoud niet binnen een landmark | 60 |
| naam en inhoud komen niet overeen | 33 |
| kleurcontrast | 13 |
| geen main-landmark | 9 |
| lege tabelkop | 6 |
| scrollbaar gebied niet focusbaar | 5 |
| tabelcel zonder kop | 3 |
| koppenvolgorde | 3 |
Bijna alles was structureel en niet visueel. De inlogpagina's en het paneel hadden geen main-element en geen skiplink. De tabellen in de artikelen hadden koppen die leeg waren. Codeblokken scrollen horizontaal en waren niet met het toetsenbord te bereiken, wat betekent dat een toetsenbordgebruiker de rechterkant van een lang commando eenvoudigweg niet kan lezen. Het tabblad met statistieken zette een grafiekkop op het verkeerde niveau onder de paginakop.
Na de reparaties: nul, nul, nul, nul. Wat ons terugbrengt bij de vraag wat die nul waard is.
Twee uitzonderingen, elk met een meting
De uitzonderingenlijst telt precies twee posten, en elk daarvan draagt een reden én een meting die werkelijk is uitgevoerd.
Kleurcontrast onder geforceerde kleuren. Het paneel draaien met geforceerde kleuren aan leverde 610 contrastfouten op over twaalf pagina's. Dat is geen productdefect, het is een wisselwerking tussen de controle en de browser. De controle leest -webkit-text-fill-color vóór color, en Chrome forceert de eerste niet. Op de inlogpagina, op dezelfde kop, in dezelfde paginalading:
| eigenschap | normaal | geforceerde kleuren |
|---|---|---|
color | rgb(16, 19, 25) | rgb(255, 255, 255) |
-webkit-text-fill-color | rgb(16, 19, 25) | rgb(16, 19, 25) |
| paginaachtergrond | rgb(244, 246, 248) | rgb(0, 0, 0) |
Hij vergelijkt dus de opgegeven voorgrond met de geforceerde achtergrond en meldt 1,12 op 1 waar het scherm in werkelijkheid 21 op 1 toont. In die modus geldt de contrasteis toch al niet, want het palet is van de gebruiker.
De regel staat uit in die ene modus, en de reden wordt bij elke ronde opnieuw gemeten. Repareert Chrome of de controle dit, dan faalt die zelftoets en moet de uitzondering opnieuw beargumenteerd worden. Een uitzondering zonder zelftoets is een stille allowlist.
De accountknop. De regel over naam en inhoud die niet overeenkomen slaat aan op de gebruikersmenuknop in het paneel. Er zijn zes kandidaat-namen op de echte knop gezet en de regel is tegen elk daarvan gedraaid. Hij slaagt alleen wanneer de naam letterlijk de tekst DKDemo Klant€0.00 bevat, waarin de initialen en de accountnaam aan elkaar geschreven zijn, en hij faalt met diezelfde tekst uit elkaar geschreven als DK Demo Klant €0.00, en met de echte naam. Alle drie de kinderen van die knop zijn verborgen voor hulptechnologie, wat de regel negeert.
Slagen zou dus betekenen dat een schermlezer DKDemo als één woord voorleest. Dat is een slechtere knop, aangenomen om te voldoen aan een regel die de bibliotheek zelf als experimenteel markeert en uitgeschakeld levert. Aan de functionele eis is voldaan: iemand die spraakbesturing gebruikt zegt "Demo Klant", en dat staat in de naam.
De uitzondering die stierf zonder iets te zeggen
Dit is het deel dat het hele artikel waard is.
Een uitzondering moet het element herkennen waar hij op slaat. De eigen CSS-selector van de controle is daar niet stabiel genoeg voor: dezelfde accountknop werd op de ene pagina op de ene manier aangeduid en op de volgende op een andere, dus een uitzondering die op de selector past dekt de ene pagina en de andere niet. In plaats daarvan past de uitzondering op een markeerattribuut dat het component zelf zet, in het HTML-fragment van het element.
Het fragment dat de controle meldt is afgekapt op 140 tekens.
Het toegankelijke opschrift van de knop groeide, want het accounttegoed werd eraan toegevoegd. De markering schoof voorbij de grens van 140 tekens. Het fragment eindigde nu op ... Credit €0.00." data-us. De uitzondering paste nergens meer op, stil, en de ronde meldde 27 ernstige bevindingen die hij de ronde ervoor had gedekt.
Niets aan die storing is luid. De uitzondering gaf geen fout, de lijst kromp niet, er veranderde geen configuratie. Een wijziging in de interface van een ongerelateerde functie verschoof een tekst, en een stuk veiligheidsinfrastructuur hield op met werken. De reparatie is passen op de niet-afgekapte openingstag, die de controle ook levert.
De algemene les is groter dan toegankelijkheid: alles wat op afgekapte tekst past is een bewaking die faalt op precies het moment dat er iets verandert, en dat is het enige moment waarop hij nodig was.
Een uitzondering die nergens op past laat de ronde falen
Elke post wordt geteld. Eindigt een volledige ronde met een uitzondering die nul keer is geraakt, dan is de ronde rood.
Dat is dezelfde vorm als een lijst met constanten elders in deze codebase, en om dezelfde reden: een uitzondering die nergens meer op slaat hoort verwijderd te worden en niet te blijven staan. Blijft hij staan, dan is het één regel meer waar de volgende persoon over moet nadenken, en uiteindelijk wordt hij helemaal niet meer gelezen.
Het tellen geldt alleen voor een volledige ronde. Beperk de ronde tot één route of één modus en "niet geraakt" betekent niets.
Bewijzen dat een nul een echte nul is
Doelgrootte, de eis dat een bedieningselement minstens 24 bij 24 pixels is, is een van de drie regels die de bibliotheek uitgeschakeld levert. Wij hebben hem aangezet en er een eigen tweede meting naast geschreven, want de twee uitzonderingen die de norm zelf toestaat moeten gemeten worden en niet aangenomen. De laatste ronde onderzocht 2056 doelen. 155 bleven onder de maat. 70 daarvan vielen onder de inline-uitzondering van de norm, wat betekent dat het doel binnen een zin staat, en 85 onder de afstandsuitzondering, wat betekent dat een cirkel van 24 pixels eromheen niets anders raakt. Er bleef nul over.
Een nul uit een meetscript dat je zelf hebt geschreven is niet te onderscheiden van een meetscript dat niets kan melden. Dus injecteert een apart script een knop van 16 bij 16 pixels naast een buur op een levende pagina en draait daar dezelfde meetcode overheen, gelezen uit het bronbestand in plaats van gekopieerd. Hij gaat van 0 naar 1 en noemt het element. Het meldpad werkt, dus de nul is een uitslag en geen stilte.
Beide uitzonderingen van de norm worden gemeten en niet geraden. Inline betekent dat de berekende display-waarde exact inline is en dat de dichtstbijzijnde blokvoorouder ook andere tekst bevat, wat is wat "staat in een zin" werkelijk betekent. Dat is geen lijst met klassenamen. En de afstandstoets meet de cirkel tegen de rechthoeken van de andere doelen in plaats van tegen hun cirkels, wat strenger is dan de norm: hij kan een vals rood opleveren, nooit een vals groen.
Wat een machine niet kan
Er is een kort draaiboek van vier poorten die een mens nodig hebben, want het zijn de dingen die geen enkele controle bereikt: of de leesvolgorde ergens op slaat en een aankondiging werkelijk aankomt, of een route doenlijk is met alleen een toetsenbord in plaats van alleen maar bereikbaar, of de opmaak leesbaar blijft op 200 procent in plaats van er alleen maar op te passen, en of het scherm nog iets betekent in het eigen palet van de gebruiker.
Die vier staan open. Dat zeggen hoort bij het punt: een rapport dat nul zegt en niet zegt waar het niet naar gekeken heeft is dezelfde fout als een uitzondering zonder meting.
Wat wij zouden opschrijven
- Vraag de bibliotheek welke regels uit staan, neem het niet aan. In de uitgeschakelde regels zaten onze bevindingen.
- Draai elke taal die je levert op elke regel waarvan de uitkomst van tekst kan afhangen.
- Geef elke uitzondering een reden en een meting, opgeschreven op de plek waar de uitzondering staat.
- Laat een uitzondering die nergens op past de ronde rood maken.
- Pas een bewaking nooit toe op afgekapte tekst.
- Bewijs je nullen door iets te injecteren dat gevangen zou moeten worden.
- Publiceer wat een machine niet kan controleren, zodat het getal gelezen wordt voor wat het is.
Dezelfde reflex, toegepast op vertalingen in plaats van op opmaak, staat in zestienduizend sleutels in negen talen.
Uit het paneelwerk bij Provibr.