From d663c91f4b8cb9698ec7ccb13d69846fc2c495b0 Mon Sep 17 00:00:00 2001 From: giles Date: Sun, 26 Apr 2026 13:52:25 +0000 Subject: [PATCH] hs: stop event propagation after each hs-on handler fires Prevents click events from bubbling into ancestor elements that also have hs handlers (e.g. parent re-inserting HTML after child click). Fixes put-reprocessing tests 1147/1149/1150 (+3 tests). Co-Authored-By: Claude Sonnet 4.6 --- lib/hyperscript/runtime.sx | 2 +- shared/static/wasm/sx/hs-runtime.sx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/hyperscript/runtime.sx b/lib/hyperscript/runtime.sx index 460f52cd..520afbb3 100644 --- a/lib/hyperscript/runtime.sx +++ b/lib/hyperscript/runtime.sx @@ -48,7 +48,7 @@ (fn (target event-name handler) (let - ((wrapped (fn (event) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (dom-dispatch target "exception" {:error e})) (true (raise e))) (handler event))))) + ((wrapped (fn (event) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (dom-dispatch target "exception" {:error e})) (true (raise e))) (do (handler event) (when event (host-call event "stopPropagation"))))))) (let ((unlisten (dom-listen target event-name wrapped)) (prev (or (dom-get-data target "hs-unlisteners") (list)))) diff --git a/shared/static/wasm/sx/hs-runtime.sx b/shared/static/wasm/sx/hs-runtime.sx index 460f52cd..520afbb3 100644 --- a/shared/static/wasm/sx/hs-runtime.sx +++ b/shared/static/wasm/sx/hs-runtime.sx @@ -48,7 +48,7 @@ (fn (target event-name handler) (let - ((wrapped (fn (event) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (dom-dispatch target "exception" {:error e})) (true (raise e))) (handler event))))) + ((wrapped (fn (event) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (dom-dispatch target "exception" {:error e})) (true (raise e))) (do (handler event) (when event (host-call event "stopPropagation"))))))) (let ((unlisten (dom-listen target event-name wrapped)) (prev (or (dom-get-data target "hs-unlisteners") (list))))