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.
All rights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. |
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 static bool isFirstOfType(Element& element, const QualifiedName& type) | 176 static bool isFirstOfType(Element& element, const QualifiedName& type) |
177 { | 177 { |
178 return !ElementTraversal::previousSibling(element, HasTagName(type)); | 178 return !ElementTraversal::previousSibling(element, HasTagName(type)); |
179 } | 179 } |
180 | 180 |
181 static bool isLastOfType(Element& element, const QualifiedName& type) | 181 static bool isLastOfType(Element& element, const QualifiedName& type) |
182 { | 182 { |
183 return !ElementTraversal::nextSibling(element, HasTagName(type)); | 183 return !ElementTraversal::nextSibling(element, HasTagName(type)); |
184 } | 184 } |
185 | 185 |
186 static int countElementsBefore(Element& element) | 186 static int nthChildIndex(Element& element) |
187 { | 187 { |
188 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) | 188 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) |
189 return nthIndexCache->nthChildIndex(element) - 1; | 189 return nthIndexCache->nthChildIndex(element); |
190 | 190 |
191 int count = 0; | 191 int index = 1; |
192 for (const Element* sibling = ElementTraversal::previousSibling(element); si
bling; sibling = ElementTraversal::previousSibling(*sibling)) | 192 for (const Element* sibling = ElementTraversal::previousSibling(element); si
bling; sibling = ElementTraversal::previousSibling(*sibling)) |
193 count++; | 193 index++; |
194 | 194 |
195 return count; | 195 return index; |
196 } | 196 } |
197 | 197 |
198 static int countElementsOfTypeBefore(Element& element, const QualifiedName& type
) | 198 static int nthOfTypeIndex(Element& element, const QualifiedName& type) |
199 { | 199 { |
200 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) | 200 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) |
201 return nthIndexCache->nthChildIndexOfType(element, type) - 1; | 201 return nthIndexCache->nthChildIndexOfType(element, type); |
202 int count = 0; | 202 int index = 1; |
203 for (const Element* sibling = ElementTraversal::previousSibling(element, Has
TagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, H
asTagName(type))) | 203 for (const Element* sibling = ElementTraversal::previousSibling(element, Has
TagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, H
asTagName(type))) |
204 ++count; | 204 ++index; |
205 return count; | 205 return index; |
206 } | 206 } |
207 | 207 |
208 static int countElementsAfter(Element& element) | 208 static int nthLastChildIndex(Element& element) |
209 { | 209 { |
210 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) | 210 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) |
211 return nthIndexCache->nthLastChildIndex(element) - 1; | 211 return nthIndexCache->nthLastChildIndex(element); |
212 | 212 |
213 int count = 0; | 213 int index = 1; |
214 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin
g; sibling = ElementTraversal::nextSibling(*sibling)) | 214 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin
g; sibling = ElementTraversal::nextSibling(*sibling)) |
215 ++count; | 215 ++index; |
216 return count; | 216 return index; |
217 } | 217 } |
218 | 218 |
219 static int countElementsOfTypeAfter(Element& element, const QualifiedName& type) | 219 static int nthLastOfTypeIndex(Element& element, const QualifiedName& type) |
220 { | 220 { |
221 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) | 221 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache()) |
222 return nthIndexCache->nthLastChildIndexOfType(element, type) - 1; | 222 return nthIndexCache->nthLastChildIndexOfType(element, type); |
223 | 223 |
224 int count = 0; | 224 int index = 1; |
225 for (const Element* sibling = ElementTraversal::nextSibling(element, HasTagN
ame(type)); sibling; sibling = ElementTraversal::nextSibling(*sibling, HasTagNam
e(type))) | 225 for (const Element* sibling = ElementTraversal::nextSibling(element, HasTagN
ame(type)); sibling; sibling = ElementTraversal::nextSibling(*sibling, HasTagNam
e(type))) |
226 ++count; | 226 ++index; |
227 return count; | 227 return index; |
228 } | 228 } |
229 | 229 |
230 bool SelectorChecker::match(const SelectorCheckingContext& context, MatchResult*
result) const | 230 bool SelectorChecker::match(const SelectorCheckingContext& context, MatchResult*
result) const |
231 { | 231 { |
232 return matchSelector(context, result) == SelectorMatches; | 232 return matchSelector(context, result) == SelectorMatches; |
233 } | 233 } |
234 | 234 |
235 // Recursive check of selectors and combinators | 235 // Recursive check of selectors and combinators |
236 // It can return 4 different values: | 236 // It can return 4 different values: |
237 // * SelectorMatches - the selector matches the element e | 237 // * SelectorMatches - the selector matches the element e |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 return false; | 804 return false; |
805 return isFirstOfType(element, element.tagQName()) && isLastOfType(el
ement, element.tagQName()); | 805 return isFirstOfType(element, element.tagQName()) && isLastOfType(el
ement, element.tagQName()); |
806 } | 806 } |
807 break; | 807 break; |
808 case CSSSelector::PseudoNthChild: | 808 case CSSSelector::PseudoNthChild: |
809 if (!selector.parseNth()) | 809 if (!selector.parseNth()) |
810 break; | 810 break; |
811 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 811 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { |
812 if (m_mode == ResolvingStyle) | 812 if (m_mode == ResolvingStyle) |
813 parent->setChildrenAffectedByForwardPositionalRules(); | 813 parent->setChildrenAffectedByForwardPositionalRules(); |
814 return selector.matchNth(1 + countElementsBefore(element)); | 814 return selector.matchNth(nthChildIndex(element)); |
815 } | 815 } |
816 break; | 816 break; |
817 case CSSSelector::PseudoNthOfType: | 817 case CSSSelector::PseudoNthOfType: |
818 if (!selector.parseNth()) | 818 if (!selector.parseNth()) |
819 break; | 819 break; |
820 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 820 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { |
821 if (m_mode == ResolvingStyle) | 821 if (m_mode == ResolvingStyle) |
822 parent->setChildrenAffectedByForwardPositionalRules(); | 822 parent->setChildrenAffectedByForwardPositionalRules(); |
823 return selector.matchNth(1 + countElementsOfTypeBefore(element, elem
ent.tagQName())); | 823 return selector.matchNth(nthOfTypeIndex(element, element.tagQName())
); |
824 } | 824 } |
825 break; | 825 break; |
826 case CSSSelector::PseudoNthLastChild: | 826 case CSSSelector::PseudoNthLastChild: |
827 if (!selector.parseNth()) | 827 if (!selector.parseNth()) |
828 break; | 828 break; |
829 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 829 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { |
830 if (m_mode == ResolvingStyle) | 830 if (m_mode == ResolvingStyle) |
831 parent->setChildrenAffectedByBackwardPositionalRules(); | 831 parent->setChildrenAffectedByBackwardPositionalRules(); |
832 if (!parent->isFinishedParsingChildren()) | 832 if (!parent->isFinishedParsingChildren()) |
833 return false; | 833 return false; |
834 return selector.matchNth(1 + countElementsAfter(element)); | 834 return selector.matchNth(nthLastChildIndex(element)); |
835 } | 835 } |
836 break; | 836 break; |
837 case CSSSelector::PseudoNthLastOfType: | 837 case CSSSelector::PseudoNthLastOfType: |
838 if (!selector.parseNth()) | 838 if (!selector.parseNth()) |
839 break; | 839 break; |
840 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { | 840 if (ContainerNode* parent = element.parentElementOrDocumentFragment()) { |
841 if (m_mode == ResolvingStyle) | 841 if (m_mode == ResolvingStyle) |
842 parent->setChildrenAffectedByBackwardPositionalRules(); | 842 parent->setChildrenAffectedByBackwardPositionalRules(); |
843 if (!parent->isFinishedParsingChildren()) | 843 if (!parent->isFinishedParsingChildren()) |
844 return false; | 844 return false; |
845 return selector.matchNth(1 + countElementsOfTypeAfter(element, eleme
nt.tagQName())); | 845 return selector.matchNth(nthLastOfTypeIndex(element, element.tagQNam
e())); |
846 } | 846 } |
847 break; | 847 break; |
848 case CSSSelector::PseudoTarget: | 848 case CSSSelector::PseudoTarget: |
849 return element == element.document().cssTarget(); | 849 return element == element.document().cssTarget(); |
850 case CSSSelector::PseudoAny: | 850 case CSSSelector::PseudoAny: |
851 { | 851 { |
852 SelectorCheckingContext subContext(context); | 852 SelectorCheckingContext subContext(context); |
853 subContext.isSubSelector = true; | 853 subContext.isSubSelector = true; |
854 ASSERT(selector.selectorList()); | 854 ASSERT(selector.selectorList()); |
855 for (subContext.selector = selector.selectorList()->first(); subCont
ext.selector; subContext.selector = CSSSelectorList::next(*subContext.selector))
{ | 855 for (subContext.selector = selector.selectorList()->first(); subCont
ext.selector; subContext.selector = CSSSelectorList::next(*subContext.selector))
{ |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1200 } | 1200 } |
1201 | 1201 |
1202 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) | 1202 bool SelectorChecker::matchesFocusPseudoClass(const Element& element) |
1203 { | 1203 { |
1204 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element
), CSSSelector::PseudoFocus)) | 1204 if (InspectorInstrumentation::forcePseudoState(const_cast<Element*>(&element
), CSSSelector::PseudoFocus)) |
1205 return true; | 1205 return true; |
1206 return element.focused() && isFrameFocused(element); | 1206 return element.focused() && isFrameFocused(element); |
1207 } | 1207 } |
1208 | 1208 |
1209 } | 1209 } |
OLD | NEW |