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 2e4b14c4e4fb33708affa1cc53954c1ad8a75cad..2aa701d4d1637fc47b4ec9b2d8a1c2c08789a567 100644 |
--- a/Source/core/css/parser/BisonCSSParser-in.cpp |
+++ b/Source/core/css/parser/BisonCSSParser-in.cpp |
@@ -2464,6 +2464,10 @@ bool BisonCSSParser::parseValue(CSSPropertyID propId, bool important) |
case CSSPropertyWebkitColumnWidth: // auto | <length> |
parsedValue = parseColumnWidth(); |
break; |
+ case CSSPropertyWillChange: |
+ if (!RuntimeEnabledFeatures::cssWillChangeEnabled()) |
+ return false; |
+ return parseWillChange(important); |
// End of CSS3 properties |
// Apple specific properties. These will never be standardized and are purely to |
@@ -8365,6 +8369,62 @@ PassRefPtr<CSSValue> BisonCSSParser::parseImageSet(CSSParserValueList* valueList |
return imageSet.release(); |
} |
+bool BisonCSSParser::parseWillChange(bool important) |
+{ |
+ ASSERT(RuntimeEnabledFeatures::cssWillChangeEnabled()); |
+ |
+ RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated(); |
+ if (m_valueList->current()->id == CSSValueAuto) { |
+ if (m_valueList->next()) |
+ return false; |
+ } |
+ |
+ CSSParserValue* currentValue; |
+ bool expectComma = false; |
+ |
+ // Every comma-separated list of CSS_IDENTs is a valid will-change value, |
+ // unless the list includes an explicitly disallowed CSS_IDENT. |
+ while ((currentValue = m_valueList->current())) { |
+ if (expectComma) { |
+ if (!isComma(currentValue)) |
+ return false; |
+ expectComma = false; |
+ m_valueList->next(); |
+ continue; |
+ } |
+ |
+ if (currentValue->unit != CSSPrimitiveValue::CSS_IDENT) |
+ return false; |
+ |
+ if (CSSPropertyID property = cssPropertyID(currentValue->string)) { |
+ if (property == CSSPropertyWillChange) |
+ return false; |
+ values->append(cssValuePool().createIdentifierValue(property)); |
+ } else { |
+ switch (currentValue->id) { |
+ case CSSValueNone: |
+ case CSSValueAll: |
+ case CSSValueAuto: |
+ case CSSValueDefault: |
+ case CSSValueInitial: |
+ case CSSValueInherit: |
+ return false; |
+ case CSSValueContents: |
+ case CSSValueScrollPosition: |
+ values->append(cssValuePool().createIdentifierValue(currentValue->id)); |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ expectComma = true; |
+ m_valueList->next(); |
+ } |
+ |
+ addProperty(CSSPropertyWillChange, values.release(), important); |
+ return true; |
+} |
+ |
class TransformOperationInfo { |
public: |
TransformOperationInfo(const CSSParserString& name) |