From 9bf01d6708548a20efe70251c03c932a98060488 Mon Sep 17 00:00:00 2001 From: Jeremy Andrews Date: Sat, 20 Nov 2021 10:12:23 -0600 Subject: [PATCH] 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(-) diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp index 25fee1b748..dbd0e099b0 100644 --- a/layout/style/nsCSSRuleProcessor.cpp +++ b/layout/style/nsCSSRuleProcessor.cpp @@ -1927,14 +1927,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;