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 |