Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1158)

Side by Side Diff: Source/core/css/parser/CSSPropertyParser.cpp

Issue 200633005: [CSS Shapes] Remove deprecated shapes (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase against ToR Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
9 * Copyright (C) 2012 Intel Corporation. All rights reserved. 9 * Copyright (C) 2012 Intel Corporation. All rights reserved.
10 * 10 *
(...skipping 4004 matching lines...) Expand 10 before | Expand all | Expand 10 after
4015 4015
4016 ASSERT(position); 4016 ASSERT(position);
4017 if (overflowAlignmentKeyword) 4017 if (overflowAlignmentKeyword)
4018 addProperty(propId, createPrimitiveValuePair(position, overflowAlignment Keyword), important); 4018 addProperty(propId, createPrimitiveValuePair(position, overflowAlignment Keyword), important);
4019 else 4019 else
4020 addProperty(propId, position.release(), important); 4020 addProperty(propId, position.release(), important);
4021 4021
4022 return true; 4022 return true;
4023 } 4023 }
4024 4024
4025 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeRectangl e(CSSParserValueList* args)
4026 {
4027 ASSERT(args);
4028
4029 // rect(x, y, width, height, [[rx], ry])
4030 if (args->size() != 7 && args->size() != 9 && args->size() != 11)
4031 return nullptr;
4032
4033 RefPtrWillBeRawPtr<CSSBasicShapeRectangle> shape = CSSBasicShapeRectangle::c reate();
4034
4035 unsigned argumentNumber = 0;
4036 CSSParserValue* argument = args->current();
4037 while (argument) {
4038 Units unitFlags = FLength | FPercent;
4039 if (argumentNumber > 1) {
4040 // Arguments width, height, rx, and ry cannot be negative.
4041 unitFlags = unitFlags | FNonNeg;
4042 }
4043 if (!validUnit(argument, unitFlags))
4044 return nullptr;
4045
4046 RefPtrWillBeRawPtr<CSSPrimitiveValue> length = createPrimitiveNumericVal ue(argument);
4047 ASSERT(argumentNumber < 6);
4048 switch (argumentNumber) {
4049 case 0:
4050 shape->setX(length);
4051 break;
4052 case 1:
4053 shape->setY(length);
4054 break;
4055 case 2:
4056 shape->setWidth(length);
4057 break;
4058 case 3:
4059 shape->setHeight(length);
4060 break;
4061 case 4:
4062 shape->setRadiusX(length);
4063 break;
4064 case 5:
4065 shape->setRadiusY(length);
4066 break;
4067 }
4068 argument = args->next();
4069 if (argument) {
4070 if (!isComma(argument))
4071 return nullptr;
4072
4073 argument = args->next();
4074 }
4075 argumentNumber++;
4076 }
4077
4078 if (argumentNumber < 4)
4079 return nullptr;
4080 return shape;
4081 }
4082
4083 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeInsetRec tangle(CSSParserValueList* args)
4084 {
4085 ASSERT(args);
4086
4087 // inset-rectangle(top, right, bottom, left, [[rx], ry])
4088 if (args->size() != 7 && args->size() != 9 && args->size() != 11)
4089 return nullptr;
4090
4091 RefPtrWillBeRawPtr<CSSBasicShapeInsetRectangle> shape = CSSBasicShapeInsetRe ctangle::create();
4092
4093 unsigned argumentNumber = 0;
4094 CSSParserValue* argument = args->current();
4095 while (argument) {
4096 Units unitFlags = FLength | FPercent | FNonNeg;
4097 if (!validUnit(argument, unitFlags))
4098 return nullptr;
4099
4100 RefPtrWillBeRawPtr<CSSPrimitiveValue> length = createPrimitiveNumericVal ue(argument);
4101 ASSERT(argumentNumber < 6);
4102 switch (argumentNumber) {
4103 case 0:
4104 shape->setTop(length);
4105 break;
4106 case 1:
4107 shape->setRight(length);
4108 break;
4109 case 2:
4110 shape->setBottom(length);
4111 break;
4112 case 3:
4113 shape->setLeft(length);
4114 break;
4115 case 4:
4116 shape->setRadiusX(length);
4117 break;
4118 case 5:
4119 shape->setRadiusY(length);
4120 break;
4121 }
4122 argument = args->next();
4123 if (argument) {
4124 if (!isComma(argument))
4125 return nullptr;
4126
4127 argument = args->next();
4128 }
4129 argumentNumber++;
4130 }
4131
4132 if (argumentNumber < 4)
4133 return nullptr;
4134 return shape;
4135 }
4136
4137 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseShapeRadius(CS SParserValue* value) 4025 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseShapeRadius(CS SParserValue* value)
4138 { 4026 {
4139 if (value->id == CSSValueClosestSide || value->id == CSSValueFarthestSide) 4027 if (value->id == CSSValueClosestSide || value->id == CSSValueFarthestSide)
4140 return cssValuePool().createIdentifierValue(value->id); 4028 return cssValuePool().createIdentifierValue(value->id);
4141 4029
4142 if (!validUnit(value, FLength | FPercent | FNonNeg)) 4030 if (!validUnit(value, FLength | FPercent | FNonNeg))
4143 return nullptr; 4031 return nullptr;
4144 4032
4145 return createPrimitiveNumericValue(value); 4033 return createPrimitiveNumericValue(value);
4146 } 4034 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4185 return nullptr; 4073 return nullptr;
4186 } 4074 }
4187 } else { 4075 } else {
4188 return nullptr; 4076 return nullptr;
4189 } 4077 }
4190 } 4078 }
4191 4079
4192 return shape; 4080 return shape;
4193 } 4081 }
4194 4082
4195 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseDeprecatedBasicSha peCircle(CSSParserValueList* args)
4196 {
4197 ASSERT(args);
4198
4199 // circle(centerX, centerY, radius)
4200 if (args->size() != 5)
4201 return nullptr;
4202
4203 RefPtrWillBeRawPtr<CSSDeprecatedBasicShapeCircle> shape = CSSDeprecatedBasic ShapeCircle::create();
4204
4205 unsigned argumentNumber = 0;
4206 CSSParserValue* argument = args->current();
4207 while (argument) {
4208 Units unitFlags = FLength | FPercent;
4209 if (argumentNumber == 2) {
4210 // Argument radius cannot be negative.
4211 unitFlags = unitFlags | FNonNeg;
4212 }
4213
4214 if (!validUnit(argument, unitFlags))
4215 return nullptr;
4216
4217 RefPtrWillBeRawPtr<CSSPrimitiveValue> length = createPrimitiveNumericVal ue(argument);
4218 ASSERT(argumentNumber < 3);
4219 switch (argumentNumber) {
4220 case 0:
4221 shape->setCenterX(length);
4222 break;
4223 case 1:
4224 shape->setCenterY(length);
4225 break;
4226 case 2:
4227 shape->setRadius(length);
4228 break;
4229 }
4230
4231 argument = args->next();
4232 if (argument) {
4233 if (!isComma(argument))
4234 return nullptr;
4235 argument = args->next();
4236 }
4237 argumentNumber++;
4238 }
4239
4240 if (argumentNumber < 3)
4241 return nullptr;
4242 return shape;
4243 }
4244
4245 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeEllipse( CSSParserValueList* args) 4083 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeEllipse( CSSParserValueList* args)
4246 { 4084 {
4247 ASSERT(args); 4085 ASSERT(args);
4248 4086
4249 // ellipse(radiusX) 4087 // ellipse(radiusX)
4250 // ellipse(radiusX at <position> 4088 // ellipse(radiusX at <position>
4251 // ellipse(radiusX radiusY) 4089 // ellipse(radiusX radiusY)
4252 // ellipse(radiusX radiusY at <position> 4090 // ellipse(radiusX radiusY at <position>
4253 // ellipse(at <position>) 4091 // ellipse(at <position>)
4254 // where position defines centerX and centerY using a CSS <position> data ty pe. 4092 // where position defines centerX and centerY using a CSS <position> data ty pe.
(...skipping 29 matching lines...) Expand all
4284 4122
4285 ASSERT(centerX->isPrimitiveValue()); 4123 ASSERT(centerX->isPrimitiveValue());
4286 ASSERT(centerY->isPrimitiveValue()); 4124 ASSERT(centerY->isPrimitiveValue());
4287 shape->setCenterX(toCSSPrimitiveValue(centerX.get())); 4125 shape->setCenterX(toCSSPrimitiveValue(centerX.get()));
4288 shape->setCenterY(toCSSPrimitiveValue(centerY.get())); 4126 shape->setCenterY(toCSSPrimitiveValue(centerY.get()));
4289 } 4127 }
4290 4128
4291 return shape; 4129 return shape;
4292 } 4130 }
4293 4131
4294 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseDeprecatedBasicSha peEllipse(CSSParserValueList* args)
4295 {
4296 ASSERT(args);
4297
4298 // ellipse(centerX, centerY, radiusX, radiusY)
4299 if (args->size() != 7)
4300 return nullptr;
4301
4302 RefPtrWillBeRawPtr<CSSDeprecatedBasicShapeEllipse> shape = CSSDeprecatedBasi cShapeEllipse::create();
4303 unsigned argumentNumber = 0;
4304 CSSParserValue* argument = args->current();
4305 while (argument) {
4306 Units unitFlags = FLength | FPercent;
4307 if (argumentNumber > 1) {
4308 // Arguments radiusX and radiusY cannot be negative.
4309 unitFlags = unitFlags | FNonNeg;
4310 }
4311 if (!validUnit(argument, unitFlags))
4312 return nullptr;
4313
4314 RefPtrWillBeRawPtr<CSSPrimitiveValue> length = createPrimitiveNumericVal ue(argument);
4315 ASSERT(argumentNumber < 4);
4316 switch (argumentNumber) {
4317 case 0:
4318 shape->setCenterX(length);
4319 break;
4320 case 1:
4321 shape->setCenterY(length);
4322 break;
4323 case 2:
4324 shape->setRadiusX(length);
4325 break;
4326 case 3:
4327 shape->setRadiusY(length);
4328 break;
4329 }
4330
4331 argument = args->next();
4332 if (argument) {
4333 if (!isComma(argument))
4334 return nullptr;
4335 argument = args->next();
4336 }
4337 argumentNumber++;
4338 }
4339
4340 if (argumentNumber < 4)
4341 return nullptr;
4342 return shape;
4343 }
4344
4345 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapePolygon( CSSParserValueList* args) 4132 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapePolygon( CSSParserValueList* args)
4346 { 4133 {
4347 ASSERT(args); 4134 ASSERT(args);
4348 4135
4349 unsigned size = args->size(); 4136 unsigned size = args->size();
4350 if (!size) 4137 if (!size)
4351 return nullptr; 4138 return nullptr;
4352 4139
4353 RefPtrWillBeRawPtr<CSSBasicShapePolygon> shape = CSSBasicShapePolygon::creat e(); 4140 RefPtrWillBeRawPtr<CSSBasicShapePolygon> shape = CSSBasicShapePolygon::creat e();
4354 4141
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
4401 case CSSValueBorderBox: 4188 case CSSValueBorderBox:
4402 case CSSValueMarginBox: 4189 case CSSValueMarginBox:
4403 return true; 4190 return true;
4404 default: 4191 default:
4405 break; 4192 break;
4406 } 4193 }
4407 4194
4408 return false; 4195 return false;
4409 } 4196 }
4410 4197
4411 // FIXME This function is temporary to allow for an orderly transition between
4412 // the new CSS Shapes circle and ellipse syntax. It will be removed when the
4413 // old syntax is removed.
4414 static bool isDeprecatedBasicShape(CSSParserValueList* args)
4415 {
4416 for (unsigned i = args->currentIndex(); i < args->size(); ++i) {
4417 CSSParserValue* value = args->valueAt(i);
4418 if (isComma(value))
4419 return true;
4420 }
4421
4422 return false;
4423 }
4424
4425 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseShapeProperty(CSSProper tyID propId) 4198 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseShapeProperty(CSSProper tyID propId)
4426 { 4199 {
4427 if (!RuntimeEnabledFeatures::cssShapesEnabled()) 4200 if (!RuntimeEnabledFeatures::cssShapesEnabled())
4428 return nullptr; 4201 return nullptr;
4429 4202
4430 CSSParserValue* value = m_valueList->current(); 4203 CSSParserValue* value = m_valueList->current();
4431 CSSValueID valueId = value->id; 4204 CSSValueID valueId = value->id;
4432 RefPtrWillBeRawPtr<CSSPrimitiveValue> boxValue; 4205 RefPtrWillBeRawPtr<CSSPrimitiveValue> boxValue;
4433 RefPtrWillBeRawPtr<CSSPrimitiveValue> shapeValue; 4206 RefPtrWillBeRawPtr<CSSPrimitiveValue> shapeValue;
4434 4207
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4487 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseBasicShape() 4260 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseBasicShape()
4488 { 4261 {
4489 CSSParserValue* value = m_valueList->current(); 4262 CSSParserValue* value = m_valueList->current();
4490 ASSERT(value->unit == CSSParserValue::Function); 4263 ASSERT(value->unit == CSSParserValue::Function);
4491 CSSParserValueList* args = value->function->args.get(); 4264 CSSParserValueList* args = value->function->args.get();
4492 4265
4493 if (!args) 4266 if (!args)
4494 return nullptr; 4267 return nullptr;
4495 4268
4496 RefPtrWillBeRawPtr<CSSBasicShape> shape; 4269 RefPtrWillBeRawPtr<CSSBasicShape> shape;
4497 if (equalIgnoringCase(value->function->name, "rectangle(")) 4270 if (equalIgnoringCase(value->function->name, "circle("))
4498 shape = parseBasicShapeRectangle(args); 4271 shape = parseBasicShapeCircle(args);
4499 else if (equalIgnoringCase(value->function->name, "circle("))
4500 if (isDeprecatedBasicShape(args))
4501 shape = parseDeprecatedBasicShapeCircle(args);
4502 else
4503 shape = parseBasicShapeCircle(args);
4504 else if (equalIgnoringCase(value->function->name, "ellipse(")) 4272 else if (equalIgnoringCase(value->function->name, "ellipse("))
4505 if (isDeprecatedBasicShape(args)) 4273 shape = parseBasicShapeEllipse(args);
4506 shape = parseDeprecatedBasicShapeEllipse(args);
4507 else
4508 shape = parseBasicShapeEllipse(args);
4509 else if (equalIgnoringCase(value->function->name, "polygon(")) 4274 else if (equalIgnoringCase(value->function->name, "polygon("))
4510 shape = parseBasicShapePolygon(args); 4275 shape = parseBasicShapePolygon(args);
4511 else if (equalIgnoringCase(value->function->name, "inset-rectangle("))
4512 shape = parseBasicShapeInsetRectangle(args);
4513 else if (equalIgnoringCase(value->function->name, "inset(")) 4276 else if (equalIgnoringCase(value->function->name, "inset("))
4514 shape = parseBasicShapeInset(args); 4277 shape = parseBasicShapeInset(args);
4515 4278
4516 if (!shape) 4279 if (!shape)
4517 return nullptr; 4280 return nullptr;
4518 4281
4519 m_valueList->next(); 4282 m_valueList->next();
4520 4283
4521 return cssValuePool().createValue(shape.release()); 4284 return cssValuePool().createValue(shape.release());
4522 } 4285 }
(...skipping 3932 matching lines...) Expand 10 before | Expand all | Expand 10 after
8455 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueFill)); 8218 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueFill));
8456 if (!seenStroke) 8219 if (!seenStroke)
8457 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueStroke) ); 8220 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueStroke) );
8458 if (!seenMarkers) 8221 if (!seenMarkers)
8459 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueMarkers )); 8222 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueMarkers ));
8460 8223
8461 return parsedValues.release(); 8224 return parsedValues.release();
8462 } 8225 }
8463 8226
8464 } // namespace WebCore 8227 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698