mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:37:35 +00:00
LibWeb: Add 'PseudoElement' as a CSS SimpleSelector::Type
Same reasoning again! This is the last one. While I was at it, I added the two remaining CSS2.2 pseudo-elements, ::first-line and ::first-letter. All 4 are handled in the new CSS parser, including with the compatibility single-colon syntax. I have not added support to the old parser.
This commit is contained in:
parent
4af7d41879
commit
8cae79cc8d
4 changed files with 66 additions and 12 deletions
|
@ -363,10 +363,24 @@ Optional<Selector> Parser::parse_single_selector(TokenStream<T>& tokens, bool is
|
|||
return {};
|
||||
}
|
||||
|
||||
// Ignore for now, otherwise we produce a "false positive" selector
|
||||
// and apply styles to the element itself, not its pseudo element
|
||||
if (is_pseudo)
|
||||
return {};
|
||||
if (is_pseudo) {
|
||||
auto pseudo_name = ((Token)current_value).ident();
|
||||
simple_selector.type = Selector::SimpleSelector::Type::PseudoElement;
|
||||
|
||||
if (pseudo_name.equals_ignoring_case("before")) {
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::Before;
|
||||
} else if (pseudo_name.equals_ignoring_case("after")) {
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::After;
|
||||
} else if (pseudo_name.equals_ignoring_case("first-line")) {
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::FirstLine;
|
||||
} else if (pseudo_name.equals_ignoring_case("first-letter")) {
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::FirstLetter;
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
|
||||
return simple_selector;
|
||||
}
|
||||
|
||||
auto& pseudo_class = simple_selector.pseudo_class;
|
||||
|
||||
|
@ -411,6 +425,22 @@ Optional<Selector> Parser::parse_single_selector(TokenStream<T>& tokens, bool is
|
|||
pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Enabled;
|
||||
} else if (pseudo_name.equals_ignoring_case("checked")) {
|
||||
pseudo_class.type = Selector::SimpleSelector::PseudoClass::Type::Checked;
|
||||
} else if (pseudo_name.equals_ignoring_case("before")) {
|
||||
// Single-colon syntax allowed for compatibility. https://www.w3.org/TR/selectors/#pseudo-element-syntax
|
||||
simple_selector.type = Selector::SimpleSelector::Type::PseudoElement;
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::Before;
|
||||
} else if (pseudo_name.equals_ignoring_case("after")) {
|
||||
// See :before
|
||||
simple_selector.type = Selector::SimpleSelector::Type::PseudoElement;
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::After;
|
||||
} else if (pseudo_name.equals_ignoring_case("first-line")) {
|
||||
// See :before
|
||||
simple_selector.type = Selector::SimpleSelector::Type::PseudoElement;
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::FirstLine;
|
||||
} else if (pseudo_name.equals_ignoring_case("first-letter")) {
|
||||
// See :before
|
||||
simple_selector.type = Selector::SimpleSelector::Type::PseudoElement;
|
||||
simple_selector.pseudo_element = Selector::SimpleSelector::PseudoElement::FirstLetter;
|
||||
} else {
|
||||
dbgln("Unknown pseudo class: '{}'", pseudo_name);
|
||||
return simple_selector;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue