| Index: Source/core/css/parser/CSSPropertyParser.cpp
|
| diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp
|
| index a7170fdd2247855c091cedce0ce9daf81274f9ac..e967ef84f4d61c0558470f75fc6787bd02f43089 100644
|
| --- a/Source/core/css/parser/CSSPropertyParser.cpp
|
| +++ b/Source/core/css/parser/CSSPropertyParser.cpp
|
| @@ -727,7 +727,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
|
| return result;
|
| }
|
| case CSSPropertyObjectPosition:
|
| - parsedValue = parseObjectPosition();
|
| + parsedValue = parsePosition(m_valueList);
|
| break;
|
| case CSSPropertyListStyleImage: // <uri> | none | inherit
|
| case CSSPropertyBorderImageSource:
|
| @@ -1495,6 +1495,17 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
|
| validPrimitive = false;
|
| break;
|
|
|
| + case CSSPropertyScrollSnapPointsX:
|
| + case CSSPropertyScrollSnapPointsY:
|
| + parsedValue = parseScrollSnapPoints();
|
| + break;
|
| + case CSSPropertyScrollSnapCoordinate:
|
| + parsedValue = parseScrollSnapCoordinate();
|
| + break;
|
| + case CSSPropertyScrollSnapDestination:
|
| + parsedValue = parsePosition(m_valueList);
|
| + break;
|
| +
|
| default:
|
| return parseSVGValue(propId, important);
|
| }
|
| @@ -2008,6 +2019,44 @@ bool CSSPropertyParser::parse4Values(CSSPropertyID propId, const CSSPropertyID *
|
| return true;
|
| }
|
|
|
| +PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseScrollSnapPoints()
|
| +{
|
| + CSSParserValue* value = m_valueList->current();
|
| +
|
| + if (value->id == CSSValueNone) {
|
| + m_valueList->next();
|
| + return cssValuePool().createIdentifierValue(CSSValueNone);
|
| + }
|
| +
|
| + if (value->unit == CSSParserValue::Function && value->function->id == CSSValueRepeat) {
|
| + // The spec defines the following grammar: repeat( <length>)
|
| + CSSParserValueList* arguments = value->function->args.get();
|
| + if (!arguments || arguments->size() != 1)
|
| + return nullptr;
|
| +
|
| + CSSParserValue* repeatValue = arguments->valueAt(0);
|
| + if (!validUnit(repeatValue, FNonNeg | FLength | FPercent))
|
| + return nullptr;
|
| +
|
| + RefPtrWillBeRawPtr<CSSFunctionValue> result = CSSFunctionValue::create(CSSValueRepeat);
|
| + result->append(parseValidPrimitive(repeatValue->id, repeatValue));
|
| + m_valueList->next();
|
| + return result.release();
|
| + }
|
| +
|
| + return nullptr;
|
| +}
|
| +
|
| +PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseScrollSnapCoordinate()
|
| +{
|
| + if (m_valueList->current()->id == CSSValueNone) {
|
| + m_valueList->next();
|
| + return cssValuePool().createIdentifierValue(CSSValueNone);
|
| + }
|
| +
|
| + return parsePositionList(m_valueList);
|
| +}
|
| +
|
| PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parsePage()
|
| {
|
| CSSParserValue* value = m_valueList->current();
|
| @@ -5554,16 +5603,37 @@ bool CSSPropertyParser::parseFlex(CSSParserValueList* args, bool important)
|
| return true;
|
| }
|
|
|
| -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseObjectPosition()
|
| +PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parsePosition(CSSParserValueList* valueList)
|
| {
|
| RefPtrWillBeRawPtr<CSSValue> xValue = nullptr;
|
| RefPtrWillBeRawPtr<CSSValue> yValue = nullptr;
|
| - parseFillPosition(m_valueList, xValue, yValue);
|
| + parseFillPosition(valueList, xValue, yValue);
|
| if (!xValue || !yValue)
|
| return nullptr;
|
| return createPrimitiveValuePair(toCSSPrimitiveValue(xValue.get()), toCSSPrimitiveValue(yValue.get()), Pair::KeepIdenticalValues);
|
| }
|
|
|
| +// Parses a list of comma separated positions. i.e., <position>#
|
| +PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parsePositionList(CSSParserValueList* valueList)
|
| +{
|
| + RefPtrWillBeRawPtr<CSSValueList> positions = CSSValueList::createCommaSeparated();
|
| + while (true) {
|
| + // parsePosition consumes values until it reaches a separator [,/],
|
| + // an invalid token, or end of the list
|
| + RefPtrWillBeRawPtr<CSSValue> position = parsePosition(valueList);
|
| + if (!position)
|
| + return nullptr;
|
| + positions->append(position);
|
| +
|
| + if (!valueList->current())
|
| + break;
|
| + if (!consumeComma(valueList) || !valueList->current())
|
| + return nullptr;
|
| + }
|
| +
|
| + return positions.release();
|
| +}
|
| +
|
| class BorderImageParseContext {
|
| STACK_ALLOCATED();
|
| public:
|
| @@ -7155,6 +7225,7 @@ PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseFilter()
|
|
|
| return list.release();
|
| }
|
| +
|
| PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseTransformOrigin()
|
| {
|
| CSSParserValue* value = m_valueList->current();
|
|
|