From 71c4fce87fb30c6e6e55fedb2d458e643cb27b2d Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 9 Mar 2026 16:39:44 +0800 Subject: [PATCH] Empty :is() and :where() pseudoselectors are valid (and return nothing) --- src/browser/tests/element/pseudo_classes.html | 11 +++++++++++ src/browser/tests/element/selector_invalid.html | 2 -- src/browser/webapi/selector/Parser.zig | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/browser/tests/element/pseudo_classes.html b/src/browser/tests/element/pseudo_classes.html index fe75ab84..355d2ee7 100644 --- a/src/browser/tests/element/pseudo_classes.html +++ b/src/browser/tests/element/pseudo_classes.html @@ -81,6 +81,17 @@ } + +
diff --git a/src/browser/webapi/selector/Parser.zig b/src/browser/webapi/selector/Parser.zig index 376bbcdc..f9b1bb23 100644 --- a/src/browser/webapi/selector/Parser.zig +++ b/src/browser/webapi/selector/Parser.zig @@ -487,7 +487,7 @@ fn pseudoClass(self: *Parser, arena: Allocator, page: *Page) !Selector.PseudoCla if (self.peek() != ')') return error.InvalidPseudoClass; self.input = self.input[1..]; - if (selectors.items.len == 0) return error.InvalidPseudoClass; + // Empty :is() is valid per spec - matches nothing return .{ .is = selectors.items }; } @@ -514,7 +514,7 @@ fn pseudoClass(self: *Parser, arena: Allocator, page: *Page) !Selector.PseudoCla if (self.peek() != ')') return error.InvalidPseudoClass; self.input = self.input[1..]; - if (selectors.items.len == 0) return error.InvalidPseudoClass; + // Empty :where() is valid per spec - matches nothing return .{ .where = selectors.items }; }