diff --git a/src/browser/css/parser.zig b/src/browser/css/parser.zig index 63b863d8..d93fdb80 100644 --- a/src/browser/css/parser.zig +++ b/src/browser/css/parser.zig @@ -821,7 +821,8 @@ pub const Parser = struct { // nameStart returns whether c can be the first character of an identifier // (not counting an initial hyphen, or an escape sequence). fn nameStart(c: u8) bool { - return 'a' <= c and c <= 'z' or 'A' <= c and c <= 'Z' or c == '_' or c > 127; + return 'a' <= c and c <= 'z' or 'A' <= c and c <= 'Z' or c == '_' or c > 127 or + '0' <= c and c <= '9'; } // nameChar returns whether c can be a character within an identifier @@ -890,7 +891,7 @@ test "parser.parseIdentifier" { err: bool = false, }{ .{ .s = "x", .exp = "x" }, - .{ .s = "96", .exp = "", .err = true }, + .{ .s = "96", .exp = "96", .err = false }, .{ .s = "-x", .exp = "-x" }, .{ .s = "r\\e9 sumé", .exp = "résumé" }, .{ .s = "r\\0000e9 sumé", .exp = "résumé" }, @@ -975,6 +976,7 @@ test "parser.parse" { .{ .s = ":root", .exp = .{ .pseudo_class = .root } }, .{ .s = ".\\:bar", .exp = .{ .class = ":bar" } }, .{ .s = ".foo\\:bar", .exp = .{ .class = "foo:bar" } }, + .{ .s = "[class=75c0fa18a94b9e3a6b8e14d6cbe688a27f5da10a]", .exp = .{ .attribute = .{ .key = "class", .val = "75c0fa18a94b9e3a6b8e14d6cbe688a27f5da10a", .op = .eql } } }, }; for (testcases) |tc| { diff --git a/src/browser/css/selector.zig b/src/browser/css/selector.zig index 00ef1558..a6402efc 100644 --- a/src/browser/css/selector.zig +++ b/src/browser/css/selector.zig @@ -993,6 +993,11 @@ test "Browser.CSS.Selector: matchFirst" { .n = .{ .child = &.{ .name = "p", .sibling = &.{ .name = "p", .att = "bar" } } }, .exp = 0, }, + .{ + .q = "[foo=1baz]", + .n = .{ .child = &.{ .name = "p", .sibling = &.{ .name = "p", .att = "bar" } } }, + .exp = 0, + }, .{ .q = "[foo!=bar]", .n = .{ .child = &.{ .name = "p", .sibling = &.{ .name = "p", .att = "bar" } } },