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 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
652 | 652 |
653 if (cs->pseudoType() == PseudoContent) { | 653 if (cs->pseudoType() == PseudoContent) { |
654 if (cs->relation() == CSSSelector::SubSelector && cs->tagHistory ()) | 654 if (cs->relation() == CSSSelector::SubSelector && cs->tagHistory ()) |
655 return cs->tagHistory()->selectorText() + str.toString() + r ightSide; | 655 return cs->tagHistory()->selectorText() + str.toString() + r ightSide; |
656 } | 656 } |
657 } else if (cs->isAttributeSelector()) { | 657 } else if (cs->isAttributeSelector()) { |
658 str.append('['); | 658 str.append('['); |
659 const AtomicString& prefix = cs->attribute().prefix(); | 659 const AtomicString& prefix = cs->attribute().prefix(); |
660 if (!prefix.isNull()) { | 660 if (!prefix.isNull()) { |
661 str.append(prefix); | 661 str.append(prefix); |
662 str.append("|"); | 662 str.append('|'); |
663 } | 663 } |
664 str.append(cs->attribute().localName()); | 664 str.append(cs->attribute().localName()); |
665 switch (cs->m_match) { | 665 switch (cs->m_match) { |
666 case CSSSelector::Exact: | 666 case CSSSelector::Exact: |
667 str.append('='); | 667 str.append('='); |
668 break; | 668 break; |
669 case CSSSelector::Set: | 669 case CSSSelector::Set: |
670 // set has no operator or value, just the attrName | 670 // set has no operator or value, just the attrName |
671 str.append(']'); | 671 str.append(']'); |
672 break; | 672 break; |
(...skipping 10 matching lines...) Expand all Loading... | |
683 str.appendLiteral("$="); | 683 str.appendLiteral("$="); |
684 break; | 684 break; |
685 case CSSSelector::Contain: | 685 case CSSSelector::Contain: |
686 str.appendLiteral("*="); | 686 str.appendLiteral("*="); |
687 break; | 687 break; |
688 default: | 688 default: |
689 break; | 689 break; |
690 } | 690 } |
691 if (cs->m_match != CSSSelector::Set) { | 691 if (cs->m_match != CSSSelector::Set) { |
692 serializeString(cs->value(), str); | 692 serializeString(cs->value(), str); |
693 if (cs->attributeMatchType() == CaseInsensitive) | |
694 str.appendLiteral(" i"); | |
693 str.append(']'); | 695 str.append(']'); |
694 } | 696 } |
695 } | 697 } |
696 if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory()) | 698 if (cs->relation() != CSSSelector::SubSelector || !cs->tagHistory()) |
697 break; | 699 break; |
698 cs = cs->tagHistory(); | 700 cs = cs->tagHistory(); |
699 } | 701 } |
700 | 702 |
701 if (const CSSSelector* tagHistory = cs->tagHistory()) { | 703 if (const CSSSelector* tagHistory = cs->tagHistory()) { |
702 switch (cs->relation()) { | 704 switch (cs->relation()) { |
703 case CSSSelector::Descendant: | 705 case CSSSelector::Descendant: |
704 return tagHistory->selectorText(" " + str.toString() + rightSide); | 706 return tagHistory->selectorText(" " + str.toString() + rightSide); |
705 case CSSSelector::Child: | 707 case CSSSelector::Child: |
706 return tagHistory->selectorText(" > " + str.toString() + rightSide); | 708 return tagHistory->selectorText(" > " + str.toString() + rightSide); |
707 case CSSSelector::ShadowDeep: | 709 case CSSSelector::ShadowDeep: |
708 return tagHistory->selectorText(" /deep/ " + str.toString() + rightS ide); | 710 return tagHistory->selectorText(" /deep/ " + str.toString() + rightS ide); |
709 case CSSSelector::DirectAdjacent: | 711 case CSSSelector::DirectAdjacent: |
710 return tagHistory->selectorText(" + " + str.toString() + rightSide); | 712 return tagHistory->selectorText(" + " + str.toString() + rightSide); |
711 case CSSSelector::IndirectAdjacent: | 713 case CSSSelector::IndirectAdjacent: |
712 return tagHistory->selectorText(" ~ " + str.toString() + rightSide); | 714 return tagHistory->selectorText(" ~ " + str.toString() + rightSide); |
713 case CSSSelector::SubSelector: | 715 case CSSSelector::SubSelector: |
714 ASSERT_NOT_REACHED(); | 716 ASSERT_NOT_REACHED(); |
715 case CSSSelector::ShadowPseudo: | 717 case CSSSelector::ShadowPseudo: |
716 return tagHistory->selectorText(str.toString() + rightSide); | 718 return tagHistory->selectorText(str.toString() + rightSide); |
717 } | 719 } |
718 } | 720 } |
719 return str.toString() + rightSide; | 721 return str.toString() + rightSide; |
720 } | 722 } |
721 | 723 |
722 void CSSSelector::setAttribute(const QualifiedName& value) | 724 void CSSSelector::setAttribute(const QualifiedName& value, AttributeMatchType ma tchType) |
723 { | 725 { |
724 createRareData(); | 726 createRareData(); |
725 m_data.m_rareData->m_attribute = value; | 727 m_data.m_rareData->m_attribute = value; |
728 m_data.m_rareData->m_bits.m_attributeMatchType = matchType; | |
726 } | 729 } |
727 | 730 |
728 void CSSSelector::setArgument(const AtomicString& value) | 731 void CSSSelector::setArgument(const AtomicString& value) |
729 { | 732 { |
730 createRareData(); | 733 createRareData(); |
731 m_data.m_rareData->m_argument = value; | 734 m_data.m_rareData->m_argument = value; |
732 } | 735 } |
733 | 736 |
734 void CSSSelector::setSelectorList(PassOwnPtr<CSSSelectorList> selectorList) | 737 void CSSSelector::setSelectorList(PassOwnPtr<CSSSelectorList> selectorList) |
735 { | 738 { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
819 } | 822 } |
820 | 823 |
821 bool CSSSelector::matchNth(int count) const | 824 bool CSSSelector::matchNth(int count) const |
822 { | 825 { |
823 ASSERT(m_hasRareData); | 826 ASSERT(m_hasRareData); |
824 return m_data.m_rareData->matchNth(count); | 827 return m_data.m_rareData->matchNth(count); |
825 } | 828 } |
826 | 829 |
827 CSSSelector::RareData::RareData(const AtomicString& value) | 830 CSSSelector::RareData::RareData(const AtomicString& value) |
828 : m_value(value) | 831 : m_value(value) |
829 , m_a(0) | 832 , m_bits() |
eseidel
2014/07/31 16:53:14
I still don't understand how this auto-initializes
ojan
2014/07/31 17:17:15
Yes.
| |
830 , m_b(0) | |
831 , m_attribute(anyQName()) | 833 , m_attribute(anyQName()) |
832 , m_argument(nullAtom) | 834 , m_argument(nullAtom) |
833 { | 835 { |
834 } | 836 } |
835 | 837 |
836 CSSSelector::RareData::~RareData() | 838 CSSSelector::RareData::~RareData() |
837 { | 839 { |
838 } | 840 } |
839 | 841 |
840 // a helper function for parsing nth-arguments | 842 // a helper function for parsing nth-arguments |
841 bool CSSSelector::RareData::parseNth() | 843 bool CSSSelector::RareData::parseNth() |
842 { | 844 { |
843 String argument = m_argument.lower(); | 845 String argument = m_argument.lower(); |
844 | 846 |
845 if (argument.isEmpty()) | 847 if (argument.isEmpty()) |
846 return false; | 848 return false; |
847 | 849 |
848 m_a = 0; | 850 int nthA = 0; |
849 m_b = 0; | 851 int nthB = 0; |
850 if (argument == "odd") { | 852 if (argument == "odd") { |
851 m_a = 2; | 853 nthA = 2; |
852 m_b = 1; | 854 nthB = 1; |
853 } else if (argument == "even") { | 855 } else if (argument == "even") { |
854 m_a = 2; | 856 nthA = 2; |
855 m_b = 0; | 857 nthB = 0; |
856 } else { | 858 } else { |
857 size_t n = argument.find('n'); | 859 size_t n = argument.find('n'); |
858 if (n != kNotFound) { | 860 if (n != kNotFound) { |
859 if (argument[0] == '-') { | 861 if (argument[0] == '-') { |
860 if (n == 1) | 862 if (n == 1) |
861 m_a = -1; // -n == -1n | 863 nthA = -1; // -n == -1n |
862 else | 864 else |
863 m_a = argument.substring(0, n).toInt(); | 865 nthA = argument.substring(0, n).toInt(); |
864 } else if (!n) | 866 } else if (!n) { |
865 m_a = 1; // n == 1n | 867 nthA = 1; // n == 1n |
866 else | 868 } else { |
867 m_a = argument.substring(0, n).toInt(); | 869 nthA = argument.substring(0, n).toInt(); |
870 } | |
868 | 871 |
869 size_t p = argument.find('+', n); | 872 size_t p = argument.find('+', n); |
870 if (p != kNotFound) | 873 if (p != kNotFound) { |
871 m_b = argument.substring(p + 1, argument.length() - p - 1).toInt (); | 874 nthB = argument.substring(p + 1, argument.length() - p - 1).toIn t(); |
872 else { | 875 } else { |
873 p = argument.find('-', n); | 876 p = argument.find('-', n); |
874 if (p != kNotFound) | 877 if (p != kNotFound) |
875 m_b = -argument.substring(p + 1, argument.length() - p - 1). toInt(); | 878 nthB = -argument.substring(p + 1, argument.length() - p - 1) .toInt(); |
876 } | 879 } |
877 } else | 880 } else { |
878 m_b = argument.toInt(); | 881 nthB = argument.toInt(); |
882 } | |
879 } | 883 } |
884 setNthAValue(nthA); | |
885 setNthBValue(nthB); | |
880 return true; | 886 return true; |
881 } | 887 } |
882 | 888 |
883 // a helper function for checking nth-arguments | 889 // a helper function for checking nth-arguments |
884 bool CSSSelector::RareData::matchNth(int count) | 890 bool CSSSelector::RareData::matchNth(int count) |
885 { | 891 { |
886 if (!m_a) | 892 if (!nthAValue()) |
887 return count == m_b; | 893 return count == nthBValue(); |
888 else if (m_a > 0) { | 894 if (nthAValue() > 0) { |
889 if (count < m_b) | 895 if (count < nthBValue()) |
890 return false; | 896 return false; |
891 return (count - m_b) % m_a == 0; | 897 return (count - nthBValue()) % nthAValue() == 0; |
892 } else { | |
893 if (count > m_b) | |
894 return false; | |
895 return (m_b - count) % (-m_a) == 0; | |
896 } | 898 } |
899 if (count > nthBValue()) | |
900 return false; | |
901 return (nthBValue() - count) % (-nthAValue()) == 0; | |
897 } | 902 } |
898 | 903 |
899 } // namespace blink | 904 } // namespace blink |
OLD | NEW |