forked from 1b-agent/opencadstudio-upstream
web: harden drop-open and autosave after adversarial review
Review of the drop-open and autosave commits surfaced one blocker and five majors; all are fixed here, and two claims in the autosave commit message are corrected by this one: tab close does NOT clear a snapshot (matches native .sv$ semantics — saving, restoring, discarding, exit, and the capped boot scan do), and serialization runs on the main thread between awaits, not off the paint path. - The restore prompt can no longer appear with no entries (empty "Recover Drawing" modal on every boot once the autosave dir exists). - Restore no longer consumes the snapshot before the open succeeds: the recovered drawing goes through the guarded drop queue, and the snapshot is deleted only after the tab opens; cancel or parse failure keeps the only copy. - Saving during an autosave round defers its snapshot cleanup until the round finishes, so a stale round can no longer resurrect a snapshot newer than the save. - The boot scan no longer deletes snapshots by mtime comparison (re-opening a drawing refreshes the recent copy's mtime, which silently destroyed wanted snapshots); GC is now a 16-entry cap with oldest-first eviction. - OPFS write failures abort the writable stream (a leaked lock could stall the same-key writer and disable autosave for the session), and DOMException errors now carry their name/message. - Empty (crash-window) snapshots are never offered; an unreadable one warns and stays discardable instead of looping forever. - Drop-open polish: reads start inside the handler and complete in drop order (legacy WebKit safety, deterministic multi-file order), dragenter is canceled too, the install guard only latches on success, non-drawing drops don't steal propagation, a lock-poison panic can't cross into JS, and re-dropping an open drawing no longer risks clobbering an in-flight open (it re-queues). - The model-space sheet floor is per-axis (a thin 8x400 mm profile keeps its length) and centers content on the enlarged page.
This commit is contained in:
1 parent
101d167ebc
commit
3edbc5b7c8
8 files changed
+386
-118
No files matched your search
+13
-11
@@ -832,17 +832,19 @@ bg={bg_ms:.1}ms n={view_count}"
|
||||
self.constraint_bar_display,
|
||||
)
|
||||
.into_iter()
|
||||
.map(|(id, point, direction, label, is_conflicting, hover_points)| {
|
||||
let selected = tab.scene.selected_constraint == Some(id);
|
||||
(
|
||||
point,
|
||||
direction,
|
||||
label,
|
||||
is_conflicting,
|
||||
selected,
|
||||
hover_points,
|
||||
)
|
||||
})
|
||||
.map(
|
||||
|(id, point, direction, label, is_conflicting, hover_points)| {
|
||||
let selected = tab.scene.selected_constraint == Some(id);
|
||||
(
|
||||
point,
|
||||
direction,
|
||||
label,
|
||||
is_conflicting,
|
||||
selected,
|
||||
hover_points,
|
||||
)
|
||||
},
|
||||
)
|
||||
.collect()
|
||||
};
|
||||
crate::ui::overlay::selection_overlay(
|
||||
|
||||
Reference in new issue
Block a user