void StyleRuleImport::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CSSStyleSheetResource* cachedStyleSheet) { if (m_styleSheet) m_styleSheet->clearOwnerRule(); CSSParserContext context = m_parentStyleSheet ? m_parentStyleSheet->parserContext() : strictCSSParserContext(); context.setCharset(charset); Document* document = m_parentStyleSheet ? m_parentStyleSheet->singleOwnerDocument() : 0; if (!baseURL.isNull()) { context.setBaseURL(baseURL); if (document) context.setReferrer(Referrer(baseURL.strippedForUseAsReferrer(), document->referrerPolicy())); } m_styleSheet = StyleSheetContents::create(this, href, context); m_styleSheet->parseAuthorStyleSheet(cachedStyleSheet, document ? document->securityOrigin() : 0); m_loading = false; if (m_parentStyleSheet) { m_parentStyleSheet->notifyLoadedSheet(cachedStyleSheet); m_parentStyleSheet->checkLoaded(); } }
void CSSParserImpl::parseStyleSheet(const String& string, const CSSParserContext& context, StyleSheetContents* styleSheet) { TRACE_EVENT_BEGIN2( "blink,blink_style", "CSSParserImpl::parseStyleSheet", "baseUrl", context.baseURL().string().utf8(), "mode", context.mode()); TRACE_EVENT_BEGIN0("blink,blink_style", "CSSParserImpl::parseStyleSheet.tokenize"); CSSTokenizer::Scope scope(string); TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.tokenize"); TRACE_EVENT_BEGIN0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse"); CSSParserImpl parser(context, styleSheet); bool firstRuleValid = parser.consumeRuleList(scope.tokenRange(), TopLevelRuleList, [&styleSheet](PassRefPtrWillBeRawPtr<StyleRuleBase> rule) { if (rule->isCharsetRule()) return; styleSheet->parserAppendRule(rule); }); styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse"); TRACE_EVENT_END2( "blink,blink_style", "CSSParserImpl::parseStyleSheet", "tokenCount", scope.tokenCount(), "length", string.length()); }
PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> BisonCSSParser::parseInlineStyleDeclaration(const String& string, Element* element) { Document& document = element->document(); CSSParserContext context = CSSParserContext(document.elementSheet().contents()->parserContext(), UseCounter::getFrom(&document)); context.setMode((element->isHTMLElement() && !document.inQuirksMode()) ? HTMLStandardMode : HTMLQuirksMode); return BisonCSSParser(context).parseDeclaration(string, document.elementSheet().contents()); }
PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> CSSParserImpl::parseInlineStyleDeclaration(const String& string, Element* element) { Document& document = element->document(); CSSParserContext context = CSSParserContext(document.elementSheet().contents()->parserContext(), UseCounter::getFrom(&document)); CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode() ? HTMLStandardMode : HTMLQuirksMode; context.setMode(mode); CSSParserImpl parser(context, document.elementSheet().contents()); CSSTokenizer::Scope scope(string); parser.consumeDeclarationList(scope.tokenRange(), StyleRule::Style); return createStylePropertySet(parser.m_parsedProperties, mode); }
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()); } } }
void UseCounter::count(CSSParserContext context, CSSPropertyID feature) { ASSERT(feature >= firstCSSProperty); ASSERT(feature <= lastUnresolvedCSSProperty); if (!isUseCounterEnabledForMode(context.mode())) return; m_CSSFeatureBits.quickSet(feature); }
PassRefPtrWillBeRawPtr<CSSValue> CSSParser::parseSingleValue(CSSPropertyID propertyID, const String& string, const CSSParserContext& context) { if (string.isEmpty()) return nullptr; if (RefPtrWillBeRawPtr<CSSValue> value = CSSParserFastPaths::maybeParseValue(propertyID, string, context.mode())) return value; RefPtrWillBeRawPtr<MutableStylePropertySet> stylePropertySet = MutableStylePropertySet::create(); bool changed = parseValue(stylePropertySet.get(), propertyID, string, false, context); ASSERT_UNUSED(changed, changed == stylePropertySet->hasProperty(propertyID)); return stylePropertySet->getPropertyCSSValue(propertyID); }
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()); } } }