| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 | 132 |
| 133 // Disable :visited matching when we see the first link or try to match
anything else than an ancestors. | 133 // Disable :visited matching when we see the first link or try to match
anything else than an ancestors. |
| 134 if (!context.isSubSelector && (context.element->isLink() || (relation !=
CSSSelector::Descendant && relation != CSSSelector::Child))) | 134 if (!context.isSubSelector && (context.element->isLink() || (relation !=
CSSSelector::Descendant && relation != CSSSelector::Child))) |
| 135 nextContext.visitedMatchType = VisitedMatchDisabled; | 135 nextContext.visitedMatchType = VisitedMatchDisabled; |
| 136 | 136 |
| 137 nextContext.pseudoId = NOPSEUDO; | 137 nextContext.pseudoId = NOPSEUDO; |
| 138 } | 138 } |
| 139 | 139 |
| 140 switch (relation) { | 140 switch (relation) { |
| 141 case CSSSelector::Descendant: | 141 case CSSSelector::Descendant: |
| 142 if (context.selector->relationIsForShadowDistributed()) { |
| 143 for (Element* element = context.element; element; element = element-
>parentElement()) { |
| 144 if (matchForShadowDistributed(element, siblingTraversalStrategy,
ignoreDynamicPseudo, nextContext) == SelectorMatches) |
| 145 return SelectorMatches; |
| 146 } |
| 147 return SelectorFailsCompletely; |
| 148 } |
| 142 nextContext.element = context.element->parentElement(); | 149 nextContext.element = context.element->parentElement(); |
| 143 nextContext.isSubSelector = false; | 150 nextContext.isSubSelector = false; |
| 144 nextContext.elementStyle = 0; | 151 nextContext.elementStyle = 0; |
| 145 for (; nextContext.element; nextContext.element = nextContext.element->p
arentElement()) { | 152 for (; nextContext.element; nextContext.element = nextContext.element->p
arentElement()) { |
| 146 Match match = this->match(nextContext, ignoreDynamicPseudo, siblingT
raversalStrategy); | 153 Match match = this->match(nextContext, ignoreDynamicPseudo, siblingT
raversalStrategy); |
| 147 if (match == SelectorMatches || match == SelectorFailsCompletely) | 154 if (match == SelectorMatches || match == SelectorFailsCompletely) |
| 148 return match; | 155 return match; |
| 149 if (nextContext.element == nextContext.scope && (nextContext.behavio
rAtBoundary & BoundaryBehaviorMask) != StaysWithinTreeScope) | 156 if (nextContext.element == nextContext.scope && (nextContext.behavio
rAtBoundary & BoundaryBehaviorMask) != StaysWithinTreeScope) |
| 150 return SelectorFailsCompletely; | 157 return SelectorFailsCompletely; |
| 151 } | 158 } |
| 152 return SelectorFailsCompletely; | 159 return SelectorFailsCompletely; |
| 153 | |
| 154 case CSSSelector::Child: | 160 case CSSSelector::Child: |
| 161 if (context.selector->relationIsForShadowDistributed()) |
| 162 return matchForShadowDistributed(context.element, siblingTraversalSt
rategy, ignoreDynamicPseudo, nextContext); |
| 155 nextContext.element = context.element->parentElement(); | 163 nextContext.element = context.element->parentElement(); |
| 156 if (!nextContext.element) | 164 if (!nextContext.element) |
| 157 return SelectorFailsCompletely; | 165 return SelectorFailsCompletely; |
| 158 nextContext.isSubSelector = false; | 166 nextContext.isSubSelector = false; |
| 159 nextContext.elementStyle = 0; | 167 nextContext.elementStyle = 0; |
| 160 return match(nextContext, ignoreDynamicPseudo, siblingTraversalStrategy)
; | 168 return match(nextContext, ignoreDynamicPseudo, siblingTraversalStrategy)
; |
| 161 | |
| 162 case CSSSelector::DirectAdjacent: | 169 case CSSSelector::DirectAdjacent: |
| 163 if (m_mode == ResolvingStyle) { | 170 if (m_mode == ResolvingStyle) { |
| 164 if (Element* parentElement = context.element->parentElement()) | 171 if (Element* parentElement = context.element->parentElement()) |
| 165 parentElement->setChildrenAffectedByDirectAdjacentRules(); | 172 parentElement->setChildrenAffectedByDirectAdjacentRules(); |
| 166 } | 173 } |
| 167 nextContext.element = context.element->previousElementSibling(); | 174 nextContext.element = context.element->previousElementSibling(); |
| 168 if (!nextContext.element) | 175 if (!nextContext.element) |
| 169 return SelectorFailsAllSiblings; | 176 return SelectorFailsAllSiblings; |
| 170 nextContext.isSubSelector = false; | 177 nextContext.isSubSelector = false; |
| 171 nextContext.elementStyle = 0; | 178 nextContext.elementStyle = 0; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 if (context.scope && context.scope->treeScope() == context.element->
treeScope() && (context.behaviorAtBoundary & BoundaryBehaviorMask) != StaysWithi
nTreeScope) | 212 if (context.scope && context.scope->treeScope() == context.element->
treeScope() && (context.behaviorAtBoundary & BoundaryBehaviorMask) != StaysWithi
nTreeScope) |
| 206 return SelectorFailsCompletely; | 213 return SelectorFailsCompletely; |
| 207 Element* shadowHostNode = context.element->shadowHost(); | 214 Element* shadowHostNode = context.element->shadowHost(); |
| 208 if (!shadowHostNode) | 215 if (!shadowHostNode) |
| 209 return SelectorFailsCompletely; | 216 return SelectorFailsCompletely; |
| 210 nextContext.element = shadowHostNode; | 217 nextContext.element = shadowHostNode; |
| 211 nextContext.isSubSelector = false; | 218 nextContext.isSubSelector = false; |
| 212 nextContext.elementStyle = 0; | 219 nextContext.elementStyle = 0; |
| 213 return match(nextContext, ignoreDynamicPseudo, siblingTraversalStrat
egy); | 220 return match(nextContext, ignoreDynamicPseudo, siblingTraversalStrat
egy); |
| 214 } | 221 } |
| 215 case CSSSelector::ShadowDistributed: | |
| 216 { | |
| 217 Vector<InsertionPoint*, 8> insertionPoints; | |
| 218 for (Element* element = context.element; element; element = element-
>parentElement()) { | |
| 219 insertionPoints.clear(); | |
| 220 collectInsertionPointsWhereNodeIsDistributed(element, insertionP
oints); | |
| 221 for (size_t i = 0; i < insertionPoints.size(); ++i) { | |
| 222 nextContext.element = insertionPoints[i]; | |
| 223 nextContext.isSubSelector = false; | |
| 224 nextContext.elementStyle = 0; | |
| 225 if (match(nextContext, ignoreDynamicPseudo, siblingTraversal
Strategy) == SelectorMatches) | |
| 226 return SelectorMatches; | |
| 227 } | |
| 228 } | |
| 229 return SelectorFailsCompletely; | |
| 230 } | |
| 231 } | 222 } |
| 232 | 223 |
| 233 ASSERT_NOT_REACHED(); | 224 ASSERT_NOT_REACHED(); |
| 234 return SelectorFailsCompletely; | 225 return SelectorFailsCompletely; |
| 235 } | 226 } |
| 236 | 227 |
| 228 template<typename SiblingTraversalStrategy> |
| 229 SelectorChecker::Match SelectorChecker::matchForShadowDistributed(const Element*
element, const SiblingTraversalStrategy& siblingTraversalStrategy, PseudoId& dy
namicPseudo, SelectorCheckingContext& nextContext) const |
| 230 { |
| 231 Vector<InsertionPoint*, 8> insertionPoints; |
| 232 collectInsertionPointsWhereNodeIsDistributed(element, insertionPoints); |
| 233 for (size_t i = 0; i < insertionPoints.size(); ++i) { |
| 234 nextContext.element = insertionPoints[i]; |
| 235 nextContext.isSubSelector = false; |
| 236 nextContext.elementStyle = 0; |
| 237 if (match(nextContext, dynamicPseudo, siblingTraversalStrategy) == Selec
torMatches) |
| 238 return SelectorMatches; |
| 239 } |
| 240 return SelectorFailsCompletely; |
| 241 } |
| 242 |
| 237 static inline bool containsHTMLSpace(const AtomicString& string) | 243 static inline bool containsHTMLSpace(const AtomicString& string) |
| 238 { | 244 { |
| 239 for (unsigned i = 0; i < string.length(); i++) | 245 for (unsigned i = 0; i < string.length(); i++) |
| 240 if (isHTMLSpace(string[i])) | 246 if (isHTMLSpace(string[i])) |
| 241 return true; | 247 return true; |
| 242 return false; | 248 return false; |
| 243 } | 249 } |
| 244 | 250 |
| 245 static bool attributeValueMatches(const Attribute* attributeItem, CSSSelector::M
atch match, const AtomicString& selectorValue, bool caseSensitive) | 251 static bool attributeValueMatches(const Attribute* attributeItem, CSSSelector::M
atch match, const AtomicString& selectorValue, bool caseSensitive) |
| 246 { | 252 { |
| (...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 return element->focused() && isFrameFocused(element); | 907 return element->focused() && isFrameFocused(element); |
| 902 } | 908 } |
| 903 | 909 |
| 904 template | 910 template |
| 905 SelectorChecker::Match SelectorChecker::match(const SelectorCheckingContext&, Ps
eudoId&, const DOMSiblingTraversalStrategy&) const; | 911 SelectorChecker::Match SelectorChecker::match(const SelectorCheckingContext&, Ps
eudoId&, const DOMSiblingTraversalStrategy&) const; |
| 906 | 912 |
| 907 template | 913 template |
| 908 SelectorChecker::Match SelectorChecker::match(const SelectorCheckingContext&, Ps
eudoId&, const ShadowDOMSiblingTraversalStrategy&) const; | 914 SelectorChecker::Match SelectorChecker::match(const SelectorCheckingContext&, Ps
eudoId&, const ShadowDOMSiblingTraversalStrategy&) const; |
| 909 | 915 |
| 910 } | 916 } |
| OLD | NEW |