mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-09 01:29:17 +00:00
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:
parent
785180dd45
commit
2c5d626b21
Notes:
github-actions[bot]
2024-08-22 11:50:33 +00:00
Author: https://github.com/tcl3
Commit: 2c5d626b21
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1160
4 changed files with 27 additions and 1 deletions
1
Tests/LibWeb/Text/expected/css/small-aspect-ratio.txt
Normal file
1
Tests/LibWeb/Text/expected/css/small-aspect-ratio.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
element height: 10px
|
11
Tests/LibWeb/Text/input/css/small-aspect-ratio.html
Normal file
11
Tests/LibWeb/Text/input/css/small-aspect-ratio.html
Normal 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>
|
|
@ -93,7 +93,7 @@ Optional<CSSPixelFraction> Box::preferred_aspect_ratio() const
|
||||||
if (ratio.is_degenerate())
|
if (ratio.is_degenerate())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
return CSSPixelFraction(CSSPixels(ratio.numerator()), CSSPixels(ratio.denominator()));
|
return CSSPixelFraction(ratio.numerator(), ratio.denominator());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,6 +320,20 @@ public:
|
||||||
VERIFY(denominator != 0);
|
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
|
constexpr operator CSSPixels() const
|
||||||
{
|
{
|
||||||
i64 wide_value = m_numerator.raw_value();
|
i64 wide_value = m_numerator.raw_value();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue