diff --git a/Tests/LibWeb/Layout/expected/css-font-size-calc.txt b/Tests/LibWeb/Layout/expected/css-font-size-calc.txt new file mode 100644 index 0000000000..8e8323a4cb --- /dev/null +++ b/Tests/LibWeb/Layout/expected/css-font-size-calc.txt @@ -0,0 +1,7 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x125.179687 [BFC] children: not-inline + BlockContainer
at (8,8) content-size 784x109.179687 children: inline + line 0 width: 644.628906, height: 109.179687, bottom: 109.179687, baseline: 84.570312 + frag 0 from TextNode start: 0, length: 13, rect: [8,8 644.628906x109.179687] + "Hello friends" + TextNode <#text> diff --git a/Tests/LibWeb/Layout/input/css-font-size-calc.html b/Tests/LibWeb/Layout/input/css-font-size-calc.html new file mode 100644 index 0000000000..cdac7fa314 --- /dev/null +++ b/Tests/LibWeb/Layout/input/css-font-size-calc.html @@ -0,0 +1,3 @@ +Hello friends \ No newline at end of file diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index db01248be3..20cd281dbb 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -1757,6 +1757,28 @@ void StyleComputer::compute_font(StyleProperties& style, DOM::Element const* ele // FIXME: Should be based on "user's default font size" float font_size_in_px = 16; + auto parent_line_height = parent_or_root_element_line_height(element, pseudo_element); + Gfx::FontPixelMetrics font_pixel_metrics; + if (parent_element && parent_element->computed_css_values()) + font_pixel_metrics = parent_element->computed_css_values()->computed_font().pixel_metrics(); + else + font_pixel_metrics = Platform::FontPlugin::the().default_font().pixel_metrics(); + auto parent_font_size = [&]() -> CSSPixels { + if (!parent_element || !parent_element->computed_css_values()) + return font_size_in_px; + auto value = parent_element->computed_css_values()->property(CSS::PropertyID::FontSize); + if (value->is_length()) { + auto length = value->as_length().length(); + auto parent_line_height = parent_or_root_element_line_height(parent_element, {}); + if (length.is_absolute() || length.is_relative()) { + Length::FontMetrics font_metrics { font_size_in_px, font_pixel_metrics, parent_line_height }; + return length.to_px(viewport_rect(), font_metrics, m_root_element_font_metrics); + } + } + return font_size_in_px; + }; + Length::FontMetrics font_metrics { parent_font_size(), font_pixel_metrics, parent_line_height }; + if (font_size->is_identifier()) { // https://w3c.github.io/csswg-drafts/css-fonts/#absolute-size-mapping AK::HashMap