LibWeb/CSS: Add :unchecked pseudo-class

This just got added to the Selectors spec:

b78c97c19d

It's thus missing from the HTML spec and WPT, but I figured it was
simple enough to add.
This commit is contained in:
Sam Atkins 2025-07-15 15:38:50 +01:00 committed by Jelle Raaijmakers
commit 632ce9523b
Notes: github-actions[bot] 2025-07-15 19:28:57 +00:00
6 changed files with 34 additions and 6 deletions

View file

@ -1425,9 +1425,8 @@ bool Element::matches_checked_pseudo_class() const
// The :checked pseudo-class must match any element falling into one of the following categories:
// - input elements whose type attribute is in the Checkbox state and whose checkedness state is true
// - input elements whose type attribute is in the Radio Button state and whose checkedness state is true
if (is<HTML::HTMLInputElement>(*this)) {
auto const& input_element = static_cast<HTML::HTMLInputElement const&>(*this);
switch (input_element.type_state()) {
if (auto* input_element = as_if<HTML::HTMLInputElement>(*this)) {
switch (input_element->type_state()) {
case HTML::HTMLInputElement::TypeAttributeState::Checkbox:
case HTML::HTMLInputElement::TypeAttributeState::RadioButton:
return static_cast<HTML::HTMLInputElement const&>(*this).checked();
@ -1437,8 +1436,27 @@ bool Element::matches_checked_pseudo_class() const
}
// - option elements whose selectedness is true
if (is<HTML::HTMLOptionElement>(*this)) {
return static_cast<HTML::HTMLOptionElement const&>(*this).selected();
if (auto* option_element = as_if<HTML::HTMLOptionElement>(*this)) {
return option_element->selected();
}
return false;
}
bool Element::matches_unchecked_pseudo_class() const
{
// AD-HOC: There is no spec for this yet, so it's based on the spec for :checked, assuming that :unchecked applies to the same cases but with a `false` value.
if (auto* input_element = as_if<HTML::HTMLInputElement>(*this)) {
switch (input_element->type_state()) {
case HTML::HTMLInputElement::TypeAttributeState::Checkbox:
case HTML::HTMLInputElement::TypeAttributeState::RadioButton:
return !static_cast<HTML::HTMLInputElement const&>(*this).checked();
default:
return false;
}
}
if (auto* option_element = as_if<HTML::HTMLOptionElement>(*this)) {
return !option_element->selected();
}
return false;
}