diff options
Diffstat (limited to 'Userland/Libraries/LibWeb')
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Selector.h | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp | 6 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Dump.cpp | 3 |
4 files changed, 12 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp index 365ed0eee2..a64bcfbae8 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/DeprecatedCSSParser.cpp @@ -554,6 +554,8 @@ public: simple_selector.pseudo_class = CSS::Selector::SimpleSelector::PseudoClass::Empty; } else if (pseudo_name.equals_ignoring_case("root")) { simple_selector.pseudo_class = CSS::Selector::SimpleSelector::PseudoClass::Root; + } else if (pseudo_name.equals_ignoring_case("first-of-type")) { + simple_selector.pseudo_class = CSS::Selector::SimpleSelector::PseudoClass::FirstOfType; } else if (pseudo_name.equals_ignoring_case("before")) { simple_selector.pseudo_element = CSS::Selector::SimpleSelector::PseudoElement::Before; } else if (pseudo_name.equals_ignoring_case("after")) { diff --git a/Userland/Libraries/LibWeb/CSS/Selector.h b/Userland/Libraries/LibWeb/CSS/Selector.h index d5dae94f98..e9d0085206 100644 --- a/Userland/Libraries/LibWeb/CSS/Selector.h +++ b/Userland/Libraries/LibWeb/CSS/Selector.h @@ -54,6 +54,7 @@ public: OnlyChild, Empty, Root, + FirstOfType, }; PseudoClass pseudo_class { PseudoClass::None }; diff --git a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp index a1db87f78f..96c0743f89 100644 --- a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp +++ b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp @@ -90,6 +90,12 @@ static bool matches(const CSS::Selector::SimpleSelector& component, const DOM::E if (!is<HTML::HTMLElement>(element)) return false; break; + case CSS::Selector::SimpleSelector::PseudoClass::FirstOfType: + for (auto* sibling = element.previous_element_sibling(); sibling; sibling = sibling->previous_element_sibling()) { + if (sibling->tag_name() == element.tag_name()) + return false; + } + break; } switch (component.attribute_match_type) { diff --git a/Userland/Libraries/LibWeb/Dump.cpp b/Userland/Libraries/LibWeb/Dump.cpp index 1be93503a7..cdb5297fb8 100644 --- a/Userland/Libraries/LibWeb/Dump.cpp +++ b/Userland/Libraries/LibWeb/Dump.cpp @@ -359,6 +359,9 @@ void dump_selector(StringBuilder& builder, const CSS::Selector& selector) case CSS::Selector::SimpleSelector::PseudoClass::Root: pseudo_class_description = "Root"; break; + case CSS::Selector::SimpleSelector::PseudoClass::FirstOfType: + pseudo_class_description = "FirstOfType"; + break; case CSS::Selector::SimpleSelector::PseudoClass::Focus: pseudo_class_description = "Focus"; break; |