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(); |