Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
index 73f765836830c131aa302d452b642694a2400bee..2dc793dc3d177380ff72bd028152bf0da03912cd 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -170,7 +170,7 @@ private: |
RefPtrWillBeMember<CSSCalcValue> m_calcValue; |
}; |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRange& range, CSSParserMode cssParserMode, double minimumValue = -std::numeric_limits<double>::max()) |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRange& range, double minimumValue = -std::numeric_limits<double>::max()) |
{ |
const CSSParserToken& token = range.peek(); |
if (token.type() == NumberToken) { |
@@ -190,6 +190,11 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRa |
return nullptr; |
} |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumePositiveInteger(CSSParserTokenRange& range) |
+{ |
+ return consumeInteger(range, 1); |
+} |
+ |
static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeNumber(CSSParserTokenRange& range, ValueRange valueRange) |
{ |
const CSSParserToken& token = range.peek(); |
@@ -596,7 +601,7 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeSpacing(CSSParserTokenRange& rang |
static PassRefPtrWillBeRawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
{ |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, cssParserMode, 0); |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, 0); |
if (parsedValue) |
return parsedValue; |
return consumeLength(range, cssParserMode, ValueRangeNonNegative); |
@@ -655,7 +660,7 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeCounter(CSSParserTokenRange& rang |
if (!counterName) |
return nullptr; |
int i = defaultValue; |
- if (RefPtrWillBeRawPtr<CSSPrimitiveValue> counterValue = consumeInteger(range, cssParserMode)) |
+ if (RefPtrWillBeRawPtr<CSSPrimitiveValue> counterValue = consumeInteger(range)) |
i = clampTo<int>(counterValue->getDoubleValue()); |
list->append(CSSValuePair::create(counterName.release(), |
cssValuePool().createValue(i, CSSPrimitiveValue::UnitType::Number), |
@@ -875,7 +880,7 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeTouchAction(CSSParserTokenRange& |
return list.release(); |
} |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineClamp(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineClamp(CSSParserTokenRange& range) |
{ |
if (range.peek().type() != PercentageToken && range.peek().type() != NumberToken) |
return nullptr; |
@@ -883,7 +888,7 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineClamp(CSSParserToken |
if (clampValue) |
return clampValue; |
// When specifying number of lines, don't allow 0 as a valid value. |
- return consumeInteger(range, cssParserMode, 1); |
+ return consumeInteger(range, 1); |
} |
static PassRefPtrWillBeRawPtr<CSSValue> consumeLocale(CSSParserTokenRange& range) |
@@ -893,6 +898,47 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeLocale(CSSParserTokenRange& range |
return consumeString(range); |
} |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeColumnWidth(CSSParserTokenRange& range) |
+{ |
+ if (range.peek().id() == CSSValueAuto) |
+ return consumeIdent(range); |
+ // Always parse lengths in strict mode here, since it would be ambiguous otherwise when used in |
+ // the 'columns' shorthand property. |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> columnWidth = consumeLength(range, HTMLStandardMode, ValueRangeNonNegative); |
+ if (!columnWidth || (!columnWidth->isCalculated() && columnWidth->getDoubleValue() == 0)) |
+ return nullptr; |
+ return columnWidth.release(); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeColumnCount(CSSParserTokenRange& range) |
+{ |
+ if (range.peek().id() == CSSValueAuto) |
+ return consumeIdent(range); |
+ return consumePositiveInteger(range); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeColumnGap(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ if (range.peek().id() == CSSValueNormal) |
+ return consumeIdent(range); |
+ return consumeLength(range, cssParserMode, ValueRangeNonNegative); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeColumnSpan(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ CSSValueID id = range.peek().id(); |
+ if (id == CSSValueAll || id == CSSValueNone) |
+ return consumeIdent(range); |
+ if (range.peek().type() != NumberToken) |
+ return nullptr; |
+ if (RefPtrWillBeRawPtr<CSSPrimitiveValue> spanValue = consumeInteger(range)) { |
+ // 1 (will be dropped in the unprefixed property). |
+ if (spanValue->getIntValue() == 1) |
+ return spanValue.release(); |
+ } |
+ return nullptr; |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID propId) |
{ |
m_range.consumeWhitespace(); |
@@ -957,12 +1003,20 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyTouchAction: |
return consumeTouchAction(m_range); |
case CSSPropertyWebkitLineClamp: |
- return consumeLineClamp(m_range, m_context.mode()); |
+ return consumeLineClamp(m_range); |
case CSSPropertyWebkitFontSizeDelta: |
return consumeLength(m_range, m_context.mode(), ValueRangeAll, UnitlessQuirk::Allow); |
case CSSPropertyWebkitHyphenateCharacter: |
case CSSPropertyWebkitLocale: |
return consumeLocale(m_range); |
+ case CSSPropertyWebkitColumnWidth: |
+ return consumeColumnWidth(m_range); |
+ case CSSPropertyWebkitColumnCount: |
+ return consumeColumnCount(m_range); |
+ case CSSPropertyWebkitColumnGap: |
+ return consumeColumnGap(m_range, m_context.mode()); |
+ case CSSPropertyWebkitColumnSpan: |
+ return consumeColumnSpan(m_range, m_context.mode()); |
default: |
return nullptr; |
} |
@@ -1297,6 +1351,37 @@ bool CSSPropertyParser::parseViewportDescriptor(CSSPropertyID propId, bool impor |
} |
} |
+static void consumeColumnWidthOrCount(CSSParserTokenRange& range, CSSParserMode cssParserMode, RefPtrWillBeRawPtr<CSSValue> &columnWidth, RefPtrWillBeRawPtr<CSSValue> &columnCount) |
+{ |
+ if (range.peek().id() == CSSValueAuto) { |
+ consumeIdent(range); |
+ return; |
+ } |
+ if (!columnWidth) { |
+ if ((columnWidth = consumeColumnWidth(range))) |
+ return; |
+ } |
+ if (!columnCount) |
+ columnCount = consumeColumnCount(range); |
+} |
+ |
+bool CSSPropertyParser::consumeColumns(bool important) |
+{ |
+ RefPtrWillBeRawPtr<CSSValue> columnWidth = nullptr; |
+ RefPtrWillBeRawPtr<CSSValue> columnCount = nullptr; |
+ consumeColumnWidthOrCount(m_range, m_context.mode(), columnWidth, columnCount); |
+ consumeColumnWidthOrCount(m_range, m_context.mode(), columnWidth, columnCount); |
+ if (!m_range.atEnd()) |
+ return false; |
+ if (!columnWidth) |
+ columnWidth = cssValuePool().createIdentifierValue(CSSValueAuto); |
+ if (!columnCount) |
+ columnCount = cssValuePool().createIdentifierValue(CSSValueAuto); |
+ addProperty(CSSPropertyWebkitColumnWidth, columnWidth.release(), important); |
+ addProperty(CSSPropertyWebkitColumnCount, columnCount.release(), important); |
+ return true; |
+} |
+ |
bool CSSPropertyParser::parseShorthand(CSSPropertyID propId, bool important) |
{ |
m_range.consumeWhitespace(); |
@@ -1350,6 +1435,11 @@ bool CSSPropertyParser::parseShorthand(CSSPropertyID propId, bool important) |
} |
case CSSPropertyBorderSpacing: |
return consumeBorderSpacing(important); |
+ case CSSPropertyWebkitColumns: { |
+ // TODO(rwlbuis): investigate if this shorthand hack can be removed. |
+ m_currentShorthand = oldShorthand; |
+ return consumeColumns(important); |
+ } |
default: |
m_currentShorthand = oldShorthand; |
return false; |