From 2fc2056be756d383b4a957aac931b777499f96a2 Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Mon, 15 Jul 2024 08:32:49 +0800 Subject: [PATCH] Issue #2486 - Part 4: Ensure layer statement rule is appended and invalid tokens are restored --- layout/style/nsCSSParser.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 1603e66353..b270dd2858 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -4947,6 +4947,7 @@ bool CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) { nsString layerName; + nsTArray* nameList = new nsTArray(); uint32_t linenum, colnum; if (!GetNextTokenLocation(true, &linenum, &colnum)) { @@ -4960,8 +4961,8 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) // Parse the layer name or name list if we aren't immediately // followed by a "{", which indicates an anonymous layer. + bool isStatement = false; if (tk->mType == eCSSToken_Ident) { - nsTArray* nameList = new nsTArray(); nameList->AppendElement(tk->mIdent); bool parsing = true; @@ -4975,27 +4976,29 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) case eCSSToken_Symbol: { if (',' == tk->mSymbol) { if (expectIdent) { - return false; + parsing = false; + break; } expectIdent = true; continue; } else if (';' == tk->mSymbol) { if (expectIdent) { - return false; + parsing = false; + break; } - RefPtr rule = - new CSSLayerStatementRule(*nameList, linenum, colnum); - return true; + isStatement = true; + parsing = false; + break; } else if ('{' == tk->mSymbol) { if (expectIdent) { - return false; + parsing = false; + break; } uint32_t nameListLength = nameList->Length(); if (nameListLength == 0 || nameListLength > 1) { return false; } layerName.Assign(nameList->ElementAt(0)); - UngetToken(); parsing = false; break; } @@ -5010,10 +5013,23 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) } } } + + if (expectIdent) { + UngetToken(); + return false; + } } else if (tk->mType == eCSSToken_Symbol && '{' != tk->mSymbol) { return false; } + if (isStatement) { + RefPtr rule = + new CSSLayerStatementRule(*nameList, linenum, colnum); + (*aAppendFunc)(rule, aProcessData); + return true; + } + + UngetToken(); RefPtr rule = new CSSLayerBlockRule(layerName, linenum, colnum); return ParseGroupRule(rule, aAppendFunc, aProcessData);