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 e746827912449a437188a22e750c36422013e339..ef4ee86adb9914723c5c33e0755635b010057d39 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -47,7 +47,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import |
if (ruleType == StyleRule::Viewport) { |
parseSuccess = (RuntimeEnabledFeatures::cssViewportEnabled() || isUASheetBehavior(context.mode())) |
- && parser.parseViewportProperty(resolvedProperty, important); |
+ && parser.parseViewportDescriptor(resolvedProperty, important); |
} else if (ruleType == StyleRule::FontFace) { |
parseSuccess = parser.parseFontFaceDescriptor(resolvedProperty); |
} else { |
@@ -293,6 +293,22 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRang |
return nullptr; |
} |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumePercent(CSSParserTokenRange& range, ValueRange valueRange) |
Timothy Loh
2015/10/07 00:18:33
Probably makes more sense if this is before consum
rwlbuis
2015/10/07 23:08:53
Done.
|
+{ |
+ const CSSParserToken& token = range.peek(); |
+ if (token.type() == PercentageToken) { |
+ if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) |
+ return nullptr; |
+ return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::Percentage); |
+ } |
+ CalcParser calcParser(range, valueRange); |
+ if (const CSSCalcValue* calculation = calcParser.value()) { |
+ if (calculation->category() == CalcPercent) |
+ return calcParser.consumeValue(); |
+ } |
+ return nullptr; |
+} |
+ |
static inline bool isCSSWideKeyword(const CSSValueID& id) |
{ |
return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault; |
@@ -784,6 +800,104 @@ bool CSSPropertyParser::parseFontFaceDescriptor(CSSPropertyID propId) |
return true; |
} |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeViewportLonghand(CSSParserTokenRange& range, CSSPropertyID propId, CSSParserMode cssParserMode) |
Timothy Loh
2015/10/07 00:18:33
consumeSingleViewportDescriptor (or something bett
rwlbuis
2015/10/07 23:08:53
Done.
|
+{ |
+ RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; |
+ CSSValueID id = range.peek().id(); |
+ switch (propId) { |
+ case CSSPropertyMinWidth: |
+ case CSSPropertyMaxWidth: |
+ case CSSPropertyMinHeight: |
+ case CSSPropertyMaxHeight: |
+ if (id == CSSValueAuto || id == CSSValueInternalExtendToZoom) |
+ parsedValue = consumeIdent(range); |
Timothy Loh
2015/10/07 00:18:33
return consumeIdent(range); and so on for the rest
rwlbuis
2015/10/07 23:08:53
Yeah much better :) Done.
|
+ else |
+ parsedValue = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
+ break; |
+ case CSSPropertyMinZoom: |
+ case CSSPropertyMaxZoom: |
+ case CSSPropertyZoom: |
+ if (id == CSSValueAuto) { |
+ parsedValue = consumeIdent(range); |
+ } else { |
+ parsedValue = consumeNumber(range, ValueRangeNonNegative); |
+ if (!parsedValue) |
+ parsedValue = consumePercent(range, ValueRangeNonNegative); |
+ } |
+ break; |
+ case CSSPropertyUserZoom: |
+ if (id == CSSValueZoom || id == CSSValueFixed) |
+ parsedValue = consumeIdent(range); |
+ break; |
+ case CSSPropertyOrientation: |
+ if (id == CSSValueAuto || id == CSSValuePortrait || id == CSSValueLandscape) |
+ parsedValue = consumeIdent(range); |
+ default: |
+ break; |
+ } |
+ |
+ return parsedValue; |
+} |
+ |
+bool CSSPropertyParser::parseViewportDescriptor(CSSPropertyID propId, bool important) |
+{ |
+ ASSERT(RuntimeEnabledFeatures::cssViewportEnabled() || isUASheetBehavior(m_context.mode())); |
+ |
+ m_range.consumeWhitespace(); |
+ RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; |
+ |
+ switch (propId) { |
+ case CSSPropertyWidth: { |
Timothy Loh
2015/10/07 00:18:33
I think there's an assertion in addProperty that c
rwlbuis
2015/10/07 23:08:53
Done.
|
+ RefPtrWillBeRawPtr<CSSValue> minWidth = consumeViewportLonghand(m_range, CSSPropertyMinWidth, m_context.mode()); |
+ if (!minWidth) |
+ return false; |
+ addProperty(CSSPropertyMinWidth, minWidth, important); |
Timothy Loh
2015/10/07 00:18:33
I think this would be slightly nicer as:
RefPtrWi
rwlbuis
2015/10/07 23:08:53
Done.
|
+ if (m_range.atEnd()) { |
+ addProperty(CSSPropertyMaxWidth, minWidth, important); |
+ return true; |
+ } |
+ RefPtrWillBeRawPtr<CSSValue> maxWidth = consumeViewportLonghand(m_range, CSSPropertyMaxWidth, m_context.mode()); |
+ if (!maxWidth || !m_range.atEnd()) |
+ return false; |
+ addProperty(CSSPropertyMaxWidth, maxWidth, important); |
+ return true; |
+ } |
+ case CSSPropertyHeight: { |
+ RefPtrWillBeRawPtr<CSSValue> minHeight = consumeViewportLonghand(m_range, CSSPropertyMinHeight, m_context.mode()); |
+ if (!minHeight) |
+ return false; |
+ addProperty(CSSPropertyMinHeight, minHeight, important); |
+ if (m_range.atEnd()) { |
+ addProperty(CSSPropertyMaxHeight, minHeight, important); |
+ return true; |
+ } |
+ RefPtrWillBeRawPtr<CSSValue> maxHeight = consumeViewportLonghand(m_range, CSSPropertyMaxHeight, m_context.mode()); |
+ if (!maxHeight || !m_range.atEnd()) |
+ return false; |
+ addProperty(CSSPropertyMaxHeight, maxHeight, important); |
+ return true; |
+ } |
+ case CSSPropertyMinWidth: |
+ case CSSPropertyMaxWidth: |
+ case CSSPropertyMinHeight: |
+ case CSSPropertyMaxHeight: |
+ case CSSPropertyMinZoom: |
+ case CSSPropertyMaxZoom: |
+ case CSSPropertyZoom: |
+ case CSSPropertyUserZoom: |
+ case CSSPropertyOrientation: |
+ default: |
Timothy Loh
2015/10/07 00:18:33
How about return false in this default and ASSERT_
rwlbuis
2015/10/07 23:08:52
Done.
|
+ parsedValue = consumeViewportLonghand(m_range, propId, m_context.mode()); |
+ break; |
+ } |
+ |
+ if (!parsedValue || !m_range.atEnd()) |
+ return false; |
+ |
+ addProperty(propId, parsedValue.release(), important); |
+ return true; |
+} |
+ |
bool CSSPropertyParser::parseShorthand(CSSPropertyID propId, bool important) |
{ |
m_range.consumeWhitespace(); |