LibWeb: Avoid division by zero with small aspect ratios
Some checks are pending
CI / macOS, arm64, Sanitizer, Clang (push) Waiting to run
CI / Linux, x86_64, Fuzzers, Clang (push) Waiting to run
CI / Linux, x86_64, Sanitizer, GNU (push) Waiting to run
CI / Linux, x86_64, Sanitizer, Clang (push) Waiting to run
Package the js repl as a binary artifact / Linux, arm64 (push) Waiting to run
Package the js repl as a binary artifact / macOS, arm64 (push) Waiting to run
Package the js repl as a binary artifact / Linux, x86_64 (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Label PRs with merge conflicts / auto-labeler (push) Waiting to run
Push notes / build (push) Waiting to run

This commit is contained in:
Tim Ledbetter 2025-07-13 01:06:12 +01:00 committed by Alexander Kalenik
commit 5478361ba0
Notes: github-actions[bot] 2025-07-13 03:42:58 +00:00
4 changed files with 18 additions and 7 deletions

View file

@ -1609,6 +1609,8 @@ CSSPixels FormattingContext::calculate_inner_width(Layout::Box const& box, Avail
CSSPixels FormattingContext::calculate_inner_height(Box const& box, AvailableSpace const& available_space, CSS::Size const& height) const CSSPixels FormattingContext::calculate_inner_height(Box const& box, AvailableSpace const& available_space, CSS::Size const& height) const
{ {
if (height.is_auto() && box.has_preferred_aspect_ratio()) { if (height.is_auto() && box.has_preferred_aspect_ratio()) {
if (*box.preferred_aspect_ratio() == 0)
return CSSPixels(0);
return m_state.get(box).content_width() / *box.preferred_aspect_ratio(); return m_state.get(box).content_width() / *box.preferred_aspect_ratio();
} }

View file

@ -604,7 +604,7 @@ void LayoutState::UsedValues::set_node(NodeWithStyle& node, UsedValues const* co
if (m_has_definite_width && m_has_definite_height) { if (m_has_definite_width && m_has_definite_height) {
// Both width and height are definite. // Both width and height are definite.
} else if (m_has_definite_width) { } else if (m_has_definite_width) {
m_content_height = clamp_to_max_dimension_value(m_content_width / *aspect_ratio); m_content_height = *aspect_ratio == 0 ? 0 : clamp_to_max_dimension_value(m_content_width / *aspect_ratio);
m_has_definite_height = true; m_has_definite_height = true;
} else if (m_has_definite_height) { } else if (m_has_definite_height) {
m_content_width = clamp_to_max_dimension_value(m_content_height * *aspect_ratio); m_content_width = clamp_to_max_dimension_value(m_content_height * *aspect_ratio);

View file

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

View file

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