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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user