LibWeb/Layout: Don't inject natural size in prepare_for_replaced_layout

Instead, compute them on demand. This affects ReplacedBox and its
subclasses.

This commit is centered around a new Box::auto_content_box_size
method. It returns a SizeWithAspectRatio representing the natural
size of a replaced element, or the size derived from attributes
for text input and textarea. These values are used when the
corresponding axis is auto or indefinite.

Although introducing this API choke-point for sizing replaced and
replaced-like elements was the main goal, it's notable that layout
becomes more robust in the face of dynamic changes due to reduced
potential for stale size values (at the cost of extra calculations
and allocations).
This commit is contained in:
Jonathan Gamble
2026-01-11 00:31:07 -06:00
committed by Sam Atkins
parent b8ee6ec476
commit ec50525675
Notes: github-actions[bot] 2026-02-06 10:41:24 +00:00
32 changed files with 293 additions and 190 deletions

View File

@@ -0,0 +1,44 @@
<!DOCTYPE html>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
<head>
<meta charset="utf-8">
<title>CSS Test: various 'object-position' values on a fixed-size object element, with a SVG image and 'object-fit:contain'.</title>
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
<link rel="help" href="http://www.w3.org/TR/css3-images/#sizing">
<link rel="help" href="http://www.w3.org/TR/css3-images/#the-object-fit">
<link rel="help" href="http://www.w3.org/TR/css3-images/#the-object-position">
<link rel="match" href="../../../../expected/wpt-import/css/css-images/object-position-svg-001-ref.html">
<style type="text/css">
object {
background: lightgray;
margin-right: 2px;
object-fit: contain;
float: left;
width: 20px;
height: 20px;
}
.op_y-7 { object-position: 50% -7% }
.op_y13 { object-position: 50% 13% }
.op_y23 { object-position: 50% 23% }
.op_y50 { object-position: 50% 50% }
.op_y75 { object-position: 50% 75% }
.op_y88 { object-position: 50% 88% }
.op_y111 { object-position: 50% 111% }
</style>
</head>
<body>
<object data="support/colors-16x8.svg" class="op_y-7"></object>
<object data="support/colors-16x8.svg" class="op_y13"></object>
<object data="support/colors-16x8.svg" class="op_y23"></object>
<object data="support/colors-16x8.svg" class="op_y50"></object>
<object data="support/colors-16x8.svg" class="op_y75"></object>
<object data="support/colors-16x8.svg" class="op_y88"></object>
<object data="support/colors-16x8.svg" class="op_y111"></object>
</body>
</html>