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

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

Issue 220943002: Use invalidation sets for :hover, :active, and :focus. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased. 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
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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 features.attributes.append(selector.attribute().localName()); 159 features.attributes.append(selector.attribute().localName());
160 else if (selector.isCustomPseudoElement()) 160 else if (selector.isCustomPseudoElement())
161 features.customPseudoElement = true; 161 features.customPseudoElement = true;
162 } 162 }
163 163
164 RuleFeatureSet::RuleFeatureSet() 164 RuleFeatureSet::RuleFeatureSet()
165 : m_targetedStyleRecalcEnabled(RuntimeEnabledFeatures::targetedStyleRecalcEn abled()) 165 : m_targetedStyleRecalcEnabled(RuntimeEnabledFeatures::targetedStyleRecalcEn abled())
166 { 166 {
167 } 167 }
168 168
169 DescendantInvalidationSet* RuleFeatureSet::invalidationSetForSelector(const CSSS elector& selector) 169 DescendantInvalidationSet* RuleFeatureSet::invalidationSetForSelector(const CSSS elector& selector, bool seenCombinator)
170 { 170 {
171 if (selector.m_match == CSSSelector::Class) 171 if (selector.m_match == CSSSelector::Class)
172 return &ensureClassInvalidationSet(selector.value()); 172 return &ensureClassInvalidationSet(selector.value());
173 if (selector.isAttributeSelector()) 173 if (selector.isAttributeSelector())
174 return &ensureAttributeInvalidationSet(selector.attribute().localName()) ; 174 return &ensureAttributeInvalidationSet(selector.attribute().localName()) ;
175 if (selector.m_match == CSSSelector::Id) 175 if (selector.m_match == CSSSelector::Id)
176 return &ensureIdInvalidationSet(selector.value()); 176 return &ensureIdInvalidationSet(selector.value());
177 if (seenCombinator) {
178 if (selector.pseudoType() == CSSSelector::PseudoHover)
179 return &ensureHoverInvalidationSet();
esprehn 2014/04/04 22:48:27 Lets use a HashMap<CSSSelector::PseudoType, Descen
rune 2014/04/08 16:28:25 Done.
180 if (selector.pseudoType() == CSSSelector::PseudoActive)
181 return &ensureActiveInvalidationSet();
182 if (selector.pseudoType() == CSSSelector::PseudoFocus)
183 return &ensureFocusInvalidationSet();
184 }
177 return 0; 185 return 0;
178 } 186 }
179 187
180 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector) 188 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector)
181 { 189 {
182 InvalidationSetMode mode = invalidationSetModeForSelector(selector); 190 InvalidationSetMode mode = invalidationSetModeForSelector(selector);
183 if (mode != AddFeatures) 191 if (mode != AddFeatures)
184 return mode; 192 return mode;
185 193
186 InvalidationSetFeatures features; 194 InvalidationSetFeatures features;
187 const CSSSelector* current = extractInvalidationSetFeatures(selector, featur es); 195 const CSSSelector* current = extractInvalidationSetFeatures(selector, featur es);
188 if (current) { 196 if (current) {
189 bool wholeSubtree = current->relation() == CSSSelector::DirectAdjacent | | current->relation() == CSSSelector::IndirectAdjacent; 197 bool wholeSubtree = current->relation() == CSSSelector::DirectAdjacent | | current->relation() == CSSSelector::IndirectAdjacent;
190 current = current->tagHistory(); 198 current = current->tagHistory();
191 if (current) 199 if (current)
192 addFeaturesToInvalidationSets(*current, features, wholeSubtree); 200 addFeaturesToInvalidationSets(*current, features, wholeSubtree);
193 } 201 }
194 return AddFeatures; 202 return AddFeatures;
195 } 203 }
196 204
197 const CSSSelector* RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelec tor& selector, InvalidationSetFeatures& features) 205 const CSSSelector* RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelec tor& selector, InvalidationSetFeatures& features)
198 { 206 {
199 const CSSSelector* lastSelector = &selector; 207 const CSSSelector* lastSelector = &selector;
200 for (; lastSelector; lastSelector = lastSelector->tagHistory()) { 208 for (; lastSelector; lastSelector = lastSelector->tagHistory()) {
201 extractInvalidationSetFeature(*lastSelector, features); 209 extractInvalidationSetFeature(*lastSelector, features);
202 // Initialize the entry in the invalidation set map, if supported. 210 // Initialize the entry in the invalidation set map, if supported.
203 invalidationSetForSelector(*lastSelector); 211 invalidationSetForSelector(*lastSelector, false);
204 if (lastSelector->pseudoType() == CSSSelector::PseudoHost || lastSelecto r->pseudoType() == CSSSelector::PseudoAny) { 212 if (lastSelector->pseudoType() == CSSSelector::PseudoHost || lastSelecto r->pseudoType() == CSSSelector::PseudoAny) {
205 if (const CSSSelectorList* selectorList = lastSelector->selectorList ()) { 213 if (const CSSSelectorList* selectorList = lastSelector->selectorList ()) {
206 for (const CSSSelector* selector = selectorList->first(); select or; selector = CSSSelectorList::next(*selector)) 214 for (const CSSSelector* selector = selectorList->first(); select or; selector = CSSSelectorList::next(*selector))
207 extractInvalidationSetFeatures(*selector, features); 215 extractInvalidationSetFeatures(*selector, features);
208 } 216 }
209 } 217 }
210 218
211 if (lastSelector->relation() != CSSSelector::SubSelector) 219 if (lastSelector->relation() != CSSSelector::SubSelector)
212 break; 220 break;
213 } 221 }
214 return lastSelector; 222 return lastSelector;
215 } 223 }
216 224
217 void RuleFeatureSet::addFeaturesToInvalidationSets(const CSSSelector& selector, const InvalidationSetFeatures& features, bool wholeSubtree) 225 void RuleFeatureSet::addFeaturesToInvalidationSets(const CSSSelector& selector, const InvalidationSetFeatures& features, bool wholeSubtree)
218 { 226 {
219 for (const CSSSelector* current = &selector; current; current = current->tag History()) { 227 for (const CSSSelector* current = &selector; current; current = current->tag History()) {
220 if (DescendantInvalidationSet* invalidationSet = invalidationSetForSelec tor(*current)) { 228 if (DescendantInvalidationSet* invalidationSet = invalidationSetForSelec tor(*current, true)) {
221 if (wholeSubtree) { 229 if (wholeSubtree) {
222 invalidationSet->setWholeSubtreeInvalid(); 230 invalidationSet->setWholeSubtreeInvalid();
223 } else { 231 } else {
224 if (!features.id.isEmpty()) 232 if (!features.id.isEmpty())
225 invalidationSet->addId(features.id); 233 invalidationSet->addId(features.id);
226 if (!features.tagName.isEmpty()) 234 if (!features.tagName.isEmpty())
227 invalidationSet->addTagName(features.tagName); 235 invalidationSet->addTagName(features.tagName);
228 for (Vector<AtomicString>::const_iterator it = features.classes. begin(); it != features.classes.end(); ++it) 236 for (Vector<AtomicString>::const_iterator it = features.classes. begin(); it != features.classes.end(); ++it)
229 invalidationSet->addClass(*it); 237 invalidationSet->addClass(*it);
230 for (Vector<AtomicString>::const_iterator it = features.attribut es.begin(); it != features.attributes.end(); ++it) 238 for (Vector<AtomicString>::const_iterator it = features.attribut es.begin(); it != features.attributes.end(); ++it)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 invalidationSet.setWholeSubtreeInvalid(); 273 invalidationSet.setWholeSubtreeInvalid();
266 } 274 }
267 275
268 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) 276 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData)
269 { 277 {
270 FeatureMetadata metadata; 278 FeatureMetadata metadata;
271 InvalidationSetMode mode = UseSubtreeStyleChange; 279 InvalidationSetMode mode = UseSubtreeStyleChange;
272 if (m_targetedStyleRecalcEnabled) 280 if (m_targetedStyleRecalcEnabled)
273 mode = updateInvalidationSets(ruleData.selector()); 281 mode = updateInvalidationSets(ruleData.selector());
274 282
275 collectFeaturesFromSelector(ruleData.selector(), metadata, mode); 283 collectFeaturesFromSelector(ruleData.selector(), metadata, mode, false);
276 m_metadata.add(metadata); 284 m_metadata.add(metadata);
277 285
278 if (metadata.foundSiblingSelector) 286 if (metadata.foundSiblingSelector)
279 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex( ), ruleData.hasDocumentSecurityOrigin())); 287 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex( ), ruleData.hasDocumentSecurityOrigin()));
280 if (ruleData.containsUncommonAttributeSelector()) 288 if (ruleData.containsUncommonAttributeSelector())
281 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele ctorIndex(), ruleData.hasDocumentSecurityOrigin())); 289 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele ctorIndex(), ruleData.hasDocumentSecurityOrigin()));
282 } 290 }
283 291
284 DescendantInvalidationSet& RuleFeatureSet::ensureClassInvalidationSet(const Atom icString& className) 292 DescendantInvalidationSet& RuleFeatureSet::ensureClassInvalidationSet(const Atom icString& className)
285 { 293 {
(...skipping 12 matching lines...) Expand all
298 } 306 }
299 307
300 DescendantInvalidationSet& RuleFeatureSet::ensureIdInvalidationSet(const AtomicS tring& id) 308 DescendantInvalidationSet& RuleFeatureSet::ensureIdInvalidationSet(const AtomicS tring& id)
301 { 309 {
302 InvalidationSetMap::AddResult addResult = m_idInvalidationSets.add(id, nullp tr); 310 InvalidationSetMap::AddResult addResult = m_idInvalidationSets.add(id, nullp tr);
303 if (addResult.isNewEntry) 311 if (addResult.isNewEntry)
304 addResult.storedValue->value = DescendantInvalidationSet::create(); 312 addResult.storedValue->value = DescendantInvalidationSet::create();
305 return *addResult.storedValue->value; 313 return *addResult.storedValue->value;
306 } 314 }
307 315
316 DescendantInvalidationSet& RuleFeatureSet::ensureHoverInvalidationSet()
317 {
318 if (!m_hoverInvalidationSet)
319 m_hoverInvalidationSet = DescendantInvalidationSet::create();
320 return *m_hoverInvalidationSet;
321 }
322
323 DescendantInvalidationSet& RuleFeatureSet::ensureActiveInvalidationSet()
324 {
325 if (!m_activeInvalidationSet)
326 m_activeInvalidationSet = DescendantInvalidationSet::create();
327 return *m_activeInvalidationSet;
328 }
329
330 DescendantInvalidationSet& RuleFeatureSet::ensureFocusInvalidationSet()
331 {
332 if (!m_focusInvalidationSet)
333 m_focusInvalidationSet = DescendantInvalidationSet::create();
334 return *m_focusInvalidationSet;
335 }
336
308 void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector) 337 void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector)
309 { 338 {
310 collectFeaturesFromSelector(selector, m_metadata, UseSubtreeStyleChange); 339 collectFeaturesFromSelector(selector, m_metadata, UseSubtreeStyleChange, fal se);
311 } 340 }
312 341
313 void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector, Ru leFeatureSet::FeatureMetadata& metadata, InvalidationSetMode mode) 342 void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector, Ru leFeatureSet::FeatureMetadata& metadata, InvalidationSetMode mode, bool seenComb inator)
314 { 343 {
315 unsigned maxDirectAdjacentSelectors = 0; 344 unsigned maxDirectAdjacentSelectors = 0;
316 345
317 for (const CSSSelector* current = &selector; current; current = current->tag History()) { 346 for (const CSSSelector* current = &selector; current; current = current->tag History()) {
318 if (mode != AddFeatures && (current->m_match == CSSSelector::Class || cu rrent->m_match == CSSSelector::Id || current->isAttributeSelector())) { 347 if (mode != AddFeatures) {
319 DescendantInvalidationSet* invalidationSet = invalidationSetForSelec tor(*current); 348 if (DescendantInvalidationSet* invalidationSet = invalidationSetForS elector(*current, seenCombinator)) {
320 ASSERT(invalidationSet); 349 if (mode == UseSubtreeStyleChange)
321 if (mode == UseSubtreeStyleChange) 350 invalidationSet->setWholeSubtreeInvalid();
322 invalidationSet->setWholeSubtreeInvalid(); 351 }
323 } 352 }
324 if (current->pseudoType() == CSSSelector::PseudoFirstLine) 353 if (current->pseudoType() == CSSSelector::PseudoFirstLine)
325 metadata.usesFirstLineRules = true; 354 metadata.usesFirstLineRules = true;
326 if (current->isDirectAdjacentSelector()) { 355 if (current->isDirectAdjacentSelector()) {
327 maxDirectAdjacentSelectors++; 356 maxDirectAdjacentSelectors++;
328 } else if (maxDirectAdjacentSelectors) { 357 } else if (maxDirectAdjacentSelectors) {
329 if (maxDirectAdjacentSelectors > metadata.maxDirectAdjacentSelectors ) 358 if (maxDirectAdjacentSelectors > metadata.maxDirectAdjacentSelectors )
330 metadata.maxDirectAdjacentSelectors = maxDirectAdjacentSelectors ; 359 metadata.maxDirectAdjacentSelectors = maxDirectAdjacentSelectors ;
331 maxDirectAdjacentSelectors = 0; 360 maxDirectAdjacentSelectors = 0;
332 } 361 }
333 if (current->isSiblingSelector()) 362 if (current->isSiblingSelector())
334 metadata.foundSiblingSelector = true; 363 metadata.foundSiblingSelector = true;
335 364
336 collectFeaturesFromSelectorList(current->selectorList(), metadata, mode) ; 365 collectFeaturesFromSelectorList(current->selectorList(), metadata, mode, seenCombinator);
337 366
338 if (mode == UseLocalStyleChange && current->relation() != CSSSelector::S ubSelector) 367 if (mode == UseLocalStyleChange && current->relation() != CSSSelector::S ubSelector) {
368 seenCombinator = true;
339 mode = UseSubtreeStyleChange; 369 mode = UseSubtreeStyleChange;
370 }
340 } 371 }
341 372
342 ASSERT(!maxDirectAdjacentSelectors); 373 ASSERT(!maxDirectAdjacentSelectors);
343 } 374 }
344 375
345 void RuleFeatureSet::collectFeaturesFromSelectorList(const CSSSelectorList* sele ctorList, RuleFeatureSet::FeatureMetadata& metadata, InvalidationSetMode mode) 376 void RuleFeatureSet::collectFeaturesFromSelectorList(const CSSSelectorList* sele ctorList, RuleFeatureSet::FeatureMetadata& metadata, InvalidationSetMode mode, b ool seenCombinator)
346 { 377 {
347 if (!selectorList) 378 if (!selectorList)
348 return; 379 return;
349 380
350 for (const CSSSelector* selector = selectorList->first(); selector; selector = CSSSelectorList::next(*selector)) 381 for (const CSSSelector* selector = selectorList->first(); selector; selector = CSSSelectorList::next(*selector))
351 collectFeaturesFromSelector(*selector, metadata, mode); 382 collectFeaturesFromSelector(*selector, metadata, mode, seenCombinator);
352 } 383 }
353 384
354 void RuleFeatureSet::FeatureMetadata::add(const FeatureMetadata& other) 385 void RuleFeatureSet::FeatureMetadata::add(const FeatureMetadata& other)
355 { 386 {
356 usesFirstLineRules = usesFirstLineRules || other.usesFirstLineRules; 387 usesFirstLineRules = usesFirstLineRules || other.usesFirstLineRules;
357 maxDirectAdjacentSelectors = std::max(maxDirectAdjacentSelectors, other.maxD irectAdjacentSelectors); 388 maxDirectAdjacentSelectors = std::max(maxDirectAdjacentSelectors, other.maxD irectAdjacentSelectors);
358 } 389 }
359 390
360 void RuleFeatureSet::FeatureMetadata::clear() 391 void RuleFeatureSet::FeatureMetadata::clear()
361 { 392 {
362 usesFirstLineRules = false; 393 usesFirstLineRules = false;
363 foundSiblingSelector = false; 394 foundSiblingSelector = false;
364 maxDirectAdjacentSelectors = 0; 395 maxDirectAdjacentSelectors = 0;
365 } 396 }
366 397
367 void RuleFeatureSet::add(const RuleFeatureSet& other) 398 void RuleFeatureSet::add(const RuleFeatureSet& other)
368 { 399 {
369 for (InvalidationSetMap::const_iterator it = other.m_classInvalidationSets.b egin(); it != other.m_classInvalidationSets.end(); ++it) 400 for (InvalidationSetMap::const_iterator it = other.m_classInvalidationSets.b egin(); it != other.m_classInvalidationSets.end(); ++it)
370 ensureClassInvalidationSet(it->key).combine(*it->value); 401 ensureClassInvalidationSet(it->key).combine(*it->value);
371 for (InvalidationSetMap::const_iterator it = other.m_attributeInvalidationSe ts.begin(); it != other.m_attributeInvalidationSets.end(); ++it) 402 for (InvalidationSetMap::const_iterator it = other.m_attributeInvalidationSe ts.begin(); it != other.m_attributeInvalidationSets.end(); ++it)
372 ensureAttributeInvalidationSet(it->key).combine(*it->value); 403 ensureAttributeInvalidationSet(it->key).combine(*it->value);
373 for (InvalidationSetMap::const_iterator it = other.m_idInvalidationSets.begi n(); it != other.m_idInvalidationSets.end(); ++it) 404 for (InvalidationSetMap::const_iterator it = other.m_idInvalidationSets.begi n(); it != other.m_idInvalidationSets.end(); ++it)
374 ensureIdInvalidationSet(it->key).combine(*it->value); 405 ensureIdInvalidationSet(it->key).combine(*it->value);
375 406
407 if (other.m_hoverInvalidationSet)
408 ensureHoverInvalidationSet().combine(*other.m_hoverInvalidationSet);
409 if (other.m_activeInvalidationSet)
410 ensureActiveInvalidationSet().combine(*other.m_activeInvalidationSet);
411 if (other.m_focusInvalidationSet)
412 ensureFocusInvalidationSet().combine(*other.m_focusInvalidationSet);
413
376 m_metadata.add(other.m_metadata); 414 m_metadata.add(other.m_metadata);
377 415
378 siblingRules.appendVector(other.siblingRules); 416 siblingRules.appendVector(other.siblingRules);
379 uncommonAttributeRules.appendVector(other.uncommonAttributeRules); 417 uncommonAttributeRules.appendVector(other.uncommonAttributeRules);
380 } 418 }
381 419
382 void RuleFeatureSet::clear() 420 void RuleFeatureSet::clear()
383 { 421 {
384 siblingRules.clear(); 422 siblingRules.clear();
385 uncommonAttributeRules.clear(); 423 uncommonAttributeRules.clear();
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 if (!oldId.isEmpty()) { 480 if (!oldId.isEmpty()) {
443 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_idInvalidation Sets.get(oldId)) 481 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_idInvalidation Sets.get(oldId))
444 m_styleInvalidator.scheduleInvalidation(invalidationSet, element); 482 m_styleInvalidator.scheduleInvalidation(invalidationSet, element);
445 } 483 }
446 if (!newId.isEmpty()) { 484 if (!newId.isEmpty()) {
447 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_idInvalidation Sets.get(newId)) 485 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_idInvalidation Sets.get(newId))
448 m_styleInvalidator.scheduleInvalidation(invalidationSet, element); 486 m_styleInvalidator.scheduleInvalidation(invalidationSet, element);
449 } 487 }
450 } 488 }
451 489
490 void RuleFeatureSet::scheduleStyleInvalidationForHoverChange(Element& element)
491 {
492 if (m_hoverInvalidationSet)
493 m_styleInvalidator.scheduleInvalidation(m_hoverInvalidationSet, element) ;
494 }
495
496 void RuleFeatureSet::scheduleStyleInvalidationForActiveChange(Element& element)
497 {
498 if (m_activeInvalidationSet)
499 m_styleInvalidator.scheduleInvalidation(m_activeInvalidationSet, element );
500 }
501
502 void RuleFeatureSet::scheduleStyleInvalidationForFocusChange(Element& element)
503 {
504 if (m_focusInvalidationSet)
505 m_styleInvalidator.scheduleInvalidation(m_focusInvalidationSet, element) ;
506 }
507
452 void RuleFeatureSet::addClassToInvalidationSet(const AtomicString& className, El ement& element) 508 void RuleFeatureSet::addClassToInvalidationSet(const AtomicString& className, El ement& element)
453 { 509 {
454 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_classInvalidationS ets.get(className)) 510 if (RefPtr<DescendantInvalidationSet> invalidationSet = m_classInvalidationS ets.get(className))
455 m_styleInvalidator.scheduleInvalidation(invalidationSet, element); 511 m_styleInvalidator.scheduleInvalidation(invalidationSet, element);
456 } 512 }
457 513
458 StyleInvalidator& RuleFeatureSet::styleInvalidator() 514 StyleInvalidator& RuleFeatureSet::styleInvalidator()
459 { 515 {
460 return m_styleInvalidator; 516 return m_styleInvalidator;
461 } 517 }
462 518
463 } // namespace WebCore 519 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698