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

Side by Side Diff: Source/core/css/CSSParser-in.cpp

Issue 98723006: Parse new circle shape syntax (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase after 164114 Created 7 years 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 5139 matching lines...) Expand 10 before | Expand all | Expand 10 after
5150 argument = args->next(); 5150 argument = args->next();
5151 } 5151 }
5152 argumentNumber++; 5152 argumentNumber++;
5153 } 5153 }
5154 5154
5155 if (argumentNumber < 4) 5155 if (argumentNumber < 4)
5156 return 0; 5156 return 0;
5157 return shape; 5157 return shape;
5158 } 5158 }
5159 5159
5160 PassRefPtr<CSSPrimitiveValue> CSSParser::parseShapeRadius(CSSParserValue* value)
5161 {
5162 if (value->id == CSSValueClosestSide && value->id == CSSValueFarthestSide)
Bem Jones-Bey (adobe) 2013/12/18 21:57:57 This should be ||, not &&.
5163 return cssValuePool().createIdentifierValue(value->id);
5164
5165 if (!validUnit(value, FLength | FPercent | FNonNeg))
5166 return 0;
5167
5168 return createPrimitiveNumericValue(value);
5169 }
5170
5160 PassRefPtr<CSSBasicShape> CSSParser::parseBasicShapeCircle(CSSParserValueList* a rgs) 5171 PassRefPtr<CSSBasicShape> CSSParser::parseBasicShapeCircle(CSSParserValueList* a rgs)
5161 { 5172 {
5162 ASSERT(args); 5173 ASSERT(args);
5163 5174
5175 // circle(radius)
5176 // circle(radius at <position>
5177 // circle(at <position>)
5178 // where position defines centerX and centerY using a CSS <position> data ty pe.
5179 RefPtr<CSSBasicShapeCircle> shape = CSSBasicShapeCircle::create();
5180
5181 for (CSSParserValue* argument = args->current(); argument; argument = args-> next()) {
5182 // The call to parseFillPosition below should consume all of the
5183 // arguments except the first two. Thus, and index greater than one
5184 // indicates an invalid production.
5185 if (args->currentIndex() > 1)
5186 return 0;
5187
5188 if (!args->currentIndex() && argument->id != CSSValueAt) {
5189 if (RefPtr<CSSPrimitiveValue> radius = parseShapeRadius(argument)) {
5190 shape->setRadius(radius);
5191 continue;
5192 }
5193
5194 return 0;
5195 }
5196
5197 if (argument->id == CSSValueAt) {
5198 RefPtr<CSSValue> centerX;
5199 RefPtr<CSSValue> centerY;
5200 args->next(); // set list to start of position center
5201 parseFillPosition(args, centerX, centerY);
5202 if (centerX && centerY) {
5203 ASSERT(centerX->isPrimitiveValue());
5204 ASSERT(centerY->isPrimitiveValue());
5205 shape->setCenterX(toCSSPrimitiveValue(centerX.get()));
5206 shape->setCenterY(toCSSPrimitiveValue(centerY.get()));
5207 } else {
5208 return 0;
5209 }
5210 } else {
5211 return 0;
5212 }
5213 }
5214
5215 return shape;
5216 }
5217
5218 PassRefPtr<CSSBasicShape> CSSParser::parseDeprecatedBasicShapeCircle(CSSParserVa lueList* args)
5219 {
5220 ASSERT(args);
5221
5164 // circle(centerX, centerY, radius) 5222 // circle(centerX, centerY, radius)
5165 if (args->size() != 5) 5223 if (args->size() != 5)
5166 return 0; 5224 return 0;
5167 5225
5168 RefPtr<CSSBasicShapeCircle> shape = CSSBasicShapeCircle::create(); 5226 RefPtr<CSSDeprecatedBasicShapeCircle> shape = CSSDeprecatedBasicShapeCircle: :create();
5169 5227
5170 unsigned argumentNumber = 0; 5228 unsigned argumentNumber = 0;
5171 CSSParserValue* argument = args->current(); 5229 CSSParserValue* argument = args->current();
5172 while (argument) { 5230 while (argument) {
5173 Units unitFlags = FLength | FPercent; 5231 Units unitFlags = FLength | FPercent;
5174 if (argumentNumber == 2) { 5232 if (argumentNumber == 2) {
5175 // Argument radius cannot be negative. 5233 // Argument radius cannot be negative.
5176 unitFlags = unitFlags | FNonNeg; 5234 unitFlags = unitFlags | FNonNeg;
5177 } 5235 }
5178 5236
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
5317 case CSSValueBorderBox: 5375 case CSSValueBorderBox:
5318 case CSSValueMarginBox: 5376 case CSSValueMarginBox:
5319 return true; 5377 return true;
5320 default: 5378 default:
5321 break; 5379 break;
5322 } 5380 }
5323 5381
5324 return false; 5382 return false;
5325 } 5383 }
5326 5384
5385 // FIXME This function is temporary to allow for an orderly transition between
5386 // the new CSS Shapes circle and ellipse syntax. It will be removed when the
5387 // old syntax is removed.
5388 static bool isDeprecatedBasicShape(CSSParserValueList* args)
5389 {
5390 for (unsigned i = args->currentIndex(); i < args->size(); ++i) {
5391 CSSParserValue* value = args->valueAt(i);
5392 if (isComma(value))
5393 return true;
5394 }
5395
5396 return false;
5397 }
5398
5327 PassRefPtr<CSSValue> CSSParser::parseShapeProperty(CSSPropertyID propId) 5399 PassRefPtr<CSSValue> CSSParser::parseShapeProperty(CSSPropertyID propId)
5328 { 5400 {
5329 if (!RuntimeEnabledFeatures::cssShapesEnabled()) 5401 if (!RuntimeEnabledFeatures::cssShapesEnabled())
5330 return 0; 5402 return 0;
5331 5403
5332 CSSParserValue* value = m_valueList->current(); 5404 CSSParserValue* value = m_valueList->current();
5333 CSSValueID valueId = value->id; 5405 CSSValueID valueId = value->id;
5334 RefPtr<CSSPrimitiveValue> boxValue; 5406 RefPtr<CSSPrimitiveValue> boxValue;
5335 RefPtr<CSSPrimitiveValue> shapeValue; 5407 RefPtr<CSSPrimitiveValue> shapeValue;
5336 5408
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
5389 ASSERT(value->unit == CSSParserValue::Function); 5461 ASSERT(value->unit == CSSParserValue::Function);
5390 CSSParserValueList* args = value->function->args.get(); 5462 CSSParserValueList* args = value->function->args.get();
5391 5463
5392 if (!args) 5464 if (!args)
5393 return 0; 5465 return 0;
5394 5466
5395 RefPtr<CSSBasicShape> shape; 5467 RefPtr<CSSBasicShape> shape;
5396 if (equalIgnoringCase(value->function->name, "rectangle(")) 5468 if (equalIgnoringCase(value->function->name, "rectangle("))
5397 shape = parseBasicShapeRectangle(args); 5469 shape = parseBasicShapeRectangle(args);
5398 else if (equalIgnoringCase(value->function->name, "circle(")) 5470 else if (equalIgnoringCase(value->function->name, "circle("))
5399 shape = parseBasicShapeCircle(args); 5471 if (isDeprecatedBasicShape(args))
5472 shape = parseDeprecatedBasicShapeCircle(args);
5473 else
5474 shape = parseBasicShapeCircle(args);
5400 else if (equalIgnoringCase(value->function->name, "ellipse(")) 5475 else if (equalIgnoringCase(value->function->name, "ellipse("))
5401 shape = parseBasicShapeEllipse(args); 5476 shape = parseBasicShapeEllipse(args);
5402 else if (equalIgnoringCase(value->function->name, "polygon(")) 5477 else if (equalIgnoringCase(value->function->name, "polygon("))
5403 shape = parseBasicShapePolygon(args); 5478 shape = parseBasicShapePolygon(args);
5404 else if (equalIgnoringCase(value->function->name, "inset-rectangle(")) 5479 else if (equalIgnoringCase(value->function->name, "inset-rectangle("))
5405 shape = parseBasicShapeInsetRectangle(args); 5480 shape = parseBasicShapeInsetRectangle(args);
5406 5481
5407 if (!shape) 5482 if (!shape)
5408 return 0; 5483 return 0;
5409 5484
(...skipping 5107 matching lines...) Expand 10 before | Expand all | Expand 10 after
10517 { 10592 {
10518 // The tokenizer checks for the construct of an+b. 10593 // The tokenizer checks for the construct of an+b.
10519 // However, since the {ident} rule precedes the {nth} rule, some of those 10594 // However, since the {ident} rule precedes the {nth} rule, some of those
10520 // tokens are identified as string literal. Furthermore we need to accept 10595 // tokens are identified as string literal. Furthermore we need to accept
10521 // "odd" and "even" which does not match to an+b. 10596 // "odd" and "even" which does not match to an+b.
10522 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") 10597 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even")
10523 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); 10598 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n");
10524 } 10599 }
10525 10600
10526 } 10601 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698