Changeset 183399 in webkit
- Timestamp:
- Apr 27, 2015 10:24:44 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r183397 r183399 1 2015-04-27 Javier Fernandez <jfernandez@igalia.com> 2 3 [CSS Grid Layout] Support for the justify-self and justify-items in grid layout 4 https://bugs.webkit.org/show_bug.cgi?id=133280 5 6 Implementation of justify-self and justify-items properties for grid. 7 Added additional testing for ensuring margin, padding and border are considered when 8 computing grid item's position. 9 10 Reviewed by David Hyatt. 11 12 * fast/css-grid-layout/grid-align-justify-margin-border-padding-expected.txt: Added. 13 * fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-lr-expected.txt: Added. 14 * fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-lr.html: Added. 15 * fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl-expected.txt: Added. 16 * fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html: Added. 17 * fast/css-grid-layout/grid-align-justify-margin-border-padding.html: Added. 18 * fast/css-grid-layout/justify-self-cell-expected.txt: Added. 19 * fast/css-grid-layout/justify-self-cell.html: Added. 20 * fast/css-grid-layout/resources/grid.css: 21 (.directionLTR): Added. Useful for defining orthogonal flows. 22 1 23 2015-04-27 Youenn Fablet <youenn.fablet@crf.canon.fr> and Xabier Rodriguez Calvar <calvaris@igalia.com> 2 24 -
trunk/LayoutTests/fast/css-grid-layout/resources/grid.css
r180567 r183399 223 223 direction: rtl; 224 224 } 225 226 .directionLTR { 227 direction: ltr; 228 } -
trunk/Source/WebCore/ChangeLog
r183398 r183399 1 2015-04-27 Javier Fernandez <jfernandez@igalia.com> 2 3 [CSS Grid Layout] Support for the justify-self and justify-items in grid layout 4 https://bugs.webkit.org/show_bug.cgi?id=133280 5 6 Reviewed by David Hyatt. 7 8 Implementation of justify-self and justify-items properties for grid. It supports 9 different writing-modes and direction. Margins, borders and paddings are also 10 considered when computing the final position and stretched size. 11 12 This patch applies also a quite important refactoring of the alignment logic in 13 order to share code between the two alignment dimensions, row-axis and column-axis. 14 15 Overflow handling is still missing and will be added later in a follow-up bug. 16 17 Tests: fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-lr.html 18 fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html 19 fast/css-grid-layout/grid-align-justify-margin-border-padding.html 20 fast/css-grid-layout/justify-self-cell.html 21 22 * rendering/RenderGrid.cpp: 23 (WebCore::RenderGrid::layoutGridItems): 24 (WebCore::RenderGrid::columnAxisPositionForChild): 25 (WebCore::RenderGrid::rowAxisPositionForChild): 26 (WebCore::RenderGrid::rowPositionForChild): 27 (WebCore::RenderGrid::columnPositionForChild): 28 (WebCore::RenderGrid::findChildLogicalPosition): 29 (WebCore::RenderGrid::allowedToStretchLogicalHeightForChild): Deleted. 30 (WebCore::RenderGrid::needToStretchChildLogicalHeight): Deleted. 31 (WebCore::RenderGrid::marginLogicalHeightForChild): Deleted. 32 (WebCore::RenderGrid::availableAlignmentSpaceForChildBeforeStretching): Deleted. 33 (WebCore::RenderGrid::applyStretchAlignmentToChildIfNeeded): Deleted. 34 * rendering/RenderGrid.h: 35 * rendering/style/RenderStyle.cpp: 36 (WebCore::RenderStyle::resolveJustification): 37 * rendering/style/RenderStyle.h: 38 1 39 2015-04-27 Darin Adler <darin@apple.com> 2 40 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r183370 r183399 41 41 static const int infinity = -1; 42 42 43 enum GridAxisPosition {GridAxisStart, GridAxisEnd, GridAxisCenter};44 45 43 class GridTrack { 46 44 public: … … 1187 1185 child->layoutIfNeeded(); 1188 1186 1189 child->setLogicalLocation(findChildLogicalPosition(*child , sizingData));1187 child->setLogicalLocation(findChildLogicalPosition(*child)); 1190 1188 1191 1189 // If the child moved, we have to repaint it as well as any floating/positioned … … 1241 1239 } 1242 1240 1243 LayoutUnit RenderGrid::endOfRowForChild(const RenderBox& child) const1244 {1245 const GridCoordinate& coordinate = cachedGridCoordinate(child);1246 1247 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()];1248 // The grid items should be inside the grid container's border box, that's why they need to be shifted.1249 LayoutUnit rowPosition = startOfRow + marginBeforeForChild(child);1250 1251 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()];1252 // FIXME: This should account for the grid item's <overflow-position>.1253 return rowPosition + std::max<LayoutUnit>(0, endOfRow - startOfRow - child.logicalHeight());1254 }1255 1256 LayoutUnit RenderGrid::startOfRowForChild(const RenderBox& child) const1257 {1258 const GridCoordinate& coordinate = cachedGridCoordinate(child);1259 1260 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()];1261 // The grid items should be inside the grid container's border box, that's why they need to be shifted.1262 // FIXME: This should account for the grid item's <overflow-position>.1263 LayoutUnit rowPosition = startOfRow + marginBeforeForChild(child);1264 1265 return rowPosition;1266 }1267 1268 LayoutUnit RenderGrid::centeredRowPositionForChild(const RenderBox& child) const1269 {1270 const GridCoordinate& coordinate = cachedGridCoordinate(child);1271 1272 // The grid items should be inside the grid container's border box, that's why they need to be shifted.1273 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()];1274 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()];1275 // FIXME: This should account for the grid item's <overflow-position>.1276 return startOfRow + std::max<LayoutUnit>(0, endOfRow - startOfRow - child.logicalHeight()) / 2;1277 }1278 1279 1241 bool RenderGrid::allowedToStretchLogicalHeightForChild(const RenderBox& child) const 1280 1242 { … … 1328 1290 } 1329 1291 1330 static GridAxisPosition columnAxisPosition(ItemPosition position, bool hasOrthogonalWritingMode, bool hasSameWritingMode) 1331 { 1332 switch (position) { 1292 GridAxisPosition RenderGrid::columnAxisPositionForChild(const RenderBox& child) const 1293 { 1294 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); 1295 bool hasSameWritingMode = child.style().writingMode() == style().writingMode(); 1296 1297 switch (RenderStyle::resolveAlignment(style(), child.style(), ItemPositionStretch)) { 1333 1298 case ItemPositionSelfStart: 1334 1299 // If orthogonal writing-modes, this computes to 'start'. … … 1363 1328 case ItemPositionBaseline: 1364 1329 case ItemPositionLastBaseline: 1365 // FIXME: Implement the ItemPositionBaseline value. For now, we always 'start' align the child.1330 // FIXME: Implement the previous values. For now, we always 'start' align the child. 1366 1331 return GridAxisStart; 1367 1332 case ItemPositionAuto: … … 1373 1338 } 1374 1339 1340 GridAxisPosition RenderGrid::rowAxisPositionForChild(const RenderBox& child) const 1341 { 1342 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); 1343 bool hasSameDirection = child.style().direction() == style().direction(); 1344 bool isLTR = style().isLeftToRightDirection(); 1345 1346 switch (RenderStyle::resolveJustification(style(), child.style(), ItemPositionStretch)) { 1347 case ItemPositionSelfStart: 1348 // For orthogonal writing-modes, this computes to 'start' 1349 // FIXME: grid track sizing and positioning do not support orthogonal modes yet. 1350 // self-start is based on the child's direction. That's why we need to check against the grid container's direction. 1351 return (hasOrthogonalWritingMode || hasSameDirection) ? GridAxisStart : GridAxisEnd; 1352 case ItemPositionSelfEnd: 1353 // For orthogonal writing-modes, this computes to 'start' 1354 // FIXME: grid track sizing and positioning do not support orthogonal modes yet. 1355 return (hasOrthogonalWritingMode || hasSameDirection) ? GridAxisEnd : GridAxisStart; 1356 case ItemPositionLeft: 1357 return isLTR ? GridAxisStart : GridAxisEnd; 1358 case ItemPositionRight: 1359 return isLTR ? GridAxisEnd : GridAxisStart; 1360 case ItemPositionCenter: 1361 return GridAxisCenter; 1362 case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalent to 'start'. 1363 case ItemPositionStart: 1364 return GridAxisStart; 1365 case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'. 1366 case ItemPositionEnd: 1367 return GridAxisEnd; 1368 case ItemPositionStretch: 1369 return GridAxisStart; 1370 case ItemPositionBaseline: 1371 case ItemPositionLastBaseline: 1372 // FIXME: Implement the previous values. For now, we always 'start' align the child. 1373 return GridAxisStart; 1374 case ItemPositionAuto: 1375 break; 1376 } 1377 1378 ASSERT_NOT_REACHED(); 1379 return GridAxisStart; 1380 } 1381 1375 1382 LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const 1376 1383 { 1377 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); 1378 bool hasSameWritingMode = child.style().writingMode() == style().writingMode(); 1379 ItemPosition position = RenderStyle::resolveAlignment(style(), child.style(), ItemPositionStretch); 1380 1381 switch (columnAxisPosition(position, hasOrthogonalWritingMode, hasSameWritingMode)) { 1384 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1385 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()]; 1386 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()]; 1387 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); 1388 // FIXME: This should account for the grid item's <overflow-position>. 1389 LayoutUnit offsetFromStartPosition = endOfRow - startOfRow - child.logicalHeight() - child.marginLogicalHeight(); 1390 1391 switch (columnAxisPositionForChild(child)) { 1382 1392 case GridAxisStart: 1383 return start OfRowForChild(child);1393 return startPosition; 1384 1394 case GridAxisEnd: 1385 return endOfRowForChild(child);1395 return startPosition + offsetFromStartPosition; 1386 1396 case GridAxisCenter: 1387 return centeredRowPositionForChild(child);1397 return startPosition + offsetFromStartPosition / 2; 1388 1398 } 1389 1399 … … 1392 1402 } 1393 1403 1394 LayoutPoint RenderGrid::findChildLogicalPosition(const RenderBox& child, const GridSizingData& sizingData) const 1404 1405 LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const 1395 1406 { 1396 1407 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1397 ASSERT_UNUSED(sizingData, coordinate.columns.resolvedInitialPosition.toInt() < sizingData.columnTracks.size()); 1398 ASSERT_UNUSED(sizingData, coordinate.rows.resolvedInitialPosition.toInt() < sizingData.rowTracks.size()); 1399 1400 LayoutUnit columnPosition = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()] + marginStartForChild(child); 1408 LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()]; 1409 LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()]; 1410 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); 1411 // FIXME: This should account for the grid item's <overflow-position>. 1412 LayoutUnit offsetFromStartPosition = endOfColumn - startOfColumn - child.logicalWidth() - child.marginLogicalWidth(); 1413 1414 switch (rowAxisPositionForChild(child)) { 1415 case GridAxisStart: 1416 return startPosition; 1417 case GridAxisEnd: 1418 return startPosition + offsetFromStartPosition; 1419 case GridAxisCenter: 1420 return startPosition + offsetFromStartPosition / 2; 1421 } 1422 1423 ASSERT_NOT_REACHED(); 1424 return 0; 1425 } 1426 1427 LayoutPoint RenderGrid::findChildLogicalPosition(const RenderBox& child) const 1428 { 1429 LayoutUnit columnPosition = columnPositionForChild(child); 1401 1430 // We stored m_columnPositions's data ignoring the direction, hence we might need now 1402 1431 // to translate positions from RTL to LTR, as it's more convenient for painting. -
trunk/Source/WebCore/rendering/RenderGrid.h
r183370 r183399 40 40 class GridTrack; 41 41 class GridItemWithSpan; 42 43 enum GridAxisPosition {GridAxisStart, GridAxisEnd, GridAxisCenter}; 42 44 43 45 class RenderGrid final : public RenderBlock { … … 118 120 LayoutUnit minContentForChild(RenderBox&, GridTrackSizingDirection, Vector<GridTrack>& columnTracks); 119 121 LayoutUnit maxContentForChild(RenderBox&, GridTrackSizingDirection, Vector<GridTrack>& columnTracks); 120 LayoutUnit startOfRowForChild(const RenderBox&) const; 121 LayoutUnit endOfRowForChild(const RenderBox&) const; 122 LayoutUnit centeredRowPositionForChild(const RenderBox&) const; 122 GridAxisPosition columnAxisPositionForChild(const RenderBox&) const; 123 GridAxisPosition rowAxisPositionForChild(const RenderBox&) const; 123 124 LayoutUnit rowPositionForChild(const RenderBox&) const; 124 LayoutPoint findChildLogicalPosition(const RenderBox&, const GridSizingData&) const; 125 LayoutUnit columnPositionForChild(const RenderBox&) const; 126 LayoutPoint findChildLogicalPosition(const RenderBox&) const; 125 127 GridCoordinate cachedGridCoordinate(const RenderBox&) const; 128 126 129 127 130 LayoutUnit gridAreaBreadthForChild(const RenderBox& child, GridTrackSizingDirection, const Vector<GridTrack>&) const; -
trunk/Source/WebCore/rendering/style/RenderStyle.cpp
r182974 r183399 180 180 } 181 181 182 ItemPosition RenderStyle::resolveJustification(const RenderStyle& parentStyle, const RenderStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject) 183 { 184 if (childStyle.justifySelf() == ItemPositionAuto) 185 return (parentStyle.justifyItems() == ItemPositionAuto) ? resolvedAutoPositionForLayoutObject : parentStyle.justifyItems(); 186 return childStyle.justifySelf(); 187 } 188 182 189 void RenderStyle::inheritFrom(const RenderStyle* inheritParent, IsAtShadowBoundary isAtShadowBoundary) 183 190 { -
trunk/Source/WebCore/rendering/style/RenderStyle.h
r183364 r183399 493 493 494 494 static ItemPosition resolveAlignment(const RenderStyle& parentStyle, const RenderStyle& childStyle, ItemPosition resolvedAutoPositionForRenderer); 495 static ItemPosition resolveJustification(const RenderStyle& parentStyle, const RenderStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject); 495 496 496 497 enum IsAtShadowBoundary {
Note: See TracChangeset
for help on using the changeset viewer.