Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[css-flex] Flex layout should not invalidate preferred width bits of …
…flex items at the end of layout. https://bugs.webkit.org/show_bug.cgi?id=264303 rdar://117181858 Reviewed by Alan Baradlay. In certain situations flex layout will invalidate the preferred widths bits of flex items towards the end of layout (in layoutAndPlaceChildren), with a call to updateBlockChildDirtyBitsBeforeLayout. This is incorrect since by the time we reach layoutAndPlaceChildren flex layout will not compute the preferred widths of these items again. This leaves the render tree in a bad state where we may compute the preferred widths of a flex item at some point during layout, dirty this bit later, and exit layout with this bit dirtied. In this state we may not be able to correctly invalidate the ancestor chain of a flex item in certain situations like in the added test case. When the image is loaded in the test case we will be unable to invalidate the preferred widths bits of its ancestor chain since the item had already been dirtied so we assume the rest of the chain has already been handled. Instead, we should be performing this type of invalidation in one of the following scenarios: 1.) The content of a flex item changes 2.) Certain style changes on the flex item that would impact the preferred widths computations of its items. One example of this is a flex item with an aspect ratio since the aspect ratio could impact its "content based minimum size," if the flexbox's cross size size changes in a specific way: https://drafts.csswg.org/css-flexbox-1/#content-based-minimum-size This patch focuses on correcting flex layout to more closely follow the principles in 2. updateFlexItemDirtyBitsBeforeLayout was added to replace the call to updateBlockChildDirtyBitsBeforeLayout so that we can continue to dirty flex items for layout without dirtying their preferred widths bits as well. Instead, in RenderFlexibleBox::styleDidChange we can call needsPreferredWidthsRecalculation on each flex item to determine if we should dirty the preferred widths bit of it. * LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes-expected.html: Added. * LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/nested-flex-image-loading-invalidates-intrinsic-sizes.html: Added. * Source/WebCore/rendering/RenderFlexibleBox.cpp: (WebCore::updateFlexItemDirtyBitsBeforeLayout): (WebCore::RenderFlexibleBox::styleDidChange): (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): Canonical link: https://commits.webkit.org/271995@main
- Loading branch information