| 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/CSSCustomIdentValue.h" | 7 #include "core/css/CSSCustomIdentValue.h" |
| 8 #include "core/css/CSSCustomPropertyDeclaration.h" | 8 #include "core/css/CSSCustomPropertyDeclaration.h" |
| 9 #include "core/css/CSSKeyframesRule.h" | 9 #include "core/css/CSSKeyframesRule.h" |
| 10 #include "core/css/CSSStyleSheet.h" | 10 #include "core/css/CSSStyleSheet.h" |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 "tokenCount", scope.tokenCount(), | 183 "tokenCount", scope.tokenCount(), |
| 184 "length", string.length()); | 184 "length", string.length()); |
| 185 } | 185 } |
| 186 | 186 |
| 187 CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange range, Styl
eSheetContents* styleSheet) | 187 CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange range, Styl
eSheetContents* styleSheet) |
| 188 { | 188 { |
| 189 // We only support a small subset of the css-page spec. | 189 // We only support a small subset of the css-page spec. |
| 190 range.consumeWhitespace(); | 190 range.consumeWhitespace(); |
| 191 AtomicString typeSelector; | 191 AtomicString typeSelector; |
| 192 if (range.peek().type() == IdentToken) | 192 if (range.peek().type() == IdentToken) |
| 193 typeSelector = range.consume().value(); | 193 typeSelector = AtomicString(range.consume().value().toString()); |
| 194 | 194 |
| 195 AtomicString pseudo; | 195 AtomicString pseudo; |
| 196 if (range.peek().type() == ColonToken) { | 196 if (range.peek().type() == ColonToken) { |
| 197 range.consume(); | 197 range.consume(); |
| 198 if (range.peek().type() != IdentToken) | 198 if (range.peek().type() != IdentToken) |
| 199 return CSSSelectorList(); | 199 return CSSSelectorList(); |
| 200 pseudo = range.consume().value(); | 200 pseudo = AtomicString(range.consume().value().toString()); |
| 201 } | 201 } |
| 202 | 202 |
| 203 range.consumeWhitespace(); | 203 range.consumeWhitespace(); |
| 204 if (!range.atEnd()) | 204 if (!range.atEnd()) |
| 205 return CSSSelectorList(); // Parse error; extra tokens in @page selector | 205 return CSSSelectorList(); // Parse error; extra tokens in @page selector |
| 206 | 206 |
| 207 OwnPtr<CSSParserSelector> selector; | 207 OwnPtr<CSSParserSelector> selector; |
| 208 if (!typeSelector.isNull() && pseudo.isNull()) { | 208 if (!typeSelector.isNull() && pseudo.isNull()) { |
| 209 selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelecto
r, styleSheet->defaultNamespace())); | 209 selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelecto
r, styleSheet->defaultNamespace())); |
| 210 } else { | 210 } else { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 callback(rule); | 349 callback(rule); |
| 350 } | 350 } |
| 351 } | 351 } |
| 352 | 352 |
| 353 return firstRuleValid; | 353 return firstRuleValid; |
| 354 } | 354 } |
| 355 | 355 |
| 356 StyleRuleBase* CSSParserImpl::consumeAtRule(CSSParserTokenRange& range, AllowedR
ulesType allowedRules) | 356 StyleRuleBase* CSSParserImpl::consumeAtRule(CSSParserTokenRange& range, AllowedR
ulesType allowedRules) |
| 357 { | 357 { |
| 358 ASSERT(range.peek().type() == AtKeywordToken); | 358 ASSERT(range.peek().type() == AtKeywordToken); |
| 359 const CSSParserString& name = range.consume().value(); | 359 const StringView name = range.consume().value(); |
| 360 const CSSParserToken* preludeStart = &range.peek(); | 360 const CSSParserToken* preludeStart = &range.peek(); |
| 361 while (!range.atEnd() && range.peek().type() != LeftBraceToken && range.peek
().type() != SemicolonToken) | 361 while (!range.atEnd() && range.peek().type() != LeftBraceToken && range.peek
().type() != SemicolonToken) |
| 362 range.consumeComponentValue(); | 362 range.consumeComponentValue(); |
| 363 | 363 |
| 364 CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek()
); | 364 CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek()
); |
| 365 CSSAtRuleID id = cssAtRuleID(name); | 365 CSSAtRuleID id = cssAtRuleID(name); |
| 366 if (id != CSSAtRuleInvalid && m_context.useCounter()) | 366 if (id != CSSAtRuleInvalid && m_context.useCounter()) |
| 367 countAtRule(m_context.useCounter(), id); | 367 countAtRule(m_context.useCounter(), id); |
| 368 | 368 |
| 369 if (range.atEnd() || range.peek().type() == SemicolonToken) { | 369 if (range.atEnd() || range.peek().type() == SemicolonToken) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 ASSERT_NOT_REACHED(); | 429 ASSERT_NOT_REACHED(); |
| 430 return nullptr; | 430 return nullptr; |
| 431 } | 431 } |
| 432 | 432 |
| 433 // This may still consume tokens if it fails | 433 // This may still consume tokens if it fails |
| 434 static AtomicString consumeStringOrURI(CSSParserTokenRange& range) | 434 static AtomicString consumeStringOrURI(CSSParserTokenRange& range) |
| 435 { | 435 { |
| 436 const CSSParserToken& token = range.peek(); | 436 const CSSParserToken& token = range.peek(); |
| 437 | 437 |
| 438 if (token.type() == StringToken || token.type() == UrlToken) | 438 if (token.type() == StringToken || token.type() == UrlToken) |
| 439 return range.consumeIncludingWhitespace().value(); | 439 return AtomicString(range.consumeIncludingWhitespace().value().toString(
)); |
| 440 | 440 |
| 441 if (token.type() != FunctionToken || !token.valueEqualsIgnoringASCIICase("ur
l")) | 441 if (token.type() != FunctionToken || !token.valueEqualsIgnoringASCIICase("ur
l")) |
| 442 return AtomicString(); | 442 return AtomicString(); |
| 443 | 443 |
| 444 CSSParserTokenRange contents = range.consumeBlock(); | 444 CSSParserTokenRange contents = range.consumeBlock(); |
| 445 const CSSParserToken& uri = contents.consumeIncludingWhitespace(); | 445 const CSSParserToken& uri = contents.consumeIncludingWhitespace(); |
| 446 ASSERT(uri.type() == StringToken); | 446 ASSERT(uri.type() == StringToken); |
| 447 if (!contents.atEnd()) | 447 if (!contents.atEnd()) |
| 448 return AtomicString(); | 448 return AtomicString(); |
| 449 return uri.value(); | 449 return AtomicString(uri.value().toString()); |
| 450 } | 450 } |
| 451 | 451 |
| 452 StyleRuleCharset* CSSParserImpl::consumeCharsetRule(CSSParserTokenRange prelude) | 452 StyleRuleCharset* CSSParserImpl::consumeCharsetRule(CSSParserTokenRange prelude) |
| 453 { | 453 { |
| 454 prelude.consumeWhitespace(); | 454 prelude.consumeWhitespace(); |
| 455 const CSSParserToken& string = prelude.consumeIncludingWhitespace(); | 455 const CSSParserToken& string = prelude.consumeIncludingWhitespace(); |
| 456 if (string.type() != StringToken || !prelude.atEnd()) | 456 if (string.type() != StringToken || !prelude.atEnd()) |
| 457 return nullptr; // Parse error, expected a single string | 457 return nullptr; // Parse error, expected a single string |
| 458 return StyleRuleCharset::create(); | 458 return StyleRuleCharset::create(); |
| 459 } | 459 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 474 } | 474 } |
| 475 | 475 |
| 476 return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(pre
lude)); | 476 return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(pre
lude)); |
| 477 } | 477 } |
| 478 | 478 |
| 479 StyleRuleNamespace* CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prel
ude) | 479 StyleRuleNamespace* CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prel
ude) |
| 480 { | 480 { |
| 481 prelude.consumeWhitespace(); | 481 prelude.consumeWhitespace(); |
| 482 AtomicString namespacePrefix; | 482 AtomicString namespacePrefix; |
| 483 if (prelude.peek().type() == IdentToken) | 483 if (prelude.peek().type() == IdentToken) |
| 484 namespacePrefix = prelude.consumeIncludingWhitespace().value(); | 484 namespacePrefix = AtomicString(prelude.consumeIncludingWhitespace().valu
e().toString()); |
| 485 | 485 |
| 486 AtomicString uri(consumeStringOrURI(prelude)); | 486 AtomicString uri(consumeStringOrURI(prelude)); |
| 487 prelude.consumeWhitespace(); | 487 prelude.consumeWhitespace(); |
| 488 if (uri.isNull() || !prelude.atEnd()) | 488 if (uri.isNull() || !prelude.atEnd()) |
| 489 return nullptr; // Parse error, expected string or URI | 489 return nullptr; // Parse error, expected string or URI |
| 490 | 490 |
| 491 return StyleRuleNamespace::create(namespacePrefix, uri); | 491 return StyleRuleNamespace::create(namespacePrefix, uri); |
| 492 } | 492 } |
| 493 | 493 |
| 494 StyleRuleMedia* CSSParserImpl::consumeMediaRule(CSSParserTokenRange prelude, CSS
ParserTokenRange block) | 494 StyleRuleMedia* CSSParserImpl::consumeMediaRule(CSSParserTokenRange prelude, CSS
ParserTokenRange block) |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 StyleRuleKeyframes* CSSParserImpl::consumeKeyframesRule(bool webkitPrefixed, CSS
ParserTokenRange prelude, CSSParserTokenRange block) | 582 StyleRuleKeyframes* CSSParserImpl::consumeKeyframesRule(bool webkitPrefixed, CSS
ParserTokenRange prelude, CSSParserTokenRange block) |
| 583 { | 583 { |
| 584 prelude.consumeWhitespace(); | 584 prelude.consumeWhitespace(); |
| 585 CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks | 585 CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks |
| 586 const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace(); | 586 const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace(); |
| 587 if (!prelude.atEnd()) | 587 if (!prelude.atEnd()) |
| 588 return nullptr; // Parse error; expected single non-whitespace token in
@keyframes header | 588 return nullptr; // Parse error; expected single non-whitespace token in
@keyframes header |
| 589 | 589 |
| 590 String name; | 590 String name; |
| 591 if (nameToken.type() == IdentToken) { | 591 if (nameToken.type() == IdentToken) { |
| 592 name = nameToken.value(); | 592 name = nameToken.value().toString(); |
| 593 } else if (nameToken.type() == StringToken && webkitPrefixed) { | 593 } else if (nameToken.type() == StringToken && webkitPrefixed) { |
| 594 if (m_context.useCounter()) | 594 if (m_context.useCounter()) |
| 595 m_context.useCounter()->count(UseCounter::QuotedKeyframesRule); | 595 m_context.useCounter()->count(UseCounter::QuotedKeyframesRule); |
| 596 name = nameToken.value(); | 596 name = nameToken.value().toString(); |
| 597 } else { | 597 } else { |
| 598 return nullptr; // Parse error; expected ident token in @keyframes heade
r | 598 return nullptr; // Parse error; expected ident token in @keyframes heade
r |
| 599 } | 599 } |
| 600 | 600 |
| 601 if (m_observerWrapper) { | 601 if (m_observerWrapper) { |
| 602 m_observerWrapper->observer().startRuleHeader(StyleRule::Keyframes, m_ob
serverWrapper->startOffset(rangeCopy)); | 602 m_observerWrapper->observer().startRuleHeader(StyleRule::Keyframes, m_ob
serverWrapper->startOffset(rangeCopy)); |
| 603 m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset
(prelude)); | 603 m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset
(prelude)); |
| 604 m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousT
okenStartOffset(block)); | 604 m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousT
okenStartOffset(block)); |
| 605 m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(b
lock)); | 605 m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(b
lock)); |
| 606 } | 606 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 634 void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude) | 634 void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude) |
| 635 { | 635 { |
| 636 ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled()); | 636 ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled()); |
| 637 | 637 |
| 638 prelude.consumeWhitespace(); | 638 prelude.consumeWhitespace(); |
| 639 const CSSParserToken& ident = prelude.consumeIncludingWhitespace(); | 639 const CSSParserToken& ident = prelude.consumeIncludingWhitespace(); |
| 640 if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident)) | 640 if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident)) |
| 641 return; // Parse error, expected a single custom property name | 641 return; // Parse error, expected a single custom property name |
| 642 m_parsedProperties.append(CSSProperty( | 642 m_parsedProperties.append(CSSProperty( |
| 643 CSSPropertyApplyAtRule, | 643 CSSPropertyApplyAtRule, |
| 644 CSSCustomIdentValue::create(ident.value()))); | 644 CSSCustomIdentValue::create(ident.value().toString()))); |
| 645 } | 645 } |
| 646 | 646 |
| 647 StyleRuleKeyframe* CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange p
relude, CSSParserTokenRange block) | 647 StyleRuleKeyframe* CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange p
relude, CSSParserTokenRange block) |
| 648 { | 648 { |
| 649 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude); | 649 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude); |
| 650 if (!keyList) | 650 if (!keyList) |
| 651 return nullptr; | 651 return nullptr; |
| 652 | 652 |
| 653 if (m_observerWrapper) { | 653 if (m_observerWrapper) { |
| 654 m_observerWrapper->observer().startRuleHeader(StyleRule::Keyframe, m_obs
erverWrapper->startOffset(prelude)); | 654 m_observerWrapper->observer().startRuleHeader(StyleRule::Keyframe, m_obs
erverWrapper->startOffset(prelude)); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 while (last->type() == WhitespaceToken) | 765 while (last->type() == WhitespaceToken) |
| 766 --last; | 766 --last; |
| 767 if (last->type() == DelimiterToken && last->delimiter() == '!') { | 767 if (last->type() == DelimiterToken && last->delimiter() == '!') { |
| 768 important = true; | 768 important = true; |
| 769 declarationValueEnd = last; | 769 declarationValueEnd = last; |
| 770 } | 770 } |
| 771 } | 771 } |
| 772 | 772 |
| 773 size_t propertiesCount = m_parsedProperties.size(); | 773 size_t propertiesCount = m_parsedProperties.size(); |
| 774 if (RuntimeEnabledFeatures::cssVariablesEnabled() && unresolvedProperty == C
SSPropertyInvalid && CSSVariableParser::isValidVariableName(token)) { | 774 if (RuntimeEnabledFeatures::cssVariablesEnabled() && unresolvedProperty == C
SSPropertyInvalid && CSSVariableParser::isValidVariableName(token)) { |
| 775 AtomicString variableName = token.value(); | 775 AtomicString variableName = AtomicString(token.value().toString()); |
| 776 consumeVariableValue(range.makeSubRange(&range.peek(), declarationValueE
nd), variableName, important); | 776 consumeVariableValue(range.makeSubRange(&range.peek(), declarationValueE
nd), variableName, important); |
| 777 } | 777 } |
| 778 | 778 |
| 779 if (important && (ruleType == StyleRule::FontFace || ruleType == StyleRule::
Keyframe)) | 779 if (important && (ruleType == StyleRule::FontFace || ruleType == StyleRule::
Keyframe)) |
| 780 return; | 780 return; |
| 781 | 781 |
| 782 if (unresolvedProperty != CSSPropertyInvalid) { | 782 if (unresolvedProperty != CSSPropertyInvalid) { |
| 783 if (m_styleSheet && m_styleSheet->singleOwnerDocument()) | 783 if (m_styleSheet && m_styleSheet->singleOwnerDocument()) |
| 784 Deprecation::warnOnDeprecatedProperties(m_styleSheet->singleOwnerDoc
ument()->frame(), unresolvedProperty); | 784 Deprecation::warnOnDeprecatedProperties(m_styleSheet->singleOwnerDoc
ument()->frame(), unresolvedProperty); |
| 785 consumeDeclarationValue(range.makeSubRange(&range.peek(), declarationVal
ueEnd), unresolvedProperty, important, ruleType); | 785 consumeDeclarationValue(range.makeSubRange(&range.peek(), declarationVal
ueEnd), unresolvedProperty, important, ruleType); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 818 else | 818 else |
| 819 return nullptr; // Parser error, invalid value in keyframe selector | 819 return nullptr; // Parser error, invalid value in keyframe selector |
| 820 if (range.atEnd()) | 820 if (range.atEnd()) |
| 821 return result; | 821 return result; |
| 822 if (range.consume().type() != CommaToken) | 822 if (range.consume().type() != CommaToken) |
| 823 return nullptr; // Parser error | 823 return nullptr; // Parser error |
| 824 } | 824 } |
| 825 } | 825 } |
| 826 | 826 |
| 827 } // namespace blink | 827 } // namespace blink |
| OLD | NEW |