Documenteditor kan na sluiten crashen terwijl slim plakken nog wacht #1665
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1665
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Probleem
Slim plakken wacht achtereenvolgens op beeldimport en meerdere klembordaanroepen. Na die awaits wordt zonder mounted-controle de editor/controller/ref gebruikt. Als het documenttabblad in de tussentijd sluit, kan de vervolgcode een disposed State, controller of context aanspreken.
Reproductie
Verwacht
Na dispose stopt de plakactie stil en raakt zij geen editorstate meer.
Technische aanwijzing
lib/widgets/document_editor_screen.dart:_smartPaste controleert mounted alleen rond meldingen, niet vóór _insertBlock, _insertPastedMarkdown of verdere ref/controller-toegang na awaits. Andere async invoegpaden doen die controle wel.
Gevonden bij audit van commit
d439638c6b.Triage: accepted
Bevestigd tegen
main(e93ef205c)._smartPastestaat inlib/widgets/parts/document_editor_layouts.dart. Naawait imageService.pasteImageDetailed(...)volgt direct_insertBlock('')— demounted-controle staat pas eromheen bij de snackbar. Hetzelfde geldt naawait Clipboard.getData(...)enawait readClipboardHtml():_insertBlock(resolved.text)en_insertPastedMarkdown(resolved.text)draaien zonder controle. Beide raken_controller(nadisposegooit die) enref.Andere asynchrone invoegwegen in dit scherm doen die controle wél; dit pad is de uitzondering.
Oplossingsrichting
Na élk
await-punt eenif (!mounted) return false;, dus vier plekken: na de beeldimport, naClipboard.getData, nareadClipboardHtml, en vóór de laatste invoeging. Geen melding, geen log — de gebruiker heeft het tabblad zelf gesloten; stil stoppen is het juiste gedrag.Wat ik hier níét zou doen: het
use_build_context_synchronously-gat afdekken met een opgeslagenScaffoldMessengerState. Dat maakt de melding veilig maar laat de echte fout (schrijven naar een weggegooide controller) staan.Regressietest (verplicht)
test/document_editor_screen_test.dart: nep-klembord/beeldservice met eenCompleter, tabblad sluiten, dan de future afronden →tester.takeException()is null én de notifier heeft niets ontvangen. Let op dat de test óók de tweede tak (klembord) dekt, niet alleen de beeldtak.Kosten
Klein. Zelfde klasse als #1636, dat net geland is (
d52782f8c) — kijk of daar een patroon of hulpstuk uit is gekomen dat hier hergebruikt kan worden.Prioriteit
Middelhoog: een crash is zichtbaar en kost onopgeslagen werk.