OLD | NEW |
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 "core/css/parser/CSSParserImpl.h" | 5 #include "core/css/parser/CSSParserImpl.h" |
6 | 6 |
7 #include "core/css/CSSCustomPropertyDeclaration.h" | 7 #include "core/css/CSSCustomPropertyDeclaration.h" |
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 23 matching lines...) Expand all Loading... |
34 CSSParserImpl::CSSParserImpl(const CSSParserContext& context, StyleSheetContents
* styleSheet) | 34 CSSParserImpl::CSSParserImpl(const CSSParserContext& context, StyleSheetContents
* styleSheet) |
35 : m_context(context) | 35 : m_context(context) |
36 , m_styleSheet(styleSheet) | 36 , m_styleSheet(styleSheet) |
37 , m_observerWrapper(nullptr) | 37 , m_observerWrapper(nullptr) |
38 { | 38 { |
39 } | 39 } |
40 | 40 |
41 bool CSSParserImpl::parseValue(MutableStylePropertySet* declaration, CSSProperty
ID unresolvedProperty, const String& string, bool important, const CSSParserCont
ext& context) | 41 bool CSSParserImpl::parseValue(MutableStylePropertySet* declaration, CSSProperty
ID unresolvedProperty, const String& string, bool important, const CSSParserCont
ext& context) |
42 { | 42 { |
43 CSSParserImpl parser(context); | 43 CSSParserImpl parser(context); |
44 StyleRule::Type ruleType = StyleRule::Style; | 44 StyleRule::RuleType ruleType = StyleRule::Style; |
45 if (declaration->cssParserMode() == CSSViewportRuleMode) | 45 if (declaration->cssParserMode() == CSSViewportRuleMode) |
46 ruleType = StyleRule::Viewport; | 46 ruleType = StyleRule::Viewport; |
47 CSSTokenizer::Scope scope(string); | 47 CSSTokenizer::Scope scope(string); |
48 parser.consumeDeclarationValue(scope.tokenRange(), unresolvedProperty, impor
tant, ruleType); | 48 parser.consumeDeclarationValue(scope.tokenRange(), unresolvedProperty, impor
tant, ruleType); |
49 if (parser.m_parsedProperties.isEmpty()) | 49 if (parser.m_parsedProperties.isEmpty()) |
50 return false; | 50 return false; |
51 return declaration->addParsedProperties(parser.m_parsedProperties); | 51 return declaration->addParsedProperties(parser.m_parsedProperties); |
52 } | 52 } |
53 | 53 |
54 bool CSSParserImpl::parseVariableValue(MutableStylePropertySet* declaration, con
st AtomicString& propertyName, const String& value, bool important, const CSSPar
serContext& context) | 54 bool CSSParserImpl::parseVariableValue(MutableStylePropertySet* declaration, con
st AtomicString& propertyName, const String& value, bool important, const CSSPar
serContext& context) |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 context.setMode(mode); | 107 context.setMode(mode); |
108 CSSParserImpl parser(context, document.elementSheet().contents()); | 108 CSSParserImpl parser(context, document.elementSheet().contents()); |
109 CSSTokenizer::Scope scope(string); | 109 CSSTokenizer::Scope scope(string); |
110 parser.consumeDeclarationList(scope.tokenRange(), StyleRule::Style); | 110 parser.consumeDeclarationList(scope.tokenRange(), StyleRule::Style); |
111 return createStylePropertySet(parser.m_parsedProperties, mode); | 111 return createStylePropertySet(parser.m_parsedProperties, mode); |
112 } | 112 } |
113 | 113 |
114 bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration, c
onst String& string, const CSSParserContext& context) | 114 bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration, c
onst String& string, const CSSParserContext& context) |
115 { | 115 { |
116 CSSParserImpl parser(context); | 116 CSSParserImpl parser(context); |
117 StyleRule::Type ruleType = StyleRule::Style; | 117 StyleRule::RuleType ruleType = StyleRule::Style; |
118 if (declaration->cssParserMode() == CSSViewportRuleMode) | 118 if (declaration->cssParserMode() == CSSViewportRuleMode) |
119 ruleType = StyleRule::Viewport; | 119 ruleType = StyleRule::Viewport; |
120 CSSTokenizer::Scope scope(string); | 120 CSSTokenizer::Scope scope(string); |
121 parser.consumeDeclarationList(scope.tokenRange(), ruleType); | 121 parser.consumeDeclarationList(scope.tokenRange(), ruleType); |
122 if (parser.m_parsedProperties.isEmpty()) | 122 if (parser.m_parsedProperties.isEmpty()) |
123 return false; | 123 return false; |
124 | 124 |
125 BitArray<numCSSProperties> seenProperties; | 125 BitArray<numCSSProperties> seenProperties; |
126 size_t unusedEntries = parser.m_parsedProperties.size(); | 126 size_t unusedEntries = parser.m_parsedProperties.size(); |
127 WillBeHeapVector<CSSProperty, 256> results(unusedEntries); | 127 WillBeHeapVector<CSSProperty, 256> results(unusedEntries); |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 return nullptr; // Parse error, invalid selector list | 645 return nullptr; // Parse error, invalid selector list |
646 | 646 |
647 if (m_observerWrapper) | 647 if (m_observerWrapper) |
648 observeSelectors(*m_observerWrapper, prelude); | 648 observeSelectors(*m_observerWrapper, prelude); |
649 | 649 |
650 consumeDeclarationList(block, StyleRule::Style); | 650 consumeDeclarationList(block, StyleRule::Style); |
651 | 651 |
652 return StyleRule::create(std::move(selectorList), createStylePropertySet(m_p
arsedProperties, m_context.mode())); | 652 return StyleRule::create(std::move(selectorList), createStylePropertySet(m_p
arsedProperties, m_context.mode())); |
653 } | 653 } |
654 | 654 |
655 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, StyleRule:
:Type ruleType) | 655 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, StyleRule:
:RuleType ruleType) |
656 { | 656 { |
657 ASSERT(m_parsedProperties.isEmpty()); | 657 ASSERT(m_parsedProperties.isEmpty()); |
658 | 658 |
659 bool useObserver = m_observerWrapper && (ruleType == StyleRule::Style || rul
eType == StyleRule::Keyframe); | 659 bool useObserver = m_observerWrapper && (ruleType == StyleRule::Style || rul
eType == StyleRule::Keyframe); |
660 if (useObserver) { | 660 if (useObserver) { |
661 m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousT
okenStartOffset(range)); | 661 m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousT
okenStartOffset(range)); |
662 m_observerWrapper->skipCommentsBefore(range, true); | 662 m_observerWrapper->skipCommentsBefore(range, true); |
663 } | 663 } |
664 | 664 |
665 while (!range.atEnd()) { | 665 while (!range.atEnd()) { |
(...skipping 29 matching lines...) Expand all Loading... |
695 } | 695 } |
696 } | 696 } |
697 | 697 |
698 // Yield remaining comments | 698 // Yield remaining comments |
699 if (useObserver) { | 699 if (useObserver) { |
700 m_observerWrapper->yieldCommentsBefore(range); | 700 m_observerWrapper->yieldCommentsBefore(range); |
701 m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(r
ange)); | 701 m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(r
ange)); |
702 } | 702 } |
703 } | 703 } |
704 | 704 |
705 void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Typ
e ruleType) | 705 void CSSParserImpl::consumeDeclaration(CSSParserTokenRange range, StyleRule::Rul
eType ruleType) |
706 { | 706 { |
707 CSSParserTokenRange rangeCopy = range; // For inspector callbacks | 707 CSSParserTokenRange rangeCopy = range; // For inspector callbacks |
708 | 708 |
709 ASSERT(range.peek().type() == IdentToken); | 709 ASSERT(range.peek().type() == IdentToken); |
710 const CSSParserToken& token = range.consumeIncludingWhitespace(); | 710 const CSSParserToken& token = range.consumeIncludingWhitespace(); |
711 CSSPropertyID unresolvedProperty = token.parseAsUnresolvedCSSPropertyID(); | 711 CSSPropertyID unresolvedProperty = token.parseAsUnresolvedCSSPropertyID(); |
712 if (range.consume().type() != ColonToken) | 712 if (range.consume().type() != ColonToken) |
713 return; // Parse error | 713 return; // Parse error |
714 | 714 |
715 bool important = false; | 715 bool important = false; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
748 important, m_parsedProperties.size() != propertiesCount); | 748 important, m_parsedProperties.size() != propertiesCount); |
749 } | 749 } |
750 } | 750 } |
751 | 751 |
752 void CSSParserImpl::consumeVariableValue(CSSParserTokenRange range, const Atomic
String& variableName, bool important) | 752 void CSSParserImpl::consumeVariableValue(CSSParserTokenRange range, const Atomic
String& variableName, bool important) |
753 { | 753 { |
754 if (RefPtrWillBeRawPtr<CSSCustomPropertyDeclaration> value = CSSVariablePars
er::parseDeclarationValue(variableName, range)) | 754 if (RefPtrWillBeRawPtr<CSSCustomPropertyDeclaration> value = CSSVariablePars
er::parseDeclarationValue(variableName, range)) |
755 m_parsedProperties.append(CSSProperty(CSSPropertyVariable, value.release
(), important)); | 755 m_parsedProperties.append(CSSProperty(CSSPropertyVariable, value.release
(), important)); |
756 } | 756 } |
757 | 757 |
758 void CSSParserImpl::consumeDeclarationValue(CSSParserTokenRange range, CSSProper
tyID unresolvedProperty, bool important, StyleRule::Type ruleType) | 758 void CSSParserImpl::consumeDeclarationValue(CSSParserTokenRange range, CSSProper
tyID unresolvedProperty, bool important, StyleRule::RuleType ruleType) |
759 { | 759 { |
760 CSSPropertyParser::parseValue(unresolvedProperty, important, range, m_contex
t, m_parsedProperties, ruleType); | 760 CSSPropertyParser::parseValue(unresolvedProperty, important, range, m_contex
t, m_parsedProperties, ruleType); |
761 } | 761 } |
762 | 762 |
763 PassOwnPtr<Vector<double>> CSSParserImpl::consumeKeyframeKeyList(CSSParserTokenR
ange range) | 763 PassOwnPtr<Vector<double>> CSSParserImpl::consumeKeyframeKeyList(CSSParserTokenR
ange range) |
764 { | 764 { |
765 OwnPtr<Vector<double>> result = adoptPtr(new Vector<double>); | 765 OwnPtr<Vector<double>> result = adoptPtr(new Vector<double>); |
766 while (true) { | 766 while (true) { |
767 range.consumeWhitespace(); | 767 range.consumeWhitespace(); |
768 const CSSParserToken& token = range.consumeIncludingWhitespace(); | 768 const CSSParserToken& token = range.consumeIncludingWhitespace(); |
769 if (token.type() == PercentageToken && token.numericValue() >= 0 && toke
n.numericValue() <= 100) | 769 if (token.type() == PercentageToken && token.numericValue() >= 0 && toke
n.numericValue() <= 100) |
770 result->append(token.numericValue() / 100); | 770 result->append(token.numericValue() / 100); |
771 else if (token.type() == IdentToken && token.valueEqualsIgnoringASCIICas
e("from")) | 771 else if (token.type() == IdentToken && token.valueEqualsIgnoringASCIICas
e("from")) |
772 result->append(0); | 772 result->append(0); |
773 else if (token.type() == IdentToken && token.valueEqualsIgnoringASCIICas
e("to")) | 773 else if (token.type() == IdentToken && token.valueEqualsIgnoringASCIICas
e("to")) |
774 result->append(1); | 774 result->append(1); |
775 else | 775 else |
776 return nullptr; // Parser error, invalid value in keyframe selector | 776 return nullptr; // Parser error, invalid value in keyframe selector |
777 if (range.atEnd()) | 777 if (range.atEnd()) |
778 return result.release(); | 778 return result.release(); |
779 if (range.consume().type() != CommaToken) | 779 if (range.consume().type() != CommaToken) |
780 return nullptr; // Parser error | 780 return nullptr; // Parser error |
781 } | 781 } |
782 } | 782 } |
783 | 783 |
784 } // namespace blink | 784 } // namespace blink |
OLD | NEW |