From 643e298a550d5b3eeed7ad4bbedc1551be76c6b7 Mon Sep 17 00:00:00 2001 From: Jeremy Andrews Date: Sat, 20 Nov 2021 10:12:23 -0600 Subject: Issue #1593 - Part 4: Make :host pass DOM parsing test and basic specificity tests. --- layout/style/nsCSSRuleProcessor.cpp | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'layout/style') diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp index a30d1cd098..f49b9d3258 100644 --- a/layout/style/nsCSSRuleProcessor.cpp +++ b/layout/style/nsCSSRuleProcessor.cpp @@ -1906,14 +1906,33 @@ static bool SelectorMatches(Element* aElement, // compound selector. If this is the case, then also ensure that the // host element matches against the compound // selector. - return aElement->GetShadowRoot() && - aTreeMatchContext.mOnlyMatchHostPseudo && - !aSelector->HasFeatureSelectors() && - !aSelector->mNext && - (!pseudoClass->u.mSelectors || - AnySelectorInArgListMatches(aElement, pseudoClass, - aNodeMatchContext, - aTreeMatchContext)); + + // We match automatically if GetParent() and GetShadowRoot() have + // the same result. Without special casing this ahead of all other + // selector matching, it fails. Have not determined the cause. + + if (aElement->GetParent() == aElement->GetShadowRoot()) { + break; + } + + // Match if any selector in the argument list matches. + + NodeMatchContext nodeContext(EventStates(), + nsCSSRuleProcessor::IsLink(aElement)); + if (AnySelectorInArgListMatches(aElement, pseudoClass, + nodeContext, + aTreeMatchContext)) { + break; + } + + // Finally, with the exception of the two above cases, make sure we + // don't match if GetContainingShadow() returns null. For whatever + // reason, we can't test for this case first. + + if (aElement->GetContainingShadow() == nullptr) { + return false; + } + } break; -- cgit v1.2.3