Chromium Code Reviews| 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 |