| 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 14 matching lines...) Expand all Loading... |
| 25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 26 * Boston, MA 02110-1301, USA. | 26 * Boston, MA 02110-1301, USA. |
| 27 */ | 27 */ |
| 28 | 28 |
| 29 #include "config.h" | 29 #include "config.h" |
| 30 #include "core/css/RuleFeature.h" | 30 #include "core/css/RuleFeature.h" |
| 31 | 31 |
| 32 #include "core/HTMLNames.h" | 32 #include "core/HTMLNames.h" |
| 33 #include "core/css/CSSSelector.h" | 33 #include "core/css/CSSSelector.h" |
| 34 #include "core/css/CSSSelectorList.h" | 34 #include "core/css/CSSSelectorList.h" |
| 35 #include "core/css/CSSValueList.h" |
| 35 #include "core/css/RuleSet.h" | 36 #include "core/css/RuleSet.h" |
| 37 #include "core/css/StylePropertySet.h" |
| 36 #include "core/css/StyleRule.h" | 38 #include "core/css/StyleRule.h" |
| 37 #include "core/css/invalidation/DescendantInvalidationSet.h" | 39 #include "core/css/invalidation/DescendantInvalidationSet.h" |
| 38 #include "core/dom/Element.h" | 40 #include "core/dom/Element.h" |
| 39 #include "core/dom/Node.h" | 41 #include "core/dom/Node.h" |
| 40 #include "core/inspector/InspectorTraceEvents.h" | 42 #include "core/inspector/InspectorTraceEvents.h" |
| 41 #include "wtf/BitVector.h" | 43 #include "wtf/BitVector.h" |
| 42 | 44 |
| 43 namespace blink { | 45 namespace blink { |
| 44 | 46 |
| 45 #if ENABLE(ASSERT) | 47 #if ENABLE(ASSERT) |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 if (selector.match() == CSSSelector::Tag && selector.tagQName().localName()
!= starAtom) | 216 if (selector.match() == CSSSelector::Tag && selector.tagQName().localName()
!= starAtom) |
| 215 features.tagName = selector.tagQName().localName(); | 217 features.tagName = selector.tagQName().localName(); |
| 216 else if (selector.match() == CSSSelector::Id) | 218 else if (selector.match() == CSSSelector::Id) |
| 217 features.id = selector.value(); | 219 features.id = selector.value(); |
| 218 else if (selector.match() == CSSSelector::Class) | 220 else if (selector.match() == CSSSelector::Class) |
| 219 features.classes.append(selector.value()); | 221 features.classes.append(selector.value()); |
| 220 else if (selector.isAttributeSelector()) | 222 else if (selector.isAttributeSelector()) |
| 221 features.attributes.append(selector.attribute().localName()); | 223 features.attributes.append(selector.attribute().localName()); |
| 222 else if (selector.isCustomPseudoElement()) | 224 else if (selector.isCustomPseudoElement()) |
| 223 features.customPseudoElement = true; | 225 features.customPseudoElement = true; |
| 226 else if (selector.pseudoType() == CSSSelector::PseudoBefore || selector.pseu
doType() == CSSSelector::PseudoAfter) |
| 227 features.hasBeforeOrAfter = true; |
| 224 else | 228 else |
| 225 return false; | 229 return false; |
| 226 return true; | 230 return true; |
| 227 } | 231 } |
| 228 | 232 |
| 229 RuleFeatureSet::RuleFeatureSet() | 233 RuleFeatureSet::RuleFeatureSet() |
| 230 { | 234 { |
| 231 } | 235 } |
| 232 | 236 |
| 233 RuleFeatureSet::~RuleFeatureSet() | 237 RuleFeatureSet::~RuleFeatureSet() |
| (...skipping 27 matching lines...) Expand all Loading... |
| 261 case CSSSelector::PseudoIndeterminate: | 265 case CSSSelector::PseudoIndeterminate: |
| 262 case CSSSelector::PseudoTarget: | 266 case CSSSelector::PseudoTarget: |
| 263 return &ensurePseudoInvalidationSet(selector.pseudoType()); | 267 return &ensurePseudoInvalidationSet(selector.pseudoType()); |
| 264 default: | 268 default: |
| 265 break; | 269 break; |
| 266 } | 270 } |
| 267 } | 271 } |
| 268 return nullptr; | 272 return nullptr; |
| 269 } | 273 } |
| 270 | 274 |
| 271 // Given a selector, update the descendant invalidation sets for the features fo
und | 275 // Given a rule, update the descendant invalidation sets for the features found |
| 272 // in the selector. The first step is to extract the features from the rightmost | 276 // in its selector. The first step is to extract the features from the rightmost |
| 273 // compound selector (extractInvalidationSetFeatures). Secondly, add those featu
res | 277 // compound selector (extractInvalidationSetFeatures). Secondly, add those featu
res |
| 274 // to the invalidation sets for the features found in the other compound selecto
rs | 278 // to the invalidation sets for the features found in the other compound selecto
rs |
| 275 // (addFeaturesToInvalidationSets). If we find a feature in the right-most compo
und | 279 // (addFeaturesToInvalidationSets). If we find a feature in the right-most compo
und |
| 276 // selector that requires a subtree recalc, we addFeaturesToInvalidationSets for
the | 280 // selector that requires a subtree recalc, we addFeaturesToInvalidationSets for
the |
| 277 // rightmost compound selector as well. | 281 // rightmost compound selector as well. |
| 278 | 282 |
| 279 void RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector) | 283 void RuleFeatureSet::updateInvalidationSets(const RuleData& ruleData) |
| 280 { | 284 { |
| 281 InvalidationSetFeatures features; | 285 InvalidationSetFeatures features; |
| 282 auto result = extractInvalidationSetFeatures(selector, features, false); | 286 auto result = extractInvalidationSetFeatures(ruleData.selector(), features,
false); |
| 283 if (result.first) { | 287 if (result.first) { |
| 284 features.forceSubtree = result.second == ForceSubtree; | 288 features.forceSubtree = result.second == ForceSubtree; |
| 285 addFeaturesToInvalidationSets(*result.first, features); | 289 addFeaturesToInvalidationSets(*result.first, features); |
| 286 } | 290 } |
| 291 |
| 292 // If any ::before and ::after rules specify 'content: attr(...)', we |
| 293 // need to create invalidation sets for those attributes. |
| 294 if (features.hasBeforeOrAfter) |
| 295 updateInvalidationSetsForContentAttribute(ruleData); |
| 296 } |
| 297 |
| 298 void RuleFeatureSet::updateInvalidationSetsForContentAttribute(const RuleData& r
uleData) |
| 299 { |
| 300 const StylePropertySet& propertySet = ruleData.rule()->properties(); |
| 301 |
| 302 int propertyIndex = propertySet.findPropertyIndex(CSSPropertyContent); |
| 303 |
| 304 if (propertyIndex == -1) |
| 305 return; |
| 306 |
| 307 StylePropertySet::PropertyReference contentProperty = propertySet.propertyAt
(propertyIndex); |
| 308 CSSValue* contentValue = contentProperty.value(); |
| 309 |
| 310 if (!contentValue->isValueList()) |
| 311 return; |
| 312 |
| 313 for (CSSValueListIterator i = contentValue; i.hasMore(); i.advance()) { |
| 314 CSSValue* item = i.value(); |
| 315 if (!item->isPrimitiveValue()) |
| 316 continue; |
| 317 CSSPrimitiveValue* primitiveItem = toCSSPrimitiveValue(item); |
| 318 if (!primitiveItem->isAttr()) |
| 319 continue; |
| 320 ensureAttributeInvalidationSet(AtomicString(primitiveItem->getStringValu
e())); |
| 321 } |
| 287 } | 322 } |
| 288 | 323 |
| 289 std::pair<const CSSSelector*, RuleFeatureSet::UseFeaturesType> | 324 std::pair<const CSSSelector*, RuleFeatureSet::UseFeaturesType> |
| 290 RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelector& selector, Inva
lidationSetFeatures& features, bool negated) | 325 RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelector& selector, Inva
lidationSetFeatures& features, bool negated) |
| 291 { | 326 { |
| 292 bool foundFeatures = false; | 327 bool foundFeatures = false; |
| 293 for (const CSSSelector* current = &selector; current; current = current->tag
History()) { | 328 for (const CSSSelector* current = &selector; current; current = current->tag
History()) { |
| 294 if (!negated) | 329 if (!negated) |
| 295 foundFeatures |= extractInvalidationSetFeature(*current, features); | 330 foundFeatures |= extractInvalidationSetFeature(*current, features); |
| 296 // Initialize the entry in the invalidation set map, if supported. | 331 // Initialize the entry in the invalidation set map, if supported. |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 if (current->relation() == CSSSelector::SubSelector) | 420 if (current->relation() == CSSSelector::SubSelector) |
| 386 continue; | 421 continue; |
| 387 | 422 |
| 388 if (current->isShadowSelector()) | 423 if (current->isShadowSelector()) |
| 389 features.treeBoundaryCrossing = true; | 424 features.treeBoundaryCrossing = true; |
| 390 | 425 |
| 391 features.adjacent = current->isAdjacentSelector(); | 426 features.adjacent = current->isAdjacentSelector(); |
| 392 } | 427 } |
| 393 } | 428 } |
| 394 | 429 |
| 395 void RuleFeatureSet::addContentAttr(const AtomicString& attributeName) | |
| 396 { | |
| 397 ensureAttributeInvalidationSet(attributeName); | |
| 398 } | |
| 399 | |
| 400 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) | 430 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) |
| 401 { | 431 { |
| 402 updateInvalidationSets(ruleData.selector()); | 432 updateInvalidationSets(ruleData); |
| 403 | 433 |
| 404 FeatureMetadata metadata; | 434 FeatureMetadata metadata; |
| 405 collectFeaturesFromSelector(ruleData.selector(), metadata); | 435 collectFeaturesFromSelector(ruleData.selector(), metadata); |
| 406 m_metadata.add(metadata); | 436 m_metadata.add(metadata); |
| 407 | 437 |
| 408 if (metadata.foundSiblingSelector) | 438 if (metadata.foundSiblingSelector) |
| 409 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(
), ruleData.hasDocumentSecurityOrigin())); | 439 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(
), ruleData.hasDocumentSecurityOrigin())); |
| 410 if (ruleData.containsUncommonAttributeSelector()) | 440 if (ruleData.containsUncommonAttributeSelector()) |
| 411 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele
ctorIndex(), ruleData.hasDocumentSecurityOrigin())); | 441 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele
ctorIndex(), ruleData.hasDocumentSecurityOrigin())); |
| 412 } | 442 } |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 visitor->trace(uncommonAttributeRules); | 640 visitor->trace(uncommonAttributeRules); |
| 611 visitor->trace(m_classInvalidationSets); | 641 visitor->trace(m_classInvalidationSets); |
| 612 visitor->trace(m_attributeInvalidationSets); | 642 visitor->trace(m_attributeInvalidationSets); |
| 613 visitor->trace(m_idInvalidationSets); | 643 visitor->trace(m_idInvalidationSets); |
| 614 visitor->trace(m_pseudoInvalidationSets); | 644 visitor->trace(m_pseudoInvalidationSets); |
| 615 visitor->trace(m_styleInvalidator); | 645 visitor->trace(m_styleInvalidator); |
| 616 #endif | 646 #endif |
| 617 } | 647 } |
| 618 | 648 |
| 619 } // namespace blink | 649 } // namespace blink |
| OLD | NEW |