Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
index 6562558b1990356b3ce19cb0230f95489b48deab..82f6ee553d7c940adcd3fcb0023c79c929f69f8d 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -3259,24 +3259,15 @@ static CSSValue* consumeGridLine(CSSParserTokenRange& range) |
return values; |
} |
-static bool allTracksAreFixedSized(CSSValueList& valueList) |
+static bool isGridTrackFixedSized(const CSSValue& value) |
{ |
- for (CSSValue* value : valueList) { |
- if (value->isGridLineNamesValue()) |
- continue; |
- // The auto-repeat value holds a <fixed-size> = <fixed-breadth> | minmax( <fixed-breadth>, <track-breadth> ) |
- if (value->isGridAutoRepeatValue()) { |
- if (!allTracksAreFixedSized(toCSSValueList(*value))) |
- return false; |
- continue; |
- } |
- const CSSPrimitiveValue& primitiveValue = value->isPrimitiveValue() |
- ? toCSSPrimitiveValue(*value) |
- : toCSSPrimitiveValue(*toCSSFunctionValue(*value).item(0)); |
- CSSValueID valueID = primitiveValue.getValueID(); |
- if (valueID == CSSValueMinContent || valueID == CSSValueMaxContent || valueID == CSSValueAuto || primitiveValue.isFlex()) |
- return false; |
- } |
+ const CSSPrimitiveValue& primitiveValue = value.isPrimitiveValue() |
+ ? toCSSPrimitiveValue(value) |
+ : toCSSPrimitiveValue(*toCSSFunctionValue(value).item(0)); |
+ CSSValueID valueID = primitiveValue.getValueID(); |
+ if (valueID == CSSValueMinContent || valueID == CSSValueMaxContent || valueID == CSSValueAuto || primitiveValue.isFlex()) |
+ return false; |
+ |
return true; |
} |
@@ -3374,36 +3365,31 @@ static bool parseGridTemplateAreasRow(const String& gridRowNames, NamedGridAreaM |
return true; |
} |
-enum TrackSizeRestriction { FixedSizeOnly, InflexibleSizeOnly, AllowAll }; |
- |
-static CSSPrimitiveValue* consumeGridBreadth(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll) |
+static CSSPrimitiveValue* consumeGridBreadth(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
{ |
- if (restriction != FixedSizeOnly) { |
- const CSSParserToken& token = range.peek(); |
- if (identMatches<CSSValueMinContent, CSSValueMaxContent, CSSValueAuto>(token.id())) |
- return consumeIdent(range); |
- if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveValue::UnitType::Fraction) { |
- if (restriction == InflexibleSizeOnly || range.peek().numericValue() < 0) |
- return nullptr; |
- return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::Fraction); |
- } |
+ const CSSParserToken& token = range.peek(); |
+ if (identMatches<CSSValueMinContent, CSSValueMaxContent, CSSValueAuto>(token.id())) |
+ return consumeIdent(range); |
+ if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveValue::UnitType::Fraction) { |
+ if (range.peek().numericValue() < 0) |
+ return nullptr; |
+ return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::Fraction); |
} |
return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, UnitlessQuirk::Allow); |
} |
// TODO(rob.buis): This needs a bool parameter so we can disallow <auto-track-list> for the grid shorthand. |
-static CSSValue* consumeGridTrackSize(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll) |
+static CSSValue* consumeGridTrackSize(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
{ |
const CSSParserToken& token = range.peek(); |
- if (restriction == AllowAll && identMatches<CSSValueAuto>(token.id())) |
+ if (identMatches<CSSValueAuto>(token.id())) |
return consumeIdent(range); |
if (token.functionId() == CSSValueMinmax) { |
CSSParserTokenRange rangeCopy = range; |
CSSParserTokenRange args = consumeFunction(rangeCopy); |
- TrackSizeRestriction minTrackBreadthRestriction = restriction == AllowAll ? InflexibleSizeOnly : restriction; |
- CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserMode, minTrackBreadthRestriction); |
- if (!minTrackBreadth || !consumeCommaIncludingWhitespace(args)) |
+ CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserMode); |
+ if (!minTrackBreadth || minTrackBreadth->isFlex() || !consumeCommaIncludingWhitespace(args)) |
return nullptr; |
CSSPrimitiveValue* maxTrackBreadth = consumeGridBreadth(args, cssParserMode); |
if (!maxTrackBreadth || !args.atEnd()) |
@@ -3414,7 +3400,7 @@ static CSSValue* consumeGridTrackSize(CSSParserTokenRange& range, CSSParserMode |
result->append(maxTrackBreadth); |
return result; |
} |
- return consumeGridBreadth(range, cssParserMode, restriction); |
+ return consumeGridBreadth(range, cssParserMode); |
} |
// Appends to the passed in CSSGridLineNamesValue if any, otherwise creates a new one. |
@@ -3433,7 +3419,7 @@ static CSSGridLineNamesValue* consumeGridLineNames(CSSParserTokenRange& range, C |
return lineNames; |
} |
-static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSValueList& list, bool& isAutoRepeat) |
+static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSValueList& list, bool& isAutoRepeat, bool& allTracksAreFixedSized) |
{ |
CSSParserTokenRange args = consumeFunction(range); |
// The number of repetitions for <auto-repeat> is not important at parsing level |
@@ -3458,13 +3444,14 @@ static bool consumeGridTrackRepeatFunction(CSSParserTokenRange& range, CSSParser |
repeatedValues->append(lineNames); |
size_t numberOfTracks = 0; |
- TrackSizeRestriction restriction = isAutoRepeat ? FixedSizeOnly : AllowAll; |
while (!args.atEnd()) { |
if (isAutoRepeat && numberOfTracks) |
return false; |
- CSSValue* trackSize = consumeGridTrackSize(args, cssParserMode, restriction); |
+ CSSValue* trackSize = consumeGridTrackSize(args, cssParserMode); |
if (!trackSize) |
return false; |
+ if (allTracksAreFixedSized) |
+ allTracksAreFixedSized = isGridTrackFixedSized(*trackSize); |
repeatedValues->append(trackSize); |
++numberOfTracks; |
lineNames = consumeGridLineNames(args); |
@@ -3496,28 +3483,29 @@ static CSSValue* consumeGridTrackList(CSSParserTokenRange& range, CSSParserMode |
values->append(lineNames); |
bool seenAutoRepeat = false; |
+ bool allTracksAreFixedSized = true; |
// TODO(rob.buis): <line-names> should not be able to directly precede <auto-repeat>. |
do { |
bool isAutoRepeat; |
if (range.peek().functionId() == CSSValueRepeat) { |
- if (!consumeGridTrackRepeatFunction(range, cssParserMode, *values, isAutoRepeat)) |
+ if (!consumeGridTrackRepeatFunction(range, cssParserMode, *values, isAutoRepeat, allTracksAreFixedSized)) |
return nullptr; |
if (isAutoRepeat && seenAutoRepeat) |
return nullptr; |
seenAutoRepeat = seenAutoRepeat || isAutoRepeat; |
- } else if (CSSValue* value = consumeGridTrackSize(range, cssParserMode, seenAutoRepeat ? FixedSizeOnly : AllowAll)) { |
+ } else if (CSSValue* value = consumeGridTrackSize(range, cssParserMode)) { |
+ if (allTracksAreFixedSized) |
+ allTracksAreFixedSized = isGridTrackFixedSized(*value); |
values->append(value); |
} else { |
return nullptr; |
} |
+ if (seenAutoRepeat && !allTracksAreFixedSized) |
+ return nullptr; |
lineNames = consumeGridLineNames(range); |
if (lineNames) |
values->append(lineNames); |
} while (!range.atEnd() && range.peek().type() != DelimiterToken); |
- // <auto-repeat> requires definite minimum track sizes in order to compute the number of repetitions. |
- // The above while loop detects those appearances after the <auto-repeat> but not the ones before. |
- if (seenAutoRepeat && !allTracksAreFixedSized(*values)) |
- return nullptr; |
return values; |
} |