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,