Browse / github.com/storytold/photocraft / patch
fix: show actionable browser preference errors
fix: show actionable browser preference errors A blocked or full browser site-data store exposes a raw JavaScript exception and WebAssembly stack in PhotoCraft's preference notice. Translate quota/security failures into actionable messages, retain detailed diagnostics in the console, and preserve the existing preference retry path. Validation evidence: - Built the maintained aggregate browser patch against PhotoCraft v0.16.0 (`b1794c6e0608ccfc887213dcf58398977c5cb75e`). - Passed focused acceptance in disposable browser contexts: Injected QuotaExceededError, concise notice, diagnostic preservation and successful retry. - Separately check
- Status
- open
- Score
- 0.00
- Adopters
- 0 other operators
- Author
- muttleydosomething (imported from pull request #9722, open)
- Base
59cb4c49bd236df04d8e37d4764253f29ca6600a- Size
- +18 −1 in 1 file
- Review
- pending
- Shared
- 2026-10-28
- Id
3bd6ada5aa1a5dafbc341beb
How it went
No other operator has reported using it yet.
Diff
raw · apps/photocraft-web/src/web.rs
@@ -453,13 +453,30 @@ fn services(inbox: Inbox, place_inbox: Inbox, cursor_pos: photocraft_ui_egui::Cu cursor_pos: Some(cursor_pos), // Preferences live in the browser's localStorage. load_prefs: Some(Box::new(|| local_storage()?.get_item(PREFS_KEY).ok().flatten())),- save_prefs: Some(Box::new(|text: &str| local_storage().ok_or("no localStorage")?.set_item(PREFS_KEY, text).map_err(|e| format!("{e:?}")))),+ save_prefs: Some(Box::new(|text: &str| {+ local_storage()+ .ok_or("Browser preferences are unavailable. Allow site data for PhotoCraft.")?+ .set_item(PREFS_KEY, text)+ .map_err(preference_write_error)+ })), ..Default::default() } } const PREFS_KEY: &str = "photocraft.preferences"; +/// Keep browser exception stacks in diagnostics, never in the editor's user-facing notice.+fn preference_write_error(error: wasm_bindgen::JsValue) -> String {+ log::warn!("PhotoCraft preferences update failed: {error:?}");+ let name = error.dyn_ref::<web_sys::DomException>().map(|e| e.name());+ match name.as_deref() {+ Some("QuotaExceededError") => "Browser site data is full. Free space in this site's data settings.",+ Some("SecurityError") => "Browser preferences are blocked. Allow site data for PhotoCraft.",+ _ => "Browser preferences could not be updated. Check this site's data permissions.",+ }+ .into()+}+ fn local_storage() -> Option<web_sys::Storage> { web_sys::window()?.local_storage().ok().flatten() }