Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Side by Side Diff: Source/core/css/CSSSelector.cpp

Issue 689933002: Corrected serialization of ::cue() functions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Additional test Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « LayoutTests/fast/css/cue-serialize-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * 1999 Waldo Bastian (bastian@kde.org) 3 * 1999 Waldo Bastian (bastian@kde.org)
4 * 2001 Andreas Schlapbach (schlpbch@iam.unibe.ch) 4 * 2001 Andreas Schlapbach (schlpbch@iam.unibe.ch)
5 * 2001-2003 Dirk Mueller (mueller@kde.org) 5 * 2001-2003 Dirk Mueller (mueller@kde.org)
6 * Copyright (C) 2002, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2002, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2008 David Smith (catfish.man@gmail.com) 7 * Copyright (C) 2008 David Smith (catfish.man@gmail.com)
8 * Copyright (C) 2010 Google Inc. All rights reserved. 8 * Copyright (C) 2010 Google Inc. All rights reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 void CSSSelector::show() const 429 void CSSSelector::show() const
430 { 430 {
431 printf("\n******* CSSSelector::show(\"%s\") *******\n", selectorText().ascii ().data()); 431 printf("\n******* CSSSelector::show(\"%s\") *******\n", selectorText().ascii ().data());
432 show(2); 432 show(2);
433 printf("******* end *******\n"); 433 printf("******* end *******\n");
434 } 434 }
435 #endif 435 #endif
436 436
437 CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name, b ool hasArguments) 437 CSSSelector::PseudoType CSSSelector::parsePseudoType(const AtomicString& name, b ool hasArguments)
438 { 438 {
439 CSSSelector::PseudoType pseudoType = nameToPseudoType(name, hasArguments); 439 PseudoType pseudoType = nameToPseudoType(name, hasArguments);
440 if (pseudoType != PseudoUnknown) 440 if (pseudoType != PseudoUnknown)
441 return pseudoType; 441 return pseudoType;
442 442
443 if (name.startsWith("-webkit-")) 443 if (name.startsWith("-webkit-"))
444 return PseudoWebKitCustomElement; 444 return PseudoWebKitCustomElement;
445 445
446 return PseudoUnknown; 446 return PseudoUnknown;
447 } 447 }
448 448
449 void CSSSelector::extractPseudoType() const 449 void CSSSelector::extractPseudoType() const
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 if (sel1 || sel2) 585 if (sel1 || sel2)
586 return false; 586 return false;
587 587
588 return true; 588 return true;
589 } 589 }
590 590
591 String CSSSelector::selectorText(const String& rightSide) const 591 String CSSSelector::selectorText(const String& rightSide) const
592 { 592 {
593 StringBuilder str; 593 StringBuilder str;
594 594
595 if (m_match == CSSSelector::Tag && !m_tagIsForNamespaceRule) { 595 if (m_match == Tag && !m_tagIsForNamespaceRule) {
596 if (tagQName().prefix().isNull()) 596 if (tagQName().prefix().isNull())
597 str.append(tagQName().localName()); 597 str.append(tagQName().localName());
598 else { 598 else {
599 str.append(tagQName().prefix().string()); 599 str.append(tagQName().prefix().string());
600 str.append('|'); 600 str.append('|');
601 str.append(tagQName().localName()); 601 str.append(tagQName().localName());
602 } 602 }
603 } 603 }
604 604
605 const CSSSelector* cs = this; 605 const CSSSelector* cs = this;
606 while (true) { 606 while (true) {
607 if (cs->m_match == CSSSelector::Id) { 607 if (cs->m_match == Id) {
608 str.append('#'); 608 str.append('#');
609 serializeIdentifier(cs->value(), str); 609 serializeIdentifier(cs->value(), str);
610 } else if (cs->m_match == CSSSelector::Class) { 610 } else if (cs->m_match == Class) {
611 str.append('.'); 611 str.append('.');
612 serializeIdentifier(cs->value(), str); 612 serializeIdentifier(cs->value(), str);
613 } else if (cs->m_match == CSSSelector::PseudoClass || cs->m_match == CSS Selector::PagePseudoClass) { 613 } else if (cs->m_match == PseudoClass || cs->m_match == PagePseudoClass) {
614 str.append(':'); 614 str.append(':');
615 str.append(cs->value()); 615 str.append(cs->value());
616 616
617 switch (cs->pseudoType()) { 617 switch (cs->pseudoType()) {
618 case PseudoNot: 618 case PseudoNot:
619 ASSERT(cs->selectorList()); 619 ASSERT(cs->selectorList());
620 str.append('('); 620 str.append('(');
621 str.append(cs->selectorList()->first()->selectorText()); 621 str.append(cs->selectorList()->first()->selectorText());
622 str.append(')'); 622 str.append(')');
623 break; 623 break;
(...skipping 27 matching lines...) Expand all
651 str.append(','); 651 str.append(',');
652 str.append(subSelector->selectorText()); 652 str.append(subSelector->selectorText());
653 } 653 }
654 str.append(')'); 654 str.append(')');
655 } 655 }
656 break; 656 break;
657 } 657 }
658 default: 658 default:
659 break; 659 break;
660 } 660 }
661 } else if (cs->m_match == CSSSelector::PseudoElement) { 661 } else if (cs->m_match == PseudoElement) {
662 str.appendLiteral("::"); 662 str.appendLiteral("::");
663 str.append(cs->value()); 663 str.append(cs->value());
664 664
665 if (cs->pseudoType() == PseudoContent) { 665 if (cs->pseudoType() == PseudoContent) {
666 if (cs->relation() == CSSSelector::SubSelector && cs->tagHistory ()) 666 if (cs->relation() == SubSelector && cs->tagHistory())
667 return cs->tagHistory()->selectorText() + str.toString() + r ightSide; 667 return cs->tagHistory()->selectorText() + str.toString() + r ightSide;
668 } else if (cs->pseudoType() == PseudoCue) {
669 if (cs->selectorList()) {
670 str.append('(');
671 const CSSSelector* firstSubSelector = cs->selectorList()->fi rst();
672 for (const CSSSelector* subSelector = firstSubSelector; subS elector; subSelector = CSSSelectorList::next(*subSelector)) {
673 if (subSelector != firstSubSelector)
674 str.append(',');
675 str.append(subSelector->selectorText());
676 }
677 str.append(')');
678 }
668 } 679 }
669 } else if (cs->isAttributeSelector()) { 680 } else if (cs->isAttributeSelector()) {
670 str.append('['); 681 str.append('[');
671 const AtomicString& prefix = cs->attribute().prefix(); 682 const AtomicString& prefix = cs->attribute().prefix();
672 if (!prefix.isNull()) { 683 if (!prefix.isNull()) {
673 str.append(prefix); 684 str.append(prefix);
674 str.append('|'); 685 str.append('|');
675 } 686 }
676 str.append(cs->attribute().localName()); 687 str.append(cs->attribute().localName());
677 switch (cs->m_match) { 688 switch (cs->m_match) {
678 case CSSSelector::AttributeExact: 689 case AttributeExact:
679 str.append('='); 690 str.append('=');
680 break; 691 break;
681 case CSSSelector::AttributeSet: 692 case AttributeSet:
682 // set has no operator or value, just the attrName 693 // set has no operator or value, just the attrName
683 str.append(']'); 694 str.append(']');
684 break; 695 break;
685 case CSSSelector::AttributeList: 696 case AttributeList:
686 str.appendLiteral("~="); 697 str.appendLiteral("~=");
687 break; 698 break;
688 case CSSSelector::AttributeHyphen: 699 case AttributeHyphen:
689 str.appendLiteral("|="); 700 str.appendLiteral("|=");
690 break; 701 break;
691 case CSSSelector::AttributeBegin: 702 case AttributeBegin:
692 str.appendLiteral("^="); 703 str.appendLiteral("^=");
693 break; 704 break;
694 case CSSSelector::AttributeEnd: 705 case AttributeEnd:
695 str.appendLiteral("$="); 706 str.appendLiteral("$=");
696 break; 707 break;
697 case CSSSelector::AttributeContain: 708 case AttributeContain:
698 str.appendLiteral("*="); 709 str.appendLiteral("*=");
699 break; 710 break;
700 default: 711 default:
701 break; 712 break;
702 } 713 }
703 if (cs->m_match != CSSSelector::AttributeSet) { 714 if (cs->m_match != AttributeSet) {
704 serializeString(cs->value(), str); 715 serializeString(cs->value(), str);
705 if (cs->attributeMatchType() == CaseInsensitive) 716 if (cs->attributeMatchType() == CaseInsensitive)
706 str.appendLiteral(" i"); 717 str.appendLiteral(" i");
707 str.append(']'); 718 str.append(']');
708 } 719 }
709 } 720 }
710 if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory()) 721 if (cs->relation() != SubSelector || !cs->tagHistory())
711 break; 722 break;
712 cs = cs->tagHistory(); 723 cs = cs->tagHistory();
713 } 724 }
714 725
715 if (const CSSSelector* tagHistory = cs->tagHistory()) { 726 if (const CSSSelector* tagHistory = cs->tagHistory()) {
716 switch (cs->relation()) { 727 switch (cs->relation()) {
717 case CSSSelector::Descendant: 728 case Descendant:
718 return tagHistory->selectorText(" " + str.toString() + rightSide); 729 return tagHistory->selectorText(" " + str.toString() + rightSide);
719 case CSSSelector::Child: 730 case Child:
720 return tagHistory->selectorText(" > " + str.toString() + rightSide); 731 return tagHistory->selectorText(" > " + str.toString() + rightSide);
721 case CSSSelector::ShadowDeep: 732 case ShadowDeep:
722 return tagHistory->selectorText(" /deep/ " + str.toString() + rightS ide); 733 return tagHistory->selectorText(" /deep/ " + str.toString() + rightS ide);
723 case CSSSelector::DirectAdjacent: 734 case DirectAdjacent:
724 return tagHistory->selectorText(" + " + str.toString() + rightSide); 735 return tagHistory->selectorText(" + " + str.toString() + rightSide);
725 case CSSSelector::IndirectAdjacent: 736 case IndirectAdjacent:
726 return tagHistory->selectorText(" ~ " + str.toString() + rightSide); 737 return tagHistory->selectorText(" ~ " + str.toString() + rightSide);
727 case CSSSelector::SubSelector: 738 case SubSelector:
728 ASSERT_NOT_REACHED(); 739 ASSERT_NOT_REACHED();
729 case CSSSelector::ShadowPseudo: 740 case ShadowPseudo:
730 return tagHistory->selectorText(str.toString() + rightSide); 741 return tagHistory->selectorText(str.toString() + rightSide);
731 } 742 }
732 } 743 }
733 return str.toString() + rightSide; 744 return str.toString() + rightSide;
734 } 745 }
735 746
736 void CSSSelector::setAttribute(const QualifiedName& value, AttributeMatchType ma tchType) 747 void CSSSelector::setAttribute(const QualifiedName& value, AttributeMatchType ma tchType)
737 { 748 {
738 createRareData(); 749 createRareData();
739 m_data.m_rareData->m_attribute = value; 750 m_data.m_rareData->m_attribute = value;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 816
806 bool CSSSelector::isCompound() const 817 bool CSSSelector::isCompound() const
807 { 818 {
808 if (!validateSubSelector(this)) 819 if (!validateSubSelector(this))
809 return false; 820 return false;
810 821
811 const CSSSelector* prevSubSelector = this; 822 const CSSSelector* prevSubSelector = this;
812 const CSSSelector* subSelector = tagHistory(); 823 const CSSSelector* subSelector = tagHistory();
813 824
814 while (subSelector) { 825 while (subSelector) {
815 if (prevSubSelector->relation() != CSSSelector::SubSelector) 826 if (prevSubSelector->relation() != SubSelector)
816 return false; 827 return false;
817 if (!validateSubSelector(subSelector)) 828 if (!validateSubSelector(subSelector))
818 return false; 829 return false;
819 830
820 prevSubSelector = subSelector; 831 prevSubSelector = subSelector;
821 subSelector = subSelector->tagHistory(); 832 subSelector = subSelector->tagHistory();
822 } 833 }
823 834
824 return true; 835 return true;
825 } 836 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 if (count < nthBValue()) 919 if (count < nthBValue())
909 return false; 920 return false;
910 return (count - nthBValue()) % nthAValue() == 0; 921 return (count - nthBValue()) % nthAValue() == 0;
911 } 922 }
912 if (count > nthBValue()) 923 if (count > nthBValue())
913 return false; 924 return false;
914 return (nthBValue() - count) % (-nthAValue()) == 0; 925 return (nthBValue() - count) % (-nthAValue()) == 0;
915 } 926 }
916 927
917 } // namespace blink 928 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/fast/css/cue-serialize-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698