fix(js): keep form-owner lookup root scoped
Resolve controls with a form= attribute inside the current slhx root instead of using document-global id lookup, preserving multi-root isolation for direct handle dispatch. req: runtime/001 req: convention/004
This commit is contained in:
@@ -27,10 +27,15 @@
|
|||||||
|
|
||||||
function formOwner(el) {
|
function formOwner(el) {
|
||||||
if (!el || el.tagName === "FORM") return el;
|
if (!el || el.tagName === "FORM") return el;
|
||||||
if (el.getAttribute && el.getAttribute("form")) return document.getElementById(el.getAttribute("form"));
|
if (el.getAttribute && el.getAttribute("form")) return elementById(rootOf(el) || document, el.getAttribute("form"));
|
||||||
return closestInRoot(el, rootOf(el) || document, (node) => node.tagName === "FORM");
|
return closestInRoot(el, rootOf(el) || document, (node) => node.tagName === "FORM");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function elementById(scope, id) {
|
||||||
|
if (attrEquals(scope, "id", id)) return scope;
|
||||||
|
return firstElement(scope, (el) => attrEquals(el, "id", id));
|
||||||
|
}
|
||||||
|
|
||||||
function formHandleId(form) {
|
function formHandleId(form) {
|
||||||
if (!form) return null;
|
if (!form) return null;
|
||||||
const holder = form.hasAttribute(HID) ? form : firstElement(form, (el) => el.hasAttribute(HID));
|
const holder = form.hasAttribute(HID) ? form : firstElement(form, (el) => el.hasAttribute(HID));
|
||||||
|
|||||||
@@ -94,12 +94,14 @@ fn runtime_handles_get_forms_without_request_body() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn runtime_clicking_submitter_schedules_form_submit() {
|
fn runtime_clicking_submitter_schedules_form_submit() {
|
||||||
// req: convention/004
|
// req: convention/004 req: runtime/001
|
||||||
let source = slhx_js::RUNTIME_JS;
|
let source = slhx_js::RUNTIME_JS;
|
||||||
|
|
||||||
assert!(source.contains("function formOwner(el)"));
|
assert!(source.contains("function formOwner(el)"));
|
||||||
assert!(source.contains("function formHandleId(form)"));
|
assert!(source.contains("function formHandleId(form)"));
|
||||||
assert!(source.contains("document.getElementById(el.getAttribute(\"form\"))"));
|
assert!(source.contains("function elementById(scope, id)"));
|
||||||
|
assert!(source.contains("return elementById(rootOf(el) || document, el.getAttribute(\"form\"))"));
|
||||||
|
assert!(!source.contains("document.getElementById(el.getAttribute(\"form\"))"));
|
||||||
assert!(source.contains("const direct = closestInRoot(event.target, root, (el) => el.hasAttribute(HID))"));
|
assert!(source.contains("const direct = closestInRoot(event.target, root, (el) => el.hasAttribute(HID))"));
|
||||||
assert!(source.contains("const submitter = closestInRoot(event.target, root, (el) =>"));
|
assert!(source.contains("const submitter = closestInRoot(event.target, root, (el) =>"));
|
||||||
assert!(source.contains("el.tagName === \"BUTTON\" && (!el.hasAttribute(\"type\") || el.getAttribute(\"type\") === \"submit\")"));
|
assert!(source.contains("el.tagName === \"BUTTON\" && (!el.hasAttribute(\"type\") || el.getAttribute(\"type\") === \"submit\")"));
|
||||||
|
|||||||
Reference in New Issue
Block a user