Toegankelijkheid: bronscan in accessibility_labels_test.dart mist kale IconButton (WCAG 4.1.2) #1248

Closed
opened 2026-08-04 23:08:35 +00:00 by brenno · 0 comments
Owner

Toegankelijkheid — bronscan in accessibility_labels_test.dart heeft een blinde vlek

De vangrail in test/accessibility_labels_test.dart bewaakt "elke knop heeft een toegankelijke naam" (WCAG 4.1.2). Hij doet dat op twee manieren:

  1. Widgettest: pompt 6 van ~30 editors en inspecteert de semantiekboom.
  2. Bronscan: zoekt in alle lib/**/*.dart naar Tooltip(message: …, child: IconButton(…)) zonder tooltip: op de knop — het patroon waarbij een Tooltip-wrapper lijkt te benoemen maar dat niet doet.

De widgettest dekt slechts een fractie van het oppervlak (6 editors, 0 van de ~53 dialogen, niet de presentatiemodus). De bronscan moet de rest dekken, maar herkent slechts één van de twee manieren waarop een knop naamloos kan zijn:

  • Tooltip(child: IconButton()) zonder tooltip: op de knop — wordt herkend.
  • IconButton() zonder tooltip: en zonder Tooltip-wrapper — wordt niet herkend.

Dat is de symmetrische fout. De poort belooft in zijn eigen commentaar "covers everything, including the code nobody pumps", maar dekt slechts de helft van de manieren waarop een knop naamloos kan zijn.

Bewijs

Tijdens de audit gevonden met een script dat de constructor-argumenten van elke IconButton parset tot de matchende haak en controleert op tooltip: (en Icon(semanticsLabel:) als alternatief). Dat vond twee kale knoppen — zie #1247. De bronscan in de test liet ze stil passeren.

Voorstel

Breid de bronscan uit met het symmetrische patroon: naast "Tooltip om IconButton" ook "IconButton zonder tooltip: in zijn eigen argumentenlijst". Het script dat dit vond (constructor-argumenten parsen tot de matchende haak, aanhalingstekens overslaand) is precies deze check en is ~25 regels. Eén extra test()-blok in hetzelfde bestand, met een zelftest die een kale IconButton rood maakt.

Dit sluit de klasse universeel — niet alleen de twee bewezen gevallen — en maakt de widgettest tot een aanvulling op focusvolgorde/leesvolgorde in plaats van de enige dekking van naamloze knoppen.

Scope

Raakt geen bestandsformaat, opslag, afhankelijkheid of publieke belofte — bewaker niet nodig.

## Toegankelijkheid — bronscan in `accessibility_labels_test.dart` heeft een blinde vlek De vangrail in `test/accessibility_labels_test.dart` bewaakt "elke knop heeft een toegankelijke naam" (WCAG 4.1.2). Hij doet dat op twee manieren: 1. **Widgettest**: pompt 6 van ~30 editors en inspecteert de semantiekboom. 2. **Bronscan**: zoekt in alle `lib/**/*.dart` naar `Tooltip(message: …, child: IconButton(…))` zonder `tooltip:` op de knop — het patroon waarbij een `Tooltip`-wrapper lijkt te benoemen maar dat niet doet. De widgettest dekt slechts een fractie van het oppervlak (6 editors, 0 van de ~53 dialogen, niet de presentatiemodus). De bronscan moet de rest dekken, maar herkent slechts **één** van de twee manieren waarop een knop naamloos kan zijn: - ✅ `Tooltip(child: IconButton())` zonder `tooltip:` op de knop — wordt herkend. - ❌ `IconButton()` zonder `tooltip:` en zonder `Tooltip`-wrapper — **wordt niet herkend**. Dat is de symmetrische fout. De poort belooft in zijn eigen commentaar *"covers everything, including the code nobody pumps"*, maar dekt slechts de helft van de manieren waarop een knop naamloos kan zijn. ### Bewijs Tijdens de audit gevonden met een script dat de constructor-argumenten van elke `IconButton` parset tot de matchende haak en controleert op `tooltip:` (en `Icon(semanticsLabel:)` als alternatief). Dat vond twee kale knoppen — zie #1247. De bronscan in de test liet ze stil passeren. ### Voorstel Breid de bronscan uit met het symmetrische patroon: naast "Tooltip om IconButton" ook "IconButton zonder `tooltip:` in zijn eigen argumentenlijst". Het script dat dit vond (constructor-argumenten parsen tot de matchende haak, aanhalingstekens overslaand) is precies deze check en is ~25 regels. Eén extra `test()`-blok in hetzelfde bestand, met een zelftest die een kale `IconButton` rood maakt. Dit sluit de klasse universeel — niet alleen de twee bewezen gevallen — en maakt de widgettest tot een aanvulling op focusvolgorde/leesvolgorde in plaats van de enige dekking van naamloze knoppen. ### Scope Raakt geen bestandsformaat, opslag, afhankelijkheid of publieke belofte — `bewaker` niet nodig.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1248
No description provided.