Issue #2078 - Follow-up: Move isForgiving check to ParsePseudoClassWithSelectorListArg

This commit is contained in:
FranklinDM 2023-02-21 19:54:31 +08:00 • committed by roytam1
commit 53f5905381

View file

@ -780,8 +780,7 @@ protected:
CSSPseudoClassType aType); CSSPseudoClassType aType);
nsSelectorParsingStatus ParsePseudoClassWithSelectorListArg(nsCSSSelector& aSelector, nsSelectorParsingStatus ParsePseudoClassWithSelectorListArg(nsCSSSelector& aSelector,
CSSPseudoClassType aType, CSSPseudoClassType aType);
bool aIsForgiving);
nsSelectorParsingStatus ParseNegatedSimpleSelector(int32_t& aDataMask, nsSelectorParsingStatus ParseNegatedSimpleSelector(int32_t& aDataMask,
nsCSSSelector& aSelector); nsCSSSelector& aSelector);
@ -6166,11 +6165,8 @@ CSSParserImpl::ParsePseudoSelector(int32_t& aDataMask,
else { else {
MOZ_ASSERT(nsCSSPseudoClasses::HasSelectorListArg(pseudoClassType), MOZ_ASSERT(nsCSSPseudoClasses::HasSelectorListArg(pseudoClassType),
"unexpected pseudo with function token"); "unexpected pseudo with function token");
bool isForgiving =
nsCSSPseudoClasses::HasForgivingSelectorListArg(pseudoClassType);
parsingStatus = ParsePseudoClassWithSelectorListArg(aSelector, parsingStatus = ParsePseudoClassWithSelectorListArg(aSelector,
pseudoClassType, pseudoClassType);
isForgiving);
} }
if (eSelectorParsingStatus_Continue != parsingStatus) { if (eSelectorParsingStatus_Continue != parsingStatus) {
if (eSelectorParsingStatus_Error == parsingStatus) { if (eSelectorParsingStatus_Error == parsingStatus) {
@ -6544,11 +6540,13 @@ CSSParserImpl::ParsePseudoClassWithNthPairArg(nsCSSSelector& aSelector,
// //
CSSParserImpl::nsSelectorParsingStatus CSSParserImpl::nsSelectorParsingStatus
CSSParserImpl::ParsePseudoClassWithSelectorListArg(nsCSSSelector& aSelector, CSSParserImpl::ParsePseudoClassWithSelectorListArg(nsCSSSelector& aSelector,
CSSPseudoClassType aType, CSSPseudoClassType aType)
bool aIsForgiving)
{ {
bool isForgiving =
nsCSSPseudoClasses::HasForgivingSelectorListArg(aType);
nsAutoPtr<nsCSSSelectorList> slist; nsAutoPtr<nsCSSSelectorList> slist;
if (! ParseSelectorList(*getter_Transfers(slist), char16_t(')'), aIsForgiving)) { if (! ParseSelectorList(*getter_Transfers(slist), char16_t(')'), isForgiving)) {
return eSelectorParsingStatus_Error; // our caller calls SkipUntil(')') return eSelectorParsingStatus_Error; // our caller calls SkipUntil(')')
} }
@ -6560,13 +6558,13 @@ CSSParserImpl::ParsePseudoClassWithSelectorListArg(nsCSSSelector& aSelector,
for (nsCSSSelectorList *l = slist; l; l = l->mNext) { for (nsCSSSelectorList *l = slist; l; l = l->mNext) {
nsCSSSelector *s = l->mSelectors; nsCSSSelector *s = l->mSelectors;
if (s == nullptr) { if (s == nullptr) {
MOZ_ASSERT(aIsForgiving, MOZ_ASSERT(isForgiving,
"unexpected empty selector in unforgiving selector list"); "unexpected empty selector in unforgiving selector list");
break; break;
} }
// Check that none of the selectors in the list have combinators or // Check that none of the selectors in the list have combinators or
// pseudo-elements. // pseudo-elements.
if ((!aIsForgiving && s->mNext) || s->IsPseudoElement()) { if ((!isForgiving && s->mNext) || s->IsPseudoElement()) {
return eSelectorParsingStatus_Error; // our caller calls SkipUntil(')') return eSelectorParsingStatus_Error; // our caller calls SkipUntil(')')
} }
} }