1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-19 14:05:06 +00:00

LibWeb: Implement the :focus-within selector

This matches if it has focus, or any nodes inside it do.
This commit is contained in:
Sam Atkins 2022-03-20 13:28:32 +00:00 committed by Linus Groh
parent 4827092554
commit d60b3be29a
4 changed files with 12 additions and 0 deletions

View file

@ -506,6 +506,8 @@ Result<Selector::SimpleSelector, Parser::ParsingResult> Parser::parse_simple_sel
simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::FirstOfType; simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::FirstOfType;
} else if (pseudo_name.equals_ignoring_case("focus")) { } else if (pseudo_name.equals_ignoring_case("focus")) {
simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Focus; simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Focus;
} else if (pseudo_name.equals_ignoring_case("focus-within")) {
simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::FocusWithin;
} else if (pseudo_name.equals_ignoring_case("hover")) { } else if (pseudo_name.equals_ignoring_case("hover")) {
simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Hover; simple_selector.pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Hover;
} else if (pseudo_name.equals_ignoring_case("last-child")) { } else if (pseudo_name.equals_ignoring_case("last-child")) {

View file

@ -60,6 +60,7 @@ public:
Visited, Visited,
Hover, Hover,
Focus, Focus,
FocusWithin,
FirstChild, FirstChild,
LastChild, LastChild,
OnlyChild, OnlyChild,
@ -185,6 +186,8 @@ constexpr StringView pseudo_class_name(Selector::SimpleSelector::PseudoClass::Ty
return "hover"sv; return "hover"sv;
case Selector::SimpleSelector::PseudoClass::Type::Focus: case Selector::SimpleSelector::PseudoClass::Type::Focus:
return "focus"sv; return "focus"sv;
case Selector::SimpleSelector::PseudoClass::Type::FocusWithin:
return "focus-within"sv;
case Selector::SimpleSelector::PseudoClass::Type::FirstChild: case Selector::SimpleSelector::PseudoClass::Type::FirstChild:
return "first-child"sv; return "first-child"sv;
case Selector::SimpleSelector::PseudoClass::Type::LastChild: case Selector::SimpleSelector::PseudoClass::Type::LastChild:

View file

@ -137,6 +137,10 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla
return matches_hover_pseudo_class(element); return matches_hover_pseudo_class(element);
case CSS::Selector::SimpleSelector::PseudoClass::Type::Focus: case CSS::Selector::SimpleSelector::PseudoClass::Type::Focus:
return element.is_focused(); return element.is_focused();
case CSS::Selector::SimpleSelector::PseudoClass::Type::FocusWithin: {
auto* focused_element = element.document().focused_element();
return focused_element && element.is_inclusive_ancestor_of(*focused_element);
}
case CSS::Selector::SimpleSelector::PseudoClass::Type::FirstChild: case CSS::Selector::SimpleSelector::PseudoClass::Type::FirstChild:
return !element.previous_element_sibling(); return !element.previous_element_sibling();
case CSS::Selector::SimpleSelector::PseudoClass::Type::LastChild: case CSS::Selector::SimpleSelector::PseudoClass::Type::LastChild:

View file

@ -405,6 +405,9 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector)
case CSS::Selector::SimpleSelector::PseudoClass::Type::Focus: case CSS::Selector::SimpleSelector::PseudoClass::Type::Focus:
pseudo_class_description = "Focus"; pseudo_class_description = "Focus";
break; break;
case CSS::Selector::SimpleSelector::PseudoClass::Type::FocusWithin:
pseudo_class_description = "FocusWithin";
break;
case CSS::Selector::SimpleSelector::PseudoClass::Type::Empty: case CSS::Selector::SimpleSelector::PseudoClass::Type::Empty:
pseudo_class_description = "Empty"; pseudo_class_description = "Empty";
break; break;