From 216b1664bd83a708605e149226f426d6cdbdf73a Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 21 Nov 2025 20:10:02 +0800 Subject: [PATCH] :checked pseudoclass --- src/browser/tests/element/html/input.html | 113 +++++++++++++++------- src/browser/webapi/selector/List.zig | 4 + src/browser/webapi/selector/Parser.zig | 5 + src/browser/webapi/selector/Selector.zig | 1 + 4 files changed, 90 insertions(+), 33 deletions(-) diff --git a/src/browser/tests/element/html/input.html b/src/browser/tests/element/html/input.html index dbd79aa3..f7052f51 100644 --- a/src/browser/tests/element/html/input.html +++ b/src/browser/tests/element/html/input.html @@ -15,7 +15,7 @@ - - - - - + + diff --git a/src/browser/webapi/selector/List.zig b/src/browser/webapi/selector/List.zig index 7174ecc2..481a3697 100644 --- a/src/browser/webapi/selector/List.zig +++ b/src/browser/webapi/selector/List.zig @@ -500,6 +500,10 @@ fn attributeContainsWord(value: []const u8, word: []const u8) bool { fn matchesPseudoClass(el: *Node.Element, pseudo: Selector.PseudoClass) bool { switch (pseudo) { .modal => return false, + .checked => { + const input = el.is(Node.Element.Html.Input) orelse return false; + return input.getChecked(); + }, .first_child => return isFirstChild(el), .last_child => return isLastChild(el), .only_child => return isFirstChild(el) and isLastChild(el), diff --git a/src/browser/webapi/selector/Parser.zig b/src/browser/webapi/selector/Parser.zig index 0b465e1d..49813291 100644 --- a/src/browser/webapi/selector/Parser.zig +++ b/src/browser/webapi/selector/Parser.zig @@ -395,6 +395,8 @@ fn pseudoClass(self: *Parser, arena: Allocator, page: *Page) !Selector.PseudoCla return .{ .not = selectors.items }; } + + return error.UnknownPseudoClass; } @@ -402,6 +404,9 @@ fn pseudoClass(self: *Parser, arena: Allocator, page: *Page) !Selector.PseudoCla 5 => { if (fastEql(name, "modal")) return .modal; }, + 7 => { + if (fastEql(name, "checked")) return .checked; + }, 10 => { if (fastEql(name, "only-child")) return .only_child; if (fastEql(name, "last-child")) return .last_child; diff --git a/src/browser/webapi/selector/Selector.zig b/src/browser/webapi/selector/Selector.zig index defc3014..15579b65 100644 --- a/src/browser/webapi/selector/Selector.zig +++ b/src/browser/webapi/selector/Selector.zig @@ -132,6 +132,7 @@ pub const AttributeMatcher = union(enum) { pub const PseudoClass = union(enum) { modal, + checked, first_child, last_child, only_child,