srctree

Robin Linden parent 98b4931e 393ed034
style: Handle weird display and float css property interactions

All inline-ish display values should be mapped to block-ish in thepresence of a float value that is not none.

inlinesplit
style/styled_node.cpp added: 26, removed: 5, total 21
@@ -311,6 +311,8 @@ gfx::Color StyledNode::get_color_property(css::PropertyId property) const {
return parse_color(color_text);
}
 
// https://developer.mozilla.org/en-US/docs/Web/CSS/float
// ^ has info about the weird float<->display property interaction.
DisplayValue StyledNode::get_display_property() const {
auto raw = get_raw_property(css::PropertyId::Display);
if (raw == "none") {
@@ -318,7 +320,11 @@ DisplayValue StyledNode::get_display_property() const {
}
 
if (raw == "inline") {
return DisplayValue::Inline;
if (get_property<css::PropertyId::Float>().value_or(Float::None) == Float::None) {
return DisplayValue::Inline;
}
 
return DisplayValue::Block;
}
 
if (raw == "block") {
 
style/styled_node_test.cpp added: 26, removed: 5, total 21
@@ -305,8 +305,23 @@ int main() {
expect_eq(styled_node.get_property<css::PropertyId::Display>(), style::DisplayValue::None);
});
 
etest::test("get_property, unhandled display value",
[] { expect_property_eq<css::PropertyId::Display>("i cant believe this", style::DisplayValue::Block); });
etest::test("get_property, display", [] {
expect_property_eq<css::PropertyId::Display>("inline", style::DisplayValue::Inline);
expect_property_eq<css::PropertyId::Display>("i cant believe this", style::DisplayValue::Block);
 
// Weird float interactions.
dom::Node dom_node = dom::Element{"dummy"s};
style::StyledNode styled{
.node = dom_node,
.properties{
{css::PropertyId::Display, "???"s},
{css::PropertyId::Float, "left"s},
},
};
 
styled.properties[0] = {css::PropertyId::Display, "inline"s};
expect_eq(styled.get_property<css::PropertyId::Display>(), style::DisplayValue::Block);
});
 
etest::test("get_property, border-style", [] {
expect_property_eq<css::PropertyId::BorderBottomStyle>("none", style::BorderStyle::None);