| Index: third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| index ddb4e9acba3ded9d1efee999baa254535abbbc43..b0308f64af3c9ee719b6816e5fe789809eb82e69 100644
|
| --- a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| +++ b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| @@ -506,9 +506,19 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
|
| addProperty(propId, CSSValuePair::create(parsedValue1.release(), parsedValue2.release(), CSSValuePair::DropIdenticalValues), important);
|
| return true;
|
| }
|
| - case CSSPropertyBorderRadius:
|
| - case CSSPropertyAliasWebkitBorderRadius:
|
| - return parseBorderRadius(unresolvedProperty, important);
|
| + case CSSPropertyBorderRadius: {
|
| + ShorthandScope scope(this, unresolvedProperty);
|
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4];
|
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4];
|
| + if (!parseRadii(radii, radii2, m_valueList, unresolvedProperty))
|
| + return false;
|
| + ImplicitScope implicitScope(this);
|
| + addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(radii[0].release(), radii2[0].release(), CSSValuePair::DropIdenticalValues), important);
|
| + addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(radii[1].release(), radii2[1].release(), CSSValuePair::DropIdenticalValues), important);
|
| + addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(radii[2].release(), radii2[2].release(), CSSValuePair::DropIdenticalValues), important);
|
| + addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(radii[3].release(), radii2[3].release(), CSSValuePair::DropIdenticalValues), important);
|
| + return true;
|
| + }
|
| case CSSPropertyWebkitBoxReflect:
|
| if (id == CSSValueNone)
|
| validPrimitive = true;
|
| @@ -2636,76 +2646,6 @@ static void completeBorderRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4])
|
| radii[3] = radii[1];
|
| }
|
|
|
| -// FIXME: This should be refactored with parseBorderRadius.
|
| -// parseBorderRadius contains support for some legacy radius construction.
|
| -PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseInsetRoundedCorners(PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape, CSSParserValueList* args)
|
| -{
|
| - CSSParserValue* argument = args->next();
|
| -
|
| - if (!argument)
|
| - return nullptr;
|
| -
|
| - Vector<CSSParserValue*> radiusArguments;
|
| - while (argument) {
|
| - radiusArguments.append(argument);
|
| - argument = args->next();
|
| - }
|
| -
|
| - unsigned num = radiusArguments.size();
|
| - if (!num || num > 9)
|
| - return nullptr;
|
| -
|
| - // FIXME: Refactor completeBorderRadii and the array
|
| - RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[2][4];
|
| -#if ENABLE(OILPAN)
|
| - // Zero initialize the array of raw pointers.
|
| - memset(&radii, 0, sizeof(radii));
|
| -#endif
|
| -
|
| - unsigned indexAfterSlash = 0;
|
| - for (unsigned i = 0; i < num; ++i) {
|
| - CSSParserValue* value = radiusArguments.at(i);
|
| - if (value->m_unit == CSSParserValue::Operator) {
|
| - if (value->iValue != '/')
|
| - return nullptr;
|
| -
|
| - if (!i || indexAfterSlash || i + 1 == num)
|
| - return nullptr;
|
| -
|
| - indexAfterSlash = i + 1;
|
| - completeBorderRadii(radii[0]);
|
| - continue;
|
| - }
|
| -
|
| - if (i - indexAfterSlash >= 4)
|
| - return nullptr;
|
| -
|
| - if (!validUnit(value, FLength | FPercent | FNonNeg))
|
| - return nullptr;
|
| -
|
| - RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = createPrimitiveNumericValue(value);
|
| -
|
| - if (!indexAfterSlash)
|
| - radii[0][i] = radius;
|
| - else
|
| - radii[1][i - indexAfterSlash] = radius.release();
|
| - }
|
| -
|
| - if (!indexAfterSlash) {
|
| - completeBorderRadii(radii[0]);
|
| - for (unsigned i = 0; i < 4; ++i)
|
| - radii[1][i] = radii[0][i];
|
| - } else {
|
| - completeBorderRadii(radii[1]);
|
| - }
|
| - shape->setTopLeftRadius(CSSValuePair::create(radii[0][0].release(), radii[1][0].release(), CSSValuePair::DropIdenticalValues));
|
| - shape->setTopRightRadius(CSSValuePair::create(radii[0][1].release(), radii[1][1].release(), CSSValuePair::DropIdenticalValues));
|
| - shape->setBottomRightRadius(CSSValuePair::create(radii[0][2].release(), radii[1][2].release(), CSSValuePair::DropIdenticalValues));
|
| - shape->setBottomLeftRadius(CSSValuePair::create(radii[0][3].release(), radii[1][3].release(), CSSValuePair::DropIdenticalValues));
|
| -
|
| - return shape;
|
| -}
|
| -
|
| PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicShapeInset(CSSParserValueList* args)
|
| {
|
| ASSERT(args);
|
| @@ -2718,6 +2658,8 @@ PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicSha
|
|
|
| while (argument) {
|
| if (argument->m_unit == CSSParserValue::Identifier && argument->id == CSSValueRound) {
|
| + if (!args->next())
|
| + return nullptr;
|
| hasRoundedInset = true;
|
| break;
|
| }
|
| @@ -2751,8 +2693,18 @@ PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicSha
|
| return nullptr;
|
| }
|
|
|
| - if (hasRoundedInset)
|
| - return parseInsetRoundedCorners(shape.release(), args);
|
| + if (hasRoundedInset) {
|
| + // FIXME: Refactor completeBorderRadii and the array
|
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4];
|
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4];
|
| + if (!parseRadii(radii, radii2, args))
|
| + return nullptr;
|
| + shape->setTopLeftRadius(CSSValuePair::create(radii[0].release(), radii2[0].release(), CSSValuePair::DropIdenticalValues));
|
| + shape->setTopRightRadius(CSSValuePair::create(radii[1].release(), radii2[1].release(), CSSValuePair::DropIdenticalValues));
|
| + shape->setBottomRightRadius(CSSValuePair::create(radii[2].release(), radii2[2].release(), CSSValuePair::DropIdenticalValues));
|
| + shape->setBottomLeftRadius(CSSValuePair::create(radii[3].release(), radii2[3].release(), CSSValuePair::DropIdenticalValues));
|
| + }
|
| +
|
| return shape.release();
|
| }
|
|
|
| @@ -3867,66 +3819,40 @@ bool CSSPropertyParser::parseBorderImageOutset(RefPtrWillBeRawPtr<CSSQuadValue>&
|
| return parseBorderImageQuad(FLength | FNumber | FNonNeg, result);
|
| }
|
|
|
| -bool CSSPropertyParser::parseBorderRadius(CSSPropertyID unresolvedProperty, bool important)
|
| +bool CSSPropertyParser::parseRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4], RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4], CSSParserValueList* args, CSSPropertyID unresolvedProperty)
|
| {
|
| - unsigned num = m_valueList->size();
|
| - if (num > 9)
|
| - return false;
|
| -
|
| - ShorthandScope scope(this, unresolvedProperty);
|
| - RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[2][4];
|
| -#if ENABLE(OILPAN)
|
| - // Zero initialize the array of raw pointers.
|
| - memset(&radii, 0, sizeof(radii));
|
| -#endif
|
| -
|
| - unsigned indexAfterSlash = 0;
|
| - for (unsigned i = 0; i < num; ++i) {
|
| - CSSParserValue* value = m_valueList->valueAt(i);
|
| - if (value->m_unit == CSSParserValue::Operator) {
|
| - if (value->iValue != '/')
|
| - return false;
|
| -
|
| - if (!i || indexAfterSlash || i + 1 == num || num > i + 5)
|
| - return false;
|
| -
|
| - indexAfterSlash = i + 1;
|
| - completeBorderRadii(radii[0]);
|
| - continue;
|
| - }
|
| -
|
| - if (i - indexAfterSlash >= 4)
|
| - return false;
|
| -
|
| + CSSParserValue* value = args->current();
|
| + int i;
|
| + for (i = 0; i < 4 && value && value->m_unit != CSSParserValue::Operator;++i, value = args->next()) {
|
| if (!validUnit(value, FLength | FPercent | FNonNeg))
|
| return false;
|
|
|
| - RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = createPrimitiveNumericValue(value);
|
| -
|
| - if (!indexAfterSlash) {
|
| - radii[0][i] = radius;
|
| -
|
| - // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2;
|
| - if (num == 2 && unresolvedProperty == CSSPropertyAliasWebkitBorderRadius) {
|
| - indexAfterSlash = 1;
|
| - completeBorderRadii(radii[0]);
|
| - }
|
| - } else
|
| - radii[1][i - indexAfterSlash] = radius.release();
|
| + radii[i] = createPrimitiveNumericValue(value);
|
| }
|
|
|
| - if (!indexAfterSlash) {
|
| - completeBorderRadii(radii[0]);
|
| + if (!i || (value && value->m_unit == CSSParserValue::Operator && value->iValue != '/'))
|
| + return false;
|
| + // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2;
|
| + if (!value && i == 2 && unresolvedProperty == CSSPropertyAliasWebkitBorderRadius) {
|
| + radii2[0] = radii[1];
|
| + radii[1] = nullptr;
|
| + completeBorderRadii(radii);
|
| + completeBorderRadii(radii2);
|
| + return true;
|
| + }
|
| + completeBorderRadii(radii);
|
| + if (value) {
|
| + value = args->next();
|
| + for (i = 0; i < 4 && value && validUnit(value, FLength | FPercent | FNonNeg); ++i, value = args->next())
|
| + radii2[i] = createPrimitiveNumericValue(value);
|
| + if (!i || value)
|
| + return false;
|
| + completeBorderRadii(radii2);
|
| + } else {
|
| for (unsigned i = 0; i < 4; ++i)
|
| - radii[1][i] = radii[0][i];
|
| - } else
|
| - completeBorderRadii(radii[1]);
|
| + radii2[i] = radii[i];
|
| + }
|
|
|
| - ImplicitScope implicitScope(this);
|
| - addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(radii[0][0].release(), radii[1][0].release(), CSSValuePair::DropIdenticalValues), important);
|
| - addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(radii[0][1].release(), radii[1][1].release(), CSSValuePair::DropIdenticalValues), important);
|
| - addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(radii[0][2].release(), radii[1][2].release(), CSSValuePair::DropIdenticalValues), important);
|
| - addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(radii[0][3].release(), radii[1][3].release(), CSSValuePair::DropIdenticalValues), important);
|
| return true;
|
| }
|
|
|
|
|