summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-10-04 22:52:49 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-10-04 22:52:49 +0200
commit77218b1c2a226359569970486032f8fbff97686f (patch)
treec6b42a96174148e60bc087ed51e82321d838ff87
parent3feb452bf483c087316bf594faf46857ac2e3fa1 (diff)
downloadserenity-77218b1c2a226359569970486032f8fbff97686f.zip
LibHTML: Make CSS inheritance slightly less hacky
Add a simple is_inherited_property(name) lookup function and use that to implement CSS property inheritance. It's a bug that "text-decoration" is inherited, but we currently rely on this in order to propagate e.g underline into linkified line boxes.
-rw-r--r--Libraries/LibHTML/CSS/StyleResolver.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/Libraries/LibHTML/CSS/StyleResolver.cpp b/Libraries/LibHTML/CSS/StyleResolver.cpp
index 2d1119d9ea..c592574dc0 100644
--- a/Libraries/LibHTML/CSS/StyleResolver.cpp
+++ b/Libraries/LibHTML/CSS/StyleResolver.cpp
@@ -57,14 +57,46 @@ NonnullRefPtrVector<StyleRule> StyleResolver::collect_matching_rules(const Eleme
return matching_rules;
}
+static bool is_inherited_property(const StringView& name)
+{
+ static HashTable<String> inherited_properties;
+ if (inherited_properties.is_empty()) {
+ inherited_properties.set("border-collapse");
+ inherited_properties.set("border-spacing");
+ inherited_properties.set("color");
+ inherited_properties.set("font-family");
+ inherited_properties.set("font-size");
+ inherited_properties.set("font-style");
+ inherited_properties.set("font-variant");
+ inherited_properties.set("font-weight");
+ inherited_properties.set("font");
+ inherited_properties.set("letter-spacing");
+ inherited_properties.set("line-height");
+ inherited_properties.set("list-style-image");
+ inherited_properties.set("list-style-position");
+ inherited_properties.set("list-style-type");
+ inherited_properties.set("list-style");
+ inherited_properties.set("text-align");
+ inherited_properties.set("text-indent");
+ inherited_properties.set("text-transform");
+ inherited_properties.set("visibility");
+ inherited_properties.set("white-space");
+ inherited_properties.set("word-spacing");
+
+ // FIXME: This property is not supposed to be inherited, but we currently
+ // rely on inheritance to propagate decorations into line boxes.
+ inherited_properties.set("text-decoraton");
+ }
+ return inherited_properties.contains(name);
+}
+
NonnullRefPtr<StyleProperties> StyleResolver::resolve_style(const Element& element, const StyleProperties* parent_properties) const
{
auto style_properties = StyleProperties::create();
if (parent_properties) {
parent_properties->for_each_property([&](const StringView& name, auto& value) {
- // TODO: proper inheritance
- if (name.starts_with("font") || name == "white-space" || name == "color" || name == "text-decoration")
+ if (is_inherited_property(name))
style_properties->set_property(name, value);
});
}