Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp |
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp |
| index 47144acf44c6abcb6d34c70563aa65569f9d8ca5..68f589dc6eb70c886b4a98e4f8fd81856fd9167d 100644 |
| --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp |
| +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp |
| @@ -717,13 +717,14 @@ static void PositionFromThreeOrFourValues(CSSValue** values, |
| } |
| bool ConsumePosition(CSSParserTokenRange& range, |
| - CSSParserMode css_parser_mode, |
| + const CSSParserContext& context, |
| UnitlessQuirk unitless, |
| + PositionSyntax syntax, |
| CSSValue*& result_x, |
| CSSValue*& result_y) { |
| bool horizontal_edge = false; |
| bool vertical_edge = false; |
| - CSSValue* value1 = ConsumePositionComponent(range, css_parser_mode, unitless, |
| + CSSValue* value1 = ConsumePositionComponent(range, context.Mode(), unitless, |
| horizontal_edge, vertical_edge); |
| if (!value1) |
| return false; |
| @@ -731,20 +732,21 @@ bool ConsumePosition(CSSParserTokenRange& range, |
| horizontal_edge = true; |
| CSSParserTokenRange range_after_first_consume = range; |
| - CSSValue* value2 = ConsumePositionComponent(range, css_parser_mode, unitless, |
| + CSSValue* value2 = ConsumePositionComponent(range, context.Mode(), unitless, |
| horizontal_edge, vertical_edge); |
| if (!value2) { |
| PositionFromOneValue(value1, result_x, result_y); |
| return true; |
| } |
| + CSSParserTokenRange range_after_second_consume = range; |
| CSSValue* value3 = nullptr; |
| if (value1->IsIdentifierValue() && |
| value2->IsIdentifierValue() != (range.Peek().GetType() == kIdentToken) && |
| (value2->IsIdentifierValue() |
| ? ToCSSIdentifierValue(value2)->GetValueID() |
| : ToCSSIdentifierValue(value1)->GetValueID()) != CSSValueCenter) |
| - value3 = ConsumePositionComponent(range, css_parser_mode, unitless, |
| + value3 = ConsumePositionComponent(range, context.Mode(), unitless, |
| horizontal_edge, vertical_edge); |
| if (!value3) { |
| if (vertical_edge && !value2->IsIdentifierValue()) { |
| @@ -760,8 +762,39 @@ bool ConsumePosition(CSSParserTokenRange& range, |
| if (value3->IsIdentifierValue() && |
| ToCSSIdentifierValue(value3)->GetValueID() != CSSValueCenter && |
| range.Peek().GetType() != kIdentToken) |
| - value4 = ConsumePositionComponent(range, css_parser_mode, unitless, |
| + value4 = ConsumePositionComponent(range, context.Mode(), unitless, |
| horizontal_edge, vertical_edge); |
| + |
| + if (!value4) { |
| + switch (syntax) { |
|
Bugs Nash
2017/05/22 01:12:56
This switch statement kind of introduces property
Eric Willigers
2017/05/22 03:52:06
Done.
|
| + case PositionSyntax::kBackground: |
| + case PositionSyntax::kScrollSnapPoints: |
| + break; |
| + case PositionSyntax::kBasicShape: |
| + context.Count(UseCounter::kThreeValuedPositionBasicShape); |
| + break; |
| + case PositionSyntax::kGradient: |
| + context.Count(UseCounter::kThreeValuedPositionGradient); |
| + break; |
| + case PositionSyntax::kObjectPosition: |
| + context.Count(UseCounter::kThreeValuedPositionObjectPosition); |
| + break; |
| + case PositionSyntax::kPerspectiveOrigin: |
| + context.Count(UseCounter::kThreeValuedPositionPerspectiveOrigin); |
| + break; |
| + case PositionSyntax::kCurrent: |
| + // [top | bottom] <length-percentage> is not permitted |
| + if (vertical_edge && !value2->IsIdentifierValue()) { |
| + range = range_after_first_consume; |
| + PositionFromOneValue(value1, result_x, result_y); |
| + return true; |
| + } |
| + range = range_after_second_consume; |
| + PositionFromTwoValues(value1, value2, result_x, result_y); |
| + return true; |
| + } |
| + } |
| + |
| CSSValue* values[5]; |
| values[0] = value1; |
| values[1] = value2; |
| @@ -773,11 +806,12 @@ bool ConsumePosition(CSSParserTokenRange& range, |
| } |
| CSSValuePair* ConsumePosition(CSSParserTokenRange& range, |
| - CSSParserMode css_parser_mode, |
| - UnitlessQuirk unitless) { |
| + const CSSParserContext& context, |
| + UnitlessQuirk unitless, |
| + PositionSyntax syntax) { |
| CSSValue* result_x = nullptr; |
| CSSValue* result_y = nullptr; |
| - if (ConsumePosition(range, css_parser_mode, unitless, result_x, result_y)) |
| + if (ConsumePosition(range, context, unitless, syntax, result_x, result_y)) |
| return CSSValuePair::Create(result_x, result_y, |
| CSSValuePair::kKeepIdenticalValues); |
| return nullptr; |
| @@ -1050,7 +1084,7 @@ static CSSValue* ConsumeDeprecatedRadialGradient(CSSParserTokenRange& args, |
| } |
| static CSSValue* ConsumeRadialGradient(CSSParserTokenRange& args, |
| - CSSParserMode css_parser_mode, |
| + const CSSParserContext& context, |
| CSSGradientRepeat repeating) { |
| const CSSIdentifierValue* shape = nullptr; |
| const CSSIdentifierValue* size_keyword = nullptr; |
| @@ -1078,13 +1112,13 @@ static CSSValue* ConsumeRadialGradient(CSSParserTokenRange& args, |
| } |
| } else { |
| CSSPrimitiveValue* center = |
| - ConsumeLengthOrPercent(args, css_parser_mode, kValueRangeAll); |
| + ConsumeLengthOrPercent(args, context.Mode(), kValueRangeAll); |
| if (!center) |
| break; |
| if (horizontal_size) |
| return nullptr; |
| horizontal_size = center; |
| - center = ConsumeLengthOrPercent(args, css_parser_mode, kValueRangeAll); |
| + center = ConsumeLengthOrPercent(args, context.Mode(), kValueRangeAll); |
| if (center) { |
| vertical_size = center; |
| ++i; |
| @@ -1116,8 +1150,8 @@ static CSSValue* ConsumeRadialGradient(CSSParserTokenRange& args, |
| CSSValue* center_y = nullptr; |
| if (args.Peek().Id() == CSSValueAt) { |
| args.ConsumeIncludingWhitespace(); |
| - ConsumePosition(args, css_parser_mode, UnitlessQuirk::kForbid, center_x, |
| - center_y); |
| + ConsumePosition(args, context, UnitlessQuirk::kForbid, |
| + PositionSyntax::kGradient, center_x, center_y); |
| if (!(center_x && center_y)) |
| return nullptr; |
| // Right now, CSS radial gradients have the same start and end centers. |
| @@ -1131,7 +1165,7 @@ static CSSValue* ConsumeRadialGradient(CSSParserTokenRange& args, |
| CSSGradientValue* result = CSSRadialGradientValue::Create( |
| center_x, center_y, shape, size_keyword, horizontal_size, vertical_size, |
| repeating, kCSSRadialGradient); |
| - return ConsumeGradientColorStops(args, css_parser_mode, result, |
| + return ConsumeGradientColorStops(args, context.Mode(), result, |
| ConsumeLengthOrPercent) |
| ? result |
| : nullptr; |
| @@ -1175,7 +1209,7 @@ static CSSValue* ConsumeLinearGradient(CSSParserTokenRange& args, |
| } |
| static CSSValue* ConsumeConicGradient(CSSParserTokenRange& args, |
| - CSSParserMode css_parser_mode, |
| + const CSSParserContext& context, |
| CSSGradientRepeat repeating) { |
| if (!RuntimeEnabledFeatures::conicGradientEnabled()) |
| return nullptr; |
| @@ -1189,8 +1223,8 @@ static CSSValue* ConsumeConicGradient(CSSParserTokenRange& args, |
| CSSValue* center_x = nullptr; |
| CSSValue* center_y = nullptr; |
| if (ConsumeIdent<CSSValueAt>(args)) { |
| - if (!ConsumePosition(args, css_parser_mode, UnitlessQuirk::kForbid, |
| - center_x, center_y)) |
| + if (!ConsumePosition(args, context, UnitlessQuirk::kForbid, |
| + PositionSyntax::kGradient, center_x, center_y)) |
| return nullptr; |
| } |
| @@ -1202,7 +1236,7 @@ static CSSValue* ConsumeConicGradient(CSSParserTokenRange& args, |
| CSSGradientValue* result = |
| CSSConicGradientValue::Create(center_x, center_y, from_angle, repeating); |
| - return ConsumeGradientColorStops(args, css_parser_mode, result, |
| + return ConsumeGradientColorStops(args, context.Mode(), result, |
| ConsumeAngleOrPercent) |
| ? result |
| : nullptr; |
| @@ -1291,9 +1325,9 @@ static CSSValue* ConsumeGeneratedImage(CSSParserTokenRange& range, |
| CSSParserTokenRange args = ConsumeFunction(range_copy); |
| CSSValue* result = nullptr; |
| if (id == CSSValueRadialGradient) { |
| - result = ConsumeRadialGradient(args, context->Mode(), kNonRepeating); |
| + result = ConsumeRadialGradient(args, *context, kNonRepeating); |
| } else if (id == CSSValueRepeatingRadialGradient) { |
| - result = ConsumeRadialGradient(args, context->Mode(), kRepeating); |
| + result = ConsumeRadialGradient(args, *context, kRepeating); |
| } else if (id == CSSValueWebkitLinearGradient) { |
| context->Count(UseCounter::kDeprecatedWebKitLinearGradient); |
| result = ConsumeLinearGradient(args, context->Mode(), kNonRepeating, |
| @@ -1319,9 +1353,9 @@ static CSSValue* ConsumeGeneratedImage(CSSParserTokenRange& range, |
| context->Count(UseCounter::kDeprecatedWebKitRepeatingRadialGradient); |
| result = ConsumeDeprecatedRadialGradient(args, context->Mode(), kRepeating); |
| } else if (id == CSSValueConicGradient) { |
| - result = ConsumeConicGradient(args, context->Mode(), kNonRepeating); |
| + result = ConsumeConicGradient(args, *context, kNonRepeating); |
| } else if (id == CSSValueRepeatingConicGradient) { |
| - result = ConsumeConicGradient(args, context->Mode(), kRepeating); |
| + result = ConsumeConicGradient(args, *context, kRepeating); |
| } else if (id == CSSValueWebkitCrossFade) { |
| result = ConsumeCrossFade(args, context); |
| } else if (id == CSSValuePaint) { |