| 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 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 callback(rule); | 351 callback(rule); |
| 352 } | 352 } |
| 353 } | 353 } |
| 354 | 354 |
| 355 return firstRuleValid; | 355 return firstRuleValid; |
| 356 } | 356 } |
| 357 | 357 |
| 358 StyleRuleBase* CSSParserImpl::consumeAtRule(CSSParserTokenRange& range, AllowedR
ulesType allowedRules) | 358 StyleRuleBase* CSSParserImpl::consumeAtRule(CSSParserTokenRange& range, AllowedR
ulesType allowedRules) |
| 359 { | 359 { |
| 360 ASSERT(range.peek().type() == AtKeywordToken); | 360 ASSERT(range.peek().type() == AtKeywordToken); |
| 361 const StringView name = range.consume().value(); | 361 const StringView name = range.consumeIncludingWhitespace().value(); |
| 362 const CSSParserToken* preludeStart = &range.peek(); | 362 const CSSParserToken* preludeStart = &range.peek(); |
| 363 while (!range.atEnd() && range.peek().type() != LeftBraceToken && range.peek
().type() != SemicolonToken) | 363 while (!range.atEnd() && range.peek().type() != LeftBraceToken && range.peek
().type() != SemicolonToken) |
| 364 range.consumeComponentValue(); | 364 range.consumeComponentValue(); |
| 365 | 365 |
| 366 CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek()
); | 366 CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek()
); |
| 367 CSSAtRuleID id = cssAtRuleID(name); | 367 CSSAtRuleID id = cssAtRuleID(name); |
| 368 if (id != CSSAtRuleInvalid && m_context.useCounter()) | 368 if (id != CSSAtRuleInvalid && m_context.useCounter()) |
| 369 countAtRule(m_context.useCounter(), id); | 369 countAtRule(m_context.useCounter(), id); |
| 370 | 370 |
| 371 if (range.atEnd() || range.peek().type() == SemicolonToken) { | 371 if (range.atEnd() || range.peek().type() == SemicolonToken) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 CSSParserTokenRange contents = range.consumeBlock(); | 446 CSSParserTokenRange contents = range.consumeBlock(); |
| 447 const CSSParserToken& uri = contents.consumeIncludingWhitespace(); | 447 const CSSParserToken& uri = contents.consumeIncludingWhitespace(); |
| 448 if (uri.type() == BadStringToken || !contents.atEnd()) | 448 if (uri.type() == BadStringToken || !contents.atEnd()) |
| 449 return AtomicString(); | 449 return AtomicString(); |
| 450 DCHECK_EQ(uri.type(), StringToken); | 450 DCHECK_EQ(uri.type(), StringToken); |
| 451 return uri.value().toAtomicString(); | 451 return uri.value().toAtomicString(); |
| 452 } | 452 } |
| 453 | 453 |
| 454 StyleRuleCharset* CSSParserImpl::consumeCharsetRule(CSSParserTokenRange prelude) | 454 StyleRuleCharset* CSSParserImpl::consumeCharsetRule(CSSParserTokenRange prelude) |
| 455 { | 455 { |
| 456 prelude.consumeWhitespace(); | |
| 457 const CSSParserToken& string = prelude.consumeIncludingWhitespace(); | 456 const CSSParserToken& string = prelude.consumeIncludingWhitespace(); |
| 458 if (string.type() != StringToken || !prelude.atEnd()) | 457 if (string.type() != StringToken || !prelude.atEnd()) |
| 459 return nullptr; // Parse error, expected a single string | 458 return nullptr; // Parse error, expected a single string |
| 460 return StyleRuleCharset::create(); | 459 return StyleRuleCharset::create(); |
| 461 } | 460 } |
| 462 | 461 |
| 463 StyleRuleImport* CSSParserImpl::consumeImportRule(CSSParserTokenRange prelude) | 462 StyleRuleImport* CSSParserImpl::consumeImportRule(CSSParserTokenRange prelude) |
| 464 { | 463 { |
| 465 prelude.consumeWhitespace(); | |
| 466 AtomicString uri(consumeStringOrURI(prelude)); | 464 AtomicString uri(consumeStringOrURI(prelude)); |
| 467 if (uri.isNull()) | 465 if (uri.isNull()) |
| 468 return nullptr; // Parse error, expected string or URI | 466 return nullptr; // Parse error, expected string or URI |
| 469 | 467 |
| 470 if (m_observerWrapper) { | 468 if (m_observerWrapper) { |
| 471 unsigned endOffset = m_observerWrapper->endOffset(prelude); | 469 unsigned endOffset = m_observerWrapper->endOffset(prelude); |
| 472 m_observerWrapper->observer().startRuleHeader(StyleRule::Import, m_obser
verWrapper->startOffset(prelude)); | 470 m_observerWrapper->observer().startRuleHeader(StyleRule::Import, m_obser
verWrapper->startOffset(prelude)); |
| 473 m_observerWrapper->observer().endRuleHeader(endOffset); | 471 m_observerWrapper->observer().endRuleHeader(endOffset); |
| 474 m_observerWrapper->observer().startRuleBody(endOffset); | 472 m_observerWrapper->observer().startRuleBody(endOffset); |
| 475 m_observerWrapper->observer().endRuleBody(endOffset); | 473 m_observerWrapper->observer().endRuleBody(endOffset); |
| 476 } | 474 } |
| 477 | 475 |
| 478 return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(pre
lude)); | 476 return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(pre
lude)); |
| 479 } | 477 } |
| 480 | 478 |
| 481 StyleRuleNamespace* CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prel
ude) | 479 StyleRuleNamespace* CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prel
ude) |
| 482 { | 480 { |
| 483 prelude.consumeWhitespace(); | |
| 484 AtomicString namespacePrefix; | 481 AtomicString namespacePrefix; |
| 485 if (prelude.peek().type() == IdentToken) | 482 if (prelude.peek().type() == IdentToken) |
| 486 namespacePrefix = prelude.consumeIncludingWhitespace().value().toAtomicS
tring(); | 483 namespacePrefix = prelude.consumeIncludingWhitespace().value().toAtomicS
tring(); |
| 487 | 484 |
| 488 AtomicString uri(consumeStringOrURI(prelude)); | 485 AtomicString uri(consumeStringOrURI(prelude)); |
| 489 prelude.consumeWhitespace(); | |
| 490 if (uri.isNull() || !prelude.atEnd()) | 486 if (uri.isNull() || !prelude.atEnd()) |
| 491 return nullptr; // Parse error, expected string or URI | 487 return nullptr; // Parse error, expected string or URI |
| 492 | 488 |
| 493 return StyleRuleNamespace::create(namespacePrefix, uri); | 489 return StyleRuleNamespace::create(namespacePrefix, uri); |
| 494 } | 490 } |
| 495 | 491 |
| 496 StyleRuleMedia* CSSParserImpl::consumeMediaRule(CSSParserTokenRange prelude, CSS
ParserTokenRange block) | 492 StyleRuleMedia* CSSParserImpl::consumeMediaRule(CSSParserTokenRange prelude, CSS
ParserTokenRange block) |
| 497 { | 493 { |
| 498 HeapVector<Member<StyleRuleBase>> rules; | 494 HeapVector<Member<StyleRuleBase>> rules; |
| 499 | 495 |
| 500 if (m_observerWrapper) { | 496 if (m_observerWrapper) { |
| 501 CSSParserTokenRange preludeWithoutWhitespace = prelude; | 497 m_observerWrapper->observer().startRuleHeader(StyleRule::Media, m_observ
erWrapper->startOffset(prelude)); |
| 502 preludeWithoutWhitespace.consumeWhitespace(); | 498 m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset
(prelude)); |
| 503 m_observerWrapper->observer().startRuleHeader(StyleRule::Media, m_observ
erWrapper->startOffset(preludeWithoutWhitespace)); | |
| 504 m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset
(preludeWithoutWhitespace)); | |
| 505 m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousT
okenStartOffset(block)); | 499 m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousT
okenStartOffset(block)); |
| 506 } | 500 } |
| 507 | 501 |
| 508 if (m_styleSheet) | 502 if (m_styleSheet) |
| 509 m_styleSheet->setHasMediaQueries(); | 503 m_styleSheet->setHasMediaQueries(); |
| 510 | 504 |
| 511 consumeRuleList(block, RegularRuleList, [&rules](StyleRuleBase* rule) { | 505 consumeRuleList(block, RegularRuleList, [&rules](StyleRuleBase* rule) { |
| 512 rules.append(rule); | 506 rules.append(rule); |
| 513 }); | 507 }); |
| 514 | 508 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 540 | 534 |
| 541 return StyleRuleSupports::create(prelude.serialize().stripWhiteSpace(), supp
orted, rules); | 535 return StyleRuleSupports::create(prelude.serialize().stripWhiteSpace(), supp
orted, rules); |
| 542 } | 536 } |
| 543 | 537 |
| 544 StyleRuleViewport* CSSParserImpl::consumeViewportRule(CSSParserTokenRange prelud
e, CSSParserTokenRange block) | 538 StyleRuleViewport* CSSParserImpl::consumeViewportRule(CSSParserTokenRange prelud
e, CSSParserTokenRange block) |
| 545 { | 539 { |
| 546 // Allow @viewport rules from UA stylesheets even if the feature is disabled
. | 540 // Allow @viewport rules from UA stylesheets even if the feature is disabled
. |
| 547 if (!RuntimeEnabledFeatures::cssViewportEnabled() && !isUASheetBehavior(m_co
ntext.mode())) | 541 if (!RuntimeEnabledFeatures::cssViewportEnabled() && !isUASheetBehavior(m_co
ntext.mode())) |
| 548 return nullptr; | 542 return nullptr; |
| 549 | 543 |
| 550 prelude.consumeWhitespace(); | |
| 551 if (!prelude.atEnd()) | 544 if (!prelude.atEnd()) |
| 552 return nullptr; // Parser error; @viewport prelude should be empty | 545 return nullptr; // Parser error; @viewport prelude should be empty |
| 553 | 546 |
| 554 if (m_observerWrapper) { | 547 if (m_observerWrapper) { |
| 555 unsigned endOffset = m_observerWrapper->endOffset(prelude); | 548 unsigned endOffset = m_observerWrapper->endOffset(prelude); |
| 556 m_observerWrapper->observer().startRuleHeader(StyleRule::Viewport, m_obs
erverWrapper->startOffset(prelude)); | 549 m_observerWrapper->observer().startRuleHeader(StyleRule::Viewport, m_obs
erverWrapper->startOffset(prelude)); |
| 557 m_observerWrapper->observer().endRuleHeader(endOffset); | 550 m_observerWrapper->observer().endRuleHeader(endOffset); |
| 558 m_observerWrapper->observer().startRuleBody(endOffset); | 551 m_observerWrapper->observer().startRuleBody(endOffset); |
| 559 m_observerWrapper->observer().endRuleBody(endOffset); | 552 m_observerWrapper->observer().endRuleBody(endOffset); |
| 560 } | 553 } |
| 561 | 554 |
| 562 consumeDeclarationList(block, StyleRule::Viewport); | 555 consumeDeclarationList(block, StyleRule::Viewport); |
| 563 return StyleRuleViewport::create(createStylePropertySet(m_parsedProperties,
CSSViewportRuleMode)); | 556 return StyleRuleViewport::create(createStylePropertySet(m_parsedProperties,
CSSViewportRuleMode)); |
| 564 } | 557 } |
| 565 | 558 |
| 566 StyleRuleFontFace* CSSParserImpl::consumeFontFaceRule(CSSParserTokenRange prelud
e, CSSParserTokenRange block) | 559 StyleRuleFontFace* CSSParserImpl::consumeFontFaceRule(CSSParserTokenRange prelud
e, CSSParserTokenRange block) |
| 567 { | 560 { |
| 568 prelude.consumeWhitespace(); | |
| 569 if (!prelude.atEnd()) | 561 if (!prelude.atEnd()) |
| 570 return nullptr; // Parse error; @font-face prelude should be empty | 562 return nullptr; // Parse error; @font-face prelude should be empty |
| 571 | 563 |
| 572 if (m_observerWrapper) { | 564 if (m_observerWrapper) { |
| 573 unsigned endOffset = m_observerWrapper->endOffset(prelude); | 565 unsigned endOffset = m_observerWrapper->endOffset(prelude); |
| 574 m_observerWrapper->observer().startRuleHeader(StyleRule::FontFace, m_obs
erverWrapper->startOffset(prelude)); | 566 m_observerWrapper->observer().startRuleHeader(StyleRule::FontFace, m_obs
erverWrapper->startOffset(prelude)); |
| 575 m_observerWrapper->observer().endRuleHeader(endOffset); | 567 m_observerWrapper->observer().endRuleHeader(endOffset); |
| 576 m_observerWrapper->observer().startRuleBody(endOffset); | 568 m_observerWrapper->observer().startRuleBody(endOffset); |
| 577 m_observerWrapper->observer().endRuleBody(endOffset); | 569 m_observerWrapper->observer().endRuleBody(endOffset); |
| 578 } | 570 } |
| 579 | 571 |
| 580 if (m_styleSheet) | 572 if (m_styleSheet) |
| 581 m_styleSheet->setHasFontFaceRule(); | 573 m_styleSheet->setHasFontFaceRule(); |
| 582 | 574 |
| 583 consumeDeclarationList(block, StyleRule::FontFace); | 575 consumeDeclarationList(block, StyleRule::FontFace); |
| 584 return StyleRuleFontFace::create(createStylePropertySet(m_parsedProperties,
m_context.mode())); | 576 return StyleRuleFontFace::create(createStylePropertySet(m_parsedProperties,
m_context.mode())); |
| 585 } | 577 } |
| 586 | 578 |
| 587 StyleRuleKeyframes* CSSParserImpl::consumeKeyframesRule(bool webkitPrefixed, CSS
ParserTokenRange prelude, CSSParserTokenRange block) | 579 StyleRuleKeyframes* CSSParserImpl::consumeKeyframesRule(bool webkitPrefixed, CSS
ParserTokenRange prelude, CSSParserTokenRange block) |
| 588 { | 580 { |
| 589 prelude.consumeWhitespace(); | |
| 590 CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks | 581 CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks |
| 591 const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace(); | 582 const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace(); |
| 592 if (!prelude.atEnd()) | 583 if (!prelude.atEnd()) |
| 593 return nullptr; // Parse error; expected single non-whitespace token in
@keyframes header | 584 return nullptr; // Parse error; expected single non-whitespace token in
@keyframes header |
| 594 | 585 |
| 595 String name; | 586 String name; |
| 596 if (nameToken.type() == IdentToken) { | 587 if (nameToken.type() == IdentToken) { |
| 597 name = nameToken.value().toString(); | 588 name = nameToken.value().toString(); |
| 598 } else if (nameToken.type() == StringToken && webkitPrefixed) { | 589 } else if (nameToken.type() == StringToken && webkitPrefixed) { |
| 599 if (m_context.useCounter()) | 590 if (m_context.useCounter()) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 | 624 |
| 634 consumeDeclarationList(block, StyleRule::Style); | 625 consumeDeclarationList(block, StyleRule::Style); |
| 635 | 626 |
| 636 return StyleRulePage::create(std::move(selectorList), createStylePropertySet
(m_parsedProperties, m_context.mode())); | 627 return StyleRulePage::create(std::move(selectorList), createStylePropertySet
(m_parsedProperties, m_context.mode())); |
| 637 } | 628 } |
| 638 | 629 |
| 639 void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude) | 630 void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude) |
| 640 { | 631 { |
| 641 ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled()); | 632 ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled()); |
| 642 | 633 |
| 643 prelude.consumeWhitespace(); | |
| 644 const CSSParserToken& ident = prelude.consumeIncludingWhitespace(); | 634 const CSSParserToken& ident = prelude.consumeIncludingWhitespace(); |
| 645 if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident)) | 635 if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident)) |
| 646 return; // Parse error, expected a single custom property name | 636 return; // Parse error, expected a single custom property name |
| 647 m_parsedProperties.append(CSSProperty( | 637 m_parsedProperties.append(CSSProperty( |
| 648 CSSPropertyApplyAtRule, | 638 CSSPropertyApplyAtRule, |
| 649 *CSSCustomIdentValue::create(ident.value().toString()))); | 639 *CSSCustomIdentValue::create(ident.value().toString()))); |
| 650 } | 640 } |
| 651 | 641 |
| 652 StyleRuleKeyframe* CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange p
relude, CSSParserTokenRange block) | 642 StyleRuleKeyframe* CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange p
relude, CSSParserTokenRange block) |
| 653 { | 643 { |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 else | 813 else |
| 824 return nullptr; // Parser error, invalid value in keyframe selector | 814 return nullptr; // Parser error, invalid value in keyframe selector |
| 825 if (range.atEnd()) | 815 if (range.atEnd()) |
| 826 return result; | 816 return result; |
| 827 if (range.consume().type() != CommaToken) | 817 if (range.consume().type() != CommaToken) |
| 828 return nullptr; // Parser error | 818 return nullptr; // Parser error |
| 829 } | 819 } |
| 830 } | 820 } |
| 831 | 821 |
| 832 } // namespace blink | 822 } // namespace blink |
| OLD | NEW |