| 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 |