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

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

Issue 330043003: Add support for case-insensitive attribute value selectors (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Make union w/ m_attributeFlags and nth-state; Return enum type. Created 6 years, 6 months 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 | Annotate | Revision Log
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 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 649
650 if (cs->pseudoType() == PseudoContent) { 650 if (cs->pseudoType() == PseudoContent) {
651 if (cs->relation() == CSSSelector::SubSelector && cs->tagHistory ()) 651 if (cs->relation() == CSSSelector::SubSelector && cs->tagHistory ())
652 return cs->tagHistory()->selectorText() + str.toString() + r ightSide; 652 return cs->tagHistory()->selectorText() + str.toString() + r ightSide;
653 } 653 }
654 } else if (cs->isAttributeSelector()) { 654 } else if (cs->isAttributeSelector()) {
655 str.append('['); 655 str.append('[');
656 const AtomicString& prefix = cs->attribute().prefix(); 656 const AtomicString& prefix = cs->attribute().prefix();
657 if (!prefix.isNull()) { 657 if (!prefix.isNull()) {
658 str.append(prefix); 658 str.append(prefix);
659 str.append("|"); 659 str.append('|');
660 } 660 }
661 str.append(cs->attribute().localName()); 661 str.append(cs->attribute().localName());
662 switch (cs->m_match) { 662 switch (cs->m_match) {
663 case CSSSelector::Exact: 663 case CSSSelector::Exact:
664 str.append('='); 664 str.append('=');
665 break; 665 break;
666 case CSSSelector::Set: 666 case CSSSelector::Set:
667 // set has no operator or value, just the attrName 667 // set has no operator or value, just the attrName
668 str.append(']'); 668 str.append(']');
669 break; 669 break;
(...skipping 10 matching lines...) Expand all
680 str.appendLiteral("$="); 680 str.appendLiteral("$=");
681 break; 681 break;
682 case CSSSelector::Contain: 682 case CSSSelector::Contain:
683 str.appendLiteral("*="); 683 str.appendLiteral("*=");
684 break; 684 break;
685 default: 685 default:
686 break; 686 break;
687 } 687 }
688 if (cs->m_match != CSSSelector::Set) { 688 if (cs->m_match != CSSSelector::Set) {
689 serializeString(cs->value(), str); 689 serializeString(cs->value(), str);
690 if (cs->attributeFlags() & CaseInsensitive)
691 str.appendLiteral(" i");
690 str.append(']'); 692 str.append(']');
691 } 693 }
692 } 694 }
693 if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory()) 695 if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory())
694 break; 696 break;
695 cs = cs->tagHistory(); 697 cs = cs->tagHistory();
696 } 698 }
697 699
698 if (const CSSSelector* tagHistory = cs->tagHistory()) { 700 if (const CSSSelector* tagHistory = cs->tagHistory()) {
699 switch (cs->relation()) { 701 switch (cs->relation()) {
700 case CSSSelector::Descendant: 702 case CSSSelector::Descendant:
701 return tagHistory->selectorText(" " + str.toString() + rightSide); 703 return tagHistory->selectorText(" " + str.toString() + rightSide);
702 case CSSSelector::Child: 704 case CSSSelector::Child:
703 return tagHistory->selectorText(" > " + str.toString() + rightSide); 705 return tagHistory->selectorText(" > " + str.toString() + rightSide);
704 case CSSSelector::ShadowDeep: 706 case CSSSelector::ShadowDeep:
705 return tagHistory->selectorText(" /deep/ " + str.toString() + rightS ide); 707 return tagHistory->selectorText(" /deep/ " + str.toString() + rightS ide);
706 case CSSSelector::DirectAdjacent: 708 case CSSSelector::DirectAdjacent:
707 return tagHistory->selectorText(" + " + str.toString() + rightSide); 709 return tagHistory->selectorText(" + " + str.toString() + rightSide);
708 case CSSSelector::IndirectAdjacent: 710 case CSSSelector::IndirectAdjacent:
709 return tagHistory->selectorText(" ~ " + str.toString() + rightSide); 711 return tagHistory->selectorText(" ~ " + str.toString() + rightSide);
710 case CSSSelector::SubSelector: 712 case CSSSelector::SubSelector:
711 ASSERT_NOT_REACHED(); 713 ASSERT_NOT_REACHED();
712 case CSSSelector::ShadowPseudo: 714 case CSSSelector::ShadowPseudo:
713 return tagHistory->selectorText(str.toString() + rightSide); 715 return tagHistory->selectorText(str.toString() + rightSide);
714 } 716 }
715 } 717 }
716 return str.toString() + rightSide; 718 return str.toString() + rightSide;
717 } 719 }
718 720
719 void CSSSelector::setAttribute(const QualifiedName& value) 721 void CSSSelector::setAttribute(const QualifiedName& value, unsigned flags)
720 { 722 {
721 createRareData(); 723 createRareData();
722 m_data.m_rareData->m_attribute = value; 724 m_data.m_rareData->m_attribute = value;
725 m_data.m_rareData->m_bits.m_attributeFlags = flags;
723 } 726 }
724 727
725 void CSSSelector::setArgument(const AtomicString& value) 728 void CSSSelector::setArgument(const AtomicString& value)
726 { 729 {
727 createRareData(); 730 createRareData();
728 m_data.m_rareData->m_argument = value; 731 m_data.m_rareData->m_argument = value;
729 } 732 }
730 733
731 void CSSSelector::setSelectorList(PassOwnPtr<CSSSelectorList> selectorList) 734 void CSSSelector::setSelectorList(PassOwnPtr<CSSSelectorList> selectorList)
732 { 735 {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 } 818 }
816 819
817 bool CSSSelector::matchNth(int count) const 820 bool CSSSelector::matchNth(int count) const
818 { 821 {
819 ASSERT(m_hasRareData); 822 ASSERT(m_hasRareData);
820 return m_data.m_rareData->matchNth(count); 823 return m_data.m_rareData->matchNth(count);
821 } 824 }
822 825
823 CSSSelector::RareData::RareData(const AtomicString& value) 826 CSSSelector::RareData::RareData(const AtomicString& value)
824 : m_value(value) 827 : m_value(value)
825 , m_a(0)
826 , m_b(0)
827 , m_attribute(anyQName()) 828 , m_attribute(anyQName())
828 , m_argument(nullAtom) 829 , m_argument(nullAtom)
829 { 830 {
830 } 831 }
831 832
832 CSSSelector::RareData::~RareData() 833 CSSSelector::RareData::~RareData()
833 { 834 {
834 } 835 }
835 836
836 // a helper function for parsing nth-arguments 837 // a helper function for parsing nth-arguments
837 bool CSSSelector::RareData::parseNth() 838 bool CSSSelector::RareData::parseNth()
838 { 839 {
839 String argument = m_argument.lower(); 840 String argument = m_argument.lower();
840 841
841 if (argument.isEmpty()) 842 if (argument.isEmpty())
842 return false; 843 return false;
843 844
844 m_a = 0; 845 int nthA = 0;
845 m_b = 0; 846 int nthB = 0;
846 if (argument == "odd") { 847 if (argument == "odd") {
847 m_a = 2; 848 nthA = 2;
848 m_b = 1; 849 nthB = 1;
849 } else if (argument == "even") { 850 } else if (argument == "even") {
850 m_a = 2; 851 nthA = 2;
851 m_b = 0; 852 nthB = 0;
852 } else { 853 } else {
853 size_t n = argument.find('n'); 854 size_t n = argument.find('n');
854 if (n != kNotFound) { 855 if (n != kNotFound) {
855 if (argument[0] == '-') { 856 if (argument[0] == '-') {
856 if (n == 1) 857 if (n == 1)
857 m_a = -1; // -n == -1n 858 nthA = -1; // -n == -1n
858 else 859 else
859 m_a = argument.substring(0, n).toInt(); 860 nthA = argument.substring(0, n).toInt();
860 } else if (!n) 861 } else if (!n) {
861 m_a = 1; // n == 1n 862 nthA = 1; // n == 1n
862 else 863 } else {
863 m_a = argument.substring(0, n).toInt(); 864 nthA = argument.substring(0, n).toInt();
865 }
864 866
865 size_t p = argument.find('+', n); 867 size_t p = argument.find('+', n);
866 if (p != kNotFound) 868 if (p != kNotFound) {
867 m_b = argument.substring(p + 1, argument.length() - p - 1).toInt (); 869 nthB = argument.substring(p + 1, argument.length() - p - 1).toIn t();
868 else { 870 } else {
869 p = argument.find('-', n); 871 p = argument.find('-', n);
870 if (p != kNotFound) 872 if (p != kNotFound)
871 m_b = -argument.substring(p + 1, argument.length() - p - 1). toInt(); 873 nthB = -argument.substring(p + 1, argument.length() - p - 1) .toInt();
872 } 874 }
873 } else 875 } else {
874 m_b = argument.toInt(); 876 nthB = argument.toInt();
877 }
875 } 878 }
879 m_bits.m_nth.m_a = nthA;
880 m_bits.m_nth.m_b = nthB;
876 return true; 881 return true;
877 } 882 }
878 883
879 // a helper function for checking nth-arguments 884 // a helper function for checking nth-arguments
880 bool CSSSelector::RareData::matchNth(int count) 885 bool CSSSelector::RareData::matchNth(int count)
881 { 886 {
882 if (!m_a) 887 if (!m_bits.m_nth.m_a)
883 return count == m_b; 888 return count == m_bits.m_nth.m_b;
884 else if (m_a > 0) { 889 if (m_bits.m_nth.m_a > 0) {
885 if (count < m_b) 890 if (count < m_bits.m_nth.m_b)
886 return false; 891 return false;
887 return (count - m_b) % m_a == 0; 892 return (count - m_bits.m_nth.m_b) % m_bits.m_nth.m_a == 0;
888 } else {
889 if (count > m_b)
890 return false;
891 return (m_b - count) % (-m_a) == 0;
892 } 893 }
894 if (count > m_bits.m_nth.m_b)
895 return false;
896 return (m_bits.m_nth.m_b - count) % (-m_bits.m_nth.m_a) == 0;
893 } 897 }
894 898
895 } // namespace WebCore 899 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698