OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. |
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> | 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) | 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) |
8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. | 8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. |
9 * Copyright (C) 2012 Intel Corporation. All rights reserved. | 9 * Copyright (C) 2012 Intel Corporation. All rights reserved. |
10 * | 10 * |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 | 93 |
94 #if YYDEBUG > 0 | 94 #if YYDEBUG > 0 |
95 extern int cssyydebug; | 95 extern int cssyydebug; |
96 #endif | 96 #endif |
97 | 97 |
98 extern int cssyyparse(WebCore::CSSParser*); | 98 extern int cssyyparse(WebCore::CSSParser*); |
99 | 99 |
100 using namespace std; | 100 using namespace std; |
101 using namespace WTF; | 101 using namespace WTF; |
102 | 102 |
103 namespace { | |
104 | |
105 PassOwnPtr<Vector<float> > createKeyframeKeyList(WebCore::CSSParserValueList* ke ys) | |
apavlov
2013/07/15 11:54:37
Looks like this should actually belong to StyleKey
Steve Block
2013/08/14 00:44:05
Done
| |
106 { | |
107 OwnPtr<Vector<float> > keyVector = adoptPtr(new Vector<float>(keys->size())) ; | |
108 for (unsigned i = 0; i < keys->size(); ++i) { | |
109 ASSERT(keys->valueAt(i)->unit == WebCore::CSSPrimitiveValue::CSS_NUMBER) ; | |
110 float key = static_cast<float>(keys->valueAt(i)->fValue); | |
111 if (key < 0 || key > 100) { | |
112 // As per http://www.w3.org/TR/css3-animations/#keyframes, | |
113 // "If a keyframe selector specifies negative percentage values | |
114 // or values higher than 100%, then the keyframe will be ignored." | |
115 keyVector->clear(); | |
116 break; | |
117 } | |
118 keyVector->at(i) = key; | |
119 } | |
120 return keyVector.release(); | |
121 } | |
122 | |
123 } // namespace | |
124 | |
103 namespace WebCore { | 125 namespace WebCore { |
104 | 126 |
105 static const unsigned INVALID_NUM_PARSED_PROPERTIES = UINT_MAX; | 127 static const unsigned INVALID_NUM_PARSED_PROPERTIES = UINT_MAX; |
106 static const double MAX_SCALE = 1000000; | 128 static const double MAX_SCALE = 1000000; |
107 | 129 |
108 template <unsigned N> | 130 template <unsigned N> |
109 static bool equal(const CSSParserString& a, const char (&b)[N]) | 131 static bool equal(const CSSParserString& a, const char (&b)[N]) |
110 { | 132 { |
111 unsigned length = N - 1; // Ignore the trailing null character | 133 unsigned length = N - 1; // Ignore the trailing null character |
112 if (a.length() != length) | 134 if (a.length() != length) |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 } | 407 } |
386 | 408 |
387 PassRefPtr<StyleKeyframe> CSSParser::parseKeyframeRule(StyleSheetContents* sheet , const String& string) | 409 PassRefPtr<StyleKeyframe> CSSParser::parseKeyframeRule(StyleSheetContents* sheet , const String& string) |
388 { | 410 { |
389 setStyleSheet(sheet); | 411 setStyleSheet(sheet); |
390 setupParser("@-internal-keyframe-rule ", string, ""); | 412 setupParser("@-internal-keyframe-rule ", string, ""); |
391 cssyyparse(this); | 413 cssyyparse(this); |
392 return m_keyframe.release(); | 414 return m_keyframe.release(); |
393 } | 415 } |
394 | 416 |
417 PassOwnPtr<Vector<float> > CSSParser::parseKeyframeKeyList(const String& string) | |
418 { | |
419 setupParser("@-internal-keyframe-key-list ", string, ""); | |
420 cssyyparse(this); | |
421 ASSERT(m_valueList); | |
422 return createKeyframeKeyList(m_valueList.get()); | |
423 } | |
424 | |
395 bool CSSParser::parseSupportsCondition(const String& string) | 425 bool CSSParser::parseSupportsCondition(const String& string) |
396 { | 426 { |
397 m_supportsCondition = false; | 427 m_supportsCondition = false; |
398 setupParser("@-internal-supports-condition ", string, ""); | 428 setupParser("@-internal-supports-condition ", string, ""); |
399 cssyyparse(this); | 429 cssyyparse(this); |
400 return m_supportsCondition; | 430 return m_supportsCondition; |
401 } | 431 } |
402 | 432 |
403 static inline bool isColorPropertyID(CSSPropertyID propertyId) | 433 static inline bool isColorPropertyID(CSSPropertyID propertyId) |
404 { | 434 { |
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1337 | 1367 |
1338 PassRefPtr<MediaQuerySet> CSSParser::parseMediaQueryList(const String& string) | 1368 PassRefPtr<MediaQuerySet> CSSParser::parseMediaQueryList(const String& string) |
1339 { | 1369 { |
1340 ASSERT(!m_mediaList); | 1370 ASSERT(!m_mediaList); |
1341 | 1371 |
1342 // can't use { because tokenizer state switches from mediaquery to initial s tate when it sees { token. | 1372 // can't use { because tokenizer state switches from mediaquery to initial s tate when it sees { token. |
1343 // instead insert one " " (which is caught by maybe_space in CSSGrammar.y) | 1373 // instead insert one " " (which is caught by maybe_space in CSSGrammar.y) |
1344 setupParser("@-internal-medialist ", string, ""); | 1374 setupParser("@-internal-medialist ", string, ""); |
1345 cssyyparse(this); | 1375 cssyyparse(this); |
1346 | 1376 |
1347 ASSERT(m_mediaList.get()); | 1377 ASSERT(m_mediaList); |
1348 return m_mediaList.release(); | 1378 return m_mediaList.release(); |
1349 } | 1379 } |
1350 | 1380 |
1351 static inline void filterProperties(bool important, const CSSParser::ParsedPrope rtyVector& input, Vector<CSSProperty, 256>& output, size_t& unusedEntries, BitAr ray<numCSSProperties>& seenProperties, HashSet<AtomicString>& seenVariables) | 1381 static inline void filterProperties(bool important, const CSSParser::ParsedPrope rtyVector& input, Vector<CSSProperty, 256>& output, size_t& unusedEntries, BitAr ray<numCSSProperties>& seenProperties, HashSet<AtomicString>& seenVariables) |
1352 { | 1382 { |
1353 // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found. | 1383 // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found. |
1354 for (int i = input.size() - 1; i >= 0; --i) { | 1384 for (int i = input.size() - 1; i >= 0; --i) { |
1355 const CSSProperty& property = input[i]; | 1385 const CSSProperty& property = input[i]; |
1356 if (property.isImportant() != important) | 1386 if (property.isImportant() != important) |
1357 continue; | 1387 continue; |
(...skipping 8820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10178 m_parsingMode = MediaQueryMode; | 10208 m_parsingMode = MediaQueryMode; |
10179 m_token = INTERNAL_MEDIALIST_SYM; | 10209 m_token = INTERNAL_MEDIALIST_SYM; |
10180 } | 10210 } |
10181 return; | 10211 return; |
10182 | 10212 |
10183 case 24: | 10213 case 24: |
10184 if (!hasEscape && isEqualToCSSIdentifier(name + 2, "internal-keyfram e-rule")) | 10214 if (!hasEscape && isEqualToCSSIdentifier(name + 2, "internal-keyfram e-rule")) |
10185 m_token = INTERNAL_KEYFRAME_RULE_SYM; | 10215 m_token = INTERNAL_KEYFRAME_RULE_SYM; |
10186 return; | 10216 return; |
10187 | 10217 |
10218 case 28: | |
10219 if (isEqualToCSSIdentifier(name + 2, "internal-keyframe-key-list")) | |
10220 m_token = INTERNAL_KEYFRAME_KEY_LIST_SYM; | |
10221 return; | |
10222 | |
10188 case 29: | 10223 case 29: |
10189 if (isEqualToCSSIdentifier(name + 2, "internal-supports-condition")) { | 10224 if (isEqualToCSSIdentifier(name + 2, "internal-supports-condition")) { |
10190 m_parsingMode = SupportsMode; | 10225 m_parsingMode = SupportsMode; |
10191 m_token = INTERNAL_SUPPORTS_CONDITION_SYM; | 10226 m_token = INTERNAL_SUPPORTS_CONDITION_SYM; |
10192 } | 10227 } |
10193 return; | 10228 return; |
10194 } | 10229 } |
10195 } | 10230 } |
10196 } | 10231 } |
10197 | 10232 |
(...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11269 if (property.id() == CSSPropertyFontVariant && property.value()->isValue List()) { | 11304 if (property.id() == CSSPropertyFontVariant && property.value()->isValue List()) { |
11270 m_parsedProperties.remove(i); | 11305 m_parsedProperties.remove(i); |
11271 continue; | 11306 continue; |
11272 } | 11307 } |
11273 ++i; | 11308 ++i; |
11274 } | 11309 } |
11275 } | 11310 } |
11276 | 11311 |
11277 StyleKeyframe* CSSParser::createKeyframe(CSSParserValueList* keys) | 11312 StyleKeyframe* CSSParser::createKeyframe(CSSParserValueList* keys) |
11278 { | 11313 { |
11279 // Create a key string from the passed keys | 11314 OwnPtr<Vector<float> > keyVector = createKeyframeKeyList(keys); |
11280 StringBuilder keyString; | 11315 if (keyVector->isEmpty()) |
11281 for (unsigned i = 0; i < keys->size(); ++i) { | 11316 return 0; |
11282 ASSERT(keys->valueAt(i)->unit == CSSPrimitiveValue::CSS_NUMBER); | |
11283 float key = static_cast<float>(keys->valueAt(i)->fValue); | |
11284 if (key < 0 || key > 100) { | |
11285 // As per http://www.w3.org/TR/css3-animations/#keyframes, | |
11286 // "If a keyframe selector specifies negative percentage values | |
11287 // or values higher than 100%, then the keyframe will be ignored." | |
11288 clearProperties(); | |
11289 return 0; | |
11290 } | |
11291 if (i != 0) | |
11292 keyString.append(','); | |
11293 keyString.append(String::number(key)); | |
11294 keyString.append('%'); | |
11295 } | |
11296 | 11317 |
11297 RefPtr<StyleKeyframe> keyframe = StyleKeyframe::create(); | 11318 RefPtr<StyleKeyframe> keyframe = StyleKeyframe::create(); |
11298 keyframe->setKeyText(keyString.toString()); | 11319 keyframe->setKeys(keyVector.release()); |
11299 keyframe->setProperties(createStylePropertySet()); | 11320 keyframe->setProperties(createStylePropertySet()); |
11300 | 11321 |
11301 clearProperties(); | 11322 clearProperties(); |
11302 | 11323 |
11303 StyleKeyframe* keyframePtr = keyframe.get(); | 11324 StyleKeyframe* keyframePtr = keyframe.get(); |
11304 m_parsedKeyframes.append(keyframe.release()); | 11325 m_parsedKeyframes.append(keyframe.release()); |
11305 return keyframePtr; | 11326 return keyframePtr; |
11306 } | 11327 } |
11307 | 11328 |
11308 void CSSParser::invalidBlockHit() | 11329 void CSSParser::invalidBlockHit() |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11721 { | 11742 { |
11722 // The tokenizer checks for the construct of an+b. | 11743 // The tokenizer checks for the construct of an+b. |
11723 // However, since the {ident} rule precedes the {nth} rule, some of those | 11744 // However, since the {ident} rule precedes the {nth} rule, some of those |
11724 // tokens are identified as string literal. Furthermore we need to accept | 11745 // tokens are identified as string literal. Furthermore we need to accept |
11725 // "odd" and "even" which does not match to an+b. | 11746 // "odd" and "even" which does not match to an+b. |
11726 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") | 11747 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") |
11727 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); | 11748 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); |
11728 } | 11749 } |
11729 | 11750 |
11730 } | 11751 } |
OLD | NEW |