diff --git a/slhx-js/runtime/slhx.js b/slhx-js/runtime/slhx.js index e36e7c5..9e7a6a6 100644 --- a/slhx-js/runtime/slhx.js +++ b/slhx-js/runtime/slhx.js @@ -180,8 +180,9 @@ headers: { "X-SLHX-Partial": "1", "Accept": "text/html" }, credentials: "same-origin", }); - if (!await applyResponse(response, root) && mode !== "none") { - location.href = href; + if (!await applyResponse(response, root)) { + if (mode === "none") location.reload(); + else location.href = href; return; } if (mode === "push") history.pushState({ slhx: true }, "", href); diff --git a/slhx-js/tests/runtime.rs b/slhx-js/tests/runtime.rs index bfb1ce4..cfb80b1 100644 --- a/slhx-js/tests/runtime.rs +++ b/slhx-js/tests/runtime.rs @@ -145,7 +145,16 @@ fn runtime_exposes_page_swap_hooks() { assert!(source.contains("x-slhx-title")); assert!(source.contains("x-slhx-fingerprint")); assert!(source.contains("slhx:missing-content-slot")); - assert!(source.contains("location.href = href")); + assert!(source.contains("else location.href = href")); +} + +#[test] +fn runtime_popstate_failed_partials_reload_instead_of_stale_ui() { + // req: page_swap/005 req: page_swap/006 req: runtime/004 + let source = slhx_js::RUNTIME_JS; + + assert!(source.contains("if (mode === \"none\") location.reload();")); + assert!(source.contains("if (root) navigateUrl(location.href, root, \"none\")")); } #[test]