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 |