| Index: Source/core/css/CSSParser-in.cpp
|
| diff --git a/Source/core/css/CSSParser-in.cpp b/Source/core/css/CSSParser-in.cpp
|
| index 132b74d87b4636fc05205c29bf99b1fae646f71b..98689989b10e78d214f4559be623ce84e5ab1862 100755
|
| --- a/Source/core/css/CSSParser-in.cpp
|
| +++ b/Source/core/css/CSSParser-in.cpp
|
| @@ -5157,15 +5157,73 @@ PassRefPtr<CSSBasicShape> CSSParser::parseBasicShapeInsetRectangle(CSSParserValu
|
| return shape;
|
| }
|
|
|
| +PassRefPtr<CSSPrimitiveValue> CSSParser::parseShapeRadius(CSSParserValue* value)
|
| +{
|
| + if (value->id == CSSValueClosestSide || value->id == CSSValueFarthestSide)
|
| + return cssValuePool().createIdentifierValue(value->id);
|
| +
|
| + if (!validUnit(value, FLength | FPercent | FNonNeg))
|
| + return 0;
|
| +
|
| + return createPrimitiveNumericValue(value);
|
| +}
|
| +
|
| PassRefPtr<CSSBasicShape> CSSParser::parseBasicShapeCircle(CSSParserValueList* args)
|
| {
|
| ASSERT(args);
|
|
|
| + // circle(radius)
|
| + // circle(radius at <position>
|
| + // circle(at <position>)
|
| + // where position defines centerX and centerY using a CSS <position> data type.
|
| + RefPtr<CSSBasicShapeCircle> shape = CSSBasicShapeCircle::create();
|
| +
|
| + for (CSSParserValue* argument = args->current(); argument; argument = args->next()) {
|
| + // The call to parseFillPosition below should consume all of the
|
| + // arguments except the first two. Thus, and index greater than one
|
| + // indicates an invalid production.
|
| + if (args->currentIndex() > 1)
|
| + return 0;
|
| +
|
| + if (!args->currentIndex() && argument->id != CSSValueAt) {
|
| + if (RefPtr<CSSPrimitiveValue> radius = parseShapeRadius(argument)) {
|
| + shape->setRadius(radius);
|
| + continue;
|
| + }
|
| +
|
| + return 0;
|
| + }
|
| +
|
| + if (argument->id == CSSValueAt) {
|
| + RefPtr<CSSValue> centerX;
|
| + RefPtr<CSSValue> centerY;
|
| + args->next(); // set list to start of position center
|
| + parseFillPosition(args, centerX, centerY);
|
| + if (centerX && centerY) {
|
| + ASSERT(centerX->isPrimitiveValue());
|
| + ASSERT(centerY->isPrimitiveValue());
|
| + shape->setCenterX(toCSSPrimitiveValue(centerX.get()));
|
| + shape->setCenterY(toCSSPrimitiveValue(centerY.get()));
|
| + } else {
|
| + return 0;
|
| + }
|
| + } else {
|
| + return 0;
|
| + }
|
| + }
|
| +
|
| + return shape;
|
| +}
|
| +
|
| +PassRefPtr<CSSBasicShape> CSSParser::parseDeprecatedBasicShapeCircle(CSSParserValueList* args)
|
| +{
|
| + ASSERT(args);
|
| +
|
| // circle(centerX, centerY, radius)
|
| if (args->size() != 5)
|
| return 0;
|
|
|
| - RefPtr<CSSBasicShapeCircle> shape = CSSBasicShapeCircle::create();
|
| + RefPtr<CSSDeprecatedBasicShapeCircle> shape = CSSDeprecatedBasicShapeCircle::create();
|
|
|
| unsigned argumentNumber = 0;
|
| CSSParserValue* argument = args->current();
|
| @@ -5324,6 +5382,20 @@ static bool isBoxValue(CSSValueID valueId)
|
| return false;
|
| }
|
|
|
| +// FIXME This function is temporary to allow for an orderly transition between
|
| +// the new CSS Shapes circle and ellipse syntax. It will be removed when the
|
| +// old syntax is removed.
|
| +static bool isDeprecatedBasicShape(CSSParserValueList* args)
|
| +{
|
| + for (unsigned i = args->currentIndex(); i < args->size(); ++i) {
|
| + CSSParserValue* value = args->valueAt(i);
|
| + if (isComma(value))
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| PassRefPtr<CSSValue> CSSParser::parseShapeProperty(CSSPropertyID propId)
|
| {
|
| if (!RuntimeEnabledFeatures::cssShapesEnabled())
|
| @@ -5396,7 +5468,10 @@ PassRefPtr<CSSPrimitiveValue> CSSParser::parseBasicShape()
|
| if (equalIgnoringCase(value->function->name, "rectangle("))
|
| shape = parseBasicShapeRectangle(args);
|
| else if (equalIgnoringCase(value->function->name, "circle("))
|
| - shape = parseBasicShapeCircle(args);
|
| + if (isDeprecatedBasicShape(args))
|
| + shape = parseDeprecatedBasicShapeCircle(args);
|
| + else
|
| + shape = parseBasicShapeCircle(args);
|
| else if (equalIgnoringCase(value->function->name, "ellipse("))
|
| shape = parseBasicShapeEllipse(args);
|
| else if (equalIgnoringCase(value->function->name, "polygon("))
|
|
|