mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 04:09:13 +00:00
LibWeb: Make CSSRule::type()
non-virtual
All its overrides return constants, and without virtual dispatch the `qualified_layer_name` and `absolutized_selectors` functions can benefit from slightly better optimizations. `CSSRule`s aren't allocated that often, so the memory impact is minimal.
This commit is contained in:
parent
2f41be733f
commit
5c1bbd3eff
Notes:
github-actions[bot]
2024-10-28 21:56:20 +00:00
Author: https://github.com/yyny
Commit: 5c1bbd3eff
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2025
30 changed files with 23 additions and 42 deletions
|
@ -11,8 +11,8 @@
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
|
||||||
CSSConditionRule::CSSConditionRule(JS::Realm& realm, CSSRuleList& rules)
|
CSSConditionRule::CSSConditionRule(JS::Realm& realm, CSSRuleList& rules, Type type)
|
||||||
: CSSGroupingRule(realm, rules)
|
: CSSGroupingRule(realm, rules, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ public:
|
||||||
virtual void for_each_effective_rule(TraversalOrder, Function<void(CSSRule const&)> const& callback) const override;
|
virtual void for_each_effective_rule(TraversalOrder, Function<void(CSSRule const&)> const& callback) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CSSConditionRule(JS::Realm&, CSSRuleList&);
|
CSSConditionRule(JS::Realm&, CSSRuleList&, Type);
|
||||||
|
|
||||||
virtual void initialize(JS::Realm&) override;
|
virtual void initialize(JS::Realm&) override;
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,7 +23,7 @@ JS::NonnullGCPtr<CSSFontFaceRule> CSSFontFaceRule::create(JS::Realm& realm, Pars
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSFontFaceRule::CSSFontFaceRule(JS::Realm& realm, ParsedFontFace&& font_face)
|
CSSFontFaceRule::CSSFontFaceRule(JS::Realm& realm, ParsedFontFace&& font_face)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::FontFace)
|
||||||
, m_font_face(move(font_face))
|
, m_font_face(move(font_face))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSFontFaceRule() override = default;
|
virtual ~CSSFontFaceRule() override = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::FontFace; }
|
|
||||||
|
|
||||||
ParsedFontFace const& font_face() const { return m_font_face; }
|
ParsedFontFace const& font_face() const { return m_font_face; }
|
||||||
CSSStyleDeclaration* style();
|
CSSStyleDeclaration* style();
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
|
||||||
CSSGroupingRule::CSSGroupingRule(JS::Realm& realm, CSSRuleList& rules)
|
CSSGroupingRule::CSSGroupingRule(JS::Realm& realm, CSSRuleList& rules, Type type)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, type)
|
||||||
, m_rules(rules)
|
, m_rules(rules)
|
||||||
{
|
{
|
||||||
for (auto& rule : *m_rules)
|
for (auto& rule : *m_rules)
|
||||||
|
|
|
@ -31,7 +31,7 @@ public:
|
||||||
virtual void set_parent_style_sheet(CSSStyleSheet*) override;
|
virtual void set_parent_style_sheet(CSSStyleSheet*) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CSSGroupingRule(JS::Realm&, CSSRuleList&);
|
CSSGroupingRule(JS::Realm&, CSSRuleList&, Type);
|
||||||
|
|
||||||
virtual void initialize(JS::Realm&) override;
|
virtual void initialize(JS::Realm&) override;
|
||||||
virtual void visit_edges(Cell::Visitor&) override;
|
virtual void visit_edges(Cell::Visitor&) override;
|
||||||
|
|
|
@ -29,7 +29,7 @@ JS::NonnullGCPtr<CSSImportRule> CSSImportRule::create(URL::URL url, DOM::Documen
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSImportRule::CSSImportRule(URL::URL url, DOM::Document& document)
|
CSSImportRule::CSSImportRule(URL::URL url, DOM::Document& document)
|
||||||
: CSSRule(document.realm())
|
: CSSRule(document.realm(), Type::Import)
|
||||||
, m_url(move(url))
|
, m_url(move(url))
|
||||||
, m_document(document)
|
, m_document(document)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,8 +36,6 @@ public:
|
||||||
CSSStyleSheet* style_sheet_for_bindings() { return m_style_sheet; }
|
CSSStyleSheet* style_sheet_for_bindings() { return m_style_sheet; }
|
||||||
void set_style_sheet(CSSStyleSheet* style_sheet) { m_style_sheet = style_sheet; }
|
void set_style_sheet(CSSStyleSheet* style_sheet) { m_style_sheet = style_sheet; }
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Import; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CSSImportRule(URL::URL, DOM::Document&);
|
CSSImportRule(URL::URL, DOM::Document&);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSKeyframeRule> CSSKeyframeRule::create(JS::Realm& realm, CSS:
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSKeyframeRule::CSSKeyframeRule(JS::Realm& realm, CSS::Percentage key, PropertyOwningCSSStyleDeclaration& declarations)
|
CSSKeyframeRule::CSSKeyframeRule(JS::Realm& realm, CSS::Percentage key, PropertyOwningCSSStyleDeclaration& declarations)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::Keyframe)
|
||||||
, m_key(key)
|
, m_key(key)
|
||||||
, m_declarations(declarations)
|
, m_declarations(declarations)
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,8 +25,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSKeyframeRule() = default;
|
virtual ~CSSKeyframeRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Keyframe; }
|
|
||||||
|
|
||||||
CSS::Percentage key() const { return m_key; }
|
CSS::Percentage key() const { return m_key; }
|
||||||
JS::NonnullGCPtr<CSSStyleDeclaration> style() const { return m_declarations; }
|
JS::NonnullGCPtr<CSSStyleDeclaration> style() const { return m_declarations; }
|
||||||
JS::NonnullGCPtr<PropertyOwningCSSStyleDeclaration> style_as_property_owning_style_declaration() const { return m_declarations; }
|
JS::NonnullGCPtr<PropertyOwningCSSStyleDeclaration> style_as_property_owning_style_declaration() const { return m_declarations; }
|
||||||
|
|
|
@ -20,7 +20,7 @@ JS::NonnullGCPtr<CSSKeyframesRule> CSSKeyframesRule::create(JS::Realm& realm, Fl
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSKeyframesRule::CSSKeyframesRule(JS::Realm& realm, FlyString name, JS::NonnullGCPtr<CSSRuleList> keyframes)
|
CSSKeyframesRule::CSSKeyframesRule(JS::Realm& realm, FlyString name, JS::NonnullGCPtr<CSSRuleList> keyframes)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::Keyframes)
|
||||||
, m_name(move(name))
|
, m_name(move(name))
|
||||||
, m_rules(move(keyframes))
|
, m_rules(move(keyframes))
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,8 +28,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSKeyframesRule() = default;
|
virtual ~CSSKeyframesRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Keyframes; }
|
|
||||||
|
|
||||||
auto const& css_rules() const { return m_rules; }
|
auto const& css_rules() const { return m_rules; }
|
||||||
FlyString const& name() const { return m_name; }
|
FlyString const& name() const { return m_name; }
|
||||||
[[nodiscard]] WebIDL::UnsignedLong length() const;
|
[[nodiscard]] WebIDL::UnsignedLong length() const;
|
||||||
|
|
|
@ -25,7 +25,7 @@ FlyString CSSLayerBlockRule::next_unique_anonymous_layer_name()
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSLayerBlockRule::CSSLayerBlockRule(JS::Realm& realm, FlyString name, CSSRuleList& rules)
|
CSSLayerBlockRule::CSSLayerBlockRule(JS::Realm& realm, FlyString name, CSSRuleList& rules)
|
||||||
: CSSGroupingRule(realm, rules)
|
: CSSGroupingRule(realm, rules, Type::LayerBlock)
|
||||||
, m_name(move(name))
|
, m_name(move(name))
|
||||||
{
|
{
|
||||||
if (m_name.is_empty()) {
|
if (m_name.is_empty()) {
|
||||||
|
|
|
@ -22,8 +22,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSLayerBlockRule() = default;
|
virtual ~CSSLayerBlockRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::LayerBlock; }
|
|
||||||
|
|
||||||
FlyString const& name() const { return m_name; }
|
FlyString const& name() const { return m_name; }
|
||||||
FlyString const& internal_name() const { return m_name_internal; }
|
FlyString const& internal_name() const { return m_name_internal; }
|
||||||
FlyString internal_qualified_name(Badge<StyleComputer>) const;
|
FlyString internal_qualified_name(Badge<StyleComputer>) const;
|
||||||
|
|
|
@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSLayerStatementRule> CSSLayerStatementRule::create(JS::Realm&
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSLayerStatementRule::CSSLayerStatementRule(JS::Realm& realm, Vector<FlyString> name_list)
|
CSSLayerStatementRule::CSSLayerStatementRule(JS::Realm& realm, Vector<FlyString> name_list)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::LayerStatement)
|
||||||
, m_name_list(move(name_list))
|
, m_name_list(move(name_list))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSLayerStatementRule() = default;
|
virtual ~CSSLayerStatementRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::LayerStatement; }
|
|
||||||
|
|
||||||
// FIXME: Should be FrozenArray
|
// FIXME: Should be FrozenArray
|
||||||
ReadonlySpan<FlyString> name_list() const { return m_name_list; }
|
ReadonlySpan<FlyString> name_list() const { return m_name_list; }
|
||||||
Vector<FlyString> internal_qualified_name_list(Badge<StyleComputer>) const;
|
Vector<FlyString> internal_qualified_name_list(Badge<StyleComputer>) const;
|
||||||
|
|
|
@ -20,7 +20,7 @@ JS::NonnullGCPtr<CSSMediaRule> CSSMediaRule::create(JS::Realm& realm, MediaList&
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSMediaRule::CSSMediaRule(JS::Realm& realm, MediaList& media, CSSRuleList& rules)
|
CSSMediaRule::CSSMediaRule(JS::Realm& realm, MediaList& media, CSSRuleList& rules)
|
||||||
: CSSConditionRule(realm, rules)
|
: CSSConditionRule(realm, rules, Type::Media)
|
||||||
, m_media(media)
|
, m_media(media)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSMediaRule() = default;
|
virtual ~CSSMediaRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Media; }
|
|
||||||
|
|
||||||
virtual String condition_text() const override;
|
virtual String condition_text() const override;
|
||||||
virtual bool condition_matches() const override { return m_media->matches(); }
|
virtual bool condition_matches() const override { return m_media->matches(); }
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace Web::CSS {
|
||||||
JS_DEFINE_ALLOCATOR(CSSNamespaceRule);
|
JS_DEFINE_ALLOCATOR(CSSNamespaceRule);
|
||||||
|
|
||||||
CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional<FlyString> prefix, FlyString namespace_uri)
|
CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional<FlyString> prefix, FlyString namespace_uri)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::Namespace)
|
||||||
, m_namespace_uri(move(namespace_uri))
|
, m_namespace_uri(move(namespace_uri))
|
||||||
, m_prefix(prefix.value_or(""_fly_string))
|
, m_prefix(prefix.value_or(""_fly_string))
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,6 @@ public:
|
||||||
FlyString const& namespace_uri() const { return m_namespace_uri; }
|
FlyString const& namespace_uri() const { return m_namespace_uri; }
|
||||||
void set_prefix(FlyString value) { m_prefix = move(value); }
|
void set_prefix(FlyString value) { m_prefix = move(value); }
|
||||||
FlyString const& prefix() const { return m_prefix; }
|
FlyString const& prefix() const { return m_prefix; }
|
||||||
virtual Type type() const override { return Type::Namespace; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CSSNamespaceRule(JS::Realm&, Optional<FlyString> prefix, FlyString namespace_uri);
|
CSSNamespaceRule(JS::Realm&, Optional<FlyString> prefix, FlyString namespace_uri);
|
||||||
|
|
|
@ -18,7 +18,7 @@ JS::NonnullGCPtr<CSSNestedDeclarations> CSSNestedDeclarations::create(JS::Realm&
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSNestedDeclarations::CSSNestedDeclarations(JS::Realm& realm, PropertyOwningCSSStyleDeclaration& declaration)
|
CSSNestedDeclarations::CSSNestedDeclarations(JS::Realm& realm, PropertyOwningCSSStyleDeclaration& declaration)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::NestedDeclarations)
|
||||||
, m_declaration(declaration)
|
, m_declaration(declaration)
|
||||||
{
|
{
|
||||||
m_declaration->set_parent_rule(*this);
|
m_declaration->set_parent_rule(*this);
|
||||||
|
|
|
@ -19,7 +19,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSNestedDeclarations() override = default;
|
virtual ~CSSNestedDeclarations() override = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::NestedDeclarations; }
|
|
||||||
PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; }
|
PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; }
|
||||||
|
|
||||||
CSSStyleDeclaration* style();
|
CSSStyleDeclaration* style();
|
||||||
|
|
|
@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSPropertyRule> CSSPropertyRule::create(JS::Realm& realm, FlyS
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSPropertyRule::CSSPropertyRule(JS::Realm& realm, FlyString name, FlyString syntax, bool inherits, Optional<String> initial_value)
|
CSSPropertyRule::CSSPropertyRule(JS::Realm& realm, FlyString name, FlyString syntax, bool inherits, Optional<String> initial_value)
|
||||||
: CSSRule(realm)
|
: CSSRule(realm, Type::Property)
|
||||||
, m_name(move(name))
|
, m_name(move(name))
|
||||||
, m_syntax(move(syntax))
|
, m_syntax(move(syntax))
|
||||||
, m_inherits(inherits)
|
, m_inherits(inherits)
|
||||||
|
|
|
@ -25,7 +25,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSPropertyRule() = default;
|
virtual ~CSSPropertyRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Property; }
|
|
||||||
FlyString const& name() const { return m_name; }
|
FlyString const& name() const { return m_name; }
|
||||||
FlyString const& syntax() const { return m_syntax; }
|
FlyString const& syntax() const { return m_syntax; }
|
||||||
bool inherits() const { return m_inherits; }
|
bool inherits() const { return m_inherits; }
|
||||||
|
|
|
@ -13,8 +13,9 @@
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
|
||||||
CSSRule::CSSRule(JS::Realm& realm)
|
CSSRule::CSSRule(JS::Realm& realm, Type type)
|
||||||
: PlatformObject(realm)
|
: PlatformObject(realm)
|
||||||
|
, m_type(type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
Property = 103, // FIXME: This should return `0` as a type, but type is used for a lot of dispatching
|
Property = 103, // FIXME: This should return `0` as a type, but type is used for a lot of dispatching
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual Type type() const = 0;
|
Type type() const { return m_type; }
|
||||||
|
|
||||||
String css_text() const;
|
String css_text() const;
|
||||||
void set_css_text(StringView);
|
void set_css_text(StringView);
|
||||||
|
@ -57,7 +57,7 @@ public:
|
||||||
virtual String serialized() const = 0;
|
virtual String serialized() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit CSSRule(JS::Realm&);
|
explicit CSSRule(JS::Realm&, Type);
|
||||||
|
|
||||||
virtual void visit_edges(Cell::Visitor&) override;
|
virtual void visit_edges(Cell::Visitor&) override;
|
||||||
|
|
||||||
|
@ -72,6 +72,7 @@ protected:
|
||||||
|
|
||||||
[[nodiscard]] FlyString const& parent_layer_internal_qualified_name_slow_case() const;
|
[[nodiscard]] FlyString const& parent_layer_internal_qualified_name_slow_case() const;
|
||||||
|
|
||||||
|
Type m_type;
|
||||||
JS::GCPtr<CSSRule> m_parent_rule;
|
JS::GCPtr<CSSRule> m_parent_rule;
|
||||||
JS::GCPtr<CSSStyleSheet> m_parent_style_sheet;
|
JS::GCPtr<CSSStyleSheet> m_parent_style_sheet;
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ JS::NonnullGCPtr<CSSStyleRule> CSSStyleRule::create(JS::Realm& realm, SelectorLi
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSStyleRule::CSSStyleRule(JS::Realm& realm, SelectorList&& selectors, PropertyOwningCSSStyleDeclaration& declaration, CSSRuleList& nested_rules)
|
CSSStyleRule::CSSStyleRule(JS::Realm& realm, SelectorList&& selectors, PropertyOwningCSSStyleDeclaration& declaration, CSSRuleList& nested_rules)
|
||||||
: CSSGroupingRule(realm, nested_rules)
|
: CSSGroupingRule(realm, nested_rules, Type::Style)
|
||||||
, m_selectors(move(selectors))
|
, m_selectors(move(selectors))
|
||||||
, m_declaration(declaration)
|
, m_declaration(declaration)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,8 +27,6 @@ public:
|
||||||
SelectorList const& absolutized_selectors() const;
|
SelectorList const& absolutized_selectors() const;
|
||||||
PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; }
|
PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; }
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Style; }
|
|
||||||
|
|
||||||
String selector_text() const;
|
String selector_text() const;
|
||||||
void set_selector_text(StringView);
|
void set_selector_text(StringView);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSSupportsRule> CSSSupportsRule::create(JS::Realm& realm, Nonn
|
||||||
}
|
}
|
||||||
|
|
||||||
CSSSupportsRule::CSSSupportsRule(JS::Realm& realm, NonnullRefPtr<Supports>&& supports, CSSRuleList& rules)
|
CSSSupportsRule::CSSSupportsRule(JS::Realm& realm, NonnullRefPtr<Supports>&& supports, CSSRuleList& rules)
|
||||||
: CSSConditionRule(realm, rules)
|
: CSSConditionRule(realm, rules, Type::Supports)
|
||||||
, m_supports(move(supports))
|
, m_supports(move(supports))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,6 @@ public:
|
||||||
|
|
||||||
virtual ~CSSSupportsRule() = default;
|
virtual ~CSSSupportsRule() = default;
|
||||||
|
|
||||||
virtual Type type() const override { return Type::Supports; }
|
|
||||||
|
|
||||||
String condition_text() const override;
|
String condition_text() const override;
|
||||||
virtual bool condition_matches() const override { return m_supports->matches(); }
|
virtual bool condition_matches() const override { return m_supports->matches(); }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue