From eaf95a85a897572085e9d5cfb595f10833d1cf91 Mon Sep 17 00:00:00 2001 From: egrs Date: Wed, 18 Feb 2026 12:00:44 +0100 Subject: [PATCH] fix OL.type default and TableCell span clamping per spec OL.type returns "1" (not "") when attribute absent. TableCell.colSpan clamps to 1-1000, rowSpan to 0-65534. --- src/browser/tests/element/html/ol.html | 2 +- src/browser/tests/element/html/tablecell.html | 16 ++++++++++++++++ src/browser/webapi/element/html/OL.zig | 2 +- src/browser/webapi/element/html/TableCell.zig | 7 +++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/browser/tests/element/html/ol.html b/src/browser/tests/element/html/ol.html index 8036e470..f999f80f 100644 --- a/src/browser/tests/element/html/ol.html +++ b/src/browser/tests/element/html/ol.html @@ -46,6 +46,6 @@ testing.expectEqual('1', ol1.type); const ol2 = document.getElementById('ol2'); - testing.expectEqual('', ol2.type); + testing.expectEqual('1', ol2.type); } diff --git a/src/browser/tests/element/html/tablecell.html b/src/browser/tests/element/html/tablecell.html index d1667288..5070ceeb 100644 --- a/src/browser/tests/element/html/tablecell.html +++ b/src/browser/tests/element/html/tablecell.html @@ -18,6 +18,14 @@ const td2 = document.getElementById('td2'); testing.expectEqual(1, td2.colSpan); + + // colSpan 0 clamps to 1 + td2.colSpan = 0; + testing.expectEqual(1, td2.colSpan); + + // colSpan > 1000 clamps to 1000 + td2.colSpan = 9999; + testing.expectEqual(1000, td2.colSpan); } @@ -31,5 +39,13 @@ const td2 = document.getElementById('td2'); testing.expectEqual(1, td2.rowSpan); + + // rowSpan 0 is valid per spec (span remaining rows) + td2.rowSpan = 0; + testing.expectEqual(0, td2.rowSpan); + + // rowSpan > 65534 clamps to 65534 + td2.rowSpan = 99999; + testing.expectEqual(65534, td2.rowSpan); } diff --git a/src/browser/webapi/element/html/OL.zig b/src/browser/webapi/element/html/OL.zig index 7001ae24..78baf5a9 100644 --- a/src/browser/webapi/element/html/OL.zig +++ b/src/browser/webapi/element/html/OL.zig @@ -56,7 +56,7 @@ pub fn setReversed(self: *OL, value: bool, page: *Page) !void { } pub fn getType(self: *OL) []const u8 { - return self.asElement().getAttributeSafe(comptime .wrap("type")) orelse ""; + return self.asElement().getAttributeSafe(comptime .wrap("type")) orelse "1"; } pub fn setType(self: *OL, value: []const u8, page: *Page) !void { diff --git a/src/browser/webapi/element/html/TableCell.zig b/src/browser/webapi/element/html/TableCell.zig index b8ddccca..d57b70ff 100644 --- a/src/browser/webapi/element/html/TableCell.zig +++ b/src/browser/webapi/element/html/TableCell.zig @@ -21,7 +21,9 @@ pub fn asNode(self: *TableCell) *Node { pub fn getColSpan(self: *TableCell) u32 { const attr = self.asElement().getAttributeSafe(comptime .wrap("colspan")) orelse return 1; - return std.fmt.parseUnsigned(u32, attr, 10) catch 1; + const v = std.fmt.parseUnsigned(u32, attr, 10) catch return 1; + if (v == 0) return 1; + return @min(v, 1000); } pub fn setColSpan(self: *TableCell, value: u32, page: *Page) !void { @@ -31,7 +33,8 @@ pub fn setColSpan(self: *TableCell, value: u32, page: *Page) !void { pub fn getRowSpan(self: *TableCell) u32 { const attr = self.asElement().getAttributeSafe(comptime .wrap("rowspan")) orelse return 1; - return std.fmt.parseUnsigned(u32, attr, 10) catch 1; + const v = std.fmt.parseUnsigned(u32, attr, 10) catch return 1; + return @min(v, 65534); } pub fn setRowSpan(self: *TableCell, value: u32, page: *Page) !void {