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

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

Issue 14334014: Parse "-webkit-columns: auto <length>" properly. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Code review #3 Created 7 years, 5 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 2466 matching lines...) Expand 10 before | Expand all | Expand 10 after
2477 case CSSPropertyTextLineThroughWidth: 2477 case CSSPropertyTextLineThroughWidth:
2478 case CSSPropertyTextOverlineWidth: 2478 case CSSPropertyTextOverlineWidth:
2479 case CSSPropertyTextUnderlineWidth: 2479 case CSSPropertyTextUnderlineWidth:
2480 if (id == CSSValueAuto || id == CSSValueNormal || id == CSSValueThin || 2480 if (id == CSSValueAuto || id == CSSValueNormal || id == CSSValueThin ||
2481 id == CSSValueMedium || id == CSSValueThick) 2481 id == CSSValueMedium || id == CSSValueThick)
2482 validPrimitive = true; 2482 validPrimitive = true;
2483 else 2483 else
2484 validPrimitive = !id && validUnit(value, FNumber | FLength | FPercen t); 2484 validPrimitive = !id && validUnit(value, FNumber | FLength | FPercen t);
2485 break; 2485 break;
2486 case CSSPropertyWebkitColumnCount: 2486 case CSSPropertyWebkitColumnCount:
2487 if (id == CSSValueAuto) 2487 parsedValue = parseColumnCount();
2488 validPrimitive = true;
2489 else
2490 validPrimitive = !id && validUnit(value, FPositiveInteger, CSSQuirks Mode);
2491 break; 2488 break;
2492 case CSSPropertyWebkitColumnGap: // normal | <length> 2489 case CSSPropertyWebkitColumnGap: // normal | <length>
2493 if (id == CSSValueNormal) 2490 if (id == CSSValueNormal)
2494 validPrimitive = true; 2491 validPrimitive = true;
2495 else 2492 else
2496 validPrimitive = validUnit(value, FLength | FNonNeg); 2493 validPrimitive = validUnit(value, FLength | FNonNeg);
2497 break; 2494 break;
2498 case CSSPropertyWebkitColumnAxis: 2495 case CSSPropertyWebkitColumnAxis:
2499 if (id == CSSValueHorizontal || id == CSSValueVertical || id == CSSValue Auto) 2496 if (id == CSSValueHorizontal || id == CSSValueVertical || id == CSSValue Auto)
2500 validPrimitive = true; 2497 validPrimitive = true;
2501 break; 2498 break;
2502 case CSSPropertyWebkitColumnProgression: 2499 case CSSPropertyWebkitColumnProgression:
2503 if (id == CSSValueNormal || id == CSSValueReverse) 2500 if (id == CSSValueNormal || id == CSSValueReverse)
2504 validPrimitive = true; 2501 validPrimitive = true;
2505 break; 2502 break;
2506 case CSSPropertyWebkitColumnSpan: // none | all | 1 (will be dropped in the unprefixed property) 2503 case CSSPropertyWebkitColumnSpan: // none | all | 1 (will be dropped in the unprefixed property)
2507 if (id == CSSValueAll || id == CSSValueNone) 2504 if (id == CSSValueAll || id == CSSValueNone)
2508 validPrimitive = true; 2505 validPrimitive = true;
2509 else 2506 else
2510 validPrimitive = validUnit(value, FNumber | FNonNeg) && value->fValu e == 1; 2507 validPrimitive = validUnit(value, FNumber | FNonNeg) && value->fValu e == 1;
2511 break; 2508 break;
2512 case CSSPropertyWebkitColumnWidth: // auto | <length> 2509 case CSSPropertyWebkitColumnWidth: // auto | <length>
2513 if (id == CSSValueAuto) 2510 parsedValue = parseColumnWidth();
2514 validPrimitive = true;
2515 else // Always parse this property in strict mode, since it would be amb iguous otherwise when used in the 'columns' shorthand property.
2516 validPrimitive = validUnit(value, FLength | FNonNeg, CSSStrictMode) && value->fValue;
2517 break; 2511 break;
2518 // End of CSS3 properties 2512 // End of CSS3 properties
2519 2513
2520 // Apple specific properties. These will never be standardized and are pure ly to 2514 // Apple specific properties. These will never be standardized and are pure ly to
2521 // support custom WebKit-based Apple applications. 2515 // support custom WebKit-based Apple applications.
2522 case CSSPropertyWebkitLineClamp: 2516 case CSSPropertyWebkitLineClamp:
2523 // When specifying number of lines, don't allow 0 as a valid value 2517 // When specifying number of lines, don't allow 0 as a valid value
2524 // When specifying either type of unit, require non-negative integers 2518 // When specifying either type of unit, require non-negative integers
2525 validPrimitive = (!id && (value->unit == CSSPrimitiveValue::CSS_PERCENTA GE || value->fValue) && validUnit(value, FInteger | FPercent | FNonNeg, CSSQuirk sMode)); 2519 validPrimitive = (!id && (value->unit == CSSPrimitiveValue::CSS_PERCENTA GE || value->fValue) && validUnit(value, FInteger | FPercent | FNonNeg, CSSQuirk sMode));
2526 break; 2520 break;
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
2653 // [ [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]? 2647 // [ [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]?
2654 // 'font-family' ] | caption | icon | menu | message-box | small-caption | status-bar | inherit 2648 // 'font-family' ] | caption | icon | menu | message-box | small-caption | status-bar | inherit
2655 if (id >= CSSValueCaption && id <= CSSValueStatusBar) 2649 if (id >= CSSValueCaption && id <= CSSValueStatusBar)
2656 validPrimitive = true; 2650 validPrimitive = true;
2657 else 2651 else
2658 return parseFont(important); 2652 return parseFont(important);
2659 break; 2653 break;
2660 case CSSPropertyListStyle: 2654 case CSSPropertyListStyle:
2661 return parseShorthand(propId, listStyleShorthand(), important); 2655 return parseShorthand(propId, listStyleShorthand(), important);
2662 case CSSPropertyWebkitColumns: 2656 case CSSPropertyWebkitColumns:
2663 return parseShorthand(propId, webkitColumnsShorthand(), important); 2657 return parseColumnsShorthand(important);
2664 case CSSPropertyWebkitColumnRule: 2658 case CSSPropertyWebkitColumnRule:
2665 return parseShorthand(propId, webkitColumnRuleShorthand(), important); 2659 return parseShorthand(propId, webkitColumnRuleShorthand(), important);
2666 case CSSPropertyWebkitTextStroke: 2660 case CSSPropertyWebkitTextStroke:
2667 return parseShorthand(propId, webkitTextStrokeShorthand(), important); 2661 return parseShorthand(propId, webkitTextStrokeShorthand(), important);
2668 case CSSPropertyWebkitAnimation: 2662 case CSSPropertyWebkitAnimation:
2669 return parseAnimationShorthand(important); 2663 return parseAnimationShorthand(important);
2670 case CSSPropertyTransition: 2664 case CSSPropertyTransition:
2671 case CSSPropertyWebkitTransition: 2665 case CSSPropertyWebkitTransition:
2672 return parseTransitionShorthand(propId, important); 2666 return parseTransitionShorthand(propId, important);
2673 case CSSPropertyInvalid: 2667 case CSSPropertyInvalid:
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
3203 addAnimationValue(values[i], cssValuePool().createImplicitInitialVal ue()); 3197 addAnimationValue(values[i], cssValuePool().createImplicitInitialVal ue());
3204 } 3198 }
3205 3199
3206 // Now add all of the properties we found. 3200 // Now add all of the properties we found.
3207 for (i = 0; i < numProperties; i++) 3201 for (i = 0; i < numProperties; i++)
3208 addPropertyWithPrefixingVariant(shorthand.properties()[i], values[i].rel ease(), important); 3202 addPropertyWithPrefixingVariant(shorthand.properties()[i], values[i].rel ease(), important);
3209 3203
3210 return true; 3204 return true;
3211 } 3205 }
3212 3206
3207 PassRefPtr<CSSValue> CSSParser::parseColumnWidth()
3208 {
3209 CSSParserValue* value = m_valueList->current();
3210 // Always parse lengths in strict mode here, since it would be ambiguous oth erwise when used in
3211 // the 'columns' shorthand property.
3212 if (value->id == CSSValueAuto
3213 || validUnit(value, FLength | FNonNeg, CSSStrictMode) && value->fValue) {
3214 RefPtr<CSSValue> parsedValue = parseValidPrimitive(value->id, value);
3215 m_valueList->next();
3216 return parsedValue;
3217 }
3218 return 0;
3219 }
3220
3221 PassRefPtr<CSSValue> CSSParser::parseColumnCount()
3222 {
3223 CSSParserValue* value = m_valueList->current();
3224 if (value->id == CSSValueAuto
3225 || (!value->id && validUnit(value, FPositiveInteger, CSSQuirksMode))) {
3226 RefPtr<CSSValue> parsedValue = parseValidPrimitive(value->id, value);
3227 m_valueList->next();
3228 return parsedValue;
3229 }
3230 return 0;
3231 }
3232
3233 bool CSSParser::parseColumnsShorthand(bool important)
3234 {
3235 RefPtr <CSSValue> columnWidth;
3236 RefPtr <CSSValue> columnCount;
3237 bool hasPendingExplicitAuto = false;
3238
3239 for (unsigned propertiesParsed = 0; CSSParserValue* value = m_valueList->cur rent(); propertiesParsed++) {
3240 if (propertiesParsed >= 2)
3241 return false; // Too many values for this shorthand. Invalid declara tion.
3242 if (!propertiesParsed && value->id == CSSValueAuto) {
3243 // 'auto' is a valid value for any of the two longhands, and at this point we
3244 // don't know which one(s) it is meant for. We need to see if there are other
3245 // values first.
3246 m_valueList->next();
3247 hasPendingExplicitAuto = true;
3248 } else {
3249 if (columnWidth || !(columnWidth = parseColumnWidth())) {
Julien - ping for review 2013/07/26 20:14:39 The second part of the 'if' is unusual in Blink. S
mstensho (USE GERRIT) 2013/07/26 22:20:19 Done. I omitted the "else"s, though. Otherwise it
3250 if (columnCount || !(columnCount = parseColumnCount())) {
3251 // If we didn't find at least one match, this is an
3252 // invalid shorthand and we have to ignore it.
3253 return false;
3254 }
3255 }
3256 }
3257 }
3258 if (hasPendingExplicitAuto) {
3259 // Time to assign the previously skipped 'auto' value to a property. If both properties are
3260 // unassigned at this point (i.e. 'columns:auto'), it doesn't really mat ter which one we
3261 // set. The one we don't set will get an implicit 'auto' value further d own.
Julien - ping for review 2013/07/26 20:14:39 Note that it does make a difference when using the
mstensho (USE GERRIT) 2013/07/26 22:20:19 Right. That's undefined behavior. I guess it's pro
3262 if (!columnWidth) {
3263 columnWidth = cssValuePool().createIdentifierValue(CSSValueAuto);
3264 } else {
3265 ASSERT(!columnCount);
3266 columnCount = cssValuePool().createIdentifierValue(CSSValueAuto);
3267 }
3268 }
3269 ASSERT(columnCount || columnWidth);
3270
3271 // Any unassigned property at this point will become implicit 'auto'.
3272 if (columnWidth) {
3273 addProperty(CSSPropertyWebkitColumnWidth, columnWidth, important);
3274 } else {
3275 ImplicitScope implicitScope(this, PropertyImplicit);
Julien - ping for review 2013/07/26 20:14:39 Note that you don't necessarily need the ImplicitS
mstensho (USE GERRIT) 2013/07/26 22:20:19 Nice! I failed to notice that. Got totally blinded
3276 addProperty(CSSPropertyWebkitColumnWidth, cssValuePool().createIdentifie rValue(CSSValueAuto), important);
3277 }
3278 if (columnCount) {
3279 addProperty(CSSPropertyWebkitColumnCount, columnCount, important);
3280 } else {
3281 ImplicitScope implicitScope(this, PropertyImplicit);
3282 addProperty(CSSPropertyWebkitColumnCount, cssValuePool().createIdentifie rValue(CSSValueAuto), important);
3283 }
3284 return true;
3285 }
3286
3213 bool CSSParser::parseShorthand(CSSPropertyID propId, const StylePropertyShorthan d& shorthand, bool important) 3287 bool CSSParser::parseShorthand(CSSPropertyID propId, const StylePropertyShorthan d& shorthand, bool important)
3214 { 3288 {
3215 // We try to match as many properties as possible 3289 // We try to match as many properties as possible
3216 // We set up an array of booleans to mark which property has been found, 3290 // We set up an array of booleans to mark which property has been found,
3217 // and we try to search for properties until it makes no longer any sense. 3291 // and we try to search for properties until it makes no longer any sense.
3218 ShorthandScope scope(this, propId); 3292 ShorthandScope scope(this, propId);
3219 3293
3220 bool found = false; 3294 bool found = false;
3221 unsigned propertiesParsed = 0; 3295 unsigned propertiesParsed = 0;
3222 bool propertyFound[6]= { false, false, false, false, false, false }; // 6 is enough size. 3296 bool propertyFound[6]= { false, false, false, false, false, false }; // 6 is enough size.
(...skipping 8517 matching lines...) Expand 10 before | Expand all | Expand 10 after
11740 { 11814 {
11741 // The tokenizer checks for the construct of an+b. 11815 // The tokenizer checks for the construct of an+b.
11742 // However, since the {ident} rule precedes the {nth} rule, some of those 11816 // However, since the {ident} rule precedes the {nth} rule, some of those
11743 // tokens are identified as string literal. Furthermore we need to accept 11817 // tokens are identified as string literal. Furthermore we need to accept
11744 // "odd" and "even" which does not match to an+b. 11818 // "odd" and "even" which does not match to an+b.
11745 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") 11819 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even")
11746 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); 11820 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n");
11747 } 11821 }
11748 11822
11749 } 11823 }
OLDNEW
« LayoutTests/fast/multicol/columns-shorthand-parsing-2.html ('K') | « Source/core/css/CSSParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698