From 088cc4ea7353b1eb1bb51ebc1b13ed4a4c40b444 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 5 Jul 2023 11:43:57 +0200 Subject: [PATCH] LibWeb: Parse CSS :host selector Let's at least parse it, even if we don't implement matching for it yet. --- Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 2 ++ Userland/Libraries/LibWeb/CSS/Selector.cpp | 1 + Userland/Libraries/LibWeb/CSS/Selector.h | 3 +++ Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp | 3 +++ Userland/Libraries/LibWeb/Dump.cpp | 3 +++ 5 files changed, 12 insertions(+) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index e619d112b5..85346ecf08 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -534,6 +534,8 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::OnlyOfType); if (pseudo_name.equals_ignoring_ascii_case("root"sv)) return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Root); + if (pseudo_name.equals_ignoring_ascii_case("host"sv)) + return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Host); if (pseudo_name.equals_ignoring_ascii_case("visited"sv)) return make_pseudo_class_selector(Selector::SimpleSelector::PseudoClass::Type::Visited); if (pseudo_name.equals_ignoring_ascii_case("scope"sv)) diff --git a/Userland/Libraries/LibWeb/CSS/Selector.cpp b/Userland/Libraries/LibWeb/CSS/Selector.cpp index 22fee35c36..18fa0df836 100644 --- a/Userland/Libraries/LibWeb/CSS/Selector.cpp +++ b/Userland/Libraries/LibWeb/CSS/Selector.cpp @@ -220,6 +220,7 @@ ErrorOr Selector::SimpleSelector::serialize() const case Selector::SimpleSelector::PseudoClass::Type::OnlyChild: case Selector::SimpleSelector::PseudoClass::Type::Empty: case Selector::SimpleSelector::PseudoClass::Type::Root: + case Selector::SimpleSelector::PseudoClass::Type::Host: case Selector::SimpleSelector::PseudoClass::Type::FirstOfType: case Selector::SimpleSelector::PseudoClass::Type::LastOfType: case Selector::SimpleSelector::PseudoClass::Type::OnlyOfType: diff --git a/Userland/Libraries/LibWeb/CSS/Selector.h b/Userland/Libraries/LibWeb/CSS/Selector.h index 80085a6363..06503d46c8 100644 --- a/Userland/Libraries/LibWeb/CSS/Selector.h +++ b/Userland/Libraries/LibWeb/CSS/Selector.h @@ -98,6 +98,7 @@ public: NthLastChild, Empty, Root, + Host, FirstOfType, LastOfType, OnlyOfType, @@ -265,6 +266,8 @@ constexpr StringView pseudo_class_name(Selector::SimpleSelector::PseudoClass::Ty return "empty"sv; case Selector::SimpleSelector::PseudoClass::Type::Root: return "root"sv; + case Selector::SimpleSelector::PseudoClass::Type::Host: + return "host"sv; case Selector::SimpleSelector::PseudoClass::Type::FirstOfType: return "first-of-type"sv; case Selector::SimpleSelector::PseudoClass::Type::LastOfType: diff --git a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp index 6881a403d9..301c74146f 100644 --- a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp +++ b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp @@ -245,6 +245,9 @@ static inline bool matches_pseudo_class(CSS::Selector::SimpleSelector::PseudoCla } case CSS::Selector::SimpleSelector::PseudoClass::Type::Root: return is(element); + case CSS::Selector::SimpleSelector::PseudoClass::Type::Host: + // FIXME: Implement :host selector. + return false; case CSS::Selector::SimpleSelector::PseudoClass::Type::Scope: return scope ? &element == scope : is(element); case CSS::Selector::SimpleSelector::PseudoClass::Type::FirstOfType: diff --git a/Userland/Libraries/LibWeb/Dump.cpp b/Userland/Libraries/LibWeb/Dump.cpp index 043ba90f11..64641fba48 100644 --- a/Userland/Libraries/LibWeb/Dump.cpp +++ b/Userland/Libraries/LibWeb/Dump.cpp @@ -467,6 +467,9 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector) case CSS::Selector::SimpleSelector::PseudoClass::Type::Root: pseudo_class_description = "Root"; break; + case CSS::Selector::SimpleSelector::PseudoClass::Type::Host: + pseudo_class_description = "Host"; + break; case CSS::Selector::SimpleSelector::PseudoClass::Type::FirstOfType: pseudo_class_description = "FirstOfType"; break;