Chromium Code Reviews| 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 |