Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(544)

Unified Diff: Source/core/css/CSSParser-in.cpp

Issue 19037003: Re-use CSSParser logic to parse keyframe keys (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698