[Prestaties][P3] Callout-dia: kwaliteitscontrole leest per toetsaanslag synchroon de beeldkop — de sync-IO-poort ziet lib/services niet #2685

Closed
opened 2026-10-31 09:47:52 +00:00 by brenno · 4 comments
Owner

Symptoom

Typen op een dia met callouts (bullets-met-beeld plus markeringen) kost per toetsaanslag op de UI-isolate 2 tot 4 synchrone realpath-aanroepen en een synchrone open/lees/sluit van de afbeelding (tot 1 MiB). Op een netwerkschijf of in een OneDrive-map onder Windows is dat merkbaar. Het is dezelfde klasse als #2624.

Oorzaak

  • deckQualityRawProvider analyseert de bewerkte dia bij elke toetsaanslag opnieuw. De memo werkt per dia-identiteit, en de bewerkte dia is na elke aanslag een nieuw object.
  • _checkCalloutClip (lib/services/slide_quality/slide_quality_analyzer_callouts.dart:155-172) roept twee functies aan:
    • resolveContainedRealPath (lib/utils/project_path.dart:19-45): tweemaal resolveSymbolicLinksSync plus typeSync;
    • readImageDimensions (lib/utils/image_dimensions.dart:27-46): existsSync, typeSync, lengthSync, openSync en readSync tot 1 MiB.
  • De poort uit #2636 (tool/check_conventions.dart:1028-1035) scant alleen lib/widgets en lib/state. Helpers in lib/services en lib/utils die vanuit build of een provider lopen, ziet hij niet. typeSync, isDirectorySync, isFileSync en isLinkSync ontbreken bovendien in de regex (r. 984-994).

Voorgestelde oplossing

  1. Lees de beeldmaat alleen opnieuw als slide.imagePath (of de versiestempel uit imageVersionOf) veranderd is ten opzichte van de vorige analyse van dezelfde dia-id. Typen in een bullet raakt het beeld niet. Een kleine map opgelost pad + versie → afmeting is genoeg.
  2. Poort: voeg typeSync|isDirectorySync|isFileSync|isLinkSync toe aan _syncIoCall, en tel lib/services/slide_quality/ mee als UI-bereikbaar, met de huidige stand als basislijn (ratchet).

Wat overeind moet blijven

  • De callout-clip-melding (#1853) verschijnt bij openen en na een beeldwissel.
  • Een onleesbaar beeld geeft geen valse positief.
  • De gedocumenteerde uitzonderingen (image_crop_dialog, de koplezing in callout_editor, #1853) houden hun reden.

Toets

Unit: analyseer dezelfde callout-dia twee keer met alleen een andere bullettekst. Het pad wordt dan één keer gelezen (teller-naad op readImageDimensions).

Gevonden bij codelezing tijdens de vervolginspectie van 31-10-2026. Niet gemeten.

## Symptoom Typen op een dia met callouts (bullets-met-beeld plus markeringen) kost per toetsaanslag op de UI-isolate 2 tot 4 synchrone realpath-aanroepen en een synchrone open/lees/sluit van de afbeelding (tot 1 MiB). Op een netwerkschijf of in een OneDrive-map onder Windows is dat merkbaar. Het is dezelfde klasse als #2624. ## Oorzaak - `deckQualityRawProvider` analyseert de bewerkte dia bij elke toetsaanslag opnieuw. De memo werkt per dia-identiteit, en de bewerkte dia is na elke aanslag een nieuw object. - `_checkCalloutClip` (`lib/services/slide_quality/slide_quality_analyzer_callouts.dart:155-172`) roept twee functies aan: - `resolveContainedRealPath` (`lib/utils/project_path.dart:19-45`): tweemaal `resolveSymbolicLinksSync` plus `typeSync`; - `readImageDimensions` (`lib/utils/image_dimensions.dart:27-46`): `existsSync`, `typeSync`, `lengthSync`, `openSync` en `readSync` tot 1 MiB. - De poort uit #2636 (`tool/check_conventions.dart:1028-1035`) scant alleen `lib/widgets` en `lib/state`. Helpers in `lib/services` en `lib/utils` die vanuit build of een provider lopen, ziet hij niet. `typeSync`, `isDirectorySync`, `isFileSync` en `isLinkSync` ontbreken bovendien in de regex (r. 984-994). ## Voorgestelde oplossing 1. Lees de beeldmaat alleen opnieuw als `slide.imagePath` (of de versiestempel uit `imageVersionOf`) veranderd is ten opzichte van de vorige analyse van dezelfde dia-id. Typen in een bullet raakt het beeld niet. Een kleine map *opgelost pad + versie → afmeting* is genoeg. 2. Poort: voeg `typeSync|isDirectorySync|isFileSync|isLinkSync` toe aan `_syncIoCall`, en tel `lib/services/slide_quality/` mee als UI-bereikbaar, met de huidige stand als basislijn (ratchet). ## Wat overeind moet blijven - De callout-clip-melding (#1853) verschijnt bij openen en na een beeldwissel. - Een onleesbaar beeld geeft geen valse positief. - De gedocumenteerde uitzonderingen (`image_crop_dialog`, de koplezing in `callout_editor`, #1853) houden hun reden. ## Toets Unit: analyseer dezelfde callout-dia twee keer met alleen een andere bullettekst. Het pad wordt dan één keer gelezen (teller-naad op `readImageDimensions`). Gevonden bij codelezing tijdens de vervolginspectie van 31-10-2026. Niet gemeten.
Author
Owner

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: de bestanden die in de oorzaak van dit issue staan, plus een regressietest.

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: de bestanden die in de oorzaak van dit issue staan, plus een regressietest.
Author
Owner

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: lib/services/slide_quality/slide_quality_analyzer_callouts.dart, tool/check_conventions.dart.

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: lib/services/slide_quality/slide_quality_analyzer_callouts.dart, tool/check_conventions.dart.
Author
Owner

Staat op main in a6b4dc066 (716509f27). De beeldkop blijft gecachet op pad, stempel en grootte, zodat een tweede analyse die alleen de bullets verandert het bestand niet opnieuw opent. typeSync valt onder de sync-IO-poort en lib/services/slide_quality telt mee. resolveContainedRealPath loopt nog bij elke analyse.

Staat op main in a6b4dc066 (716509f27). De beeldkop blijft gecachet op pad, stempel en grootte, zodat een tweede analyse die alleen de bullets verandert het bestand niet opnieuw opent. typeSync valt onder de sync-IO-poort en lib/services/slide_quality telt mee. resolveContainedRealPath loopt nog bij elke analyse.
Author
Owner

Opgelost op main in a6b4dc066. De zin „per toetsaanslag een synchrone open/lees/sluit van de afbeelding“ is gedekt door de cache in lib/utils/image_dimensions.dart; de toets eist één koplezing. De poort telt typeSync en lib/services/slide_quality/ mee (tool/check_conventions.dart). Niet meegenomen: resolveContainedRealPath loopt nog bij elke analyse.

Opgelost op main in a6b4dc066. De zin „per toetsaanslag een synchrone open/lees/sluit van de afbeelding“ is gedekt door de cache in lib/utils/image_dimensions.dart; de toets eist één koplezing. De poort telt typeSync en lib/services/slide_quality/ mee (tool/check_conventions.dart). Niet meegenomen: resolveContainedRealPath loopt nog bij elke analyse.
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#2685
No description provided.