OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |