Chromium Code Reviews| Index: Source/core/css/CSSParser-in.cpp | 
| diff --git a/Source/core/css/CSSParser-in.cpp b/Source/core/css/CSSParser-in.cpp | 
| index ef0b3ff3c184acd4d55d8c2edec0638eb0277300..63d8848972d25ee70938aa451fb5a47cc83498d8 100644 | 
| --- a/Source/core/css/CSSParser-in.cpp | 
| +++ b/Source/core/css/CSSParser-in.cpp | 
| @@ -2660,7 +2660,7 @@ bool CSSParser::parseValue(CSSPropertyID propId, bool important) | 
| case CSSPropertyListStyle: | 
| return parseShorthand(propId, listStyleShorthand(), important); | 
| case CSSPropertyWebkitColumns: | 
| - return parseShorthand(propId, webkitColumnsShorthand(), important); | 
| + return parseColumnsShorthand(important); | 
| case CSSPropertyWebkitColumnRule: | 
| return parseShorthand(propId, webkitColumnRuleShorthand(), important); | 
| case CSSPropertyWebkitTextStroke: | 
| @@ -3210,6 +3210,70 @@ bool CSSParser::parseTransitionShorthand(CSSPropertyID propId, bool important) | 
| return true; | 
| } | 
| +bool CSSParser::parseColumnsShorthand(bool important) | 
| +{ | 
| + ShorthandScope scope(this, CSSPropertyWebkitColumns); | 
| + unsigned propertiesParsed = 0; | 
| + unsigned autoCount = 0; | 
| + bool columnCountFound = false; | 
| + bool columnWidthFound = false; | 
| 
 
Julien - ping for review
2013/07/24 21:41:11
Ideally variable names should be good English: col
 
mstensho (USE GERRIT)
2013/07/25 12:01:59
Done.
 
 | 
| + | 
| + while (CSSParserValue* value = m_valueList->current()) { | 
| + if (propertiesParsed >= 2) | 
| + return false; // Too many values for this shorthand. Invalid declaration. | 
| + if (value->id == CSSValueAuto) { | 
| + // 'auto' is a valid value for any of the two longhands, and at this point we | 
| + // don't know which one(s) it is meant for. We need to see if there are other | 
| + // values first. Just count the 'auto' occurrence for now. After having | 
| + // processed the value list, set unassigned properties to 'auto'. | 
| + m_valueList->next(); | 
| + autoCount++; | 
| + } else { | 
| + if (!columnCountFound && parseValue(CSSPropertyWebkitColumnCount, important)) { | 
| + columnCountFound = true; | 
| + } else if (!columnWidthFound && parseValue(CSSPropertyWebkitColumnWidth, important)) { | 
| + columnWidthFound = true; | 
| + } else { | 
| + // If we didn't find at least one match, this is an | 
| + // invalid shorthand and we have to ignore it. | 
| + return false; | 
| + } | 
| + } | 
| + propertiesParsed++; | 
| + } | 
| + | 
| + if (!autoCount && propertiesParsed == 2) | 
| + return true; | 
| + | 
| 
 
Julien - ping for review
2013/07/24 21:41:11
Probably worth adding this assert:
ASSERT(!column
 
mstensho (USE GERRIT)
2013/07/25 12:01:59
Done.
 
 | 
| + // Fill in any remaining properties with the 'initial' or 'auto' value. | 
| + RefPtr<CSSValue> value; | 
| + if (autoCount) { | 
| + // 'auto' is among the values. Set remaining properties to 'auto'. | 
| + value = cssValuePool().createIdentifierValue(CSSValueAuto); | 
| + } else { | 
| + // 'auto' isn't among the values, but we still have to make sure that the unspecified | 
| + // longhand gets set to its initial value. | 
| + value = cssValuePool().createImplicitInitialValue(); | 
| + m_implicitShorthand = true; | 
| + } | 
| + if (!columnCountFound) { | 
| + addProperty(CSSPropertyWebkitColumnCount, value, important); | 
| + if (autoCount == 1) { | 
| + // Only one 'auto' value was specified, and we have just assigned it to a longhand. If | 
| + // the other longhand needs to be set to 'auto' as well, make sure it's marked as | 
| + // "implicit", so that we don't get too many 'auto' occurrences if we later decide to | 
| + // reconstruct the shorthand based on these longhands (using getComputedStyle(), for | 
| + // instance). | 
| + m_implicitShorthand = true; | 
| + } | 
| + } | 
| + if (!columnWidthFound) | 
| + addProperty(CSSPropertyWebkitColumnWidth, value, important); | 
| + m_implicitShorthand = false; | 
| + | 
| 
 
Julien - ping for review
2013/07/24 21:41:11
This code is way too complicated and I don't think
 
mstensho (USE GERRIT)
2013/07/25 12:01:59
OK, I've tried to do this now. This eliminated the
 
 | 
| + return true; | 
| +} | 
| + | 
| bool CSSParser::parseShorthand(CSSPropertyID propId, const StylePropertyShorthand& shorthand, bool important) | 
| { | 
| // We try to match as many properties as possible |