| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
| 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. |
| 6 * All rights reserved. | 6 * All rights reserved. |
| 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 10 * (http://www.torchmobile.com/) | 10 * (http://www.torchmobile.com/) |
| (...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 if (context.inRightmostCompound) | 757 if (context.inRightmostCompound) |
| 758 m_elementStyle->setEmptyState(result); | 758 m_elementStyle->setEmptyState(result); |
| 759 else if (element.computedStyle() && | 759 else if (element.computedStyle() && |
| 760 (element.document().styleEngine().usesSiblingRules() || | 760 (element.document().styleEngine().usesSiblingRules() || |
| 761 element.computedStyle()->unique())) | 761 element.computedStyle()->unique())) |
| 762 element.mutableComputedStyle()->setEmptyState(result); | 762 element.mutableComputedStyle()->setEmptyState(result); |
| 763 } | 763 } |
| 764 return result; | 764 return result; |
| 765 } | 765 } |
| 766 case CSSSelector::PseudoFirstChild: | 766 case CSSSelector::PseudoFirstChild: |
| 767 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 767 if (m_mode == ResolvingStyle) { |
| 768 if (m_mode == ResolvingStyle) { | 768 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) |
| 769 parent->setChildrenAffectedByFirstChildRules(); | 769 parent->setChildrenAffectedByFirstChildRules(); |
| 770 element.setAffectedByFirstChildRules(); | 770 element.setAffectedByFirstChildRules(); |
| 771 } | |
| 772 return isFirstChild(element); | |
| 773 } | 771 } |
| 774 break; | 772 return isFirstChild(element); |
| 775 case CSSSelector::PseudoFirstOfType: | 773 case CSSSelector::PseudoFirstOfType: |
| 776 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 774 if (m_mode == ResolvingStyle) { |
| 777 if (m_mode == ResolvingStyle) | 775 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) |
| 778 parent->setChildrenAffectedByForwardPositionalRules(); | 776 parent->setChildrenAffectedByForwardPositionalRules(); |
| 779 return isFirstOfType(element, element.tagQName()); | |
| 780 } | 777 } |
| 781 break; | 778 return isFirstOfType(element, element.tagQName()); |
| 782 case CSSSelector::PseudoLastChild: | 779 case CSSSelector::PseudoLastChild: { |
| 783 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 780 ContainerNode* parent = element.parentElementOrDocumentFragment(); |
| 784 if (m_mode == ResolvingStyle) { | 781 if (m_mode == ResolvingStyle) { |
| 782 if (parent) |
| 785 parent->setChildrenAffectedByLastChildRules(); | 783 parent->setChildrenAffectedByLastChildRules(); |
| 786 element.setAffectedByLastChildRules(); | 784 element.setAffectedByLastChildRules(); |
| 787 } | |
| 788 if (!m_isQuerySelector && !parent->isFinishedParsingChildren()) | |
| 789 return false; | |
| 790 return isLastChild(element); | |
| 791 } | 785 } |
| 792 break; | 786 if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren()) |
| 793 case CSSSelector::PseudoLastOfType: | 787 return false; |
| 794 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 788 return isLastChild(element); |
| 795 if (m_mode == ResolvingStyle) | 789 } |
| 790 case CSSSelector::PseudoLastOfType: { |
| 791 ContainerNode* parent = element.parentElementOrDocumentFragment(); |
| 792 if (m_mode == ResolvingStyle) { |
| 793 if (parent) |
| 796 parent->setChildrenAffectedByBackwardPositionalRules(); | 794 parent->setChildrenAffectedByBackwardPositionalRules(); |
| 797 if (!m_isQuerySelector && !parent->isFinishedParsingChildren()) | |
| 798 return false; | |
| 799 return isLastOfType(element, element.tagQName()); | |
| 800 } | 795 } |
| 801 break; | 796 if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren()) |
| 802 case CSSSelector::PseudoOnlyChild: | 797 return false; |
| 803 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 798 return isLastOfType(element, element.tagQName()); |
| 804 if (m_mode == ResolvingStyle) { | 799 } |
| 800 case CSSSelector::PseudoOnlyChild: { |
| 801 ContainerNode* parent = element.parentElementOrDocumentFragment(); |
| 802 if (m_mode == ResolvingStyle) { |
| 803 if (parent) { |
| 805 parent->setChildrenAffectedByFirstChildRules(); | 804 parent->setChildrenAffectedByFirstChildRules(); |
| 806 parent->setChildrenAffectedByLastChildRules(); | 805 parent->setChildrenAffectedByLastChildRules(); |
| 807 element.setAffectedByFirstChildRules(); | |
| 808 element.setAffectedByLastChildRules(); | |
| 809 } | 806 } |
| 810 if (!m_isQuerySelector && !parent->isFinishedParsingChildren()) | 807 element.setAffectedByFirstChildRules(); |
| 811 return false; | 808 element.setAffectedByLastChildRules(); |
| 812 return isFirstChild(element) && isLastChild(element); | |
| 813 } | 809 } |
| 814 break; | 810 if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren()) |
| 815 case CSSSelector::PseudoOnlyOfType: | 811 return false; |
| 812 return isFirstChild(element) && isLastChild(element); |
| 813 } |
| 814 case CSSSelector::PseudoOnlyOfType: { |
| 816 // FIXME: This selector is very slow. | 815 // FIXME: This selector is very slow. |
| 817 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 816 ContainerNode* parent = element.parentElementOrDocumentFragment(); |
| 818 if (m_mode == ResolvingStyle) { | 817 if (m_mode == ResolvingStyle && parent) { |
| 819 parent->setChildrenAffectedByForwardPositionalRules(); | 818 parent->setChildrenAffectedByForwardPositionalRules(); |
| 820 parent->setChildrenAffectedByBackwardPositionalRules(); | 819 parent->setChildrenAffectedByBackwardPositionalRules(); |
| 821 } | |
| 822 if (!m_isQuerySelector && !parent->isFinishedParsingChildren()) | |
| 823 return false; | |
| 824 return isFirstOfType(element, element.tagQName()) && | |
| 825 isLastOfType(element, element.tagQName()); | |
| 826 } | 820 } |
| 827 break; | 821 if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren()) |
| 822 return false; |
| 823 return isFirstOfType(element, element.tagQName()) && |
| 824 isLastOfType(element, element.tagQName()); |
| 825 } |
| 828 case CSSSelector::PseudoPlaceholderShown: | 826 case CSSSelector::PseudoPlaceholderShown: |
| 829 if (isTextControlElement(element)) | 827 if (isTextControlElement(element)) |
| 830 return toTextControlElement(element).isPlaceholderVisible(); | 828 return toTextControlElement(element).isPlaceholderVisible(); |
| 831 break; | 829 break; |
| 832 case CSSSelector::PseudoNthChild: | 830 case CSSSelector::PseudoNthChild: |
| 833 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 831 if (m_mode == ResolvingStyle) { |
| 834 if (m_mode == ResolvingStyle) | 832 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) |
| 835 parent->setChildrenAffectedByForwardPositionalRules(); | 833 parent->setChildrenAffectedByForwardPositionalRules(); |
| 836 return selector.matchNth(NthIndexCache::nthChildIndex(element)); | |
| 837 } | 834 } |
| 838 break; | 835 return selector.matchNth(NthIndexCache::nthChildIndex(element)); |
| 839 case CSSSelector::PseudoNthOfType: | 836 case CSSSelector::PseudoNthOfType: |
| 840 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 837 if (m_mode == ResolvingStyle) { |
| 841 if (m_mode == ResolvingStyle) | 838 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) |
| 842 parent->setChildrenAffectedByForwardPositionalRules(); | 839 parent->setChildrenAffectedByForwardPositionalRules(); |
| 843 return selector.matchNth(NthIndexCache::nthOfTypeIndex(element)); | |
| 844 } | 840 } |
| 845 break; | 841 return selector.matchNth(NthIndexCache::nthOfTypeIndex(element)); |
| 846 case CSSSelector::PseudoNthLastChild: | 842 case CSSSelector::PseudoNthLastChild: { |
| 847 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 843 ContainerNode* parent = element.parentElementOrDocumentFragment(); |
| 848 if (m_mode == ResolvingStyle) | 844 if (m_mode == ResolvingStyle && parent) |
| 849 parent->setChildrenAffectedByBackwardPositionalRules(); | 845 parent->setChildrenAffectedByBackwardPositionalRules(); |
| 850 if (!m_isQuerySelector && !parent->isFinishedParsingChildren()) | 846 if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren()) |
| 851 return false; | 847 return false; |
| 852 return selector.matchNth(NthIndexCache::nthLastChildIndex(element)); | 848 return selector.matchNth(NthIndexCache::nthLastChildIndex(element)); |
| 853 } | 849 } |
| 854 break; | 850 case CSSSelector::PseudoNthLastOfType: { |
| 855 case CSSSelector::PseudoNthLastOfType: | 851 ContainerNode* parent = element.parentElementOrDocumentFragment(); |
| 856 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 852 if (m_mode == ResolvingStyle && parent) |
| 857 if (m_mode == ResolvingStyle) | 853 parent->setChildrenAffectedByBackwardPositionalRules(); |
| 858 parent->setChildrenAffectedByBackwardPositionalRules(); | 854 if (!m_isQuerySelector && parent && !parent->isFinishedParsingChildren()) |
| 859 if (!m_isQuerySelector && !parent->isFinishedParsingChildren()) | 855 return false; |
| 860 return false; | 856 return selector.matchNth(NthIndexCache::nthLastOfTypeIndex(element)); |
| 861 return selector.matchNth(NthIndexCache::nthLastOfTypeIndex(element)); | 857 } |
| 862 } | |
| 863 break; | |
| 864 case CSSSelector::PseudoTarget: | 858 case CSSSelector::PseudoTarget: |
| 865 return element == element.document().cssTarget(); | 859 return element == element.document().cssTarget(); |
| 866 case CSSSelector::PseudoAny: { | 860 case CSSSelector::PseudoAny: { |
| 867 SelectorCheckingContext subContext(context); | 861 SelectorCheckingContext subContext(context); |
| 868 subContext.isSubSelector = true; | 862 subContext.isSubSelector = true; |
| 869 DCHECK(selector.selectorList()); | 863 DCHECK(selector.selectorList()); |
| 870 for (subContext.selector = selector.selectorList()->first(); | 864 for (subContext.selector = selector.selectorList()->first(); |
| 871 subContext.selector; | 865 subContext.selector; |
| 872 subContext.selector = CSSSelectorList::next(*subContext.selector)) { | 866 subContext.selector = CSSSelectorList::next(*subContext.selector)) { |
| 873 if (match(subContext)) | 867 if (match(subContext)) |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 } | 1308 } |
| 1315 | 1309 |
| 1316 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) { | 1310 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) { |
| 1317 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element), | 1311 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element), |
| 1318 CSSSelector::PseudoFocus)) | 1312 CSSSelector::PseudoFocus)) |
| 1319 return true; | 1313 return true; |
| 1320 return element.isFocused() && isFrameFocused(element); | 1314 return element.isFocused() && isFrameFocused(element); |
| 1321 } | 1315 } |
| 1322 | 1316 |
| 1323 } // namespace blink | 1317 } // namespace blink |
| OLD | NEW |