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

Side by Side Diff: Source/core/css/RuleFeature.cpp

Issue 224593002: Use invalidation sets when selector contains adjacent combinators. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased with modified expected test results. Created 6 years, 8 months 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/css/RuleFeature.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 return foundDescendantRelation ? UseLocalStyleChange : UseSubtreeSty leChange; 128 return foundDescendantRelation ? UseLocalStyleChange : UseSubtreeSty leChange;
129 } 129 }
130 switch (component->relation()) { 130 switch (component->relation()) {
131 case CSSSelector::Descendant: 131 case CSSSelector::Descendant:
132 case CSSSelector::Child: 132 case CSSSelector::Child:
133 case CSSSelector::ShadowPseudo: 133 case CSSSelector::ShadowPseudo:
134 case CSSSelector::ShadowDeep: 134 case CSSSelector::ShadowDeep:
135 foundDescendantRelation = true; 135 foundDescendantRelation = true;
136 // Fall through! 136 // Fall through!
137 case CSSSelector::SubSelector: 137 case CSSSelector::SubSelector:
138 case CSSSelector::DirectAdjacent:
139 case CSSSelector::IndirectAdjacent:
138 continue; 140 continue;
139 default: 141 default:
142 // All combinators should be handled above.
143 ASSERT_NOT_REACHED();
140 return UseLocalStyleChange; 144 return UseLocalStyleChange;
141 } 145 }
142 } 146 }
143 return foundIdent ? AddFeatures : UseLocalStyleChange; 147 return foundIdent ? AddFeatures : UseLocalStyleChange;
144 } 148 }
145 149
146 void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector, InvalidationSetFeatures& features) 150 void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector, InvalidationSetFeatures& features)
147 { 151 {
148 if (selector.m_match == CSSSelector::Tag) 152 if (selector.m_match == CSSSelector::Tag)
149 features.tagName = selector.tagQName().localName(); 153 features.tagName = selector.tagQName().localName();
(...skipping 24 matching lines...) Expand all
174 } 178 }
175 179
176 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector) 180 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector)
177 { 181 {
178 InvalidationSetMode mode = invalidationSetModeForSelector(selector); 182 InvalidationSetMode mode = invalidationSetModeForSelector(selector);
179 if (mode != AddFeatures) 183 if (mode != AddFeatures)
180 return mode; 184 return mode;
181 185
182 InvalidationSetFeatures features; 186 InvalidationSetFeatures features;
183 const CSSSelector* current = extractInvalidationSetFeatures(selector, featur es); 187 const CSSSelector* current = extractInvalidationSetFeatures(selector, featur es);
184 if (current) 188 if (current) {
189 bool wholeSubtree = current->relation() == CSSSelector::DirectAdjacent | | current->relation() == CSSSelector::IndirectAdjacent;
185 current = current->tagHistory(); 190 current = current->tagHistory();
186 191 if (current)
187 if (current) 192 addFeaturesToInvalidationSets(*current, features, wholeSubtree);
188 addFeaturesToInvalidationSets(*current, features); 193 }
189 return AddFeatures; 194 return AddFeatures;
190 } 195 }
191 196
192 const CSSSelector* RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelec tor& selector, InvalidationSetFeatures& features) 197 const CSSSelector* RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelec tor& selector, InvalidationSetFeatures& features)
193 { 198 {
194 const CSSSelector* lastSelector = &selector; 199 const CSSSelector* lastSelector = &selector;
195 for (; lastSelector; lastSelector = lastSelector->tagHistory()) { 200 for (; lastSelector; lastSelector = lastSelector->tagHistory()) {
196 extractInvalidationSetFeature(*lastSelector, features); 201 extractInvalidationSetFeature(*lastSelector, features);
197 // Initialize the entry in the invalidation set map, if supported. 202 // Initialize the entry in the invalidation set map, if supported.
198 invalidationSetForSelector(*lastSelector); 203 invalidationSetForSelector(*lastSelector);
199 if (lastSelector->pseudoType() == CSSSelector::PseudoHost || lastSelecto r->pseudoType() == CSSSelector::PseudoAny) { 204 if (lastSelector->pseudoType() == CSSSelector::PseudoHost || lastSelecto r->pseudoType() == CSSSelector::PseudoAny) {
200 if (const CSSSelectorList* selectorList = lastSelector->selectorList ()) { 205 if (const CSSSelectorList* selectorList = lastSelector->selectorList ()) {
201 for (const CSSSelector* selector = selectorList->first(); select or; selector = CSSSelectorList::next(*selector)) 206 for (const CSSSelector* selector = selectorList->first(); select or; selector = CSSSelectorList::next(*selector))
202 extractInvalidationSetFeatures(*selector, features); 207 extractInvalidationSetFeatures(*selector, features);
203 } 208 }
204 } 209 }
205 210
206 if (lastSelector->relation() != CSSSelector::SubSelector) 211 if (lastSelector->relation() != CSSSelector::SubSelector)
207 break; 212 break;
208 } 213 }
209 return lastSelector; 214 return lastSelector;
210 } 215 }
211 216
212 void RuleFeatureSet::addFeaturesToInvalidationSets(const CSSSelector& selector, const InvalidationSetFeatures& features) 217 void RuleFeatureSet::addFeaturesToInvalidationSets(const CSSSelector& selector, const InvalidationSetFeatures& features, bool wholeSubtree)
213 { 218 {
214 for (const CSSSelector* current = &selector; current; current = current->tag History()) { 219 for (const CSSSelector* current = &selector; current; current = current->tag History()) {
215 if (DescendantInvalidationSet* invalidationSet = invalidationSetForSelec tor(*current)) { 220 if (DescendantInvalidationSet* invalidationSet = invalidationSetForSelec tor(*current)) {
216 if (!features.id.isEmpty()) 221 if (wholeSubtree) {
217 invalidationSet->addId(features.id); 222 invalidationSet->setWholeSubtreeInvalid();
218 if (!features.tagName.isEmpty()) 223 } else {
219 invalidationSet->addTagName(features.tagName); 224 if (!features.id.isEmpty())
220 for (Vector<AtomicString>::const_iterator it = features.classes.begi n(); it != features.classes.end(); ++it) 225 invalidationSet->addId(features.id);
221 invalidationSet->addClass(*it); 226 if (!features.tagName.isEmpty())
222 for (Vector<AtomicString>::const_iterator it = features.attributes.b egin(); it != features.attributes.end(); ++it) 227 invalidationSet->addTagName(features.tagName);
223 invalidationSet->addAttribute(*it); 228 for (Vector<AtomicString>::const_iterator it = features.classes. begin(); it != features.classes.end(); ++it)
224 if (features.customPseudoElement) 229 invalidationSet->addClass(*it);
225 invalidationSet->setCustomPseudoInvalid(); 230 for (Vector<AtomicString>::const_iterator it = features.attribut es.begin(); it != features.attributes.end(); ++it)
231 invalidationSet->addAttribute(*it);
232 if (features.customPseudoElement)
233 invalidationSet->setCustomPseudoInvalid();
234 }
226 } else if (current->pseudoType() == CSSSelector::PseudoHost || current-> pseudoType() == CSSSelector::PseudoAny) { 235 } else if (current->pseudoType() == CSSSelector::PseudoHost || current-> pseudoType() == CSSSelector::PseudoAny) {
227 if (const CSSSelectorList* selectorList = current->selectorList()) { 236 if (const CSSSelectorList* selectorList = current->selectorList()) {
228 for (const CSSSelector* selector = selectorList->first(); select or; selector = CSSSelectorList::next(*selector)) 237 for (const CSSSelector* selector = selectorList->first(); select or; selector = CSSSelectorList::next(*selector))
229 addFeaturesToInvalidationSets(*selector, features); 238 addFeaturesToInvalidationSets(*selector, features, wholeSubt ree);
230 } 239 }
231 } 240 }
241 switch (current->relation()) {
242 case CSSSelector::Descendant:
243 case CSSSelector::Child:
244 case CSSSelector::ShadowPseudo:
245 case CSSSelector::ShadowDeep:
246 wholeSubtree = false;
247 break;
248 case CSSSelector::DirectAdjacent:
249 case CSSSelector::IndirectAdjacent:
250 wholeSubtree = true;
251 break;
252 case CSSSelector::SubSelector:
253 break;
254 default:
255 // All combinators should be handled above.
256 ASSERT_NOT_REACHED();
257 break;
258 }
232 } 259 }
233 } 260 }
234 261
235 void RuleFeatureSet::addContentAttr(const AtomicString& attributeName) 262 void RuleFeatureSet::addContentAttr(const AtomicString& attributeName)
236 { 263 {
237 DescendantInvalidationSet& invalidationSet = ensureAttributeInvalidationSet( attributeName); 264 DescendantInvalidationSet& invalidationSet = ensureAttributeInvalidationSet( attributeName);
238 invalidationSet.setWholeSubtreeInvalid(); 265 invalidationSet.setWholeSubtreeInvalid();
239 } 266 }
240 267
241 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) 268 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData)
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_classInvalidationS ets.get(className)) 454 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_classInvalidationS ets.get(className))
428 m_styleInvalidator.scheduleInvalidation(invalidationSet, element); 455 m_styleInvalidator.scheduleInvalidation(invalidationSet, element);
429 } 456 }
430 457
431 StyleInvalidator& RuleFeatureSet::styleInvalidator() 458 StyleInvalidator& RuleFeatureSet::styleInvalidator()
432 { 459 {
433 return m_styleInvalidator; 460 return m_styleInvalidator;
434 } 461 }
435 462
436 } // namespace WebCore 463 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/RuleFeature.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698