Skip to content

Commit

Permalink
Merge r241746 - [css-grid] Handle indefinite percentages in fit-conte…
Browse files Browse the repository at this point in the history
…nt()

https://bugs.webkit.org/show_bug.cgi?id=194509

Patch by Oriol Brufau <obrufau@igalia.com> on 2019-02-18
Reviewed by Javier Fernandez.

LayoutTests/imported/w3c:

Import WPT test.

* web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage-expected.txt: Added.
* web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage.html: Added.
* web-platform-tests/css/css-grid/layout-algorithm/w3c-import.log:

Source/WebCore:

Test: imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage.html

If the size of the grid container depends on the size of its tracks,
a percentage in fit-content() is indefinite. Without this patch, some
places treated this case as fit-content(0), which prevented the grid
container from growing enough to contain the max-content contribution
of its grid items.

This patch treats such fit-content() as minmax(auto, max-content),
but once the size of the grid container is known and it is laid out
"for real", then the percentage is definite and it's used.

* rendering/GridTrackSizingAlgorithm.cpp:
(WebCore::GridTrackSizingAlgorithm::gridTrackSize const):
(WebCore::GridTrackSizingAlgorithm::initializeTrackSizes):
  • Loading branch information
Loirooriol authored and carlosgcampos committed Feb 20, 2019
1 parent d2d7754 commit 81a91b5
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 7 deletions.
13 changes: 13 additions & 0 deletions LayoutTests/imported/w3c/ChangeLog
@@ -1,3 +1,16 @@
2019-02-18 Oriol Brufau <obrufau@igalia.com>

[css-grid] Handle indefinite percentages in fit-content()
https://bugs.webkit.org/show_bug.cgi?id=194509

Reviewed by Javier Fernandez.

Import WPT test.

* web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage-expected.txt: Added.
* web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage.html: Added.
* web-platform-tests/css/css-grid/layout-algorithm/w3c-import.log:

2019-02-12 Rob Buis <rbuis@igalia.com>

Align with Fetch on data: URLs
Expand Down
@@ -0,0 +1,7 @@

PASS fit-content(0%)
PASS fit-content(50%)
PASS fit-content(75%)
PASS fit-content(100%)
PASS fit-content(150%)

@@ -0,0 +1,61 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Grid Layout Test: indefinite percentage in fit-content()</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-grid/#track-sizes" title="7.2.1. Track Sizes">
<meta name="assert" content="Checks that an indefinite percentage in fit-content lets the grid container grow enough to contain the max-content contribution of its grid items.">
<style>
.container {
width: 200px;
margin-top: 10px;
}
.grid {
display: inline-grid;
background: blue;
}
.item {
background: orange;
}
.item::before, .item::after {
content: '';
float: left;
width: 50px;
height: 50px;
}
</style>

<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<div id="log"></div>

<script>
"use strict";
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
const minContent = 50;
const maxContent = 100;
for (const percentage of [0, 50, 75, 100, 150]) {
const container = document.createElement("div");
container.className = "container";
document.body.appendChild(container);
const grid = document.createElement("div");
grid.className = "grid";
grid.style.gridTemplateColumns = `fit-content(${percentage}%)`;
container.appendChild(grid);
const item = document.createElement("div");
item.className = "item";
grid.appendChild(item);
test(function() {
const colSize = clamp(percentage * maxContent / 100, minContent, maxContent);
const height = colSize < maxContent ? maxContent : minContent;
assert_equals(item.offsetWidth, colSize, "Grid item width");
assert_equals(item.offsetHeight, height, "Grid item height");
assert_equals(grid.offsetWidth, maxContent, "Grid container width");
assert_equals(grid.offsetHeight, height, "Grid container height");
assert_equals(getComputedStyle(grid).gridTemplateColumns, colSize + "px",
"Grid column size");
}, `fit-content(${percentage}%)`);
}
</script>
Expand Up @@ -20,6 +20,7 @@ List of files:
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-content-distribution-must-account-for-track-sizing-004.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-001.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-find-fr-size-gutters-002.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-intrinsic-size-with-orthogonal-items.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-layout-free-space-unit-expected.html
/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-layout-free-space-unit.html
Expand Down
23 changes: 23 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,26 @@
2019-02-18 Oriol Brufau <obrufau@igalia.com>

[css-grid] Handle indefinite percentages in fit-content()
https://bugs.webkit.org/show_bug.cgi?id=194509

Reviewed by Javier Fernandez.

Test: imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-fit-content-percentage.html

If the size of the grid container depends on the size of its tracks,
a percentage in fit-content() is indefinite. Without this patch, some
places treated this case as fit-content(0), which prevented the grid
container from growing enough to contain the max-content contribution
of its grid items.

This patch treats such fit-content() as minmax(auto, max-content),
but once the size of the grid container is known and it is laid out
"for real", then the percentage is definite and it's used.

* rendering/GridTrackSizingAlgorithm.cpp:
(WebCore::GridTrackSizingAlgorithm::gridTrackSize const):
(WebCore::GridTrackSizingAlgorithm::initializeTrackSizes):

2019-02-18 John Wilander <wilander@apple.com>

Check the existence of the frame in Document::hasFrameSpecificStorageAccess() and Document::setHasFrameSpecificStorageAccess()
Expand Down
10 changes: 3 additions & 7 deletions Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp
Expand Up @@ -645,7 +645,7 @@ GridTrackSize GridTrackSizingAlgorithm::gridTrackSize(GridTrackSizingDirection d

auto& trackSize = rawGridTrackSize(direction, translatedIndex);
if (trackSize.isFitContent())
return trackSize;
return isRelativeGridLengthAsAuto(trackSize.fitContentTrackBreadth(), direction) ? GridTrackSize(Length(Auto), Length(MaxContent)) : trackSize;

GridLength minTrackBreadth = trackSize.minTrackBreadth();
GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
Expand Down Expand Up @@ -1099,7 +1099,6 @@ void GridTrackSizingAlgorithm::initializeTrackSizes()
ASSERT(!m_hasPercentSizedRowsIndefiniteHeight);

Vector<GridTrack>& allTracks = tracks(m_direction);
const bool hasDefiniteFreeSpace = !!availableSpace();
const bool indefiniteHeight = m_direction == ForRows && !m_renderGrid->hasDefiniteLogicalHeight();
LayoutUnit maxSize = std::max(0_lu, availableSpace().valueOr(0_lu));
// 1. Initialize per Grid track variables.
Expand All @@ -1111,11 +1110,8 @@ void GridTrackSizingAlgorithm::initializeTrackSizes()
track.setGrowthLimit(initialGrowthLimit(trackSize, track.baseSize()));
track.setInfinitelyGrowable(false);

if (trackSize.isFitContent()) {
GridLength gridLength = trackSize.fitContentTrackBreadth();
if (!gridLength.isPercentage() || hasDefiniteFreeSpace)
track.setGrowthLimitCap(valueForLength(gridLength.length(), maxSize));
}
if (trackSize.isFitContent())
track.setGrowthLimitCap(valueForLength(trackSize.fitContentTrackBreadth().length(), maxSize));
if (trackSize.isContentSized())
m_contentSizedTracksIndex.append(i);
if (trackSize.maxTrackBreadth().isFlex())
Expand Down

0 comments on commit 81a91b5

Please sign in to comment.