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

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

Issue 203413006: [CSS Shapes] shape-outside: ellipse(50% 50% at) causes crash (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 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
« no previous file with comments | « LayoutTests/fast/shapes/parsing/parsing-test-utils.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4132 matching lines...) Expand 10 before | Expand all | Expand 10 after
4143 return nullptr; 4143 return nullptr;
4144 4144
4145 return createPrimitiveNumericValue(value); 4145 return createPrimitiveNumericValue(value);
4146 } 4146 }
4147 4147
4148 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeCircle(C SSParserValueList* args) 4148 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeCircle(C SSParserValueList* args)
4149 { 4149 {
4150 ASSERT(args); 4150 ASSERT(args);
4151 4151
4152 // circle(radius) 4152 // circle(radius)
4153 // circle(radius at <position> 4153 // circle(radius at <position>)
4154 // circle(at <position>) 4154 // circle(at <position>)
4155 // where position defines centerX and centerY using a CSS <position> data ty pe. 4155 // where position defines centerX and centerY using a CSS <position> data ty pe.
4156 RefPtrWillBeRawPtr<CSSBasicShapeCircle> shape = CSSBasicShapeCircle::create( ); 4156 RefPtrWillBeRawPtr<CSSBasicShapeCircle> shape = CSSBasicShapeCircle::create( );
4157 4157
4158 for (CSSParserValue* argument = args->current(); argument; argument = args-> next()) { 4158 for (CSSParserValue* argument = args->current(); argument; argument = args-> next()) {
4159 // The call to parseFillPosition below should consume all of the 4159 // The call to parseFillPosition below should consume all of the
4160 // arguments except the first two. Thus, and index greater than one 4160 // arguments except the first two. Thus, and index greater than one
4161 // indicates an invalid production. 4161 // indicates an invalid production.
4162 if (args->currentIndex() > 1) 4162 if (args->currentIndex() > 1)
4163 return nullptr; 4163 return nullptr;
4164 4164
4165 if (!args->currentIndex() && argument->id != CSSValueAt) { 4165 if (!args->currentIndex() && argument->id != CSSValueAt) {
4166 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius( argument)) { 4166 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius( argument)) {
4167 shape->setRadius(radius); 4167 shape->setRadius(radius);
4168 continue; 4168 continue;
4169 } 4169 }
4170 4170
4171 return nullptr; 4171 return nullptr;
4172 } 4172 }
4173 4173
4174 if (argument->id == CSSValueAt) { 4174 if (argument->id == CSSValueAt && args->next()) {
4175 RefPtrWillBeRawPtr<CSSValue> centerX; 4175 RefPtrWillBeRawPtr<CSSValue> centerX;
4176 RefPtrWillBeRawPtr<CSSValue> centerY; 4176 RefPtrWillBeRawPtr<CSSValue> centerY;
4177 args->next(); // set list to start of position center
4178 parseFillPosition(args, centerX, centerY); 4177 parseFillPosition(args, centerX, centerY);
4179 if (centerX && centerY && !args->current()) { 4178 if (centerX && centerY && !args->current()) {
4180 ASSERT(centerX->isPrimitiveValue()); 4179 ASSERT(centerX->isPrimitiveValue());
4181 ASSERT(centerY->isPrimitiveValue()); 4180 ASSERT(centerY->isPrimitiveValue());
4182 shape->setCenterX(toCSSPrimitiveValue(centerX.get())); 4181 shape->setCenterX(toCSSPrimitiveValue(centerX.get()));
4183 shape->setCenterY(toCSSPrimitiveValue(centerY.get())); 4182 shape->setCenterY(toCSSPrimitiveValue(centerY.get()));
4184 } else { 4183 } else {
4185 return nullptr; 4184 return nullptr;
4186 } 4185 }
4187 } else { 4186 } else {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4240 if (argumentNumber < 3) 4239 if (argumentNumber < 3)
4241 return nullptr; 4240 return nullptr;
4242 return shape; 4241 return shape;
4243 } 4242 }
4244 4243
4245 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeEllipse( CSSParserValueList* args) 4244 PassRefPtrWillBeRawPtr<CSSBasicShape> CSSPropertyParser::parseBasicShapeEllipse( CSSParserValueList* args)
4246 { 4245 {
4247 ASSERT(args); 4246 ASSERT(args);
4248 4247
4249 // ellipse(radiusX) 4248 // ellipse(radiusX)
4250 // ellipse(radiusX at <position> 4249 // ellipse(radiusX at <position>)
4251 // ellipse(radiusX radiusY) 4250 // ellipse(radiusX radiusY)
4252 // ellipse(radiusX radiusY at <position> 4251 // ellipse(radiusX radiusY at <position>)
4253 // ellipse(at <position>) 4252 // ellipse(at <position>)
4254 // where position defines centerX and centerY using a CSS <position> data ty pe. 4253 // where position defines centerX and centerY using a CSS <position> data ty pe.
4255 RefPtrWillBeRawPtr<CSSBasicShapeEllipse> shape = CSSBasicShapeEllipse::creat e(); 4254 RefPtrWillBeRawPtr<CSSBasicShapeEllipse> shape = CSSBasicShapeEllipse::creat e();
4256 4255
4257 for (CSSParserValue* argument = args->current(); argument; argument = args-> next()) { 4256 for (CSSParserValue* argument = args->current(); argument; argument = args-> next()) {
4258 // The call to parseFillPosition below should consume all of the 4257 // The call to parseFillPosition below should consume all of the
4259 // arguments except the first three. Thus, an index greater than two 4258 // arguments except the first three. Thus, an index greater than two
4260 // indicates an invalid production. 4259 // indicates an invalid production.
4261 if (args->currentIndex() > 2) 4260 if (args->currentIndex() > 2)
4262 return nullptr; 4261 return nullptr;
4263 4262
4264 if (args->currentIndex() < 2 && argument->id != CSSValueAt) { 4263 if (args->currentIndex() < 2 && argument->id != CSSValueAt) {
4265 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius( argument)) { 4264 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius( argument)) {
4266 if (!shape->radiusX()) 4265 if (!shape->radiusX())
4267 shape->setRadiusX(radius); 4266 shape->setRadiusX(radius);
4268 else 4267 else
4269 shape->setRadiusY(radius); 4268 shape->setRadiusY(radius);
4270 continue; 4269 continue;
4271 } 4270 }
4272 4271
4273 return nullptr; 4272 return nullptr;
4274 } 4273 }
4275 4274
4276 if (argument->id != CSSValueAt) 4275 if (argument->id != CSSValueAt || !args->next()) // expecting ellipse(.. at <position>)
4277 return nullptr; 4276 return nullptr;
4278 RefPtrWillBeRawPtr<CSSValue> centerX; 4277 RefPtrWillBeRawPtr<CSSValue> centerX;
4279 RefPtrWillBeRawPtr<CSSValue> centerY; 4278 RefPtrWillBeRawPtr<CSSValue> centerY;
4280 args->next(); // set list to start of position center
4281 parseFillPosition(args, centerX, centerY); 4279 parseFillPosition(args, centerX, centerY);
4282 if (!centerX || !centerY || args->current()) 4280 if (!centerX || !centerY || args->current())
4283 return nullptr; 4281 return nullptr;
4284 4282
4285 ASSERT(centerX->isPrimitiveValue()); 4283 ASSERT(centerX->isPrimitiveValue());
4286 ASSERT(centerY->isPrimitiveValue()); 4284 ASSERT(centerY->isPrimitiveValue());
4287 shape->setCenterX(toCSSPrimitiveValue(centerX.get())); 4285 shape->setCenterX(toCSSPrimitiveValue(centerX.get()));
4288 shape->setCenterY(toCSSPrimitiveValue(centerY.get())); 4286 shape->setCenterY(toCSSPrimitiveValue(centerY.get()));
4289 } 4287 }
4290 4288
(...skipping 4164 matching lines...) Expand 10 before | Expand all | Expand 10 after
8455 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueFill)); 8453 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueFill));
8456 if (!seenStroke) 8454 if (!seenStroke)
8457 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueStroke) ); 8455 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueStroke) );
8458 if (!seenMarkers) 8456 if (!seenMarkers)
8459 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueMarkers )); 8457 parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueMarkers ));
8460 8458
8461 return parsedValues.release(); 8459 return parsedValues.release();
8462 } 8460 }
8463 8461
8464 } // namespace WebCore 8462 } // namespace WebCore
OLDNEW
« no previous file with comments | « LayoutTests/fast/shapes/parsing/parsing-test-utils.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698