Webexport meldt 'geëxporteerd naar' ook als de browserdownload nooit startte #1902
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#1902
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
Op web is elke uitgang een browserdownload — er is geen bestandssysteem. Elke
downloadroute die via
FilePicker.saveFileloopt meldt succes zodra er geenexception viel. Maar
FilePicker.saveFilegeeft op web altijdnullterug,ook wanneer het goed ging (
file_picker_web3.0.1,lib/src/file_picker_web.dart:238-278: Blob + anker +click(), danreturn null). Er is dus geen signaal dat de download werkelijk startte — ener valt er ook geen te krijgen:
anchor.click()gooit niets wanneer de browserde download tegenhoudt.
Gevolg: de gebruiker leest "Pakket geëxporteerd naar: deck.ocideck" terwijl er
niets in de downloadmap staat.
Waar het staat
lib/services/export_service.dart:251-262return ExportResult.ok(fileName)staat onvoorwaardelijk ná desaveFile-aanroepenlib/services/document_export_service.dart:422-427return webFileName;idemlib/services/file/file_service_package.dart:53-58(downloadPackage)return name;idemlib/services/file/file_service_dossier.dart:72-88(downloadDossier)return name;idemlib/widgets/shell/shell_actions_export.dart:51en:120Ter vergelijking, en om de reikwijdte eerlijk te houden: de eigen
downloadTextFile(lib/utils/file_download_web.dart) geeft wel een boolterug, en
_saveAsDownload(lib/state/deck_provider.dart:354) enlib/widgets/presentation/session_export.dart:307kijken daar ook naar. Maardie bool betekent alleen "er viel geen exception"; hij ziet net zomin of het
bestand ergens aankwam. Beide routes hebben dus dezelfde blinde vlek — de
FilePicker-route heeft er alleen niet eens een bool bij.De concrete manier waarop het misgaat
Browsers laten de eerste automatische download door en zetten een poort voor de
tweede en verder (Chrome vraagt "meerdere bestanden downloaden?"; geweigerd of
geblokkeerd is stilzwijgend niets). Twee plekken vuren meer dan één download
achter elkaar af:
…-redactie.json-manifest, en bij salts de verificatiesleutels(
_redactionManifestFiles,export_service.dart:475-493). Stopt de browserna de eerste, dan houdt de auteur een geredigeerd rapport in handen en
gelooft hij dat commitments én sleutels mee zijn — precies wat de comment op
export_service.dart:255-258wilde voorkomen.(
session_export.dart:302-308).Op desktop is die volgorde met zorg geregeld — manifest eerst, dan het grote
bestand, met de reden erbij (
export_service.dart:267-272). Op web valt diezorg weg zonder dat iemand het merkt.
Wat vaststaat en wat niet
Vast, uit de code:
saveFilegeeft op web altijdnull, en alle vier deroutes melden onvoorwaardelijk succes. De multi-download-poort van de browser
is de aannemelijke aanleiding, maar is niet in een echte browser nagemeten —
dat hoort bij de repro te gebeuren vóór de reparatie.
Voorgestelde oplossing
als download: ". Klein, en hoe dan ook waar.
die uit meer dan één bestand bestaat, gaat op web als één ZIP de deur uit.
Eén download, geen browserpoort, en het manifest kan niet los zoekraken.
Raakt de vraag hoe de ontvanger uitpakt, dus beslis dit vóór punt 1.
FilePicker.saveFileaanmaar de eigen Blob+anker uit
file_download_web.dart, achter eeninjecteerbare seam. Verwacht daar niet meer van dan het vangen én loggen van
exceptions; een door de browser geblokkeerde download blijft voor de pagina
onzichtbaar.
Regressietest
De test die dit had moeten vangen bestaat niet, en kan nu ook niet bestaan:
FilePicker.saveFilewordt statisch aangeroepen, er is niets om tegen temeten. Die seam is meteen het echte werk.
precies één download-aanroep, niet drie.
ExportResult.okuit — nu is datonmogelijk te toetsen.
Repro
(slotje → Site-instellingen).
ontbreken.
Herkomst
Gevonden bij het nalopen van de downloadroutes van de webbuild, naast #1720
(dat de ontbrekende
kIsWeb-tak in de documentexport repareerde — die tak iser nu, maar meldt succes op dezelfde onvoorwaardelijke manier).
Labels
bug
Opgepakt. Tak: fix/webdownload-succesmelding-1902. Verwachte reikwijdte: lib/utils/file_download*.dart (seam + bytes-download), lib/services/export_service.dart, lib/services/document_export_service.dart, lib/services/file/file_service_package.dart, lib/services/file/file_service_dossier.dart, lib/widgets/presentation/session_export.dart, lib/widgets/shell/shell_actions_export.dart, plus tests en l10n.
Opgelost en op
main:1948e97c2(PR #1906).Wat er nu gebeurt. Eén export vertrekt als één download. Bestaat hij uit meer
dan één bestand — een geredigeerd rapport met zijn manifest en sleutels, een
sessie met een bestand per dia — dan gaat het als één ZIP, genoemd naar het
hoofdbestand plus
.zip. Eén bestand gaat nog steeds als zichzelf. De webversiemeldt aangeboden als download in plaats van geëxporteerd naar, want de pagina
kan niet zien of het bestand in de downloadmap aankwam. Een geweigerde download
levert een echte fout op in plaats van een bestandsnaam die nergens staat.
Meer dan de vier paden uit de melding. Het stijlprofiel en het RFC
3161-tijdstempelverzoek deden hetzelfde. Die tweede was de vervelendste: hij
bewaarde de nonce ná de export, terwijl de comment daar met zoveel woorden zegt
dat dat pas mag als het verzoek de deur uit is. In
lib/staat nu geen enkeleFilePicker.saveFile-aanroep meer.Eén ding erbij dat hier niet in stond. De conditional import koos onder
dart2wasm stilzwijgend de lege stub —
dart.library.htmlis daar onwaar. Op eenwasm-build zou élke download een lege huls zijn geweest. Nagemeten in de
glue-module van een echte
--wasm-build: metdart.library.htmlstaat.downloader 0× in enrevokeObjectURL1×, metdart.library.js_interop1× en2×. Staat nu op
js_interop, zoalsclipboard_html.dartenpresenter_fullscreen.dartal deden. Relevant voor #1734.Toetsing. Zeventien toetsen erbij. De hele webtak lag buiten bereik van de
suite (
kIsWebis op de VM altijdfalse); twee@visibleForTesting-haken indownload_delivery.dartmaken hem meetbaar. Rood geproefd door de afleverlaagterug te zetten op het oude gedrag: vier toetsen vallen dan om, op precies de
twee claims uit dit issue.
make checkgroen, plusmake build-webenflutter build web --wasm.Wat níet is nagemeten, zoals hierboven al stond: dat de
multi-download-poort van de browser dit werkelijk triggert, is niet in een echte
browser bevestigd. De code-analyse staat vast en de reparatie is hoe dan ook de
goede kant op — één download kan die poort niet raken — maar de repro-stappen in
dit issue zijn nog steeds de manier om het met eigen ogen te zien.