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

Unified 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: Compile fix 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/CSSParser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/CSSParser-in.cpp
diff --git a/Source/core/css/CSSParser-in.cpp b/Source/core/css/CSSParser-in.cpp
index 34dd18efbdea92296545d9998f2df73fd9c40c57..b171eda6f263c8449c39462fd5afecc37918109d 100644
--- a/Source/core/css/CSSParser-in.cpp
+++ b/Source/core/css/CSSParser-in.cpp
@@ -2488,10 +2488,7 @@ bool CSSParser::parseValue(CSSPropertyID propId, bool important)
validPrimitive = !id && validUnit(value, FNumber | FLength | FPercent);
break;
case CSSPropertyWebkitColumnCount:
- if (id == CSSValueAuto)
- validPrimitive = true;
- else
- validPrimitive = !id && validUnit(value, FPositiveInteger, CSSQuirksMode);
+ parsedValue = parseColumnCount();
break;
case CSSPropertyWebkitColumnGap: // normal | <length>
if (id == CSSValueNormal)
@@ -2514,10 +2511,7 @@ bool CSSParser::parseValue(CSSPropertyID propId, bool important)
validPrimitive = validUnit(value, FNumber | FNonNeg) && value->fValue == 1;
break;
case CSSPropertyWebkitColumnWidth: // auto | <length>
- if (id == CSSValueAuto)
- validPrimitive = true;
- else // Always parse this property in strict mode, since it would be ambiguous otherwise when used in the 'columns' shorthand property.
- validPrimitive = validUnit(value, FLength | FNonNeg, CSSStrictMode) && value->fValue;
+ parsedValue = parseColumnWidth();
break;
// End of CSS3 properties
@@ -2664,7 +2658,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:
@@ -3214,6 +3208,87 @@ bool CSSParser::parseTransitionShorthand(CSSPropertyID propId, bool important)
return true;
}
+PassRefPtr<CSSValue> CSSParser::parseColumnWidth()
+{
+ CSSParserValue* value = m_valueList->current();
+ // Always parse lengths in strict mode here, since it would be ambiguous otherwise when used in
+ // the 'columns' shorthand property.
+ if (value->id == CSSValueAuto
+ || (validUnit(value, FLength | FNonNeg, CSSStrictMode) && value->fValue)) {
+ RefPtr<CSSValue> parsedValue = parseValidPrimitive(value->id, value);
+ m_valueList->next();
+ return parsedValue;
+ }
+ return 0;
+}
+
+PassRefPtr<CSSValue> CSSParser::parseColumnCount()
+{
+ CSSParserValue* value = m_valueList->current();
+ if (value->id == CSSValueAuto
+ || (!value->id && validUnit(value, FPositiveInteger, CSSQuirksMode))) {
+ RefPtr<CSSValue> parsedValue = parseValidPrimitive(value->id, value);
+ m_valueList->next();
+ return parsedValue;
+ }
+ return 0;
+}
+
+bool CSSParser::parseColumnsShorthand(bool important)
+{
+ RefPtr <CSSValue> columnWidth;
+ RefPtr <CSSValue> columnCount;
+ bool hasPendingExplicitAuto = false;
+
+ for (unsigned propertiesParsed = 0; CSSParserValue* value = m_valueList->current(); propertiesParsed++) {
+ if (propertiesParsed >= 2)
+ return false; // Too many values for this shorthand. Invalid declaration.
+ if (!propertiesParsed && 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.
+ m_valueList->next();
+ hasPendingExplicitAuto = true;
+ } else {
+ if (!columnWidth) {
+ if ((columnWidth = parseColumnWidth()))
+ continue;
+ }
+ if (!columnCount) {
+ if ((columnCount = parseColumnCount()))
+ continue;
+ }
+ // If we didn't find at least one match, this is an
+ // invalid shorthand and we have to ignore it.
+ return false;
+ }
+ }
+ if (hasPendingExplicitAuto) {
+ // Time to assign the previously skipped 'auto' value to a property. If both properties are
+ // unassigned at this point (i.e. 'columns:auto'), it doesn't matter that much which one we
+ // set (although it does make a slight difference to web-inspector). The one we don't set
+ // here will get an implicit 'auto' value further down.
+ if (!columnWidth) {
+ columnWidth = cssValuePool().createIdentifierValue(CSSValueAuto);
+ } else {
+ ASSERT(!columnCount);
+ columnCount = cssValuePool().createIdentifierValue(CSSValueAuto);
+ }
+ }
+ ASSERT(columnCount || columnWidth);
+
+ // Any unassigned property at this point will become implicit 'auto'.
+ if (columnWidth)
+ addProperty(CSSPropertyWebkitColumnWidth, columnWidth, important);
+ else
+ addProperty(CSSPropertyWebkitColumnWidth, cssValuePool().createIdentifierValue(CSSValueAuto), important, true /* implicit */);
+ if (columnCount)
+ addProperty(CSSPropertyWebkitColumnCount, columnCount, important);
+ else
+ addProperty(CSSPropertyWebkitColumnCount, cssValuePool().createIdentifierValue(CSSValueAuto), important, true /* implicit */);
+ return true;
+}
+
bool CSSParser::parseShorthand(CSSPropertyID propId, const StylePropertyShorthand& shorthand, bool important)
{
// We try to match as many properties as possible
« no previous file with comments | « Source/core/css/CSSParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698