From 4295e93da7e8bb55dfbf41ff8b0a60a473b711dc Mon Sep 17 00:00:00 2001 From: slhx agent Date: Mon, 1 Jun 2026 20:24:43 +0200 Subject: [PATCH] fix(js): release parallel pending state When data-slhx-policy=parallel runs overlapping requests against one target, release pending UI bookkeeping for each completed request instead of only the last pending handle. req: convention/006 req: convention/007 req: convention/008 --- slhx-js/runtime/slhx.js | 2 ++ slhx-js/tests/runtime.rs | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/slhx-js/runtime/slhx.js b/slhx-js/runtime/slhx.js index b1a2de1..f935f85 100644 --- a/slhx-js/runtime/slhx.js +++ b/slhx-js/runtime/slhx.js @@ -214,6 +214,8 @@ if (pending.get(target)?.abort === abort) { pending.delete(target); showPending(target, false); + } else if (policy === "parallel") { + showPending(target, false); } finish(); } diff --git a/slhx-js/tests/runtime.rs b/slhx-js/tests/runtime.rs index e9da75e..7530e1a 100644 --- a/slhx-js/tests/runtime.rs +++ b/slhx-js/tests/runtime.rs @@ -152,6 +152,17 @@ fn runtime_latest_request_policy_releases_superseded_pending_state() { assert!(source.contains("if (pending.get(target)?.abort === abort)")); } +#[test] +fn runtime_parallel_request_policy_releases_each_pending_state() { + // req: convention/006 req: convention/007 req: convention/008 + let source = slhx_js::RUNTIME_JS; + + assert!(source.contains("else if (policy === \"parallel\") {\n showPending(target, false);\n }")); + assert!(source.contains("const pendingClassStates = new WeakMap()")); + assert!(source.contains("const indicatorStates = new WeakMap()")); + assert!(source.contains("const disabledStates = new WeakMap()")); +} + #[test] fn runtime_exposes_page_swap_hooks() { let source = slhx_js::RUNTIME_JS;