fix(js): release superseded latest pending state

When data-slhx-policy=latest aborts an in-flight request, release that request's pending UI bookkeeping before starting the replacement request so pending classes, indicators, and disabled controls do not leak.

req: convention/006

req: convention/007
This commit is contained in:
slhx agent
2026-06-01 20:20:26 +02:00
parent 31b812f557
commit e6486c1b35
2 changed files with 13 additions and 1 deletions
+4 -1
View File
@@ -174,7 +174,10 @@
const policy = requestPolicy(target, eventName); const policy = requestPolicy(target, eventName);
const active = pending.get(target); const active = pending.get(target);
if (active && policy === "drop") return; if (active && policy === "drop") return;
if (active && policy === "latest") active.abort.abort(); if (active && policy === "latest") {
active.abort.abort();
showPending(target, false);
}
if (active && policy === "queue") { if (active && policy === "queue") {
const base = queues.get(target) || active.done; const base = queues.get(target) || active.done;
let queued; let queued;
+9
View File
@@ -143,6 +143,15 @@ fn runtime_supports_queued_request_policy() {
assert!(source.contains("const base = queues.get(target) || active.done")); assert!(source.contains("const base = queues.get(target) || active.done"));
} }
#[test]
fn runtime_latest_request_policy_releases_superseded_pending_state() {
// req: convention/006 req: convention/007
let source = slhx_js::RUNTIME_JS;
assert!(source.contains("if (active && policy === \"latest\") {\n active.abort.abort();\n showPending(target, false);\n }"));
assert!(source.contains("if (pending.get(target)?.abort === abort)"));
}
#[test] #[test]
fn runtime_exposes_page_swap_hooks() { fn runtime_exposes_page_swap_hooks() {
let source = slhx_js::RUNTIME_JS; let source = slhx_js::RUNTIME_JS;