fix(web): broncontrole van de broneditor zonder Isolate.run (#2764) #2788

Merged
brenno merged 1 commit from fix/web-deck-checks-2764 into main 2026-11-03 09:38:49 +00:00
Owner

Closes #2764

Wat er mis was

De standaardrunner van de broncontrole (deckChecksRunner) riep ook in de browser Isolate.run aan. Het web kent dat niet en gooit pas bij aanroep, ná de debounce van 350 ms. Gevolg: validatie, schrijftips en de Marp-controle kwamen niet, en de balk bleef op "Controleren…" staan. De widgettests zagen het niet, omdat ze de runner door een synchrone variant vervangen.

Wat er verandert

  • lib/services/deck_source_checks.dart: kIsWeb ? Future.sync(...) : Isolate.run(...). Dat is hetzelfde patroon als ExportService._offload, _offloadPdfLayout en de zip-exports. Debounce, de pure regels en de bescherming tegen een verlopen ronde blijven gelijk.
  • Commentaar in de runner en de editor zegt nu dat de ronde op het web op de main thread draait. Er staat geen off-thread-belofte meer voor het web.
  • docs/CHECKS.md: de browserregressies staan in het commando om expliciet te draaien.

Toetsen

Toets Platform Bewijst
markdown_deck_editor_web_test.dart Chrome (@TestOn('browser')) de editor met de standaardrunner (zonder vervanging) levert bij openen een fout en na wijzigen "geen problemen"; de pendingstatus eindigt; een verdwenen editor krijgt geen setState
deck_source_checks_test.dart native én Chrome zelfde oordeel als de directe controle; native blijft de teller van de UI-isolate staan (de ronde loopt elders), op het web niet; een verlopen ronde levert niets af

Rood vóór de fix: alle vier vielen in Chrome (Unsupported operation: dart:isolate is not supported on dart4web). Met alleen de runnerwijziging erbij zijn alle vier groen.
Sabotage native: met de runner altijd inline valt de isolatetoets (Expected: <1>, Actual: <2>).

Poorten

make check (incl. golden), make check-secrets en make sast zijn groen op deze commit. De Chrome-toetsen draaien buiten make check; ze zijn los gedraaid op deze commit.

Niet in deze PR

lib/utils/sanitize_svg.dart heeft dezelfde fout: een geïmporteerde SVG boven 256 KB gaat op het web naar Isolate.run. Die krijgt een eigen issue en een eigen PR.

🤖 Generated with Claude Code

Closes #2764 ## Wat er mis was De standaardrunner van de broncontrole (`deckChecksRunner`) riep ook in de browser `Isolate.run` aan. Het web kent dat niet en gooit pas bij aanroep, ná de debounce van 350 ms. Gevolg: validatie, schrijftips en de Marp-controle kwamen niet, en de balk bleef op "Controleren…" staan. De widgettests zagen het niet, omdat ze de runner door een synchrone variant vervangen. ## Wat er verandert - `lib/services/deck_source_checks.dart`: `kIsWeb ? Future.sync(...) : Isolate.run(...)`. Dat is hetzelfde patroon als `ExportService._offload`, `_offloadPdfLayout` en de zip-exports. Debounce, de pure regels en de bescherming tegen een verlopen ronde blijven gelijk. - Commentaar in de runner en de editor zegt nu dat de ronde op het web op de main thread draait. Er staat geen off-thread-belofte meer voor het web. - `docs/CHECKS.md`: de browserregressies staan in het commando om expliciet te draaien. ## Toetsen | Toets | Platform | Bewijst | |---|---|---| | `markdown_deck_editor_web_test.dart` | Chrome (`@TestOn('browser')`) | de editor met de standaardrunner (zonder vervanging) levert bij openen een fout en na wijzigen "geen problemen"; de pendingstatus eindigt; een verdwenen editor krijgt geen setState | | `deck_source_checks_test.dart` | native én Chrome | zelfde oordeel als de directe controle; native blijft de teller van de UI-isolate staan (de ronde loopt elders), op het web niet; een verlopen ronde levert niets af | **Rood vóór de fix:** alle vier vielen in Chrome (`Unsupported operation: dart:isolate is not supported on dart4web`). Met alleen de runnerwijziging erbij zijn alle vier groen. **Sabotage native:** met de runner altijd inline valt de isolatetoets (`Expected: <1>, Actual: <2>`). ## Poorten `make check` (incl. golden), `make check-secrets` en `make sast` zijn groen op deze commit. De Chrome-toetsen draaien buiten `make check`; ze zijn los gedraaid op deze commit. ## Niet in deze PR `lib/utils/sanitize_svg.dart` heeft dezelfde fout: een geïmporteerde SVG boven 256 KB gaat op het web naar `Isolate.run`. Die krijgt een eigen issue en een eigen PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
De standaardrunner van de debounced inspectieronde riep ook in de browser
`Isolate.run` aan. Dat gooit daar pas bij aanroep, ná de 350 ms debounce, als
onafgevangen fout: validatie, schrijftips en de Marp-controle kwamen niet en
de balk bleef op "Controleren…" staan. De widgettests zagen het niet, omdat
ze de runner door een synchrone variant vervangen.

Op het web draait de bundel nu via `Future.sync` op de main thread, zoals
`ExportService._offload` het al deed; native blijft hij op een eigen isolate.
Debounce, de pure controleregels en de bescherming tegen een verlopen ronde
blijven ongewijzigd.

Toetsen:
- test/markdown_deck_editor_web_test.dart (@TestOn browser): de editor met de
  standaardrunner, openen en wijzigen, en een verdwenen editor.
- test/deck_source_checks_test.dart (native en Chrome): zelfde oordeel als de
  directe controle; native blijft de teller van de UI-isolate staan, op web
  niet; een verlopen ronde levert niets af.

Rood vóór de fix: alle vier in Chrome ("dart:isolate is not supported on
dart4web"). Sabotage native (runner altijd inline): de isolatetoets valt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brenno merged commit 2926c2ad85 into main 2026-11-03 09:38:49 +00:00
brenno deleted branch fix/web-deck-checks-2764 2026-11-03 09:38:51 +00:00
Sign in to join this conversation.
No description provided.