Browse Source

LibWeb/CSS: Resolve value of "height" in special way according to spec

Per spec value of height should be resolved to used value if "display"
property is not "none" or "contents".
Aliaksandr Kalenik 1 year ago
parent
commit
7411f66fcf

+ 1 - 1
Tests/LibWeb/Text/expected/css/getComputedStyle-print-all.txt

@@ -81,7 +81,7 @@ grid-row-start: auto
 grid-template-areas: 
 grid-template-columns: 
 grid-template-rows: 
-height: auto
+height: 1411px
 image-rendering: auto
 inset-block-end: auto
 inset-block-start: auto

+ 14 - 4
Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp

@@ -270,11 +270,21 @@ RefPtr<StyleValue const> ResolvedCSSStyleDeclaration::style_value_for_property(L
         // -> padding-top
         // -> width
         // -> A resolved value special case property like height defined in another specification
-        // FIXME: If the property applies to the element or pseudo-element and the resolved value of the
-        //    display property is not none or contents, then the resolved value is the used value.
-        //    Otherwise the resolved value is the computed value.
-    case PropertyID::Height:
+    case PropertyID::Height: {
+        // If the property applies to the element or pseudo-element and the resolved value of the
+        // display property is not none or contents, then the resolved value is the used value.
+        // Otherwise the resolved value is the computed value.
+        auto const& display = layout_node.computed_values().display();
+        if (!display.is_none() && !display.is_contents() && layout_node.paintable()) {
+            if (layout_node.paintable()->is_paintable_box()) {
+                auto const& paintable_box = static_cast<Painting::PaintableBox const&>(*layout_node.paintable());
+                auto const used_height = paintable_box.content_height();
+                return style_value_for_size(Size::make_px(used_height));
+            }
+            dbgln("FIXME: Support getting used height for ({})", layout_node.debug_description());
+        }
         return style_value_for_size(layout_node.computed_values().height());
+    }
     case PropertyID::MarginBlockEnd:
         return style_value_for_length_box_logical_side(layout_node, layout_node.computed_values().margin(), LogicalSide::BlockEnd);
     case PropertyID::MarginBlockStart: