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);
}
</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]);
}
</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 {
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),
.document => {},
.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),
}
}