Commit graph

565 commits

Author SHA1 Message Date
Oriol Brufau
9ad59d1459
Consistent resolution of cyclic percentages in min sizing properties (#33988)
The spec says that cyclic percentages in min sizing properties should
be resolved against zero when computing intrinsic contributions.
We were already doing that in the inline axis, but we were treating
the entire expression as `auto` in the block axis.

With this patch we will follow the spec in both axes. But note that
browsers don't follo the spec in either axis, so we may have to revisit
(see https://github.com/w3c/csswg-drafts/issues/10969).

calc-min-height-block-1.html now fails because it tests what browsers
do instead of what the spec says.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-24 12:03:32 +00:00
Oriol Brufau
1c26c0335e
Implement keyword sizes on absolute/fixed positioned elements (#33950)
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-22 18:50:12 +00:00
Oriol Brufau
2319764a1e
Refactor positioned layout (#33922)
This unifies the size resolution into AbsoluteAxisSolver, since it needs
to know the size in order to resolve auto margins correctly anyways.
This will allow adding support for sizing keywords in a follow-up patch.

Also, this avoids doing multiple layouts due to min and max constraints,
improving performance.

Additionally, tables may end up having a custom size, different than
what we would expect by just looking at the sizing properties. This
patch ensures that we resolve margins correctly with the final size,
resulting in 2 tests now passing.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-21 10:41:42 +00:00
Servo WPT Sync
d0d02cd56c
Update web-platform-tests to revision b'5a9d9349a312e12a950d5f4703cd41609a06f242' (#33923)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
2024-10-20 01:33:44 +00:00
Oriol Brufau
73880ee1d0
Remove BoxFragment::overconstrained (#33907)
This was only used for serializing inset properties in getComputedStyle,
but it was unnecessary and the logic was wrong anyways: an `auto` size
doesn't imply that we won't be overconstrained, because it won't become
negative even if the insets are big enough.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-19 01:55:55 +00:00
Oriol Brufau
09fc988d3a
Fix resolved value of insets to use margin box instead of content box (#33906)
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-18 23:55:53 +00:00
Servo WPT Sync
76776bf082
Update web-platform-tests to revision b'c7076ab2397dd3dcf0bb93dc304d05be04cd2a47' (#33826)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
2024-10-13 13:52:51 +00:00
Simon Wülker
c5899e596d
Implement DOMRect::FromRect (#33798)
* Implement DOMRect::FromRect

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Silence crown errors

The rect type does not contain any gc'd members,
so not rooting it is perfectly fineSilence crown errors

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Update WPT expectations

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Add SVGRect to the list of exposed interface globals

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Update WPT manifest

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
2024-10-11 15:35:59 +00:00
Simon Wülker
c00c6e728d
Implement DOMMatrix stringifier (#33792)
* Implement DOMMatrix stringifier

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Update WPT expectations

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
2024-10-11 03:06:44 +00:00
Simon Wülker
fc2c77be83
Use NaN-safe comparisons in DOMQuad::GetBounds (#33794)
* Use nan-safe comparison in DOMQuad::GetBounds

This fixes at least the following WPT test:
* css/geometry/DOMQuad-nan.html

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Update WPT expectations

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
2024-10-11 02:43:44 +00:00
Simon Wülker
f15da16da4
Update DOMMatrix::is2D when modifying elements (#33796)
* Invalidate DOMMatrix::is2D when modifying matrix values

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Update WPT expectations

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
2024-10-11 01:55:27 +00:00
tanishka
091b8ecda0
layout: Handle inline margins in layout_for_block_content_size() (#33780)
* fix: Handle inline margins in layout_for_block_content_size()

Signed-off-by: taniishkaaa <tanishkasingh2004@gmail.com>

* Update test expectations

Signed-off-by: taniishkaaa <tanishkasingh2004@gmail.com>

---------

Signed-off-by: taniishkaaa <tanishkasingh2004@gmail.com>
2024-10-10 20:45:18 +00:00
Oriol Brufau
8c56cbdab2
Implement keyword sizes on atomic inlines (#33737)
Adds support for min-content, max-content, fit-content and stretch,
for atomic inlines.

There are some new test failures because we don't support vertical
writing modes nor `transition-behavior:allow-discrete`.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-10 15:25:59 +00:00
Oriol Brufau
433f48741b
Fix align-content set to start or end on flexbox (#33667)
We need to handle `flex-wrap: wrap-reverse`.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-07 09:15:56 +00:00
Servo WPT Sync
f8933a5735
Sync WPT with upstream (06-10-2024) (#33668)
* Update web-platform-tests to revision b'9448ab31f11e671a8b069e3407b4f6279bea698e'

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>

* Remove intermittent failure.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

---------

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Co-authored-by: Josh Matthews <josh@joshmatthews.net>
2024-10-06 02:45:43 +00:00
Oriol Brufau
ea84f7b135
Enable stretch keyword (#33659)
Bump Stylo to servo/stylo#81

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-05 18:27:43 +00:00
Oriol Brufau
ad8ba49d2c
Skip anonymous blocks for percentage resolution (#33658)
Anonymous blocks have `height: auto`, so children with a percentage
`height` were considered to have an indefinite height.

However, anonymous blocks need to be skipped for percentage resolution,
so the percentages may actually be definite.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-10-05 08:56:17 +00:00
Servo WPT Sync
013473f1d5
Sync WPT with upstream (29-09-2024) (#33580)
* Update web-platform-tests to revision b'16d17064d2122cfa83b22f8bab32c96e6514c034'

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>

* Update big5-decode-csbig5.html.ini

Signed-off-by: Samson <16504129+sagudev@users.noreply.github.com>

---------

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
Signed-off-by: Samson <16504129+sagudev@users.noreply.github.com>
Co-authored-by: Samson <16504129+sagudev@users.noreply.github.com>
2024-09-29 07:54:33 +00:00
Oriol Brufau
057dd1e9eb
Make ComputedValuesExt expose keywords for the sizing properties (#33558)
This will allow callers to start obeying `min-content`, `max-content`,
`fit-content` and `stretch` in follow-up patches.
The old functionality is kept as deprecated methods that we should
eventually remove.
This patch has very little impact on the existing behavior, just some
very minimal implementation of the keywords for css tables.

This also overhauls fixed-layout-2.html since:
 - It had code that wasn't doing anything
 - It had wrong expecations in prose
 - The logic seemed broken in general
 - All browsers were failing one testcase

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-27 17:16:07 +00:00
Oriol Brufau
0cefee48e1
Fix table track constrainedness (#33550)
* Fix table track constraindness

Only as size that isn't `auto` and doesn't contain percentages can constrain
a table track (https://drafts.csswg.org/css-tables/#constrainedness).

However, in a bunch of cases we were only checking for `auto`.

Also, we were allowing the inline-size of a cell to constrain both its
column and row. Using the block-size of the row makes more sense.
The spec doesn't define constrainedness for rows, though.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Apply suggestions from code review

Co-authored-by: Martin Robinson <mrobinson@igalia.com>
Signed-off-by: Oriol Brufau <obrufau@igalia.com>

---------

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-26 14:06:33 +00:00
Servo WPT Sync
8276673bae
Update web-platform-tests to revision b'8e164c249d2b93a4234a2710a5e2cc5a16fab499' (#33515)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
2024-09-22 01:24:38 +00:00
Oriol Brufau
9597390d2b
Enable min-content, max-content, fit-content and stretch (#33492)
For the sizing properties.

We don't actually support them yet, just treating them as
the initial value.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-20 14:48:27 +00:00
Martin Robinson
ef229b9386
layout: Ensure that <caption>'s support position: relative (#33426)
This change adds support for `position: relative` to table `<caption>`.
In addition to adjusting their position according to inset values, table
captions must also establish containing blocks for descendants that are
absolutely positioned.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
2024-09-19 12:43:29 +00:00
Martin Robinson
bd632fc814
layout: Add support for object-fit and object-position (#33479)
This also makes a couple small improvements:
 - Rename `IntrinsicSizes` to `NaturalSizes` which reflects more
   modern spec language.
 - Move the conversion of Stylo's `ImageRendering` to WebRender's
   version to a `ToWebRender` trait implementation.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
2024-09-18 06:20:28 +00:00
Oriol Brufau
b12cebd1ac
Small improvements for table border collapse (#33452)
We were only collapsing the borders from adjacent cells. This patch also
handles the borders from rows, row groups, columns, and column groups.
Additionally, it takes the border style into account in order to decide
which border wins.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-16 08:20:22 +00:00
Oriol Brufau
679afe5195
Do not remove extra columns at the end of the table (#33451)
<col> and <colgroup> elements can be used to create extra columns that
have no cell. We were removing these columns and column groups, but in
general we shouldn't do that.

Now we will only remove them if the table has no row nor row group.
matching WebKit and the expectations of some tests. But note that Gecko
and Blink never remove them.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-16 08:11:36 +00:00
Servo WPT Sync
9f2306f760
Update web-platform-tests to revision b'4c3d068f942231dc905ea283e4f82bd70801c37c' (#33461)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
2024-09-15 01:26:41 +00:00
Oriol Brufau
a2b8bdb903
Allow table-layout:fixed to shrink cells to less than the border+padding (#33442)
A table cell with `width: auto` in fixed layout will now have an outer
min-content width of zero, even if it has borders or padding. In a way,
this is like allowing the content-box width to become negative.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-13 17:57:54 +00:00
Oriol Brufau
fa8752df6a
Fix precision issue with line heights (#33438)
When computing the ascent and descent in an inline formatting context,
we weren't taking into account that app units have precision limitations.
Therefore, in some cases we were getting a line height that was slightly
taller than the value specified in `line-height`.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-13 16:56:14 +00:00
Oriol Brufau
a76daaf04c
Upgrade stylo to 2024-09-02 (#33370)
* Upgrade stylo to 2024-09-02

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Fixup for https://phabricator.services.mozilla.com/D217308

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Fixup for https://phabricator.services.mozilla.com/D217626

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Fixup for https://phabricator.services.mozilla.com/D218488

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Fixup for https://phabricator.services.mozilla.com/D219537

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Update test expectations

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

---------

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-13 15:59:57 +00:00
atbrakhi
f76692035b
uses app units in display_list (#33420)
Signed-off-by: atbrakhi <atbrakhi@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-13 10:49:59 +00:00
Oriol Brufau
52f89c95b9
Fix inset box-shadow to use the padding box (#33433)
As specified in https://drafts.csswg.org/css-backgrounds-3/#shadow-shape

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-13 10:47:50 +00:00
Martin Robinson
db0aee6b58
layout: <th> should have text-align: center when the child of an element with text-align: initial (#33427)
This behavir is enabled via a special CSS value that we can share with
Gecko.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
2024-09-12 19:28:31 +00:00
Oriol Brufau
dc018b5f9f
Add support for table-layout: fixed (#33384)
More details might be needed to fully support the feature, but this
covers the basic functionality.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-12 16:33:13 +00:00
Oriol Brufau
52e495c1a6
Avoid crash with large table column widths (#33424)
Fixes #33423

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-12 15:11:22 +00:00
Oriol Brufau
4839cdf176
Add width and height presentational hints for table-related elements (#33405)
We were only parsing the `width` attribute as a presentation hint for
`<table>`, `<td>` and `<th>`. This patch also handles `<colgroup>` and
`<col>`.

Also, we weren't parsing `height` at all, now we do it for `<table>`,
`<td>`, `<th>`, `<tr>`, `<tbody>`, `<thead>` and `<tfoot>`.

One test is now crashing, but this was an existing issue: #33423

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-12 13:34:20 +00:00
Oriol Brufau
d9be9d6bd4
Handle all white-space values when intrinsically sizing an IFC (#33343)
There were various cases like `text-wrap-mode: nowrap` and
`white-space-collapse: break-spaces` that weren't handled well.

Fixes #33335

flexbox_flex-formatting-interop.html fails now because we don't support
`table-layout: fixed`.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-11 23:50:45 +00:00
Martin Robinson
ed5dc43f16
layout: Reverse space-between alignment properly for absolute children of flex containers (#33406)
When aligning with `space-between` the space should be allocated on the
`flex-end` side of the container ie it should be mapped to `flex-start`
(`start` and reversing if necssary).

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
2024-09-11 17:51:56 +00:00
Oriol Brufau
9175e598ad
Let table-related boxes adjust their overflow values (#33400)
The `overflow` property doesn't apply to table track and track groups,
and table elements only accept a few `overflow` values.

Therefore, this patch adds an `effective_overflow()` method to get the
actual value that needs to be used.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-09-11 15:30:17 +00:00
Martin Robinson
027fc53e2f
layout: Right-to-left support for other layout modes (#33375)
This change removes the `effective_writing_mode` concept and tries to
properly implement right-to-left layout support for all non-inline
writing modes. In general, what needs to happen is that rectangles
need to be converted to physical rectangles using the containing block.
A right-to-left rectangle's inline start is on the right physical side
of the containing block. Likewise a positive inline offset in
right-to-left text is a negative physical one.

The implementation here is pretty good for most layout modes, but floats
are still a bit in process. Currently, floats are processed in the
logical layout of the block container, but there still might be issues
with float interaction with mixed RTL and LTR.

While this does move us closer to supporting vertical writing modes,
this is still unsupported.

New failures:
 - Vertical writing mode not supported:
   - `/css/CSS2/floats/floats-placement-vertical-001b.xht`
   - `/css/CSS2/floats/floats-placement-vertical-001c.xht`
 - Absolutes inlines should avoid floats (#33323)
   - `/css/css-position/position-absolute-dynamic-static-position-floats-004.html`
 - No support for grid
   - `/css/css-align/self-alignment/self-align-safe-unsafe-grid-003.html`
   - `/css/css-position/static-position/inline-level-absolute-in-block-level-context-009.html`
   - `/css/css-position/static-position/inline-level-absolute-in-block-level-context-010.html`
 - Cannot reproduce these locally on any platform. Very mysterious:
   - `/css/css-tables/row-group-margin-border-padding.html`
   - `/css/css-tables/row-margin-border-padding.html`
 - Exposes bugs we have related to hanging whitespace in preserved
   whitespace inlines:
   - `/css/css-text/white-space/trailing-space-and-text-alignment-rtl-003.html`
   - `/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-023.html`

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Rakhi Sharma <atbrakhi@igalia.com>
2024-09-11 13:40:11 +00:00
Taym Haddadi
1b27a911af
Make Crashtests with test-wait wait (#33344)
* Make Crashtests with test-wait wait

Signed-off-by: Taym <haddadi.taym@gmail.com>

* use Atom::from instead of the atom macro

Signed-off-by: Taym <haddadi.taym@gmail.com>

* Update test result expectations

Signed-off-by: Taym <haddadi.taym@gmail.com>

---------

Signed-off-by: Taym <haddadi.taym@gmail.com>
2024-09-10 15:19:18 +00:00
Martin Robinson
d169a82d2e
layout: Implement proper absolute child position for flexbox (#33346)
This implements the requirements outlined in the [flexbox specification]
about how to position absolute children of flex containers. We must
establish a static position rectangle (to use if all insets are auto)
and also align the child into that rectangle.

[flebox specification]: https://drafts.csswg.org/css-flexbox/#abspos-items

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
2024-09-09 14:44:16 +00:00
Servo WPT Sync
85823edd01
Update web-platform-tests to revision b'ec9b870fec350e59e9db48ae2858e914a07f38d6' (#33359)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
2024-09-08 01:41:09 +00:00
Martin Robinson
c24c7d8e4d
layout: Lay out absolutes in atomic containing blocks (#33336)
When inline atomics establish containing blocks for absolute
descendants, layout should happen with those atomics as the containing
block. This ensures that the absolute descendents have the correct
containing block and Fragment parent. This wasn't happening before and
this change fixes that.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
2024-09-06 13:42:45 +00:00
Oriol Brufau
27d87f104e
Fix intrinsic sizing of column flex containers (#33299)
From https://drafts.csswg.org/css-flexbox-1/#intrinsic-cross-sizes,
> The min-content/max-content cross size of a single-line flex container
> is the largest min-content contribution/max-content contribution
> (respectively) of its flex items.

We were using the min/max-content size instead of the min/max-content
contribution.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-09-04 06:44:31 +00:00
Servo WPT Sync
3453d9fdad
Update web-platform-tests to revision b'5d8ec746ed021738e7ee0cee92ad1a1814ba00fe' (#33274)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
2024-09-01 01:40:45 +00:00
Oriol Brufau
3acc9edd82
Fix various issues with replaced elements in flex layout (#33263)
In particular, this takes into account that flex items may be stretched,
and if they have an aspect ratio, we ma6y need to convert the stretched
size through the ratio.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-08-30 23:39:18 +00:00
Oriol Brufau
4bf941bc8a
Fix automatic minimum size for column flexbox (#33248)
`main_content_size_info()` was always assigning the main-axis automatic
minimum size into the inline axis. But in a column flexbox, the main
axis corresponds to the block axis.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-08-29 16:55:44 +00:00
Oriol Brufau
0643aa4708
Handle aspect ratios in ReplacedContent::inline_content_sizes (#33240)
We were only handling the aspect ratio of a replaced element when
computing its min/max-content contribution, but not when computing
the min/max-content size. Now both cases will take it into account.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
2024-08-29 15:38:59 +00:00
Oriol Brufau
93abdf7cb5
layout: Add an indefinite containing block for intrinsic sizing (#33204)
When computing the min-content or max-content size of an element we
need to ignore `inline-size`, `min-inline-size` and `max-inline-size`.

However, we should take the block-axis sizing properties into account.
That's because the contents could have percentages depending on them,
which can then affect their inline size via an aspect ratio.

Therefore, this patch adds `IndefiniteContainingBlock`, which is similar
to `ContainingBlock`, but it allows an indefinite inline-size. This
struct is then passed arround during intrinsic sizing.

More refinement will be needed in follow-up patches in order to fully
address the problem.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
2024-08-29 14:10:46 +00:00