diff --git a/crates/obscura-js/js/bootstrap.js b/crates/obscura-js/js/bootstrap.js index 3ef371a..96353c0 100644 --- a/crates/obscura-js/js/bootstrap.js +++ b/crates/obscura-js/js/bootstrap.js @@ -4122,13 +4122,13 @@ if (typeof Response === 'undefined') { } if (!Element.prototype.replaceWith) { + // _convertNodes turns any non-node argument (numbers, booleans, null, …) into + // a Text node via String(n), matching the spec and append()/prepend(); the + // old `typeof n === 'string'` check corrupted insert_before for other types. Element.prototype.replaceWith = function(...nodes) { const parent = this.parentNode; if (!parent) return; - for (const n of nodes) { - if (typeof n === 'string') parent.insertBefore(document.createTextNode(n), this); - else parent.insertBefore(n, this); - } + for (const n of _convertNodes(nodes)) parent.insertBefore(n, this); parent.removeChild(this); }; _markNative(Element.prototype.replaceWith); @@ -4137,10 +4137,7 @@ if (!Element.prototype.before) { Element.prototype.before = function(...nodes) { const parent = this.parentNode; if (!parent) return; - for (const n of nodes) { - if (typeof n === 'string') parent.insertBefore(document.createTextNode(n), this); - else parent.insertBefore(n, this); - } + for (const n of _convertNodes(nodes)) parent.insertBefore(n, this); }; _markNative(Element.prototype.before); } @@ -4149,10 +4146,7 @@ if (!Element.prototype.after) { const parent = this.parentNode; if (!parent) return; const ref = this.nextSibling; - for (const n of nodes) { - if (typeof n === 'string') parent.insertBefore(document.createTextNode(n), ref); - else parent.insertBefore(n, ref); - } + for (const n of _convertNodes(nodes)) parent.insertBefore(n, ref); }; _markNative(Element.prototype.after); } diff --git a/crates/obscura-js/src/runtime.rs b/crates/obscura-js/src/runtime.rs index fdfeb4d..a6bd24c 100644 --- a/crates/obscura-js/src/runtime.rs +++ b/crates/obscura-js/src/runtime.rs @@ -1317,6 +1317,26 @@ mod tests { rt } + #[test] + fn childnode_helpers_coerce_non_string_primitives_to_text() { + let mut rt = setup_runtime(r#"