Correctly handle setting textContent to empty for DocFrag and Element

Fixes an [non-critical] error on old.reddit.com
This commit is contained in:
Karl Seguin
2025-12-24 11:43:43 +08:00
parent 7183b0339b
commit 83f008de1f
3 changed files with 38 additions and 2 deletions

View File

@@ -176,3 +176,16 @@
testing.expectEqual("Nested content", clonedInner.textContent); testing.expectEqual("Nested content", clonedInner.textContent);
} }
</script> </script>
<script id=textContent>
{
const df = document.createDocumentFragment();
df.appendChild(document.createElement("div"));
testing.expectEqual(1, df.childNodes.length);
df.textContent = '';
testing.expectEqual(0, df.childNodes.length);
df.textContent = ' ';
testing.expectEqual(1, df.childNodes.length);
}
</script>

View File

@@ -153,3 +153,16 @@
testing.expectEqual(d, parent.childNodes[3]); testing.expectEqual(d, parent.childNodes[3]);
} }
</script> </script>
<script id=textContent>
{
const parent = document.createElement('div');
parent.appendChild(document.createElement('div'));
testing.expectEqual(1, parent.childNodes.length);
parent.textContent = '';
testing.expectEqual(0, parent.childNodes.length);
parent.textContent = ' ';
testing.expectEqual(1, parent.childNodes.length);
}
</script>

View File

@@ -269,11 +269,21 @@ pub fn getTextContentAlloc(self: *Node, allocator: Allocator) error{WriteFailed}
pub fn setTextContent(self: *Node, data: []const u8, page: *Page) !void { pub fn setTextContent(self: *Node, data: []const u8, page: *Page) !void {
switch (self._type) { switch (self._type) {
.element => |el| return el.replaceChildren(&.{.{ .text = data }}, page), .element => |el| {
if (data.len == 0) {
return el.replaceChildren(&.{}, page);
}
return el.replaceChildren(&.{.{ .text = data }}, page);
},
.cdata => |c| c._data = try page.arena.dupe(u8, data), .cdata => |c| c._data = try page.arena.dupe(u8, data),
.document => {}, .document => {},
.document_type => {}, .document_type => {},
.document_fragment => |frag| return frag.replaceChildren(&.{.{ .text = data }}, page), .document_fragment => |frag| {
if (data.len == 0) {
return frag.replaceChildren(&.{}, page);
}
return frag.replaceChildren(&.{.{ .text = data }}, page);
},
.attribute => |attr| return attr.setValue(data, page), .attribute => |attr| return attr.setValue(data, page),
} }
} }