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 e5286c36554fdd73b7078ca7bb4ff55115c2e03c..171269f4704087fde1e30b4b2bd7421fe71b7abd 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -10,8 +10,10 @@ |
#include "core/css/CSSCustomIdentValue.h" |
#include "core/css/CSSFontFaceSrcValue.h" |
#include "core/css/CSSFontFeatureValue.h" |
+#include "core/css/CSSFunctionValue.h" |
#include "core/css/CSSPrimitiveValueMappings.h" |
#include "core/css/CSSQuadValue.h" |
+#include "core/css/CSSSVGDocumentValue.h" |
#include "core/css/CSSShadowValue.h" |
#include "core/css/CSSStringValue.h" |
#include "core/css/CSSTimingFunctionValue.h" |
@@ -331,7 +333,7 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLengthOrPercent(CSSParse |
return nullptr; |
} |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRange& range) |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
{ |
const CSSParserToken& token = range.peek(); |
if (token.type() == DimensionToken) { |
@@ -345,6 +347,11 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeAngle(CSSParserTokenRang |
return nullptr; |
} |
} |
+ if (token.type() == NumberToken) { |
+ if (!shouldAcceptUnitlessValues(token.numericValue(), cssParserMode, UnitlessQuirk::Forbid)) |
+ return nullptr; |
+ return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::Degrees); |
+ } |
CalcParser calcParser(range, ValueRangeAll); |
if (const CSSCalcValue* calculation = calcParser.value()) { |
if (calculation->category() == CalcAngle) |
@@ -803,12 +810,12 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineHeight(CSSParserToke |
return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
} |
-static PassRefPtrWillBeRawPtr<CSSValueList> consumeRotation(CSSParserTokenRange& range) |
+static PassRefPtrWillBeRawPtr<CSSValueList> consumeRotation(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
{ |
ASSERT(RuntimeEnabledFeatures::cssIndependentTransformPropertiesEnabled()); |
RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- RefPtrWillBeRawPtr<CSSValue> rotation = consumeAngle(range); |
+ RefPtrWillBeRawPtr<CSSValue> rotation = consumeAngle(range, cssParserMode); |
if (!rotation) |
return nullptr; |
list->append(rotation.release()); |
@@ -1415,6 +1422,71 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeShadow(CSSParserTokenRange& range |
return shadowValueList; |
} |
+static PassRefPtrWillBeRawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const CSSParserContext& context) |
+{ |
+ CSSValueID filterType = range.peek().functionId(); |
+ if (filterType < CSSValueInvert || filterType > CSSValueDropShadow) |
+ return nullptr; |
+ CSSParserTokenRange args = consumeFunction(range); |
+ RefPtrWillBeRawPtr<CSSFunctionValue> filterValue = CSSFunctionValue::create(filterType); |
+ RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; |
+ |
+ if (filterType == CSSValueDropShadow) { |
+ parsedValue = parseSingleShadow(args, context, false, false); |
+ } else { |
+ // TODO(timloh): Add UseCounters for empty filter arguments. |
+ if (args.atEnd()) |
+ return filterValue.release(); |
+ if (filterType == CSSValueBrightness) { |
+ // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5) |
+ parsedValue = consumePercent(args, ValueRangeAll); |
+ if (!parsedValue) |
+ parsedValue = consumeNumber(args, ValueRangeAll); |
+ } else if (filterType == CSSValueHueRotate) { |
+ parsedValue = consumeAngle(args, context.mode()); |
+ } else if (filterType == CSSValueBlur) { |
+ parsedValue = consumeLength(args, HTMLStandardMode, ValueRangeNonNegative); |
+ } else { |
+ // FIXME (crbug.com/397061): Support calc expressions like calc(10% + 0.5) |
+ parsedValue = consumePercent(args, ValueRangeNonNegative); |
+ if (!parsedValue) |
+ parsedValue = consumeNumber(args, ValueRangeNonNegative); |
+ if (parsedValue && filterType != CSSValueSaturate && filterType != CSSValueContrast) { |
+ double maxAllowed = toCSSPrimitiveValue(parsedValue.get())->isPercentage() ? 100.0 : 1.0; |
+ if (toCSSPrimitiveValue(parsedValue.get())->getDoubleValue() > maxAllowed) |
+ return nullptr; |
+ } |
+ } |
+ } |
+ if (!parsedValue || !args.atEnd()) |
+ return nullptr; |
+ filterValue->append(parsedValue.release()); |
+ return filterValue.release(); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, const CSSParserContext& context) |
+{ |
+ if (range.peek().id() == CSSValueNone) |
+ return consumeIdent(range); |
+ |
+ RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
+ do { |
+ String url = consumeUrl(range); |
+ RefPtrWillBeRawPtr<CSSFunctionValue> filterValue = nullptr; |
+ if (!url.isNull()) { |
+ filterValue = CSSFunctionValue::create(CSSValueUrl); |
+ filterValue->append(CSSSVGDocumentValue::create(url)); |
+ } else { |
+ filterValue = consumeFilterFunction(range, context); |
+ if (!filterValue) |
+ return nullptr; |
+ } |
+ list->append(filterValue.release()); |
+ } while (!range.atEnd()); |
+ |
+ return list.release(); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty) |
{ |
CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
@@ -1448,7 +1520,7 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyLineHeight: |
return consumeLineHeight(m_range, m_context.mode()); |
case CSSPropertyRotate: |
- return consumeRotation(m_range); |
+ return consumeRotation(m_range, m_context.mode()); |
case CSSPropertyWebkitBorderHorizontalSpacing: |
case CSSPropertyWebkitBorderVerticalSpacing: |
return consumeLength(m_range, m_context.mode(), ValueRangeNonNegative); |
@@ -1522,6 +1594,9 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3 |
case CSSPropertyBoxShadow: |
return consumeShadow(m_range, m_context, property == CSSPropertyBoxShadow); |
+ case CSSPropertyWebkitFilter: |
+ case CSSPropertyBackdropFilter: |
+ return consumeFilter(m_range, m_context); |
default: |
return nullptr; |
} |