diff --git a/TODO.md b/TODO.md index b6e5007..d343438 100644 --- a/TODO.md +++ b/TODO.md @@ -18,5 +18,6 @@ Reference: `docs/autosave-system.md` → "HTMX v2 Migration Plan" section. - [x] Analyze root cause → `docs/filepond-crash-analysis.md` - [x] Partial fixes (Content-Type headers, onerror cleanup, load object) — insufficient, crash still reproduces -- [ ] Replace `server.load` with custom function to bypass FilePond's buggy `load-file-error` → `DID_THROW_ITEM_INVALID` dispatch (see analysis doc, Option B) -- [ ] Implement `destroyFilePondsIn()` pre-destroy abort (defense in depth) +- [x] HTMX/destroy race hypothesis investigation → `docs/filepond-race-investigation.md` (verdict: REFUTED; likely cause: Firefox XHR abort edge in server.load racing with file replacement) +- [ ] Replace `server.load` with custom fetch-based function to bypass FilePond's `createResponse` path entirely (see investigation doc, recommended next step) +- [ ] Fix `destroyFilePondsIn()` status check: `f.status === 7` (LOADING) not caught; needs to also cover LOADING and PROCESSING_QUEUED (status 9) diff --git a/docs/filepond-race-investigation.md b/docs/filepond-race-investigation.md new file mode 100644 index 0000000..d626933 --- /dev/null +++ b/docs/filepond-race-investigation.md @@ -0,0 +1,278 @@ +# HTMX/destroy race hypothesis — investigation report + +## HTMX destroy triggers + +### What fires `destroy()` and when, relative to HTMX swap lifecycle + +The only code path that destroys FilePond instances is `destroyFilePondsIn(el)`, called by the `htmx:beforeSwap` listener: + +```js +window.htmx.on("htmx:beforeSwap", onHtmxBeforeSwap); +// → onHtmxBeforeSwap(evt) { destroyFilePondsIn(evt.detail.target); } +``` + +On the **edit page** (`/admin/edit.php`), the following HTMX targets exist on page load: + +| Element | Trigger | Target selector | Scope | +|---------|---------|-----------------|-------| +| `#toast-region` | `load` | `#toast-region` | Footer `