From ea580ec54ba03fccef434a46aee18388aa1101a7 Mon Sep 17 00:00:00 2001 From: erixreyes Date: Thu, 17 Jul 2025 12:44:53 +0800 Subject: [PATCH] Issue #2691: Improve Parser State Handling --- layout/style/nsCSSParser.cpp | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 7b75a00e27..548cfdf20b 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -5066,29 +5066,23 @@ CSSParserImpl::ParseSupportsSelector(bool& aConditionMet) return true; } - nsCSSScanner tempScanner(selectorText, 0); - css::ErrorReporter tempReporter(tempScanner, mSheet, mChildLoader, mSheetURI); + // isolate parser instance to avoid state corruption + CSSParserImpl tempParser; + tempParser.SetStyleSheet(mSheet); + tempParser.SetChildLoader(mChildLoader); - nsCSSScanner* savedScanner = mScanner; - css::ErrorReporter* savedReporter = mReporter; - - mScanner = &tempScanner; - mReporter = &tempReporter; - - nsCSSSelectorList* selectorList = nullptr; + // check support SelectorParsingFlags flags = SelectorParsingFlags::eNone; - bool parseSuccess = ParseSelectorGroup(selectorList, flags); - - mScanner = savedScanner; - mReporter = savedReporter; - - if (parseSuccess && selectorList) { - aConditionMet = true; + nsCSSSelectorList* selectorList = nullptr; + bool supportSuccess = tempParser.ParseSelectorString(selectorText, mSheetURI, 0, &selectorList) == NS_OK; + + // clean up + if (selectorList) { delete selectorList; - } else { - aConditionMet = false; } - + + + aConditionMet = supportSuccess; return true; }