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 aaec7b836d0bf41a224eb9fc49b96912aba03c01..12667b09ba29cc4f6261ec25e255f8ac1b396b80 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -641,6 +641,76 @@ static PassRefPtrWillBeRawPtr<CSSValueList> consumeRotation(CSSParserTokenRange& |
return list.release(); |
} |
+enum class SizeParameter { |
+ None, |
+ Auto, |
+ Length, |
+ PageSize, |
+ Orientation, |
+}; |
+ |
+static SizeParameter parseSizeParameter(CSSParserTokenRange& range, CSSParserMode cssParserMode, CSSValueList* parsedValues, SizeParameter prevParamType) |
+{ |
+ switch (range.peek().id()) { |
+ case CSSValueAuto: |
+ if (prevParamType == SizeParameter::None) { |
+ parsedValues->append(consumeIdent(range)); |
+ return SizeParameter::Auto; |
+ } |
+ return SizeParameter::None; |
+ case CSSValueLandscape: |
+ case CSSValuePortrait: |
+ if (prevParamType == SizeParameter::None || prevParamType == SizeParameter::PageSize) { |
+ parsedValues->append(consumeIdent(range)); |
+ return SizeParameter::Orientation; |
+ } |
+ return SizeParameter::None; |
+ case CSSValueA3: |
+ case CSSValueA4: |
+ case CSSValueA5: |
+ case CSSValueB4: |
+ case CSSValueB5: |
+ case CSSValueLedger: |
+ case CSSValueLegal: |
+ case CSSValueLetter: |
+ if (prevParamType == SizeParameter::None || prevParamType == SizeParameter::Orientation) { |
+ // Normalize to Page Size then Orientation order by prepending for simpler StyleBuilder handling |
+ parsedValues->prepend(consumeIdent(range)); |
+ return SizeParameter::PageSize; |
+ } |
+ return SizeParameter::None; |
+ case 0: { |
+ RefPtrWillBeRawPtr<CSSValue> parsedValue = consumeLength(range, cssParserMode, ValueRangeNonNegative); |
+ if (parsedValue && (prevParamType == SizeParameter::None || prevParamType == SizeParameter::Length)) { |
+ parsedValues->append(parsedValue.release()); |
+ return SizeParameter::Length; |
+ } |
+ return SizeParameter::None; |
+ } |
+ default: |
+ return SizeParameter::None; |
+ } |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValueList> consumeSize(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ RefPtrWillBeRawPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated(); |
+ |
+ // First parameter. |
Timothy Loh
2015/10/08 23:36:38
This can be lots simpler I think. Sorry for code d
rwlbuis
2015/10/12 17:13:19
I like it! But the part where height is set to wid
|
+ SizeParameter paramType = parseSizeParameter(range, cssParserMode, parsedValues.get(), SizeParameter::None); |
+ if (paramType == SizeParameter::None) |
+ return nullptr; |
+ |
+ // Second parameter, if any. |
+ if (!range.atEnd()) { |
+ paramType = parseSizeParameter(range, cssParserMode, parsedValues.get(), paramType); |
+ if (paramType == SizeParameter::None) |
+ return nullptr; |
+ } |
+ |
+ return parsedValues.release(); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID propId) |
{ |
m_range.consumeWhitespace(); |
@@ -677,6 +747,8 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyWebkitBorderHorizontalSpacing: |
case CSSPropertyWebkitBorderVerticalSpacing: |
return consumeLength(m_range, m_context.mode(), ValueRangeNonNegative); |
+ case CSSPropertySize: |
+ return consumeSize(m_range, m_context.mode()); |
default: |
return nullptr; |
} |