| Index: Source/core/css/parser/BisonCSSParser-in.cpp
|
| diff --git a/Source/core/css/parser/BisonCSSParser-in.cpp b/Source/core/css/parser/BisonCSSParser-in.cpp
|
| index e3d0aa5f0045477affea17653003cb386f84f864..e2ac5c3bc04f40dd4f724254fbdabf049a83ec4b 100644
|
| --- a/Source/core/css/parser/BisonCSSParser-in.cpp
|
| +++ b/Source/core/css/parser/BisonCSSParser-in.cpp
|
| @@ -199,6 +199,7 @@ BisonCSSParser::BisonCSSParser(const CSSParserContext& context, UseCounter* coun
|
| , m_hadSyntacticallyValidCSSRule(false)
|
| , m_logErrors(false)
|
| , m_ignoreErrors(false)
|
| + , m_parseStepMiddleTimingFunction(false)
|
| , m_defaultNamespace(starAtom)
|
| , m_observer(0)
|
| , m_source(0)
|
| @@ -1114,12 +1115,12 @@ PassRefPtr<CSSValueList> BisonCSSParser::parseFontFaceValue(const AtomicString&
|
| return toCSSValueList(dummyStyle->getPropertyCSSValue(CSSPropertyFontFamily).get());
|
| }
|
|
|
| -PassRefPtr<CSSValue> BisonCSSParser::parseAnimationTimingFunctionValue(const String& string)
|
| +PassRefPtr<CSSValue> BisonCSSParser::parseAnimationTimingFunctionValue(const String& string, bool parseStepMiddleTimingFunction)
|
| {
|
| if (string.isEmpty())
|
| return 0;
|
| RefPtr<MutableStylePropertySet> style = MutableStylePropertySet::create();
|
| - if (!parseValue(style.get(), CSSPropertyAnimationTimingFunction, string, false, HTMLStandardMode, 0))
|
| + if (!parseValue(style.get(), CSSPropertyAnimationTimingFunction, string, false, HTMLStandardMode, 0, parseStepMiddleTimingFunction))
|
| return 0;
|
|
|
| return style->getPropertyCSSValue(CSSPropertyAnimationTimingFunction);
|
| @@ -1142,7 +1143,7 @@ bool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropert
|
| return parser.parseValue(declaration, propertyID, string, important, static_cast<StyleSheetContents*>(0));
|
| }
|
|
|
| -bool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropertyID propertyID, const String& string, bool important, CSSParserMode cssParserMode, StyleSheetContents* contextStyleSheet)
|
| +bool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropertyID propertyID, const String& string, bool important, CSSParserMode cssParserMode, StyleSheetContents* contextStyleSheet, bool parseStepMiddleTimingFunction)
|
| {
|
| ASSERT(!string.isEmpty());
|
| if (parseSimpleLengthValue(declaration, propertyID, string, important, cssParserMode))
|
| @@ -1162,6 +1163,7 @@ bool BisonCSSParser::parseValue(MutableStylePropertySet* declaration, CSSPropert
|
| return true;
|
|
|
| BisonCSSParser parser(context);
|
| + parser.m_parseStepMiddleTimingFunction = parseStepMiddleTimingFunction;
|
| return parser.parseValue(declaration, propertyID, string, important, contextStyleSheet);
|
| }
|
|
|
| @@ -4422,7 +4424,8 @@ PassRefPtr<CSSValue> BisonCSSParser::parseAnimationTimingFunction()
|
| {
|
| CSSParserValue* value = m_valueList->current();
|
| if (value->id == CSSValueEase || value->id == CSSValueLinear || value->id == CSSValueEaseIn || value->id == CSSValueEaseOut
|
| - || value->id == CSSValueEaseInOut || value->id == CSSValueStepStart || value->id == CSSValueStepEnd)
|
| + || value->id == CSSValueEaseInOut || value->id == CSSValueStepStart || value->id == CSSValueStepEnd
|
| + || (value->id == CSSValueStepMiddle && m_parseStepMiddleTimingFunction))
|
| return cssValuePool().createIdentifierValue(value->id);
|
|
|
| // We must be a function.
|
| @@ -4438,7 +4441,7 @@ PassRefPtr<CSSValue> BisonCSSParser::parseAnimationTimingFunction()
|
|
|
| // There are two values.
|
| int numSteps;
|
| - bool stepAtStart = false;
|
| + StepsTimingFunction::StepAtPosition stepAtPosition = StepsTimingFunction::StepAtEnd;
|
|
|
| CSSParserValue* v = args->current();
|
| if (!validUnit(v, FInteger))
|
| @@ -4453,12 +4456,18 @@ PassRefPtr<CSSValue> BisonCSSParser::parseAnimationTimingFunction()
|
| if (!isComma(v))
|
| return 0;
|
| v = args->next();
|
| - if (v->id != CSSValueStart && v->id != CSSValueEnd)
|
| + if (!m_parseStepMiddleTimingFunction && v->id == CSSValueMiddle)
|
| return 0;
|
| - stepAtStart = v->id == CSSValueStart;
|
| + if (v->id != CSSValueStart && v->id != CSSValueEnd && v->id != CSSValueMiddle)
|
| + return 0;
|
| + if (v->id == CSSValueStart) {
|
| + stepAtPosition = StepsTimingFunction::StepAtStart;
|
| + } else if (v->id == CSSValueMiddle) {
|
| + stepAtPosition = StepsTimingFunction::StepAtMiddle;
|
| + }
|
| }
|
|
|
| - return CSSStepsTimingFunctionValue::create(numSteps, stepAtStart);
|
| + return CSSStepsTimingFunctionValue::create(numSteps, stepAtPosition);
|
| }
|
|
|
| if (equalIgnoringCase(value->function->name, "cubic-bezier(")) {
|
|
|