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