Commit 4af84fff authored by Anders Hartvoll Ruud's avatar Anders Hartvoll Ruud Committed by Commit Bot

Properly check for <any-value> in the @supports parser

A few token types are not allowed in <any-value>, and therefore
ConsumeGeneralEnclosed must return kParseFailure rather than kUnknown
if these tokens are observed.

Change-Id: Iedcf120739d2a65d24b047286da66f8a435ebf7b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2057124
Commit-Queue: Anders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: default avatarXiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742512}
parent 9492308b
...@@ -41,6 +41,30 @@ CSSSupportsParser::Result EvalUnknown(CSSSupportsParser::Result result) { ...@@ -41,6 +41,30 @@ CSSSupportsParser::Result EvalUnknown(CSSSupportsParser::Result result) {
: result; : result;
} }
// https://drafts.csswg.org/css-syntax/#typedef-any-value
bool IsNextTokenAllowedForAnyValue(CSSParserTokenRange& range) {
switch (range.Peek().GetType()) {
case kBadStringToken:
case kEOFToken:
case kBadUrlToken:
return false;
case kRightParenthesisToken:
case kRightBracketToken:
case kRightBraceToken:
return range.Peek().GetBlockType() == CSSParserToken::kBlockEnd;
default:
return true;
}
}
// https://drafts.csswg.org/css-syntax/#typedef-any-value
bool ConsumeAnyValue(CSSParserTokenRange& range) {
DCHECK(!range.AtEnd());
while (IsNextTokenAllowedForAnyValue(range))
range.Consume();
return range.AtEnd();
}
} // namespace } // namespace
CSSSupportsParser::Result CSSSupportsParser::SupportsCondition( CSSSupportsParser::Result CSSSupportsParser::SupportsCondition(
...@@ -169,15 +193,13 @@ CSSSupportsParser::Result CSSSupportsParser::ConsumeGeneralEnclosed( ...@@ -169,15 +193,13 @@ CSSSupportsParser::Result CSSSupportsParser::ConsumeGeneralEnclosed(
if (range.Peek().GetType() == kFunctionToken || if (range.Peek().GetType() == kFunctionToken ||
range.Peek().GetType() == kLeftParenthesisToken) { range.Peek().GetType() == kLeftParenthesisToken) {
auto block = range.ConsumeBlock(); auto block = range.ConsumeBlock();
range.ConsumeWhitespace();
// Note that <any-value> matches a sequence of one or more tokens, hence the // Note that <any-value> matches a sequence of one or more tokens, hence the
// block-range can't be empty. // block-range can't be empty.
// https://drafts.csswg.org/css-syntax-3/#typedef-any-value // https://drafts.csswg.org/css-syntax-3/#typedef-any-value
// if (block.AtEnd() || !ConsumeAnyValue(block))
// TODO(andruud): This is not entirely accurate, as we need to check for return Result::kParseFailure;
// <bad-string-token>, etc. range.ConsumeWhitespace();
if (!block.AtEnd()) return Result::kUnknown;
return Result::kUnknown;
} }
return Result::kParseFailure; return Result::kParseFailure;
} }
......
...@@ -218,6 +218,30 @@ TEST_F(CSSSupportsParserTest, ConsumeGeneralEnclosed) { ...@@ -218,6 +218,30 @@ TEST_F(CSSSupportsParserTest, ConsumeGeneralEnclosed) {
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("()")); EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("()"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("color:red")); EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("color:red"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("asdf")); EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("asdf"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("(asdf)"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("( asdf )"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("(3)"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("max(1, 2)"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("asdf(1, 2)"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("asdf(1, 2)\t"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed(""));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("("));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed(")"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("()"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("color:red"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("asdf"));
// Invalid <any-value>:
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("(asdf})"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("(asd]f)"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("(\"as\ndf\")"));
EXPECT_EQ(Result::kParseFailure, ConsumeGeneralEnclosed("(url(as'df))"));
// Valid <any-value>
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("(as;df)"));
EXPECT_EQ(Result::kUnknown, ConsumeGeneralEnclosed("(as ! df)"));
} }
TEST_F(CSSSupportsParserTest, AtSupportsCondition) { TEST_F(CSSSupportsParserTest, AtSupportsCondition) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment