From 2199dcb2da7116fa1b7dacd6ace836929191abeb Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Wed, 28 Oct 2026 13:04:10 +0000 Subject: [PATCH] Reject non-numeric paddingHorizontal/paddingVertical in node.set Found while testing crates/engine/src/cmd/props.rs:623-634 (the "paddingHorizontal" and "paddingVertical" arms) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/cmd/layout.rs | 13 +++++++++++++ crates/engine/src/cmd/props.rs | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/crates/engine/src/cmd/layout.rs b/crates/engine/src/cmd/layout.rs index 5a0a4000..22f50b0f 100644 --- a/crates/engine/src/cmd/layout.rs +++ b/crates/engine/src/cmd/layout.rs @@ -181,6 +181,19 @@ mod tests { assert!(s.execute("node.set", &json!({"id": f, "props": {"paddingLeft": "wide"}})).is_err()); } + #[test] + fn junk_axis_padding_is_refused_and_keeps_padding() { + let mut s = Session::new(); + let (f, _, _) = al_frame(&mut s); + ex(&mut s, "node.set", json!({"id": f, "props": {"padding": 16}})); + for key in ["paddingHorizontal", "paddingVertical"] { + for junk in [json!("abc"), json!({"a": 1}), json!([1, 2])] { + assert!(s.execute("node.set", &json!({"id": f, "props": {key: junk}})).is_err(), "{key}"); + assert_eq!(node(&s, f).layout.as_ref().unwrap().padding, [16.0; 4], "{key}"); + } + } + } + #[test] fn baseline_alignment_lines_up_text() { let mut s = Session::new(); diff --git a/crates/engine/src/cmd/props.rs b/crates/engine/src/cmd/props.rs index 30a10393..8c09a9b6 100644 --- a/crates/engine/src/cmd/props.rs +++ b/crates/engine/src/cmd/props.rs @@ -621,13 +621,13 @@ pub fn apply(cmd: &str, doc: &mut Document, id: NodeId, props: &Map { - let val = f64_of(v).unwrap_or(0.0).max(0.0); + let val = f64_of(v).ok_or_else(|| bad(cmd, format!("`{k}` must be a number")))?.max(0.0); let l = layout_mut(cmd, k, doc.get_mut(id)?)?; l.padding[1] = val; l.padding[3] = val; } "paddingVertical" => { - let val = f64_of(v).unwrap_or(0.0).max(0.0); + let val = f64_of(v).ok_or_else(|| bad(cmd, format!("`{k}` must be a number")))?.max(0.0); let l = layout_mut(cmd, k, doc.get_mut(id)?)?; l.padding[0] = val; l.padding[2] = val;