void CSSSelectorParser::parseSelector(CSSParserTokenRange range, const CSSParserContext& context, const AtomicString& defaultNamespace, StyleSheetContents* styleSheet, CSSSelectorList& output) { CSSSelectorParser parser(context, defaultNamespace, styleSheet); range.consumeWhitespace(); CSSSelectorList result; parser.consumeComplexSelectorList(range, result); if (range.atEnd()) { output.adopt(result); recordSelectorStats(context, output); } ASSERT(!(output.isValid() && parser.m_failedParsing)); }
CSSSelectorList CSSSelectorParser::parseSelector( CSSParserTokenRange range, const CSSParserContext& context, StyleSheetContents* styleSheet) { CSSSelectorParser parser(context, styleSheet); range.consumeWhitespace(); CSSSelectorList result = parser.consumeComplexSelectorList(range); if (!range.atEnd()) return CSSSelectorList(); recordSelectorStats(context, result); return result; }
StyleRuleBase* BisonCSSParser::createStyleRule(Vector<OwnPtr<CSSParserSelector> >* selectors) { StyleRule* result = 0; if (selectors) { m_allowImportRules = m_allowNamespaceDeclarations = false; RefPtrWillBeRawPtr<StyleRule> rule = StyleRule::create(); rule->parserAdoptSelectorVector(*selectors); rule->setProperties(createStylePropertySet()); result = rule.get(); m_parsedRules.append(rule.release()); recordSelectorStats(m_context, result->selectorList()); } clearProperties(); return result; }
static void recordSelectorStats(const CSSParserContext& context, const CSSSelectorList& selectorList) { if (!context.useCounter()) return; for (const CSSSelector* selector = selectorList.first(); selector; selector = CSSSelectorList::next(*selector)) { for (const CSSSelector* current = selector; current ; current = current->tagHistory()) { UseCounter::Feature feature = UseCounter::NumberOfFeatures; switch (current->pseudoType()) { case CSSSelector::PseudoUnresolved: feature = UseCounter::CSSSelectorPseudoUnresolved; break; case CSSSelector::PseudoShadow: feature = UseCounter::CSSSelectorPseudoShadow; break; case CSSSelector::PseudoContent: feature = UseCounter::CSSSelectorPseudoContent; break; case CSSSelector::PseudoHost: feature = UseCounter::CSSSelectorPseudoHost; break; case CSSSelector::PseudoHostContext: feature = UseCounter::CSSSelectorPseudoHostContext; break; case CSSSelector::PseudoFullScreenDocument: feature = UseCounter::CSSSelectorPseudoFullScreenDocument; break; case CSSSelector::PseudoFullScreenAncestor: feature = UseCounter::CSSSelectorPseudoFullScreenAncestor; break; case CSSSelector::PseudoFullScreen: feature = UseCounter::CSSSelectorPseudoFullScreen; break; default: break; } if (feature != UseCounter::NumberOfFeatures) context.useCounter()->count(feature); if (current->relation() == CSSSelector::ShadowDeep) context.useCounter()->count(UseCounter::CSSDeepCombinator); if (current->selectorList()) recordSelectorStats(context, *current->selectorList()); } } }
static void recordSelectorStats(const CSSParserContext& context, const CSSSelectorList& selectorList) { if (!context.useCounter()) return; for (const CSSSelector* selector = selectorList.first(); selector; selector = CSSSelectorList::next(*selector)) { for (const CSSSelector* current = selector; current; current = current->tagHistory()) { UseCounter::Feature feature = UseCounter::NumberOfFeatures; switch (current->getPseudoType()) { case CSSSelector::PseudoAny: feature = UseCounter::CSSSelectorPseudoAny; break; case CSSSelector::PseudoUnresolved: feature = UseCounter::CSSSelectorPseudoUnresolved; break; case CSSSelector::PseudoDefined: feature = UseCounter::CSSSelectorPseudoDefined; break; case CSSSelector::PseudoSlotted: feature = UseCounter::CSSSelectorPseudoSlotted; break; case CSSSelector::PseudoContent: feature = UseCounter::CSSSelectorPseudoContent; break; case CSSSelector::PseudoHost: feature = UseCounter::CSSSelectorPseudoHost; break; case CSSSelector::PseudoHostContext: feature = UseCounter::CSSSelectorPseudoHostContext; break; case CSSSelector::PseudoFullScreenAncestor: feature = UseCounter::CSSSelectorPseudoFullScreenAncestor; break; case CSSSelector::PseudoFullScreen: feature = UseCounter::CSSSelectorPseudoFullScreen; break; case CSSSelector::PseudoListBox: if (context.mode() != UASheetMode) feature = UseCounter::CSSSelectorInternalPseudoListBox; break; case CSSSelector::PseudoWebKitCustomElement: if (context.mode() != UASheetMode) { if (current->value() == "-internal-media-controls-cast-button") feature = UseCounter::CSSSelectorInternalMediaControlsCastButton; else if (current->value() == "-internal-media-controls-overlay-cast-button") feature = UseCounter::CSSSelectorInternalMediaControlsOverlayCastButton; } break; case CSSSelector::PseudoSpatialNavigationFocus: if (context.mode() != UASheetMode) feature = UseCounter::CSSSelectorInternalPseudoSpatialNavigationFocus; break; case CSSSelector::PseudoReadOnly: if (context.mode() != UASheetMode) feature = UseCounter::CSSSelectorPseudoReadOnly; break; case CSSSelector::PseudoReadWrite: if (context.mode() != UASheetMode) feature = UseCounter::CSSSelectorPseudoReadWrite; break; default: break; } if (feature != UseCounter::NumberOfFeatures) context.useCounter()->count(feature); if (current->relation() == CSSSelector::IndirectAdjacent) context.useCounter()->count(UseCounter::CSSSelectorIndirectAdjacent); if (current->selectorList()) recordSelectorStats(context, *current->selectorList()); } } }