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 304d82fbd3b8b1c4e6423f95f2c05fca79e6325e..c88a0d6d0cfd4fc5ce29a4254c316d41aeeb7329 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -11,6 +11,7 @@ |
#include "core/css/CSSFontFaceSrcValue.h" |
#include "core/css/CSSFontFeatureValue.h" |
#include "core/css/CSSFunctionValue.h" |
+#include "core/css/CSSPathValue.h" |
#include "core/css/CSSPrimitiveValueMappings.h" |
#include "core/css/CSSQuadValue.h" |
#include "core/css/CSSSVGDocumentValue.h" |
@@ -26,6 +27,7 @@ |
#include "core/css/parser/CSSParserValues.h" |
#include "core/frame/UseCounter.h" |
#include "core/layout/LayoutTheme.h" |
+#include "core/svg/SVGPathUtilities.h" |
#include "wtf/text/StringBuilder.h" |
namespace blink { |
@@ -1422,7 +1424,7 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeShadow(CSSParserTokenRange& range |
return shadowValueList; |
} |
-static PassRefPtrWillBeRawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const CSSParserContext& context) |
+static PassRefPtrWillBeRawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const CSSParserContext& context) |
{ |
CSSValueID filterType = range.peek().functionId(); |
if (filterType < CSSValueInvert || filterType > CSSValueDropShadow) |
@@ -1464,7 +1466,7 @@ static PassRefPtrWillBeRawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserT |
return filterValue.release(); |
} |
-static PassRefPtrWillBeRawPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, const CSSParserContext& context) |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, const CSSParserContext& context) |
{ |
if (range.peek().id() == CSSValueNone) |
return consumeIdent(range); |
@@ -1505,6 +1507,49 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeTextDecorationLine(CSSParserToken |
return list.release(); |
} |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeMotionPath(CSSParserTokenRange& range) |
+{ |
+ CSSValueID id = range.peek().id(); |
+ if (id == CSSValueNone) |
+ return consumeIdent(range); |
+ |
+ // FIXME: Add support for <url>, <basic-shape>, <geometry-box>. |
+ if (range.peek().functionId() != CSSValuePath) |
+ return nullptr; |
+ |
+ // FIXME: Add support for <fill-rule>. |
+ CSSParserTokenRange functionRange = range; |
+ CSSParserTokenRange functionArgs = consumeFunction(functionRange); |
+ |
+ if (functionArgs.peek().type() != StringToken) |
+ return nullptr; |
+ String pathString = functionArgs.consumeIncludingWhitespace().value(); |
+ Path path; |
+ if (!buildPathFromString(pathString, path) || !functionArgs.atEnd()) |
+ return nullptr; |
+ |
+ range = functionRange; |
+ return CSSPathValue::create(pathString); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeMotionRotation(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ RefPtrWillBeRawPtr<CSSValue> angle = consumeAngle(range, cssParserMode); |
+ RefPtrWillBeRawPtr<CSSValue> keyword = consumeIdent<CSSValueAuto, CSSValueReverse>(range); |
+ if (!angle && !keyword) |
+ return nullptr; |
+ |
+ if (!angle) |
+ angle = consumeAngle(range, cssParserMode); |
+ |
+ RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
+ if (keyword) |
+ list->append(keyword.release()); |
+ if (angle) |
+ list->append(angle.release()); |
+ return list.release(); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty) |
{ |
CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
@@ -1621,6 +1666,15 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyWebkitTextDecorationsInEffect: |
case CSSPropertyTextDecorationLine: |
return consumeTextDecorationLine(m_range); |
+ case CSSPropertyMotionPath: |
+ ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
+ return consumeMotionPath(m_range); |
+ case CSSPropertyMotionOffset: |
+ ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
+ return consumeLengthOrPercent(m_range, m_context.mode(), ValueRangeAll); |
+ case CSSPropertyMotionRotation: |
+ ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
+ return consumeMotionRotation(m_range, m_context.mode()); |
default: |
return nullptr; |
} |
@@ -2092,6 +2146,9 @@ bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im |
addProperty(CSSPropertyTextDecoration, textDecoration.release(), important); |
return true; |
} |
+ case CSSPropertyMotion: |
+ ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
+ return consumeShorthandGreedily(motionShorthand(), important); |
default: |
m_currentShorthand = oldShorthand; |
return false; |