diff options
author | Sam Atkins <atkinssj@gmail.com> | 2021-08-16 16:07:13 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-16 23:26:16 +0200 |
commit | 0fba71a6550753e13d9561ab80f6885981b4aa70 (patch) | |
tree | 52154bcdbd1529c9236ae7bf670f36c652ae1ce3 | |
parent | ea2b02186c11fc3d077673064efb9ad003d9a2fb (diff) | |
download | serenity-0fba71a6550753e13d9561ab80f6885981b4aa70.zip |
LibWeb: Replace is_inherited_property() with generated code
We already include the inheritance for each property in Properties.json,
so made sense to use that instead of a list in StyleResolver.
Added `inherited: true` to a couple of properties to match the previous
code's behavior. One of those had a FIXME which I've moved to the JSON
file, which is hacky, but it works.
5 files changed, 36 insertions, 36 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/Properties.json b/Userland/Libraries/LibWeb/CSS/Properties.json index 2fbc714e01..92f47cc5c5 100644 --- a/Userland/Libraries/LibWeb/CSS/Properties.json +++ b/Userland/Libraries/LibWeb/CSS/Properties.json @@ -293,6 +293,7 @@ "initial": "normal" }, "list-style": { + "inherited": true, "longhands": [ "list-style-type", "list-style-position", @@ -422,7 +423,8 @@ "initial": "none" }, "text-decoration-line": { - "inherited": false, + "__comment": "FIXME: This property is not supposed to be inherited, but we currently rely on inheritance to propagate decorations into line boxes.", + "inherited": true, "initial": "none" }, "text-decoration-style": { diff --git a/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp b/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp index 7a5f9124f9..245dfa5aef 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp @@ -102,38 +102,6 @@ void StyleResolver::sort_matching_rules(Vector<MatchingRule>& matching_rules) co }); } -bool StyleResolver::is_inherited_property(CSS::PropertyID property_id) -{ - static HashTable<CSS::PropertyID> inherited_properties; - if (inherited_properties.is_empty()) { - inherited_properties.set(CSS::PropertyID::BorderCollapse); - inherited_properties.set(CSS::PropertyID::BorderSpacing); - inherited_properties.set(CSS::PropertyID::Color); - inherited_properties.set(CSS::PropertyID::FontFamily); - inherited_properties.set(CSS::PropertyID::FontSize); - inherited_properties.set(CSS::PropertyID::FontStyle); - inherited_properties.set(CSS::PropertyID::FontVariant); - inherited_properties.set(CSS::PropertyID::FontWeight); - inherited_properties.set(CSS::PropertyID::LetterSpacing); - inherited_properties.set(CSS::PropertyID::LineHeight); - inherited_properties.set(CSS::PropertyID::ListStyle); - inherited_properties.set(CSS::PropertyID::ListStyleImage); - inherited_properties.set(CSS::PropertyID::ListStylePosition); - inherited_properties.set(CSS::PropertyID::ListStyleType); - inherited_properties.set(CSS::PropertyID::TextAlign); - inherited_properties.set(CSS::PropertyID::TextIndent); - inherited_properties.set(CSS::PropertyID::TextTransform); - inherited_properties.set(CSS::PropertyID::Visibility); - inherited_properties.set(CSS::PropertyID::WhiteSpace); - inherited_properties.set(CSS::PropertyID::WordSpacing); - - // FIXME: This property is not supposed to be inherited, but we currently - // rely on inheritance to propagate decorations into line boxes. - inherited_properties.set(CSS::PropertyID::TextDecorationLine); - } - return inherited_properties.contains(property_id); -} - enum class Edge { Top, Right, diff --git a/Userland/Libraries/LibWeb/CSS/StyleResolver.h b/Userland/Libraries/LibWeb/CSS/StyleResolver.h index 7fa000c016..f21415706f 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleResolver.h +++ b/Userland/Libraries/LibWeb/CSS/StyleResolver.h @@ -41,8 +41,6 @@ public: CustomPropertyResolutionTuple resolve_custom_property_with_specificity(DOM::Element&, String const&) const; Optional<StyleProperty> resolve_custom_property(DOM::Element&, String const&) const; - static bool is_inherited_property(CSS::PropertyID); - private: template<typename Callback> void for_each_stylesheet(Callback) const; diff --git a/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_cpp.cpp b/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_cpp.cpp index ae65e8bea6..22937da989 100644 --- a/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_cpp.cpp +++ b/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_cpp.cpp @@ -82,7 +82,7 @@ const char* string_from_property_id(PropertyID property_id) { member_generator.append(R"~~~( case PropertyID::@name:titlecase@: return "@name@"; - )~~~"); +)~~~"); }); generator.append(R"~~~( @@ -91,6 +91,37 @@ const char* string_from_property_id(PropertyID property_id) { } } +bool is_inherited_property(PropertyID property_id) +{ + switch (property_id) { +)~~~"); + + json.value().as_object().for_each_member([&](auto& name, auto& value) { + VERIFY(value.is_object()); + + bool inherited = false; + if (value.as_object().has("inherited")) { + auto& inherited_value = value.as_object().get("inherited"); + VERIFY(inherited_value.is_bool()); + inherited = inherited_value.as_bool(); + } + + if (inherited) { + auto member_generator = generator.fork(); + member_generator.set("name:titlecase", title_casify(name)); + member_generator.append(R"~~~( + case PropertyID::@name:titlecase@: + return true; +)~~~"); + } + }); + + generator.append(R"~~~( + default: + return false; + } +} + bool is_pseudo_property(PropertyID property_id) { switch (property_id) { diff --git a/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_h.cpp b/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_h.cpp index aa54e166fd..89ad93c4d1 100644 --- a/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_h.cpp +++ b/Userland/Libraries/LibWeb/CodeGenerators/Generate_CSS_PropertyID_h.cpp @@ -71,6 +71,7 @@ enum class PropertyID { PropertyID property_id_from_string(const StringView&); const char* string_from_property_id(PropertyID); +bool is_inherited_property(PropertyID); bool is_pseudo_property(PropertyID); } // namespace Web::CSS |