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

Side by Side Diff: Source/core/css/parser/CSSParserImpl.cpp

Issue 951213004: Make CSSRuleSourceData use the CSSRule Type enum (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Use StyleRule::Type Created 5 years, 10 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 unified diff | Download patch
« no previous file with comments | « Source/core/css/parser/CSSParserImpl.h ('k') | Source/core/css/parser/CSSParserObserver.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/css/parser/CSSParserImpl.h" 6 #include "core/css/parser/CSSParserImpl.h"
7 7
8 #include "core/css/CSSKeyframesRule.h" 8 #include "core/css/CSSKeyframesRule.h"
9 #include "core/css/CSSStyleSheet.h" 9 #include "core/css/CSSStyleSheet.h"
10 #include "core/css/StylePropertySet.h" 10 #include "core/css/StylePropertySet.h"
(...skipping 18 matching lines...) Expand all
29 : m_context(context) 29 : m_context(context)
30 , m_defaultNamespace(starAtom) 30 , m_defaultNamespace(starAtom)
31 , m_styleSheet(styleSheet) 31 , m_styleSheet(styleSheet)
32 { 32 {
33 CSSTokenizer::tokenize(string, m_tokens); 33 CSSTokenizer::tokenize(string, m_tokens);
34 } 34 }
35 35
36 bool CSSParserImpl::parseValue(MutableStylePropertySet* declaration, CSSProperty ID propertyID, const String& string, bool important, const CSSParserContext& con text) 36 bool CSSParserImpl::parseValue(MutableStylePropertySet* declaration, CSSProperty ID propertyID, const String& string, bool important, const CSSParserContext& con text)
37 { 37 {
38 CSSParserImpl parser(context, string); 38 CSSParserImpl parser(context, string);
39 CSSRuleSourceData::Type ruleType = CSSRuleSourceData::STYLE_RULE; 39 StyleRule::Type ruleType = StyleRule::Style;
40 if (declaration->cssParserMode() == CSSViewportRuleMode) 40 if (declaration->cssParserMode() == CSSViewportRuleMode)
41 ruleType = CSSRuleSourceData::VIEWPORT_RULE; 41 ruleType = StyleRule::Viewport;
42 parser.consumeDeclarationValue(CSSParserTokenRange(parser.m_tokens), propert yID, important, ruleType); 42 parser.consumeDeclarationValue(CSSParserTokenRange(parser.m_tokens), propert yID, important, ruleType);
43 if (parser.m_parsedProperties.isEmpty()) 43 if (parser.m_parsedProperties.isEmpty())
44 return false; 44 return false;
45 declaration->addParsedProperties(parser.m_parsedProperties); 45 declaration->addParsedProperties(parser.m_parsedProperties);
46 return true; 46 return true;
47 } 47 }
48 48
49 static inline void filterProperties(bool important, const WillBeHeapVector<CSSPr operty, 256>& input, WillBeHeapVector<CSSProperty, 256>& output, size_t& unusedE ntries, BitArray<numCSSProperties>& seenProperties) 49 static inline void filterProperties(bool important, const WillBeHeapVector<CSSPr operty, 256>& input, WillBeHeapVector<CSSProperty, 256>& output, size_t& unusedE ntries, BitArray<numCSSProperties>& seenProperties)
50 { 50 {
51 // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found. 51 // Add properties in reverse order so that highest priority definitions are reached first. Duplicate definitions can then be ignored when found.
(...skipping 21 matching lines...) Expand all
73 return ImmutableStylePropertySet::create(results.data() + unusedEntries, res ults.size() - unusedEntries, mode); 73 return ImmutableStylePropertySet::create(results.data() + unusedEntries, res ults.size() - unusedEntries, mode);
74 } 74 }
75 75
76 PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> CSSParserImpl::parseInlineStyl eDeclaration(const String& string, Element* element) 76 PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> CSSParserImpl::parseInlineStyl eDeclaration(const String& string, Element* element)
77 { 77 {
78 Document& document = element->document(); 78 Document& document = element->document();
79 CSSParserContext context = CSSParserContext(document.elementSheet().contents ()->parserContext(), UseCounter::getFrom(&document)); 79 CSSParserContext context = CSSParserContext(document.elementSheet().contents ()->parserContext(), UseCounter::getFrom(&document));
80 CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode() ? HTMLStandardMode : HTMLQuirksMode; 80 CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode() ? HTMLStandardMode : HTMLQuirksMode;
81 context.setMode(mode); 81 context.setMode(mode);
82 CSSParserImpl parser(context, string); 82 CSSParserImpl parser(context, string);
83 parser.consumeDeclarationList(CSSParserTokenRange(parser.m_tokens), CSSRuleS ourceData::STYLE_RULE); 83 parser.consumeDeclarationList(CSSParserTokenRange(parser.m_tokens), StyleRul e::Style);
84 return createStylePropertySet(parser.m_parsedProperties, mode); 84 return createStylePropertySet(parser.m_parsedProperties, mode);
85 } 85 }
86 86
87 bool CSSParserImpl::parseDeclaration(MutableStylePropertySet* declaration, const String& string, const CSSParserContext& context) 87 bool CSSParserImpl::parseDeclaration(MutableStylePropertySet* declaration, const String& string, const CSSParserContext& context)
88 { 88 {
89 CSSParserImpl parser(context, string); 89 CSSParserImpl parser(context, string);
90 CSSRuleSourceData::Type ruleType = CSSRuleSourceData::STYLE_RULE; 90 StyleRule::Type ruleType = StyleRule::Style;
91 if (declaration->cssParserMode() == CSSViewportRuleMode) 91 if (declaration->cssParserMode() == CSSViewportRuleMode)
92 ruleType = CSSRuleSourceData::VIEWPORT_RULE; 92 ruleType = StyleRule::Viewport;
93 parser.consumeDeclarationList(CSSParserTokenRange(parser.m_tokens), ruleType ); 93 parser.consumeDeclarationList(CSSParserTokenRange(parser.m_tokens), ruleType );
94 if (parser.m_parsedProperties.isEmpty()) 94 if (parser.m_parsedProperties.isEmpty())
95 return false; 95 return false;
96 declaration->addParsedProperties(parser.m_parsedProperties); 96 declaration->addParsedProperties(parser.m_parsedProperties);
97 return true; 97 return true;
98 } 98 }
99 99
100 PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::parseRule(const String& str ing, const CSSParserContext& context, AllowedRulesType allowedRules) 100 PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::parseRule(const String& str ing, const CSSParserContext& context, AllowedRulesType allowedRules)
101 { 101 {
102 CSSParserImpl parser(context, string); 102 CSSParserImpl parser(context, string);
(...skipping 25 matching lines...) Expand all
128 PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& key List) 128 PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& key List)
129 { 129 {
130 Vector<CSSParserToken> tokens; 130 Vector<CSSParserToken> tokens;
131 CSSTokenizer::tokenize(keyList, tokens); 131 CSSTokenizer::tokenize(keyList, tokens);
132 return consumeKeyframeKeyList(tokens); 132 return consumeKeyframeKeyList(tokens);
133 } 133 }
134 134
135 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range) 135 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range)
136 { 136 {
137 ASSERT(m_parsedProperties.isEmpty()); 137 ASSERT(m_parsedProperties.isEmpty());
138 consumeDeclaration(range, CSSRuleSourceData::STYLE_RULE); 138 consumeDeclaration(range, StyleRule::Style);
139 bool result = !m_parsedProperties.isEmpty(); 139 bool result = !m_parsedProperties.isEmpty();
140 m_parsedProperties.clear(); 140 m_parsedProperties.clear();
141 return result; 141 return result;
142 } 142 }
143 143
144 static CSSParserImpl::AllowedRulesType computeNewAllowedRules(CSSParserImpl::All owedRulesType allowedRules, StyleRuleBase* rule) 144 static CSSParserImpl::AllowedRulesType computeNewAllowedRules(CSSParserImpl::All owedRulesType allowedRules, StyleRuleBase* rule)
145 { 145 {
146 if (!rule || allowedRules == CSSParserImpl::KeyframeRules) 146 if (!rule || allowedRules == CSSParserImpl::KeyframeRules)
147 return allowedRules; 147 return allowedRules;
148 ASSERT(allowedRules <= CSSParserImpl::RegularRules); 148 ASSERT(allowedRules <= CSSParserImpl::RegularRules);
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 338
339 PassRefPtrWillBeRawPtr<StyleRuleViewport> CSSParserImpl::consumeViewportRule(CSS ParserTokenRange prelude, CSSParserTokenRange block) 339 PassRefPtrWillBeRawPtr<StyleRuleViewport> CSSParserImpl::consumeViewportRule(CSS ParserTokenRange prelude, CSSParserTokenRange block)
340 { 340 {
341 // Allow @viewport rules from UA stylesheets even if the feature is disabled . 341 // Allow @viewport rules from UA stylesheets even if the feature is disabled .
342 if (!RuntimeEnabledFeatures::cssViewportEnabled() && !isUASheetBehavior(m_co ntext.mode())) 342 if (!RuntimeEnabledFeatures::cssViewportEnabled() && !isUASheetBehavior(m_co ntext.mode()))
343 return nullptr; 343 return nullptr;
344 344
345 prelude.consumeWhitespaceAndComments(); 345 prelude.consumeWhitespaceAndComments();
346 if (!prelude.atEnd()) 346 if (!prelude.atEnd())
347 return nullptr; // Parser error; @viewport prelude should be empty 347 return nullptr; // Parser error; @viewport prelude should be empty
348 consumeDeclarationList(block, CSSRuleSourceData::VIEWPORT_RULE); 348 consumeDeclarationList(block, StyleRule::Viewport);
349 RefPtrWillBeRawPtr<StyleRuleViewport> rule = StyleRuleViewport::create(); 349 RefPtrWillBeRawPtr<StyleRuleViewport> rule = StyleRuleViewport::create();
350 rule->setProperties(createStylePropertySet(m_parsedProperties, CSSViewportRu leMode)); 350 rule->setProperties(createStylePropertySet(m_parsedProperties, CSSViewportRu leMode));
351 m_parsedProperties.clear(); 351 m_parsedProperties.clear();
352 return rule.release(); 352 return rule.release();
353 } 353 }
354 354
355 PassRefPtrWillBeRawPtr<StyleRuleFontFace> CSSParserImpl::consumeFontFaceRule(CSS ParserTokenRange prelude, CSSParserTokenRange block) 355 PassRefPtrWillBeRawPtr<StyleRuleFontFace> CSSParserImpl::consumeFontFaceRule(CSS ParserTokenRange prelude, CSSParserTokenRange block)
356 { 356 {
357 prelude.consumeWhitespaceAndComments(); 357 prelude.consumeWhitespaceAndComments();
358 if (!prelude.atEnd()) 358 if (!prelude.atEnd())
359 return nullptr; // Parse error; @font-face prelude should be empty 359 return nullptr; // Parse error; @font-face prelude should be empty
360 consumeDeclarationList(block, CSSRuleSourceData::FONT_FACE_RULE); 360 consumeDeclarationList(block, StyleRule::FontFace);
361 361
362 // FIXME: This logic should be in CSSPropertyParser 362 // FIXME: This logic should be in CSSPropertyParser
363 // FIXME: Shouldn't we fail if font-family or src aren't specified? 363 // FIXME: Shouldn't we fail if font-family or src aren't specified?
364 for (unsigned i = 0; i < m_parsedProperties.size(); ++i) { 364 for (unsigned i = 0; i < m_parsedProperties.size(); ++i) {
365 CSSProperty& property = m_parsedProperties[i]; 365 CSSProperty& property = m_parsedProperties[i];
366 if (property.id() == CSSPropertyFontVariant && property.value()->isPrimi tiveValue()) { 366 if (property.id() == CSSPropertyFontVariant && property.value()->isPrimi tiveValue()) {
367 property.wrapValueInCommaSeparatedList(); 367 property.wrapValueInCommaSeparatedList();
368 } else if (property.id() == CSSPropertyFontFamily && (!property.value()- >isValueList() || toCSSValueList(property.value())->length() != 1)) { 368 } else if (property.id() == CSSPropertyFontFamily && (!property.value()- >isValueList() || toCSSValueList(property.value())->length() != 1)) {
369 m_parsedProperties.clear(); 369 m_parsedProperties.clear();
370 return nullptr; 370 return nullptr;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, m _defaultNamespace)); 441 selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, m _defaultNamespace));
442 } 442 }
443 443
444 selector->setForPage(); 444 selector->setForPage();
445 445
446 RefPtrWillBeRawPtr<StyleRulePage> pageRule = StyleRulePage::create(); 446 RefPtrWillBeRawPtr<StyleRulePage> pageRule = StyleRulePage::create();
447 Vector<OwnPtr<CSSParserSelector>> selectorVector; 447 Vector<OwnPtr<CSSParserSelector>> selectorVector;
448 selectorVector.append(selector.release()); 448 selectorVector.append(selector.release());
449 pageRule->parserAdoptSelectorVector(selectorVector); 449 pageRule->parserAdoptSelectorVector(selectorVector);
450 450
451 consumeDeclarationList(block, CSSRuleSourceData::STYLE_RULE); 451 consumeDeclarationList(block, StyleRule::Style);
452 pageRule->setProperties(createStylePropertySet(m_parsedProperties, m_context .mode())); 452 pageRule->setProperties(createStylePropertySet(m_parsedProperties, m_context .mode()));
453 m_parsedProperties.clear(); 453 m_parsedProperties.clear();
454 454
455 return pageRule.release(); 455 return pageRule.release();
456 } 456 }
457 457
458 PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRul e(CSSParserTokenRange prelude, CSSParserTokenRange block) 458 PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRul e(CSSParserTokenRange prelude, CSSParserTokenRange block)
459 { 459 {
460 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude); 460 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude);
461 if (!keyList) 461 if (!keyList)
462 return nullptr; 462 return nullptr;
463 consumeDeclarationList(block, CSSRuleSourceData::KEYFRAMES_RULE); 463 consumeDeclarationList(block, StyleRule::Keyframes);
464 RefPtrWillBeRawPtr<StyleRuleKeyframe> rule = StyleRuleKeyframe::create(); 464 RefPtrWillBeRawPtr<StyleRuleKeyframe> rule = StyleRuleKeyframe::create();
465 rule->setKeys(keyList.release()); 465 rule->setKeys(keyList.release());
466 rule->setProperties(createStylePropertySet(m_parsedProperties, m_context.mod e())); 466 rule->setProperties(createStylePropertySet(m_parsedProperties, m_context.mod e()));
467 m_parsedProperties.clear(); 467 m_parsedProperties.clear();
468 return rule.release(); 468 return rule.release();
469 } 469 }
470 470
471 PassRefPtrWillBeRawPtr<StyleRule> CSSParserImpl::consumeStyleRule(CSSParserToken Range prelude, CSSParserTokenRange block) 471 PassRefPtrWillBeRawPtr<StyleRule> CSSParserImpl::consumeStyleRule(CSSParserToken Range prelude, CSSParserTokenRange block)
472 { 472 {
473 CSSSelectorList selectorList; 473 CSSSelectorList selectorList;
474 CSSSelectorParser::parseSelector(prelude, m_context, m_defaultNamespace, m_s tyleSheet, selectorList); 474 CSSSelectorParser::parseSelector(prelude, m_context, m_defaultNamespace, m_s tyleSheet, selectorList);
475 if (!selectorList.isValid()) 475 if (!selectorList.isValid())
476 return nullptr; // Parse error, invalid selector list 476 return nullptr; // Parse error, invalid selector list
477 consumeDeclarationList(block, CSSRuleSourceData::STYLE_RULE); 477 consumeDeclarationList(block, StyleRule::Style);
478 478
479 RefPtrWillBeRawPtr<StyleRule> rule = StyleRule::create(); 479 RefPtrWillBeRawPtr<StyleRule> rule = StyleRule::create();
480 rule->wrapperAdoptSelectorList(selectorList); 480 rule->wrapperAdoptSelectorList(selectorList);
481 rule->setProperties(createStylePropertySet(m_parsedProperties, m_context.mod e())); 481 rule->setProperties(createStylePropertySet(m_parsedProperties, m_context.mod e()));
482 m_parsedProperties.clear(); 482 m_parsedProperties.clear();
483 return rule.release(); 483 return rule.release();
484 } 484 }
485 485
486 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, CSSRuleSou rceData::Type ruleType) 486 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, StyleRule: :Type ruleType)
487 { 487 {
488 ASSERT(m_parsedProperties.isEmpty()); 488 ASSERT(m_parsedProperties.isEmpty());
489 489
490 while (!range.atEnd()) { 490 while (!range.atEnd()) {
491 switch (range.peek().type()) { 491 switch (range.peek().type()) {
492 case CommentToken: 492 case CommentToken:
493 case WhitespaceToken: 493 case WhitespaceToken:
494 case SemicolonToken: 494 case SemicolonToken:
495 range.consume(); 495 range.consume();
496 break; 496 break;
497 case IdentToken: { 497 case IdentToken: {
498 const CSSParserToken* declarationStart = &range.peek(); 498 const CSSParserToken* declarationStart = &range.peek();
499 while (!range.atEnd() && range.peek().type() != SemicolonToken) 499 while (!range.atEnd() && range.peek().type() != SemicolonToken)
500 range.consumeComponentValue(); 500 range.consumeComponentValue();
501 consumeDeclaration(range.makeSubRange(declarationStart, &range.peek( )), ruleType); 501 consumeDeclaration(range.makeSubRange(declarationStart, &range.peek( )), ruleType);
502 break; 502 break;
503 } 503 }
504 default: // Parser error 504 default: // Parser error
505 // FIXME: The spec allows at-rules in a declaration list 505 // FIXME: The spec allows at-rules in a declaration list
506 while (!range.atEnd() && range.peek().type() != SemicolonToken) 506 while (!range.atEnd() && range.peek().type() != SemicolonToken)
507 range.consumeComponentValue(); 507 range.consumeComponentValue();
508 break; 508 break;
509 } 509 }
510 } 510 }
511 } 511 }
512 512
513 void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, CSSRuleSourceD ata::Type ruleType) 513 void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Typ e ruleType)
514 { 514 {
515 ASSERT(range.peek().type() == IdentToken); 515 ASSERT(range.peek().type() == IdentToken);
516 CSSPropertyID id = range.consumeIncludingWhitespaceAndComments().parseAsCSSP ropertyID(); 516 CSSPropertyID id = range.consumeIncludingWhitespaceAndComments().parseAsCSSP ropertyID();
517 if (id == CSSPropertyInvalid) 517 if (id == CSSPropertyInvalid)
518 return; 518 return;
519 if (range.consume().type() != ColonToken) 519 if (range.consume().type() != ColonToken)
520 return; // Parse error 520 return; // Parse error
521 521
522 // FIXME: We shouldn't allow !important in @keyframes or @font-face 522 // FIXME: We shouldn't allow !important in @keyframes or @font-face
523 const CSSParserToken* last = range.end() - 1; 523 const CSSParserToken* last = range.end() - 1;
524 while (last->type() == WhitespaceToken || last->type() == CommentToken) 524 while (last->type() == WhitespaceToken || last->type() == CommentToken)
525 --last; 525 --last;
526 if (last->type() == IdentToken && equalIgnoringCase(last->value(), "importan t")) { 526 if (last->type() == IdentToken && equalIgnoringCase(last->value(), "importan t")) {
527 --last; 527 --last;
528 while (last->type() == WhitespaceToken || last->type() == CommentToken) 528 while (last->type() == WhitespaceToken || last->type() == CommentToken)
529 --last; 529 --last;
530 if (last->type() == DelimiterToken && last->delimiter() == '!') { 530 if (last->type() == DelimiterToken && last->delimiter() == '!') {
531 consumeDeclarationValue(range.makeSubRange(&range.peek(), last), id, true, ruleType); 531 consumeDeclarationValue(range.makeSubRange(&range.peek(), last), id, true, ruleType);
532 return; 532 return;
533 } 533 }
534 } 534 }
535 consumeDeclarationValue(range.makeSubRange(&range.peek(), range.end()), id, false, ruleType); 535 consumeDeclarationValue(range.makeSubRange(&range.peek(), range.end()), id, false, ruleType);
536 } 536 }
537 537
538 void CSSParserImpl::consumeDeclarationValue(CSSParserTokenRange range, CSSProper tyID propertyID, bool important, CSSRuleSourceData::Type ruleType) 538 void CSSParserImpl::consumeDeclarationValue(CSSParserTokenRange range, CSSProper tyID propertyID, bool important, StyleRule::Type ruleType)
539 { 539 {
540 CSSParserValueList valueList(range); 540 CSSParserValueList valueList(range);
541 if (!valueList.size()) 541 if (!valueList.size())
542 return; // Parser error 542 return; // Parser error
543 bool inViewport = ruleType == CSSRuleSourceData::VIEWPORT_RULE; 543 bool inViewport = ruleType == StyleRule::Viewport;
544 CSSPropertyParser::parseValue(propertyID, important, &valueList, m_context, inViewport, m_parsedProperties, ruleType); 544 CSSPropertyParser::parseValue(propertyID, important, &valueList, m_context, inViewport, m_parsedProperties, ruleType);
545 } 545 }
546 546
547 PassOwnPtr<Vector<double>> CSSParserImpl::consumeKeyframeKeyList(CSSParserTokenR ange range) 547 PassOwnPtr<Vector<double>> CSSParserImpl::consumeKeyframeKeyList(CSSParserTokenR ange range)
548 { 548 {
549 OwnPtr<Vector<double>> result = adoptPtr(new Vector<double>); 549 OwnPtr<Vector<double>> result = adoptPtr(new Vector<double>);
550 while (true) { 550 while (true) {
551 range.consumeWhitespaceAndComments(); 551 range.consumeWhitespaceAndComments();
552 const CSSParserToken& token = range.consumeIncludingWhitespaceAndComment s(); 552 const CSSParserToken& token = range.consumeIncludingWhitespaceAndComment s();
553 if (token.type() == PercentageToken && token.numericValue() >= 0 && toke n.numericValue() <= 100) 553 if (token.type() == PercentageToken && token.numericValue() >= 0 && toke n.numericValue() <= 100)
554 result->append(token.numericValue() / 100); 554 result->append(token.numericValue() / 100);
555 else if (token.type() == IdentToken && equalIgnoringCase(token.value(), "from")) 555 else if (token.type() == IdentToken && equalIgnoringCase(token.value(), "from"))
556 result->append(0); 556 result->append(0);
557 else if (token.type() == IdentToken && equalIgnoringCase(token.value(), "to")) 557 else if (token.type() == IdentToken && equalIgnoringCase(token.value(), "to"))
558 result->append(1); 558 result->append(1);
559 else 559 else
560 return nullptr; // Parser error, invalid value in keyframe selector 560 return nullptr; // Parser error, invalid value in keyframe selector
561 if (range.atEnd()) 561 if (range.atEnd())
562 return result.release(); 562 return result.release();
563 if (range.consume().type() != CommaToken) 563 if (range.consume().type() != CommaToken)
564 return nullptr; // Parser error 564 return nullptr; // Parser error
565 } 565 }
566 } 566 }
567 567
568 } // namespace blink 568 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSParserImpl.h ('k') | Source/core/css/parser/CSSParserObserver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698