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 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r
ights 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 bool foundIdent = false; | 125 bool foundIdent = false; |
126 for (const CSSSelector* component = &selector; component; component = compon
ent->tagHistory()) { | 126 for (const CSSSelector* component = &selector; component; component = compon
ent->tagHistory()) { |
127 | 127 |
128 if (component->match() == CSSSelector::Class || component->match() == CS
SSelector::Id | 128 if (component->match() == CSSSelector::Class || component->match() == CS
SSelector::Id |
129 || (component->match() == CSSSelector::Tag && component->tagQName().
localName() != starAtom) | 129 || (component->match() == CSSSelector::Tag && component->tagQName().
localName() != starAtom) |
130 || component->isAttributeSelector() || component->isCustomPseudoElem
ent()) { | 130 || component->isAttributeSelector() || component->isCustomPseudoElem
ent()) { |
131 if (!foundCombinator) { | 131 if (!foundCombinator) { |
132 // We have found an invalidation set feature in the rightmost co
mpound selector. | 132 // We have found an invalidation set feature in the rightmost co
mpound selector. |
133 foundIdent = true; | 133 foundIdent = true; |
134 } | 134 } |
135 } else if (component->pseudoType() == CSSSelector::PseudoHost || compone
nt->pseudoType() == CSSSelector::PseudoAny) { | 135 } else if (component->pseudoType() == CSSSelector::PseudoNot |
| 136 || component->pseudoType() == CSSSelector::PseudoHost |
| 137 || component->pseudoType() == CSSSelector::PseudoAny) { |
136 if (const CSSSelectorList* selectorList = component->selectorList())
{ | 138 if (const CSSSelectorList* selectorList = component->selectorList())
{ |
137 bool foundUniversal = false; | 139 // Features inside :not() are not added to the feature set, so c
onsider it a universal selector. |
| 140 bool foundUniversal = component->pseudoType() == CSSSelector::Ps
eudoNot; |
138 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) { | 141 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) { |
139 // Find the invalidation set mode for each of the selectors
in the selector list | 142 // Find the invalidation set mode for each of the selectors
in the selector list |
140 // of a :not(), :host(), etc. For instance, ".x :-webkit-any
(.a, .b)" yields an | 143 // of a :not(), :host(), etc. For instance, ".x :-webkit-any
(.a, .b)" yields an |
141 // AddFeatures mode for both ".a" and ".b". ":-webkit-any(.a
, *)" yields AddFeatures | 144 // AddFeatures mode for both ".a" and ".b". ":-webkit-any(.a
, *)" yields AddFeatures |
142 // for ".a", but UseSubtreeStyleChange for "*". One sub-sele
ctor without invalidation | 145 // for ".a", but UseSubtreeStyleChange for "*". One sub-sele
ctor without invalidation |
143 // set features is sufficient to cause the selector to be a
universal selector as far | 146 // set features is sufficient to cause the selector to be a
universal selector as far |
144 // the invalidation set is concerned. | 147 // the invalidation set is concerned. |
145 InvalidationSetMode subSelectorMode = invalidationSetModeFor
Selector(*selector); | 148 InvalidationSetMode subSelectorMode = invalidationSetModeFor
Selector(*selector); |
146 | 149 |
147 // The sub-selector contained something unskippable, fall ba
ck to whole subtree | 150 // The sub-selector contained something unskippable, fall ba
ck to whole subtree |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 // added to the invalidation sets for the features found in the other compound s
electors | 225 // added to the invalidation sets for the features found in the other compound s
electors |
223 // (addFeaturesToInvalidationSets). | 226 // (addFeaturesToInvalidationSets). |
224 | 227 |
225 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const
CSSSelector& selector) | 228 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const
CSSSelector& selector) |
226 { | 229 { |
227 InvalidationSetMode mode = invalidationSetModeForSelector(selector); | 230 InvalidationSetMode mode = invalidationSetModeForSelector(selector); |
228 if (mode != AddFeatures) | 231 if (mode != AddFeatures) |
229 return mode; | 232 return mode; |
230 | 233 |
231 InvalidationSetFeatures features; | 234 InvalidationSetFeatures features; |
232 if (const CSSSelector* current = extractInvalidationSetFeatures(selector, fe
atures)) | 235 if (const CSSSelector* current = extractInvalidationSetFeatures(selector, fe
atures, false)) |
233 addFeaturesToInvalidationSets(*current, features); | 236 addFeaturesToInvalidationSets(*current, features); |
234 return AddFeatures; | 237 return AddFeatures; |
235 } | 238 } |
236 | 239 |
237 const CSSSelector* RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelec
tor& selector, InvalidationSetFeatures& features) | 240 const CSSSelector* RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelec
tor& selector, InvalidationSetFeatures& features, bool negated) |
238 { | 241 { |
239 for (const CSSSelector* current = &selector; current; current = current->tag
History()) { | 242 for (const CSSSelector* current = &selector; current; current = current->tag
History()) { |
240 extractInvalidationSetFeature(*current, features); | 243 if (!negated) |
| 244 extractInvalidationSetFeature(*current, features); |
241 // Initialize the entry in the invalidation set map, if supported. | 245 // Initialize the entry in the invalidation set map, if supported. |
242 invalidationSetForSelector(*current); | 246 invalidationSetForSelector(*current); |
243 if (current->pseudoType() == CSSSelector::PseudoHost || current->pseudoT
ype() == CSSSelector::PseudoAny) { | 247 if (current->pseudoType() == CSSSelector::PseudoHost || current->pseudoT
ype() == CSSSelector::PseudoAny || current->pseudoType() == CSSSelector::PseudoN
ot) { |
244 if (const CSSSelectorList* selectorList = current->selectorList()) { | 248 if (const CSSSelectorList* selectorList = current->selectorList()) { |
245 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) | 249 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) |
246 extractInvalidationSetFeatures(*selector, features); | 250 extractInvalidationSetFeatures(*selector, features, current-
>pseudoType() == CSSSelector::PseudoNot); |
247 } | 251 } |
248 } | 252 } |
249 | 253 |
250 switch (current->relation()) { | 254 switch (current->relation()) { |
251 case CSSSelector::SubSelector: | 255 case CSSSelector::SubSelector: |
252 break; | 256 break; |
253 case CSSSelector::ShadowPseudo: | 257 case CSSSelector::ShadowPseudo: |
254 case CSSSelector::ShadowDeep: | 258 case CSSSelector::ShadowDeep: |
255 features.treeBoundaryCrossing = true; | 259 features.treeBoundaryCrossing = true; |
256 return current->tagHistory(); | 260 return current->tagHistory(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 invalidationSet->addId(features.id); | 294 invalidationSet->addId(features.id); |
291 if (!features.tagName.isEmpty()) | 295 if (!features.tagName.isEmpty()) |
292 invalidationSet->addTagName(features.tagName); | 296 invalidationSet->addTagName(features.tagName); |
293 for (Vector<AtomicString>::const_iterator it = features.classes.
begin(); it != features.classes.end(); ++it) | 297 for (Vector<AtomicString>::const_iterator it = features.classes.
begin(); it != features.classes.end(); ++it) |
294 invalidationSet->addClass(*it); | 298 invalidationSet->addClass(*it); |
295 for (Vector<AtomicString>::const_iterator it = features.attribut
es.begin(); it != features.attributes.end(); ++it) | 299 for (Vector<AtomicString>::const_iterator it = features.attribut
es.begin(); it != features.attributes.end(); ++it) |
296 invalidationSet->addAttribute(*it); | 300 invalidationSet->addAttribute(*it); |
297 if (features.customPseudoElement) | 301 if (features.customPseudoElement) |
298 invalidationSet->setCustomPseudoInvalid(); | 302 invalidationSet->setCustomPseudoInvalid(); |
299 } | 303 } |
300 } else if (current->pseudoType() == CSSSelector::PseudoHost || current->
pseudoType() == CSSSelector::PseudoAny) { | 304 } else { |
301 if (current->pseudoType() == CSSSelector::PseudoHost) | 305 if (current->pseudoType() == CSSSelector::PseudoHost) |
302 features.treeBoundaryCrossing = true; | 306 features.treeBoundaryCrossing = true; |
303 if (const CSSSelectorList* selectorList = current->selectorList()) { | 307 if (const CSSSelectorList* selectorList = current->selectorList()) { |
| 308 ASSERT(current->pseudoType() == CSSSelector::PseudoHost || curre
nt->pseudoType() == CSSSelector::PseudoAny || current->pseudoType() == CSSSelect
or::PseudoNot); |
304 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) | 309 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) |
305 addFeaturesToInvalidationSets(*selector, features); | 310 addFeaturesToInvalidationSets(*selector, features); |
306 } | 311 } |
307 } | 312 } |
308 switch (current->relation()) { | 313 switch (current->relation()) { |
309 case CSSSelector::SubSelector: | 314 case CSSSelector::SubSelector: |
310 break; | 315 break; |
311 case CSSSelector::ShadowPseudo: | 316 case CSSSelector::ShadowPseudo: |
312 case CSSSelector::ShadowDeep: | 317 case CSSSelector::ShadowDeep: |
313 features.treeBoundaryCrossing = true; | 318 features.treeBoundaryCrossing = true; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 visitor->trace(uncommonAttributeRules); | 560 visitor->trace(uncommonAttributeRules); |
556 visitor->trace(m_classInvalidationSets); | 561 visitor->trace(m_classInvalidationSets); |
557 visitor->trace(m_attributeInvalidationSets); | 562 visitor->trace(m_attributeInvalidationSets); |
558 visitor->trace(m_idInvalidationSets); | 563 visitor->trace(m_idInvalidationSets); |
559 visitor->trace(m_pseudoInvalidationSets); | 564 visitor->trace(m_pseudoInvalidationSets); |
560 visitor->trace(m_styleInvalidator); | 565 visitor->trace(m_styleInvalidator); |
561 #endif | 566 #endif |
562 } | 567 } |
563 | 568 |
564 } // namespace blink | 569 } // namespace blink |
OLD | NEW |