Log Message
https://bugs.webkit.org/show_bug.cgi?id=220224 Support transferred min/max block size for aspect-ratio
Patch by Rob Buis <[email protected]> on 2021-01-15 Reviewed by Darin Adler. Source/WebCore: Add logic to transfer min-height/max-height for minmax logical width calculation in case aspect-ratio should be applied [1]. Both absolute and normally positioned elements are handled. [1] https://drafts.csswg.org/css-sizing-4/#aspect-ratio-size-transfers * rendering/RenderBox.cpp: (WebCore::RenderBox::constrainLogicalWidthInFragmentByMinMax const): (WebCore::RenderBox::computePositionedLogicalWidth const): (WebCore::RenderBox::computeMinMaxLogicalWidthFromAspectRatio const): * rendering/RenderBox.h: LayoutTests: Enable some tests that pass now. * TestExpectations:
Modified Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (271553 => 271554)
--- trunk/LayoutTests/ChangeLog 2021-01-16 04:15:40 UTC (rev 271553)
+++ trunk/LayoutTests/ChangeLog 2021-01-16 07:57:56 UTC (rev 271554)
@@ -1,3 +1,14 @@
+2021-01-15 Rob Buis <[email protected]>
+
+ https://bugs.webkit.org/show_bug.cgi?id=220224
+ Support transferred min/max block size for aspect-ratio
+
+ Reviewed by Darin Adler.
+
+ Enable some tests that pass now.
+
+ * TestExpectations:
+
2021-01-15 Lauro Moura <[email protected]>
[GLIB] Gardening a couple failures
Modified: trunk/LayoutTests/TestExpectations (271553 => 271554)
--- trunk/LayoutTests/TestExpectations 2021-01-16 04:15:40 UTC (rev 271553)
+++ trunk/LayoutTests/TestExpectations 2021-01-16 07:57:56 UTC (rev 271554)
@@ -4407,7 +4407,6 @@
webkit.org/b/214462 imported/w3c/web-platform-tests/css/css-scoping/shadow-directionality-002.tentative.html [ ImageOnlyFailure ]
webkit.org/b/214462 imported/w3c/web-platform-tests/css/css-scoping/slotted-placeholder.html [ ImageOnlyFailure ]
-webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-008.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-012.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-013.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-014.html [ ImageOnlyFailure ]
@@ -4415,12 +4414,7 @@
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-014.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-015.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-017.html [ ImageOnlyFailure ]
-webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-020.html [ ImageOnlyFailure ]
-webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-021.html [ ImageOnlyFailure ]
-webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-023.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-024.html [ ImageOnlyFailure ]
-webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-026.html [ ImageOnlyFailure ]
-webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-027.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-028.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/flex-aspect-ratio-001.html [ ImageOnlyFailure ]
webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/flex-aspect-ratio-002.html [ ImageOnlyFailure ]
Modified: trunk/Source/WebCore/ChangeLog (271553 => 271554)
--- trunk/Source/WebCore/ChangeLog 2021-01-16 04:15:40 UTC (rev 271553)
+++ trunk/Source/WebCore/ChangeLog 2021-01-16 07:57:56 UTC (rev 271554)
@@ -1,3 +1,22 @@
+2021-01-15 Rob Buis <[email protected]>
+
+ https://bugs.webkit.org/show_bug.cgi?id=220224
+ Support transferred min/max block size for aspect-ratio
+
+ Reviewed by Darin Adler.
+
+ Add logic to transfer min-height/max-height for minmax logical width
+ calculation in case aspect-ratio should be applied [1]. Both absolute
+ and normally positioned elements are handled.
+
+ [1] https://drafts.csswg.org/css-sizing-4/#aspect-ratio-size-transfers
+
+ * rendering/RenderBox.cpp:
+ (WebCore::RenderBox::constrainLogicalWidthInFragmentByMinMax const):
+ (WebCore::RenderBox::computePositionedLogicalWidth const):
+ (WebCore::RenderBox::computeMinMaxLogicalWidthFromAspectRatio const):
+ * rendering/RenderBox.h:
+
2021-01-15 Simon Fraser <[email protected]>
Scroll position is lost when homing out and resuming Safari on iOS
Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (271553 => 271554)
--- trunk/Source/WebCore/rendering/RenderBox.cpp 2021-01-16 04:15:40 UTC (rev 271553)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp 2021-01-16 07:57:56 UTC (rev 271554)
@@ -643,6 +643,13 @@
LayoutUnit RenderBox::constrainLogicalWidthInFragmentByMinMax(LayoutUnit logicalWidth, LayoutUnit availableWidth, RenderBlock& cb, RenderFragmentContainer* fragment) const
{
const RenderStyle& styleToUse = style();
+
+ if (shouldComputeLogicalHeightFromAspectRatio()) {
+ LayoutUnit logicalMinWidth, logicalMaxWidth;
+ std::tie(logicalMinWidth, logicalMaxWidth) = computeMinMaxLogicalWidthFromAspectRatio();
+ logicalWidth = std::max(logicalMinWidth, std::min(logicalWidth, logicalMaxWidth));
+ }
+
if (!styleToUse.logicalMaxWidth().isUndefined())
logicalWidth = std::min(logicalWidth, computeLogicalWidthInFragmentUsing(MaxSize, styleToUse.logicalMaxWidth(), availableWidth, cb, fragment));
return std::max(logicalWidth, computeLogicalWidthInFragmentUsing(MinSize, styleToUse.logicalMinWidth(), availableWidth, cb, fragment));
@@ -3625,39 +3632,54 @@
logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
computedValues);
+ LayoutUnit transferredMinSize = LayoutUnit::min();
+ LayoutUnit transferredMaxSize = LayoutUnit::max();
+ if (shouldComputeLogicalHeightFromAspectRatio())
+ std::tie(transferredMinSize, transferredMaxSize) = computeMinMaxLogicalWidthFromAspectRatio();
+
+ LogicalExtentComputedValues maxValues;
+ maxValues.m_extent = LayoutUnit::max();
// Calculate constraint equation values for 'max-width' case.
if (!style().logicalMaxWidth().isUndefined()) {
- LogicalExtentComputedValues maxValues;
-
computePositionedLogicalWidthUsing(MaxSize, style().logicalMaxWidth(), containerBlock, containerDirection,
containerLogicalWidth, bordersPlusPadding,
logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
maxValues);
-
- if (computedValues.m_extent > maxValues.m_extent) {
- computedValues.m_extent = maxValues.m_extent;
- computedValues.m_position = maxValues.m_position;
- computedValues.m_margins.m_start = maxValues.m_margins.m_start;
- computedValues.m_margins.m_end = maxValues.m_margins.m_end;
- }
}
+ if (transferredMaxSize < maxValues.m_extent) {
+ computePositionedLogicalWidthUsing(MaxSize, Length(transferredMaxSize, Fixed), containerBlock, containerDirection,
+ containerLogicalWidth, bordersPlusPadding,
+ logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
+ maxValues);
+ }
+ if (computedValues.m_extent > maxValues.m_extent) {
+ computedValues.m_extent = maxValues.m_extent;
+ computedValues.m_position = maxValues.m_position;
+ computedValues.m_margins.m_start = maxValues.m_margins.m_start;
+ computedValues.m_margins.m_end = maxValues.m_margins.m_end;
+ }
+ LogicalExtentComputedValues minValues;
+ minValues.m_extent = LayoutUnit::min();
// Calculate constraint equation values for 'min-width' case.
if (!style().logicalMinWidth().isZero() || style().logicalMinWidth().isIntrinsic()) {
- LogicalExtentComputedValues minValues;
-
computePositionedLogicalWidthUsing(MinSize, style().logicalMinWidth(), containerBlock, containerDirection,
+ containerLogicalWidth, bordersPlusPadding,
+ logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
+ minValues);
+ }
+ if (transferredMinSize > minValues.m_extent) {
+ computePositionedLogicalWidthUsing(MinSize, Length(transferredMinSize, Fixed), containerBlock, containerDirection,
containerLogicalWidth, bordersPlusPadding,
logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
minValues);
-
- if (computedValues.m_extent < minValues.m_extent) {
- computedValues.m_extent = minValues.m_extent;
- computedValues.m_position = minValues.m_position;
- computedValues.m_margins.m_start = minValues.m_margins.m_start;
- computedValues.m_margins.m_end = minValues.m_margins.m_end;
- }
}
+ if (computedValues.m_extent < minValues.m_extent) {
+ computedValues.m_extent = minValues.m_extent;
+ computedValues.m_position = minValues.m_position;
+ computedValues.m_margins.m_start = minValues.m_margins.m_start;
+ computedValues.m_margins.m_end = minValues.m_margins.m_end;
+ }
computedValues.m_extent += bordersPlusPadding;
if (is<RenderBox>(containerBlock)) {
@@ -5033,6 +5055,22 @@
return constrainLogicalWidthInFragmentByMinMax(logicalWidth, containerWidthInInlineDirection, *containingBlock(), fragment);
}
+std::pair<LayoutUnit, LayoutUnit> RenderBox::computeMinMaxLogicalWidthFromAspectRatio() const
+{
+ auto ratio = LayoutUnit { style().logicalAspectRatio() };
+ LayoutUnit blockMinSize = constrainLogicalHeightByMinMax(LayoutUnit(), WTF::nullopt);
+ LayoutUnit blockMaxSize = constrainLogicalHeightByMinMax(LayoutUnit::max(), WTF::nullopt);
+ LayoutUnit transferredMinSize = LayoutUnit();
+ LayoutUnit transferredMaxSize = LayoutUnit::max();
+ if (blockMinSize > LayoutUnit())
+ transferredMinSize = inlineSizeFromAspectRatio(horizontalBorderAndPaddingExtent(), verticalBorderAndPaddingExtent(), ratio, style().boxSizing(), blockMinSize);
+ if (blockMaxSize != LayoutUnit::max())
+ transferredMaxSize = inlineSizeFromAspectRatio(horizontalBorderAndPaddingExtent(), verticalBorderAndPaddingExtent(), ratio, style().boxSizing(), blockMaxSize);
+ // Minimum size wins over maximum size.
+ transferredMaxSize = std::max(transferredMaxSize, transferredMinSize);
+ return { transferredMinSize, transferredMaxSize };
+}
+
bool RenderBox::hasRelativeDimensions() const
{
return style().height().isPercentOrCalculated() || style().width().isPercentOrCalculated()
Modified: trunk/Source/WebCore/rendering/RenderBox.h (271553 => 271554)
--- trunk/Source/WebCore/rendering/RenderBox.h 2021-01-16 04:15:40 UTC (rev 271553)
+++ trunk/Source/WebCore/rendering/RenderBox.h 2021-01-16 07:57:56 UTC (rev 271554)
@@ -701,6 +701,7 @@
bool shouldComputeLogicalWidthFromAspectRatio() const;
bool shouldComputeLogicalWidthFromAspectRatioAndInsets() const;
LayoutUnit computeLogicalWidthFromAspectRatio(RenderFragmentContainer* = nullptr) const;
+ std::pair<LayoutUnit, LayoutUnit> computeMinMaxLogicalWidthFromAspectRatio() const;
static LayoutUnit blockSizeFromAspectRatio(LayoutUnit borderPaddingInlineSum, LayoutUnit borderPaddingBlockSum, LayoutUnit aspectRatio, BoxSizing boxSizing, LayoutUnit inlineSize)
{
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
