Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: third_party/WebKit/Source/core/css/SelectorChecker.cpp

Issue 2505543004: Let querySelector(All) match (nth-)last with unclosed parent. (Closed)
Patch Set: Added expectation file Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 parent->setChildrenAffectedByForwardPositionalRules(); 738 parent->setChildrenAffectedByForwardPositionalRules();
739 return isFirstOfType(element, element.tagQName()); 739 return isFirstOfType(element, element.tagQName());
740 } 740 }
741 break; 741 break;
742 case CSSSelector::PseudoLastChild: 742 case CSSSelector::PseudoLastChild:
743 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 743 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
744 if (m_mode == ResolvingStyle) { 744 if (m_mode == ResolvingStyle) {
745 parent->setChildrenAffectedByLastChildRules(); 745 parent->setChildrenAffectedByLastChildRules();
746 element.setAffectedByLastChildRules(); 746 element.setAffectedByLastChildRules();
747 } 747 }
748 if (!parent->isFinishedParsingChildren()) 748 if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
749 return false; 749 return false;
750 return isLastChild(element); 750 return isLastChild(element);
751 } 751 }
752 break; 752 break;
753 case CSSSelector::PseudoLastOfType: 753 case CSSSelector::PseudoLastOfType:
754 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 754 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
755 if (m_mode == ResolvingStyle) 755 if (m_mode == ResolvingStyle)
756 parent->setChildrenAffectedByBackwardPositionalRules(); 756 parent->setChildrenAffectedByBackwardPositionalRules();
757 if (!parent->isFinishedParsingChildren()) 757 if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
758 return false; 758 return false;
759 return isLastOfType(element, element.tagQName()); 759 return isLastOfType(element, element.tagQName());
760 } 760 }
761 break; 761 break;
762 case CSSSelector::PseudoOnlyChild: 762 case CSSSelector::PseudoOnlyChild:
763 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 763 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
764 if (m_mode == ResolvingStyle) { 764 if (m_mode == ResolvingStyle) {
765 parent->setChildrenAffectedByFirstChildRules(); 765 parent->setChildrenAffectedByFirstChildRules();
766 parent->setChildrenAffectedByLastChildRules(); 766 parent->setChildrenAffectedByLastChildRules();
767 element.setAffectedByFirstChildRules(); 767 element.setAffectedByFirstChildRules();
768 element.setAffectedByLastChildRules(); 768 element.setAffectedByLastChildRules();
769 } 769 }
770 if (!parent->isFinishedParsingChildren()) 770 if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
771 return false; 771 return false;
772 return isFirstChild(element) && isLastChild(element); 772 return isFirstChild(element) && isLastChild(element);
773 } 773 }
774 break; 774 break;
775 case CSSSelector::PseudoOnlyOfType: 775 case CSSSelector::PseudoOnlyOfType:
776 // FIXME: This selector is very slow. 776 // FIXME: This selector is very slow.
777 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 777 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
778 if (m_mode == ResolvingStyle) { 778 if (m_mode == ResolvingStyle) {
779 parent->setChildrenAffectedByForwardPositionalRules(); 779 parent->setChildrenAffectedByForwardPositionalRules();
780 parent->setChildrenAffectedByBackwardPositionalRules(); 780 parent->setChildrenAffectedByBackwardPositionalRules();
781 } 781 }
782 if (!parent->isFinishedParsingChildren()) 782 if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
783 return false; 783 return false;
784 return isFirstOfType(element, element.tagQName()) && 784 return isFirstOfType(element, element.tagQName()) &&
785 isLastOfType(element, element.tagQName()); 785 isLastOfType(element, element.tagQName());
786 } 786 }
787 break; 787 break;
788 case CSSSelector::PseudoPlaceholderShown: 788 case CSSSelector::PseudoPlaceholderShown:
789 if (isHTMLTextFormControlElement(element)) 789 if (isHTMLTextFormControlElement(element))
790 return toHTMLTextFormControlElement(element).isPlaceholderVisible(); 790 return toHTMLTextFormControlElement(element).isPlaceholderVisible();
791 break; 791 break;
792 case CSSSelector::PseudoNthChild: 792 case CSSSelector::PseudoNthChild:
793 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 793 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
794 if (m_mode == ResolvingStyle) 794 if (m_mode == ResolvingStyle)
795 parent->setChildrenAffectedByForwardPositionalRules(); 795 parent->setChildrenAffectedByForwardPositionalRules();
796 return selector.matchNth(NthIndexCache::nthChildIndex(element)); 796 return selector.matchNth(NthIndexCache::nthChildIndex(element));
797 } 797 }
798 break; 798 break;
799 case CSSSelector::PseudoNthOfType: 799 case CSSSelector::PseudoNthOfType:
800 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 800 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
801 if (m_mode == ResolvingStyle) 801 if (m_mode == ResolvingStyle)
802 parent->setChildrenAffectedByForwardPositionalRules(); 802 parent->setChildrenAffectedByForwardPositionalRules();
803 return selector.matchNth(NthIndexCache::nthOfTypeIndex(element)); 803 return selector.matchNth(NthIndexCache::nthOfTypeIndex(element));
804 } 804 }
805 break; 805 break;
806 case CSSSelector::PseudoNthLastChild: 806 case CSSSelector::PseudoNthLastChild:
807 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 807 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
808 if (m_mode == ResolvingStyle) 808 if (m_mode == ResolvingStyle)
809 parent->setChildrenAffectedByBackwardPositionalRules(); 809 parent->setChildrenAffectedByBackwardPositionalRules();
810 if (!parent->isFinishedParsingChildren()) 810 if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
811 return false; 811 return false;
812 return selector.matchNth(NthIndexCache::nthLastChildIndex(element)); 812 return selector.matchNth(NthIndexCache::nthLastChildIndex(element));
813 } 813 }
814 break; 814 break;
815 case CSSSelector::PseudoNthLastOfType: 815 case CSSSelector::PseudoNthLastOfType:
816 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { 816 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) {
817 if (m_mode == ResolvingStyle) 817 if (m_mode == ResolvingStyle)
818 parent->setChildrenAffectedByBackwardPositionalRules(); 818 parent->setChildrenAffectedByBackwardPositionalRules();
819 if (!parent->isFinishedParsingChildren()) 819 if (!m_isQuerySelector && !parent->isFinishedParsingChildren())
820 return false; 820 return false;
821 return selector.matchNth(NthIndexCache::nthLastOfTypeIndex(element)); 821 return selector.matchNth(NthIndexCache::nthLastOfTypeIndex(element));
822 } 822 }
823 break; 823 break;
824 case CSSSelector::PseudoTarget: 824 case CSSSelector::PseudoTarget:
825 return element == element.document().cssTarget(); 825 return element == element.document().cssTarget();
826 case CSSSelector::PseudoAny: { 826 case CSSSelector::PseudoAny: {
827 SelectorCheckingContext subContext(context); 827 SelectorCheckingContext subContext(context);
828 subContext.isSubSelector = true; 828 subContext.isSubSelector = true;
829 DCHECK(selector.selectorList()); 829 DCHECK(selector.selectorList());
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 } 1268 }
1269 1269
1270 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) { 1270 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) {
1271 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element), 1271 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element),
1272 CSSSelector::PseudoFocus)) 1272 CSSSelector::PseudoFocus))
1273 return true; 1273 return true;
1274 return element.isFocused() && isFrameFocused(element); 1274 return element.isFocused() && isFrameFocused(element);
1275 } 1275 }
1276 1276
1277 } // namespace blink 1277 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698