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 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
166 }); | 166 }); |
167 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); | 167 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); |
168 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse" ); | 168 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse" ); |
169 | 169 |
170 TRACE_EVENT_END2( | 170 TRACE_EVENT_END2( |
171 "blink,blink_style", "CSSParserImpl::parseStyleSheet", | 171 "blink,blink_style", "CSSParserImpl::parseStyleSheet", |
172 "tokenCount", scope.tokenCount(), | 172 "tokenCount", scope.tokenCount(), |
173 "length", string.length()); | 173 "length", string.length()); |
174 } | 174 } |
175 | 175 |
176 CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange prelude, St yleSheetContents* styleSheet) | |
Timothy Loh
2016/02/01 21:55:16
prelude -> range? This isn't really a prelude when
ramya.v
2016/02/02 05:43:24
Done in https://codereview.chromium.org/1653303002
| |
177 { | |
178 prelude.consumeWhitespace(); | |
179 AtomicString typeSelector; | |
180 if (prelude.peek().type() == IdentToken) | |
181 typeSelector = prelude.consume().value(); | |
182 | |
183 AtomicString pseudo; | |
184 if (prelude.peek().type() == ColonToken) { | |
185 prelude.consume(); | |
186 if (prelude.peek().type() != IdentToken) | |
187 return CSSSelectorList(); | |
188 pseudo = prelude.consume().value(); | |
189 } | |
190 | |
191 prelude.consumeWhitespace(); | |
192 if (!prelude.atEnd()) | |
193 return CSSSelectorList(); // Parse error; extra tokens in @page header | |
Timothy Loh
2016/02/01 21:55:15
@page header -> @page selector (actually I don't t
ramya.v
2016/02/02 05:43:24
Done in https://codereview.chromium.org/1653303002
| |
194 | |
195 OwnPtr<CSSParserSelector> selector; | |
196 if (!typeSelector.isNull() && pseudo.isNull()) { | |
197 selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelecto r, styleSheet->defaultNamespace())); | |
rune
2016/02/01 14:09:34
Namespaces for page names doesn't make sense, and
ramya.v
2016/02/01 15:50:05
Sure will take care in subsequent patch.
| |
198 } else { | |
199 selector = CSSParserSelector::create(); | |
200 if (!pseudo.isNull()) { | |
201 selector->setMatch(CSSSelector::PagePseudoClass); | |
202 selector->updatePseudoType(pseudo.lower()); | |
203 if (selector->pseudoType() == CSSSelector::PseudoUnknown) | |
204 return CSSSelectorList(); | |
205 } | |
206 if (!typeSelector.isNull()) { | |
207 selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, s tyleSheet->defaultNamespace())); | |
208 } | |
209 } | |
210 | |
211 selector->setForPage(); | |
212 Vector<OwnPtr<CSSParserSelector>> selectorVector; | |
213 selectorVector.append(selector.release()); | |
214 CSSSelectorList selectorList = CSSSelectorList::adoptSelectorVector(selector Vector); | |
215 return selectorList; | |
216 } | |
217 | |
176 PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& key List) | 218 PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& key List) |
177 { | 219 { |
178 return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange()); | 220 return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange()); |
179 } | 221 } |
180 | 222 |
181 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range) | 223 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range) |
182 { | 224 { |
183 ASSERT(m_parsedProperties.isEmpty()); | 225 ASSERT(m_parsedProperties.isEmpty()); |
184 consumeDeclaration(range, StyleRule::Style); | 226 consumeDeclaration(range, StyleRule::Style); |
185 bool result = !m_parsedProperties.isEmpty(); | 227 bool result = !m_parsedProperties.isEmpty(); |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
529 consumeRuleList(block, KeyframesRuleList, [keyframeRule](PassRefPtrWillBeRaw Ptr<StyleRuleBase> keyframe) { | 571 consumeRuleList(block, KeyframesRuleList, [keyframeRule](PassRefPtrWillBeRaw Ptr<StyleRuleBase> keyframe) { |
530 keyframeRule->parserAppendKeyframe(toStyleRuleKeyframe(keyframe.get())); | 572 keyframeRule->parserAppendKeyframe(toStyleRuleKeyframe(keyframe.get())); |
531 }); | 573 }); |
532 keyframeRule->setName(name); | 574 keyframeRule->setName(name); |
533 keyframeRule->setVendorPrefixed(webkitPrefixed); | 575 keyframeRule->setVendorPrefixed(webkitPrefixed); |
534 return keyframeRule.release(); | 576 return keyframeRule.release(); |
535 } | 577 } |
536 | 578 |
537 PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTo kenRange prelude, CSSParserTokenRange block) | 579 PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTo kenRange prelude, CSSParserTokenRange block) |
538 { | 580 { |
539 // We only support a small subset of the css-page spec. | 581 // We only support a small subset of the css-page spec. |
Timothy Loh
2016/02/01 21:55:16
This comment should be moved to parsePageSelector.
ramya.v
2016/02/02 05:43:24
Done in https://codereview.chromium.org/1653303002
| |
540 prelude.consumeWhitespace(); | 582 CSSSelectorList selectorList = parsePageSelector(prelude, m_styleSheet); |
541 AtomicString typeSelector; | 583 if (!selectorList.isValid()) |
542 if (prelude.peek().type() == IdentToken) | 584 return nullptr; |
Timothy Loh
2016/02/01 21:55:16
FYI I was fairly deliberate with commenting on par
ramya.v
2016/02/02 05:43:24
Done in https://codereview.chromium.org/1653303002
| |
543 typeSelector = prelude.consume().value(); | |
544 | |
545 AtomicString pseudo; | |
546 if (prelude.peek().type() == ColonToken) { | |
547 prelude.consume(); | |
548 if (prelude.peek().type() != IdentToken) | |
549 return nullptr; // Parse error; expected ident token following colon in @page header | |
550 pseudo = prelude.consume().value(); | |
551 } | |
552 | |
553 prelude.consumeWhitespace(); | |
554 if (!prelude.atEnd()) | |
555 return nullptr; // Parse error; extra tokens in @page header | |
556 | |
557 OwnPtr<CSSParserSelector> selector; | |
558 if (!typeSelector.isNull() && pseudo.isNull()) { | |
559 selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelecto r, m_styleSheet->defaultNamespace())); | |
560 } else { | |
561 selector = CSSParserSelector::create(); | |
562 if (!pseudo.isNull()) { | |
563 selector->setMatch(CSSSelector::PagePseudoClass); | |
564 selector->updatePseudoType(pseudo.lower()); | |
565 if (selector->pseudoType() == CSSSelector::PseudoUnknown) | |
566 return nullptr; // Parse error; unknown page pseudo-class | |
567 } | |
568 if (!typeSelector.isNull()) | |
569 selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, m _styleSheet->defaultNamespace())); | |
570 } | |
571 | 585 |
572 if (m_observerWrapper) { | 586 if (m_observerWrapper) { |
573 unsigned endOffset = m_observerWrapper->endOffset(prelude); | 587 unsigned endOffset = m_observerWrapper->endOffset(prelude); |
574 m_observerWrapper->observer().startRuleHeader(StyleRule::Page, m_observe rWrapper->startOffset(prelude)); | 588 m_observerWrapper->observer().startRuleHeader(StyleRule::Page, m_observe rWrapper->startOffset(prelude)); |
575 m_observerWrapper->observer().endRuleHeader(endOffset); | 589 m_observerWrapper->observer().endRuleHeader(endOffset); |
576 } | 590 } |
577 | 591 |
578 selector->setForPage(); | |
579 Vector<OwnPtr<CSSParserSelector>> selectorVector; | |
580 selectorVector.append(selector.release()); | |
581 CSSSelectorList selectorList = CSSSelectorList::adoptSelectorVector(selector Vector); | |
582 | |
583 consumeDeclarationList(block, StyleRule::Style); | 592 consumeDeclarationList(block, StyleRule::Style); |
584 | 593 |
585 return StyleRulePage::create(std::move(selectorList), createStylePropertySet (m_parsedProperties, m_context.mode())); | 594 return StyleRulePage::create(std::move(selectorList), createStylePropertySet (m_parsedProperties, m_context.mode())); |
586 } | 595 } |
587 | 596 |
588 PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRul e(CSSParserTokenRange prelude, CSSParserTokenRange block) | 597 PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRul e(CSSParserTokenRange prelude, CSSParserTokenRange block) |
589 { | 598 { |
590 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude); | 599 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude); |
591 if (!keyList) | 600 if (!keyList) |
592 return nullptr; | 601 return nullptr; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
755 else | 764 else |
756 return nullptr; // Parser error, invalid value in keyframe selector | 765 return nullptr; // Parser error, invalid value in keyframe selector |
757 if (range.atEnd()) | 766 if (range.atEnd()) |
758 return result.release(); | 767 return result.release(); |
759 if (range.consume().type() != CommaToken) | 768 if (range.consume().type() != CommaToken) |
760 return nullptr; // Parser error | 769 return nullptr; // Parser error |
761 } | 770 } |
762 } | 771 } |
763 | 772 |
764 } // namespace blink | 773 } // namespace blink |
OLD | NEW |