Chromium Code Reviews| Index: Source/core/css/CSSParser-in.cpp |
| diff --git a/Source/core/css/CSSParser-in.cpp b/Source/core/css/CSSParser-in.cpp |
| index 16298cbeb552b60120b812dc4e07a0f0e0731a7c..cab88733377c58a0c97f167e46cdb5bd27f28035 100644 |
| --- a/Source/core/css/CSSParser-in.cpp |
| +++ b/Source/core/css/CSSParser-in.cpp |
| @@ -100,6 +100,28 @@ extern int cssyyparse(WebCore::CSSParser*); |
| using namespace std; |
| using namespace WTF; |
| +namespace { |
| + |
| +PassOwnPtr<Vector<float> > createKeyframeKeyList(WebCore::CSSParserValueList* keys) |
|
apavlov
2013/07/15 11:54:37
Looks like this should actually belong to StyleKey
Steve Block
2013/08/14 00:44:05
Done
|
| +{ |
| + OwnPtr<Vector<float> > keyVector = adoptPtr(new Vector<float>(keys->size())); |
| + for (unsigned i = 0; i < keys->size(); ++i) { |
| + ASSERT(keys->valueAt(i)->unit == WebCore::CSSPrimitiveValue::CSS_NUMBER); |
| + float key = static_cast<float>(keys->valueAt(i)->fValue); |
| + if (key < 0 || key > 100) { |
| + // As per http://www.w3.org/TR/css3-animations/#keyframes, |
| + // "If a keyframe selector specifies negative percentage values |
| + // or values higher than 100%, then the keyframe will be ignored." |
| + keyVector->clear(); |
| + break; |
| + } |
| + keyVector->at(i) = key; |
| + } |
| + return keyVector.release(); |
| +} |
| + |
| +} // namespace |
| + |
| namespace WebCore { |
| static const unsigned INVALID_NUM_PARSED_PROPERTIES = UINT_MAX; |
| @@ -392,6 +414,14 @@ PassRefPtr<StyleKeyframe> CSSParser::parseKeyframeRule(StyleSheetContents* sheet |
| return m_keyframe.release(); |
| } |
| +PassOwnPtr<Vector<float> > CSSParser::parseKeyframeKeyList(const String& string) |
| +{ |
| + setupParser("@-internal-keyframe-key-list ", string, ""); |
| + cssyyparse(this); |
| + ASSERT(m_valueList); |
| + return createKeyframeKeyList(m_valueList.get()); |
| +} |
| + |
| bool CSSParser::parseSupportsCondition(const String& string) |
| { |
| m_supportsCondition = false; |
| @@ -1344,7 +1374,7 @@ PassRefPtr<MediaQuerySet> CSSParser::parseMediaQueryList(const String& string) |
| setupParser("@-internal-medialist ", string, ""); |
| cssyyparse(this); |
| - ASSERT(m_mediaList.get()); |
| + ASSERT(m_mediaList); |
| return m_mediaList.release(); |
| } |
| @@ -10185,6 +10215,11 @@ inline void CSSParser::detectAtToken(int length, bool hasEscape) |
| m_token = INTERNAL_KEYFRAME_RULE_SYM; |
| return; |
| + case 28: |
| + if (isEqualToCSSIdentifier(name + 2, "internal-keyframe-key-list")) |
| + m_token = INTERNAL_KEYFRAME_KEY_LIST_SYM; |
| + return; |
| + |
| case 29: |
| if (isEqualToCSSIdentifier(name + 2, "internal-supports-condition")) { |
| m_parsingMode = SupportsMode; |
| @@ -11276,26 +11311,12 @@ void CSSParser::deleteFontFaceOnlyValues() |
| StyleKeyframe* CSSParser::createKeyframe(CSSParserValueList* keys) |
| { |
| - // Create a key string from the passed keys |
| - StringBuilder keyString; |
| - for (unsigned i = 0; i < keys->size(); ++i) { |
| - ASSERT(keys->valueAt(i)->unit == CSSPrimitiveValue::CSS_NUMBER); |
| - float key = static_cast<float>(keys->valueAt(i)->fValue); |
| - if (key < 0 || key > 100) { |
| - // As per http://www.w3.org/TR/css3-animations/#keyframes, |
| - // "If a keyframe selector specifies negative percentage values |
| - // or values higher than 100%, then the keyframe will be ignored." |
| - clearProperties(); |
| - return 0; |
| - } |
| - if (i != 0) |
| - keyString.append(','); |
| - keyString.append(String::number(key)); |
| - keyString.append('%'); |
| - } |
| + OwnPtr<Vector<float> > keyVector = createKeyframeKeyList(keys); |
| + if (keyVector->isEmpty()) |
| + return 0; |
| RefPtr<StyleKeyframe> keyframe = StyleKeyframe::create(); |
| - keyframe->setKeyText(keyString.toString()); |
| + keyframe->setKeys(keyVector.release()); |
| keyframe->setProperties(createStylePropertySet()); |
| clearProperties(); |