HS: throw respond via exception event (+2 tests)
`hs-on` now wraps each event handler in a `guard` that catches thrown
exceptions and re-dispatches them as an `exception` DOM event on the
same target with `{error: e}` as detail. The `on exception(error)`
handler, registered the same way, receives the event and destructures
`error` from the detail. Wrapping skips `exception`/`error` event
handlers to avoid infinite loops — those bubble out as before.
Suite hs-upstream-throw: 5/7 → 7/7. Smoke 0-195: 162/195 unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -25,10 +25,12 @@
|
|||||||
(fn
|
(fn
|
||||||
(target event-name handler)
|
(target event-name handler)
|
||||||
(let
|
(let
|
||||||
((unlisten (dom-listen target event-name handler))
|
((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)))))
|
||||||
(prev (or (dom-get-data target "hs-unlisteners") (list))))
|
(let
|
||||||
(dom-set-data target "hs-unlisteners" (append prev (list unlisten)))
|
((unlisten (dom-listen target event-name wrapped))
|
||||||
unlisten)))
|
(prev (or (dom-get-data target "hs-unlisteners") (list))))
|
||||||
|
(dom-set-data target "hs-unlisteners" (append prev (list unlisten)))
|
||||||
|
unlisten))))
|
||||||
|
|
||||||
;; Run an initializer function immediately.
|
;; Run an initializer function immediately.
|
||||||
;; (hs-init thunk) — called at element boot time
|
;; (hs-init thunk) — called at element boot time
|
||||||
|
|||||||
@@ -25,10 +25,12 @@
|
|||||||
(fn
|
(fn
|
||||||
(target event-name handler)
|
(target event-name handler)
|
||||||
(let
|
(let
|
||||||
((unlisten (dom-listen target event-name handler))
|
((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)))))
|
||||||
(prev (or (dom-get-data target "hs-unlisteners") (list))))
|
(let
|
||||||
(dom-set-data target "hs-unlisteners" (append prev (list unlisten)))
|
((unlisten (dom-listen target event-name wrapped))
|
||||||
unlisten)))
|
(prev (or (dom-get-data target "hs-unlisteners") (list))))
|
||||||
|
(dom-set-data target "hs-unlisteners" (append prev (list unlisten)))
|
||||||
|
unlisten))))
|
||||||
|
|
||||||
;; Run an initializer function immediately.
|
;; Run an initializer function immediately.
|
||||||
;; (hs-init thunk) — called at element boot time
|
;; (hs-init thunk) — called at element boot time
|
||||||
|
|||||||
Reference in New Issue
Block a user