void RuleFeatureSet::collectFeatures(const RuleData& ruleData) { SelectorFeatures selectorFeatures; recursivelyCollectFeaturesFromSelector(selectorFeatures, *ruleData.selector()); if (selectorFeatures.hasSiblingSelector) siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); if (ruleData.containsUncommonAttributeSelector()) uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); for (auto* className : selectorFeatures.classesMatchingAncestors) { auto addResult = ancestorClassRules.ensure(className, [] { return std::make_unique<Vector<RuleFeature>>(); }); addResult.iterator->value->append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); } for (auto* selector : selectorFeatures.attributeSelectorsMatchingAncestors) { // Hashing by attributeCanonicalLocalName makes this HTML specific. auto addResult = ancestorAttributeRulesForHTML.ensure(selector->attributeCanonicalLocalName().impl(), [] { return std::make_unique<AttributeRules>(); }); auto& rules = *addResult.iterator->value; rules.features.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); // Deduplicate selectors. rules.selectors.add(makeAttributeSelectorKey(*selector), selector); } }
static void collectFeaturesFromRuleData(RuleFeatureSet& features, const RuleData& ruleData) { bool hasSiblingSelector; features.collectFeaturesFromSelector(*ruleData.selector(), hasSiblingSelector); if (hasSiblingSelector) features.siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); if (ruleData.containsUncommonAttributeSelector()) features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); }
void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) { updateInvalidationSets(ruleData); FeatureMetadata metadata; collectFeaturesFromSelector(ruleData.selector(), metadata); m_metadata.add(metadata); if (metadata.foundSiblingSelector) siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); if (ruleData.containsUncommonAttributeSelector()) uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); }
void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) { FeatureMetadata metadata; InvalidationSetMode mode = UseSubtreeStyleChange; if (m_targetedStyleRecalcEnabled) mode = updateInvalidationSets(ruleData.selector()); collectFeaturesFromSelector(ruleData.selector(), metadata, mode); m_metadata.add(metadata); if (metadata.foundSiblingSelector) siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); if (ruleData.containsUncommonAttributeSelector()) uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); }
static void collectFeaturesFromRuleData(RuleFeatureSet& features, const RuleData& ruleData) { bool foundSiblingSelector = false; for (const CSSSelector* selector = ruleData.selector(); selector; selector = selector->tagHistory()) { features.collectFeaturesFromSelector(selector); if (const CSSSelectorList* selectorList = selector->selectorList()) { for (const CSSSelector* subSelector = selectorList->first(); subSelector; subSelector = CSSSelectorList::next(subSelector)) { if (!foundSiblingSelector && selector->isSiblingSelector()) foundSiblingSelector = true; features.collectFeaturesFromSelector(subSelector); } } else if (!foundSiblingSelector && selector->isSiblingSelector()) foundSiblingSelector = true; } if (foundSiblingSelector) features.siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); if (ruleData.containsUncommonAttributeSelector()) features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); }
void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) { FeatureMetadata metadata; bool selectorUsesClassInvalidationSet = false; if (m_targetedStyleRecalcEnabled) selectorUsesClassInvalidationSet = updateClassInvalidationSets(ruleData.selector()); SelectorFeatureCollectionMode collectionMode; if (selectorUsesClassInvalidationSet) collectionMode = DontProcessClasses; else collectionMode = ProcessClasses; collectFeaturesFromSelector(ruleData.selector(), metadata, collectionMode); m_metadata.add(metadata); if (metadata.foundSiblingSelector) siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); if (ruleData.containsUncommonAttributeSelector()) uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); }