From 2c5d626b2125ffea49e06735e2f93279d0dfa0e1 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Thu, 22 Aug 2024 10:36:03 +0100 Subject: [PATCH] LibWeb: Don't crash when converting small CSS::Ratio to CSSPixelFraction Previously, a crash would occur in the if `CSSPixelFraction` was given a denominator value less than the resolution of `CSSPixels` (1/64). We now divide both parts of the ratio by the denominator in this case. --- .../Text/expected/css/small-aspect-ratio.txt | 1 + .../LibWeb/Text/input/css/small-aspect-ratio.html | 11 +++++++++++ Userland/Libraries/LibWeb/Layout/Box.cpp | 2 +- Userland/Libraries/LibWeb/PixelUnits.h | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/css/small-aspect-ratio.txt create mode 100644 Tests/LibWeb/Text/input/css/small-aspect-ratio.html diff --git a/Tests/LibWeb/Text/expected/css/small-aspect-ratio.txt b/Tests/LibWeb/Text/expected/css/small-aspect-ratio.txt new file mode 100644 index 00000000000..1bfe75352f4 --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/small-aspect-ratio.txt @@ -0,0 +1 @@ +element height: 10px diff --git a/Tests/LibWeb/Text/input/css/small-aspect-ratio.html b/Tests/LibWeb/Text/input/css/small-aspect-ratio.html new file mode 100644 index 00000000000..5c5b20088f3 --- /dev/null +++ b/Tests/LibWeb/Text/input/css/small-aspect-ratio.html @@ -0,0 +1,11 @@ + + diff --git a/Userland/Libraries/LibWeb/Layout/Box.cpp b/Userland/Libraries/LibWeb/Layout/Box.cpp index 97cf4061d2d..b1aeb1a691b 100644 --- a/Userland/Libraries/LibWeb/Layout/Box.cpp +++ b/Userland/Libraries/LibWeb/Layout/Box.cpp @@ -93,7 +93,7 @@ Optional Box::preferred_aspect_ratio() const if (ratio.is_degenerate()) return {}; - return CSSPixelFraction(CSSPixels(ratio.numerator()), CSSPixels(ratio.denominator())); + return CSSPixelFraction(ratio.numerator(), ratio.denominator()); } } diff --git a/Userland/Libraries/LibWeb/PixelUnits.h b/Userland/Libraries/LibWeb/PixelUnits.h index a3718c04e74..65aa2663c7e 100644 --- a/Userland/Libraries/LibWeb/PixelUnits.h +++ b/Userland/Libraries/LibWeb/PixelUnits.h @@ -320,6 +320,20 @@ public: VERIFY(denominator != 0); } + template + constexpr CSSPixelFraction(F numerator, F denominator = 1) + { + if (CSSPixels::nearest_value_for(denominator) == 0) { + numerator = numerator / denominator; + denominator = 1; + } + + m_numerator = CSSPixels(numerator); + m_denominator = CSSPixels(denominator); + + VERIFY(denominator != 0); + } + constexpr operator CSSPixels() const { i64 wide_value = m_numerator.raw_value();