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.
This commit is contained in:
Tim Ledbetter 2024-08-22 10:36:03 +01:00 committed by Andreas Kling
parent 785180dd45
commit 2c5d626b21
Notes: github-actions[bot] 2024-08-22 11:50:33 +00:00
4 changed files with 27 additions and 1 deletions

View file

@ -0,0 +1 @@
element height: 10px

View file

@ -0,0 +1,11 @@
<script src="../include.js"></script>
<script>
test(() => {
const element = document.createElement("div");
element.style.width = "100px";
element.style.aspectRatio = ".0000000000001 / .00000000000001";
document.body.appendChild(element);
println(`element height: ${element.clientHeight}px`);
element.remove();
});
</script>

View file

@ -93,7 +93,7 @@ Optional<CSSPixelFraction> Box::preferred_aspect_ratio() const
if (ratio.is_degenerate())
return {};
return CSSPixelFraction(CSSPixels(ratio.numerator()), CSSPixels(ratio.denominator()));
return CSSPixelFraction(ratio.numerator(), ratio.denominator());
}
}

View file

@ -320,6 +320,20 @@ public:
VERIFY(denominator != 0);
}
template<FloatingPoint F>
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();