diff --git a/packages/react-native/ReactCommon/react/renderer/css/CSSSyntaxParser.h b/packages/react-native/ReactCommon/react/renderer/css/CSSSyntaxParser.h index 5eea737d7fd..22c96834b9f 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/CSSSyntaxParser.h +++ b/packages/react-native/ReactCommon/react/renderer/css/CSSSyntaxParser.h @@ -233,11 +233,14 @@ struct CSSComponentValueVisitorDispatcher { constexpr ReturnT consumeComponentValue( CSSDelimiter delimiter, const VisitorsT&... visitors) { + auto originalParser = parser; if (!consumeDelimiter(delimiter)) { + parser = originalParser; return {}; } if (parser.peek().type() == parser.terminator_) { + parser = originalParser; return {}; } diff --git a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSSyntaxParserTest.cpp b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSSyntaxParserTest.cpp index 9dc8aa6721a..86336b104de 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSSyntaxParserTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSSyntaxParserTest.cpp @@ -579,4 +579,31 @@ TEST(CSSSyntaxParser, solidus_or_whitespace) { EXPECT_FALSE(delimValue1); } +TEST(CSSSyntaxParser, delimeter_not_consumed_when_no_component_value) { + CSSSyntaxParser parser{"foo ,"}; + + auto identValue = parser.consumeComponentValue( + [](const CSSPreservedToken& token) { + EXPECT_EQ(token.type(), CSSTokenType::Ident); + EXPECT_EQ(token.stringValue(), "foo"); + return token.stringValue(); + }); + + EXPECT_EQ(identValue, "foo"); + + auto identValue2 = parser.consumeComponentValue( + CSSDelimiter::Comma, + [](const CSSPreservedToken& /*token*/) { return true; }); + + EXPECT_FALSE(identValue2); + + auto hasComma = parser.consumeComponentValue( + CSSDelimiter::Whitespace, [](const CSSPreservedToken& token) { + EXPECT_EQ(token.type(), CSSTokenType::Comma); + return true; + }); + + EXPECT_TRUE(hasComma); +} + } // namespace facebook::react