From 3dc6f0bc4718f5f54f2d18119a0f9fe457c283a8 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 23 Sep 2021 20:15:26 +0200 Subject: [PATCH] LibWeb: Absolutize internal lengths in all StyleValues StyleValue now has a virtual visit_lengths() that allows us to update all CSS lengths during the absolutization phase. --- .../Libraries/LibWeb/CSS/StyleResolver.cpp | 13 +++++------ Userland/Libraries/LibWeb/CSS/StyleValue.h | 23 ++++++++++++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp b/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp index ccbee28a94..5c7217f6b4 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp @@ -818,13 +818,12 @@ void StyleResolver::absolutize_values(StyleProperties& style, DOM::Element const float root_font_size = 10; for (auto& it : style.properties()) { - if (!it.value->is_length()) - continue; - auto length = it.value->to_length(); - if (length.is_relative()) { - auto px = length.relative_length_to_px(viewport_rect, font_metrics, root_font_size); - it.value = LengthStyleValue::create(CSS::Length::make_px(px)); - } + it.value->visit_lengths([&](Length& length) { + if (length.is_absolute() || length.is_relative()) { + auto px = length.to_px(viewport_rect, font_metrics, root_font_size); + length = Length::make_px(px); + } + }); } } diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index 9433e8df86..0e275546f0 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -8,6 +8,7 @@ #pragma once +#include #include #include #include @@ -357,6 +358,8 @@ public: return to_string() == other.to_string(); } + virtual void visit_lengths(Function) { } + protected: explicit StyleValue(Type); @@ -514,12 +517,18 @@ private: m_is_elliptical = (m_horizontal_radius != m_vertical_radius); } + virtual void visit_lengths(Function visitor) override + { + visitor(m_horizontal_radius); + visitor(m_vertical_radius); + } + bool m_is_elliptical; Length m_horizontal_radius; Length m_vertical_radius; }; -class BoxShadowStyleValue : public StyleValue { +class BoxShadowStyleValue final : public StyleValue { public: static NonnullRefPtr create(Length const& offset_x, Length const& offset_y, Length const& blur_radius, Color const& color) { @@ -545,6 +554,13 @@ private: { } + virtual void visit_lengths(Function visitor) override + { + visitor(m_offset_x); + visitor(m_offset_y); + visitor(m_blur_radius); + } + Length m_offset_x; Length m_offset_y; Length m_blur_radius; @@ -964,6 +980,11 @@ private: { } + virtual void visit_lengths(Function visitor) override + { + visitor(m_length); + } + Length m_length; };