From 0fba71a6550753e13d9561ab80f6885981b4aa70 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 16 Aug 2021 16:07:13 +0100 Subject: 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. --- Userland/Libraries/LibWeb/CSS/Properties.json | 4 ++- Userland/Libraries/LibWeb/CSS/StyleResolver.cpp | 32 --------------------- Userland/Libraries/LibWeb/CSS/StyleResolver.h | 2 -- .../CodeGenerators/Generate_CSS_PropertyID_cpp.cpp | 33 +++++++++++++++++++++- .../CodeGenerators/Generate_CSS_PropertyID_h.cpp | 1 + 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& matching_rules) co }); } -bool StyleResolver::is_inherited_property(CSS::PropertyID property_id) -{ - static HashTable 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 resolve_custom_property(DOM::Element&, String const&) const; - static bool is_inherited_property(CSS::PropertyID); - private: template 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 -- cgit v1.2.3