From 9ad579bd35179ac41be256e30c4874708751264d Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Mon, 15 Jul 2024 08:58:56 +0800 Subject: [PATCH] Issue #2486 - Part 5: Fix parsing of nested layer names This does not handle the merging of same-named layers, however. --- layout/style/nsCSSParser.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index b270dd2858..c467525c29 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -4963,7 +4963,8 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) // followed by a "{", which indicates an anonymous layer. bool isStatement = false; if (tk->mType == eCSSToken_Ident) { - nameList->AppendElement(tk->mIdent); + nsString* currentName = new nsString(); + currentName->Assign(tk->mIdent); bool parsing = true; bool expectIdent = false; @@ -4974,11 +4975,21 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) switch (tk->mType) { case eCSSToken_Symbol: { - if (',' == tk->mSymbol) { + if ('.' == tk->mSymbol) { + expectIdent = true; + if (!currentName->IsEmpty()) { + currentName->Append(tk->mSymbol); + continue; + } + parsing = false; + break; + } else if (',' == tk->mSymbol) { if (expectIdent) { parsing = false; break; } + nameList->AppendElement(*currentName); + currentName = new nsString(); expectIdent = true; continue; } else if (';' == tk->mSymbol) { @@ -4986,6 +4997,8 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) parsing = false; break; } + nameList->AppendElement(*currentName); + currentName = new nsString(); isStatement = true; parsing = false; break; @@ -4994,6 +5007,7 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) parsing = false; break; } + nameList->AppendElement(*currentName); uint32_t nameListLength = nameList->Length(); if (nameListLength == 0 || nameListLength > 1) { return false; @@ -5004,8 +5018,8 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) } } case eCSSToken_Ident: { - nameList->AppendElement(tk->mIdent); expectIdent = false; + currentName->Append(tk->mIdent); break; } default: { @@ -5019,6 +5033,7 @@ CSSParserImpl::ParseLayerRule(RuleAppendFunc aAppendFunc, void* aProcessData) return false; } } else if (tk->mType == eCSSToken_Symbol && '{' != tk->mSymbol) { + UngetToken(); return false; }