Commit 987b239e authored by Rob Buis's avatar Rob Buis Committed by Commit Bot

Add buckets for MathML and SVG UA default style rules

Add buckets for MathML and SVG UA default style rules in order
to reduce overhead of universal selector matching for HTML elements.
SVG UA sheet only has one universal selector but MathML plans on adding
more than one. Note that this adds buckets for visual style
rules but printing is unchanged as performance is less crucial there.

Bug: 1071357

Change-Id: I3a0a3280dc4e7ca818a9cb05711fd9553ce737b6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2150425
Commit-Queue: Rob Buis <rbuis@igalia.com>
Reviewed-by: default avatarRune Lillesveen <futhark@chromium.org>
Reviewed-by: default avatarFrédéric Wang <fwang@igalia.com>
Cr-Commit-Position: refs/heads/master@{#759985}
parent f5ad9af8
......@@ -108,10 +108,14 @@ CSSDefaultStyleSheets::CSSDefaultStyleSheets()
#if DCHECK_IS_ON()
default_style_->CompactRulesIfNeeded();
default_mathml_style_->CompactRulesIfNeeded();
default_svg_style_->CompactRulesIfNeeded();
default_quirks_style_->CompactRulesIfNeeded();
default_print_style_->CompactRulesIfNeeded();
default_forced_color_style_->CompactRulesIfNeeded();
DCHECK(default_style_->UniversalRules()->IsEmpty());
DCHECK(default_mathml_style_->UniversalRules()->IsEmpty());
DCHECK(default_svg_style_->UniversalRules()->IsEmpty());
DCHECK(default_quirks_style_->UniversalRules()->IsEmpty());
DCHECK(default_print_style_->UniversalRules()->IsEmpty());
DCHECK(default_forced_color_style_->UniversalRules()->IsEmpty());
......@@ -142,6 +146,8 @@ void CSSDefaultStyleSheets::PrepareForLeakDetection() {
void CSSDefaultStyleSheets::InitializeDefaultStyles() {
// This must be called only from constructor / PrepareForLeakDetection.
default_style_ = MakeGarbageCollected<RuleSet>();
default_mathml_style_ = MakeGarbageCollected<RuleSet>();
default_svg_style_ = MakeGarbageCollected<RuleSet>();
default_quirks_style_ = MakeGarbageCollected<RuleSet>();
default_print_style_ = MakeGarbageCollected<RuleSet>();
default_forced_color_style_ = MakeGarbageCollected<RuleSet>();
......@@ -206,7 +212,7 @@ bool CSSDefaultStyleSheets::EnsureDefaultStyleSheetsForElement(
if (element.IsSVGElement() && !svg_style_sheet_) {
svg_style_sheet_ =
ParseUASheet(UncompressResourceAsASCIIString(IDR_UASTYLE_SVG_CSS));
default_style_->AddRulesFromSheet(SvgStyleSheet(), ScreenEval());
default_svg_style_->AddRulesFromSheet(SvgStyleSheet(), ScreenEval());
default_print_style_->AddRulesFromSheet(SvgStyleSheet(), PrintEval());
default_forced_color_style_->AddRulesFromSheet(SvgStyleSheet(),
ForcedColorsEval());
......@@ -220,7 +226,7 @@ bool CSSDefaultStyleSheets::EnsureDefaultStyleSheetsForElement(
RuntimeEnabledFeatures::MathMLCoreEnabled()
? UncompressResourceAsASCIIString(IDR_UASTYLE_MATHML_CSS)
: UncompressResourceAsASCIIString(IDR_UASTYLE_MATHML_FALLBACK_CSS));
default_style_->AddRulesFromSheet(MathmlStyleSheet(), ScreenEval());
default_mathml_style_->AddRulesFromSheet(MathmlStyleSheet(), ScreenEval());
default_print_style_->AddRulesFromSheet(MathmlStyleSheet(), PrintEval());
changed_default_style = true;
}
......@@ -312,6 +318,8 @@ void CSSDefaultStyleSheets::EnsureDefaultStyleSheetForFullscreen() {
void CSSDefaultStyleSheets::Trace(Visitor* visitor) {
visitor->Trace(default_style_);
visitor->Trace(default_mathml_style_);
visitor->Trace(default_svg_style_);
visitor->Trace(default_quirks_style_);
visitor->Trace(default_print_style_);
visitor->Trace(default_view_source_style_);
......
......@@ -48,6 +48,8 @@ class CSSDefaultStyleSheets final
void EnsureDefaultStyleSheetForFullscreen();
RuleSet* DefaultStyle() { return default_style_.Get(); }
RuleSet* DefaultMathMLStyle() { return default_mathml_style_.Get(); }
RuleSet* DefaultSVGStyle() { return default_svg_style_.Get(); }
RuleSet* DefaultQuirksStyle() { return default_quirks_style_.Get(); }
RuleSet* DefaultPrintStyle() { return default_print_style_.Get(); }
RuleSet* DefaultViewSourceStyle();
......@@ -94,6 +96,8 @@ class CSSDefaultStyleSheets final
void InitializeDefaultStyles();
Member<RuleSet> default_style_;
Member<RuleSet> default_mathml_style_;
Member<RuleSet> default_svg_style_;
Member<RuleSet> default_quirks_style_;
Member<RuleSet> default_print_style_;
Member<RuleSet> default_view_source_style_;
......
......@@ -90,6 +90,7 @@
#include "third_party/blink/renderer/core/html/track/vtt/vtt_cue.h"
#include "third_party/blink/renderer/core/html/track/vtt/vtt_element.h"
#include "third_party/blink/renderer/core/html_names.h"
#include "third_party/blink/renderer/core/mathml_names.h"
#include "third_party/blink/renderer/core/media_type_names.h"
#include "third_party/blink/renderer/core/probe/core_probes.h"
#include "third_party/blink/renderer/core/style/style_inherited_variables.h"
......@@ -608,15 +609,22 @@ void StyleResolver::MatchUserRules(ElementRuleCollector& collector) {
collector.FinishAddingUserRules();
}
void StyleResolver::MatchUARules(ElementRuleCollector& collector) {
void StyleResolver::MatchUARules(const Element& element,
ElementRuleCollector& collector) {
collector.SetMatchingUARules(true);
CSSDefaultStyleSheets& default_style_sheets =
CSSDefaultStyleSheets::Instance();
RuleSet* user_agent_style_sheet =
print_media_type_ ? default_style_sheets.DefaultPrintStyle()
: default_style_sheets.DefaultStyle();
MatchRuleSet(collector, user_agent_style_sheet);
if (!print_media_type_) {
if (LIKELY(element.IsHTMLElement() || element.IsVTTElement()))
MatchRuleSet(collector, default_style_sheets.DefaultStyle());
else if (element.IsSVGElement())
MatchRuleSet(collector, default_style_sheets.DefaultSVGStyle());
else if (element.namespaceURI() == mathml_names::kNamespaceURI)
MatchRuleSet(collector, default_style_sheets.DefaultMathMLStyle());
} else {
MatchRuleSet(collector, default_style_sheets.DefaultPrintStyle());
}
// In quirks mode, we match rules from the quirks user agent sheet.
if (GetDocument().InQuirksMode())
......@@ -647,7 +655,7 @@ DISABLE_CFI_PERF
void StyleResolver::MatchAllRules(StyleResolverState& state,
ElementRuleCollector& collector,
bool include_smil_properties) {
MatchUARules(collector);
MatchUARules(state.GetElement(), collector);
MatchUserRules(collector);
// Now check author rules, beginning first with presentational attributes
......@@ -1102,7 +1110,7 @@ bool StyleResolver::PseudoStyleForElementInternal(
}
}
MatchUARules(collector);
MatchUARules(state.GetElement(), collector);
MatchUserRules(collector);
MatchAuthorRules(state.GetElement(), collector);
collector.FinishAddingAuthorRulesForTreeScope();
......@@ -1342,7 +1350,7 @@ void StyleResolver::CollectPseudoRulesForElement(
collector.SetPseudoElementStyleRequest(PseudoElementStyleRequest(pseudo_id));
if (rules_to_include & kUAAndUserCSSRules) {
MatchUARules(collector);
MatchUARules(element, collector);
MatchUserRules(collector);
}
......
......@@ -160,7 +160,7 @@ class CORE_EXPORT StyleResolver final : public GarbageCollected<StyleResolver> {
PseudoId,
unsigned rules_to_include);
void MatchRuleSet(ElementRuleCollector&, RuleSet*);
void MatchUARules(ElementRuleCollector&);
void MatchUARules(const Element&, ElementRuleCollector&);
void MatchUserRules(ElementRuleCollector&);
// This matches `::part` selectors. It looks in ancestor scopes as far as
// part mapping requires.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment