LibWeb: Implement the :default pseudo-class
Some checks are pending
CI / Lagom (arm64, Sanitizer_CI, false, macos-15, macOS, Clang) (push) Waiting to run
CI / Lagom (x86_64, Fuzzers_CI, false, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, false, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, true, ubuntu-24.04, Linux, Clang) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (arm64, macos-15, macOS, macOS-universal2) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (x86_64, ubuntu-24.04, Linux, Linux-x86_64) (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Label PRs with merge conflicts / auto-labeler (push) Waiting to run
Push notes / build (push) Waiting to run

This commit is contained in:
Gingeh 2025-05-24 15:24:38 +10:00 committed by Sam Atkins
commit 3fe148f2d4
Notes: github-actions[bot] 2025-05-24 09:32:32 +00:00
9 changed files with 115 additions and 3 deletions

View file

@ -1037,6 +1037,29 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla
return false;
}
case CSS::PseudoClass::Default: {
// https://html.spec.whatwg.org/multipage/semantics-other.html#selector-default
// The :default pseudo-class must match any element falling into one of the following categories:
if (auto const* form_associated_element = as_if<Web::HTML::FormAssociatedElement>(element)) {
// - Submit buttons that are default buttons of their form owner.
if (form_associated_element->is_submit_button() && form_associated_element->form() && form_associated_element->form()->default_button() == form_associated_element)
return true;
// - input elements to which the checked attribute applies and that have a checked attribute
if (auto const* input_element = as_if<Web::HTML::HTMLInputElement>(form_associated_element)) {
if (input_element->checked_applies() && input_element->has_attribute(HTML::AttributeNames::checked))
return true;
}
}
// - option elements that have a selected attribute
else if (auto const* option_element = as_if<Web::HTML::HTMLOptionElement>(element)) {
if (option_element->has_attribute(HTML::AttributeNames::selected))
return true;
}
return false;
}
}
return false;