diff options
author | Tobias Christiansen <tobi@tobyase.de> | 2021-05-23 21:00:44 +0200 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-05-24 22:10:08 +0100 |
commit | 820224bb487d824890b1650e93bde41243a1a1d6 (patch) | |
tree | 84bc688882f1445cb260f9b37f63393ddbc44bc5 | |
parent | 1ab82afee695d0671c767eff683a7fd1326c5609 (diff) | |
download | serenity-820224bb487d824890b1650e93bde41243a1a1d6.zip |
LibWeb: Match the :not pseudoclass
When a Selector features a :not() pseudoclass we now check whether the
current element matches with the given selector in the :not and act
accordingly.
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp index 44b7a48dba..bd7e24ae60 100644 --- a/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp +++ b/Userland/Libraries/LibWeb/CSS/SelectorEngine.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include <LibWeb/CSS/Parser/DeprecatedCSSParser.h> #include <LibWeb/CSS/SelectorEngine.h> #include <LibWeb/DOM/Document.h> #include <LibWeb/DOM/Element.h> @@ -100,6 +101,17 @@ static bool matches(const CSS::Selector::SimpleSelector& component, const DOM::E if (!element.has_attribute("checked")) return false; break; + case CSS::Selector::SimpleSelector::PseudoClass::Not: { + if (component.not_selector.is_empty()) + return false; + auto not_selector = Web::parse_selector(CSS::ParsingContext(element), component.not_selector); + if (!not_selector.has_value()) + return false; + auto not_matches = matches(not_selector.value(), element); + if (not_matches) + return false; + break; + } case CSS::Selector::SimpleSelector::PseudoClass::NthChild: case CSS::Selector::SimpleSelector::PseudoClass::NthLastChild: const auto step_size = component.nth_child_pattern.step_size; |