Changeset 190484 in webkit
- Timestamp:
- Oct 2, 2015 5:14:49 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 42 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r190481 r190484 1 2015-10-02 Javier Fernandez <jfernandez@igalia.com> 2 3 [CSS Grid Layout] Support for Content Alignment in grid layout 4 https://bugs.webkit.org/show_bug.cgi?id=145520 5 6 Reviewed by Darin Adler. 7 8 Content Distribution alignment controls alignment of the box's 9 content within the box. The alignment container is the grid 10 container's content box. The alignment subjects are the grid 11 tracks. 12 13 In addition to the tests to verify the new functionality, I've 14 added some tests to check out that the new complex values are 15 overwritten properly. 16 17 I had to modify the grid-item-margin-auto-columns-rows-horizontal-rtl 18 test because when using RTL direction the whole grid must flow form 19 right to left, not only its items, so I rebaselined text expectations 20 to adapt it to the new behavior. 21 22 * css3/overwrite-content-alignment-expected.txt: Added. 23 * css3/overwrite-content-alignment.html: Added. 24 * css3/overwrite-self-alignment-expected.txt: Added. 25 * css3/overwrite-self-alignment.html: Added. 26 * fast/css-grid-layout/grid-align-content-distribution-expected.txt: Added. 27 * fast/css-grid-layout/grid-align-content-distribution-vertical-lr-expected.txt: Added. 28 * fast/css-grid-layout/grid-align-content-distribution-vertical-lr.html: Added. 29 * fast/css-grid-layout/grid-align-content-distribution-vertical-rl-expected.txt: Added. 30 * fast/css-grid-layout/grid-align-content-distribution-vertical-rl.html: Added. 31 * fast/css-grid-layout/grid-align-content-distribution.html: Added. 32 * fast/css-grid-layout/grid-align-content-expected.txt: Added. 33 * fast/css-grid-layout/grid-align-content-vertical-lr-expected.txt: Added. 34 * fast/css-grid-layout/grid-align-content-vertical-lr.html: Added. 35 * fast/css-grid-layout/grid-align-content-vertical-rl-expected.txt: Added. 36 * fast/css-grid-layout/grid-align-content-vertical-rl.html: Added. 37 * fast/css-grid-layout/grid-align-content.html: Added. 38 * fast/css-grid-layout/grid-content-alignment-overflow-expected.txt: Added. 39 * fast/css-grid-layout/grid-content-alignment-overflow.html: Added. 40 * fast/css-grid-layout/grid-content-alignment-with-different-sized-tracks.html: Added. 41 * fast/css-grid-layout/grid-content-alignment-with-different-sized-tracks-expected.txt: Added. 42 * fast/css-grid-layout/grid-content-alignment-with-span-expected.txt: Added. 43 * fast/css-grid-layout/grid-content-alignment-with-span-vertical-lr-expected.txt: Added. 44 * fast/css-grid-layout/grid-content-alignment-with-span-vertical-lr.html: Added. 45 * fast/css-grid-layout/grid-content-alignment-with-span-vertical-rl-expected.txt: Added. 46 * fast/css-grid-layout/grid-content-alignment-with-span-vertical-rl.html: Added. 47 * fast/css-grid-layout/grid-content-alignment-with-span.html: Added. 48 * fast/css-grid-layout/grid-item-margin-auto-columns-rows-horizontal-rtl-expected.html: 49 * fast/css-grid-layout/grid-justify-content-distribution-expected.txt: Added. 50 * fast/css-grid-layout/grid-justify-content-distribution-vertical-lr-expected.txt: Added. 51 * fast/css-grid-layout/grid-justify-content-distribution-vertical-lr.html: Added. 52 * fast/css-grid-layout/grid-justify-content-distribution-vertical-rl-expected.txt: Added. 53 * fast/css-grid-layout/grid-justify-content-distribution-vertical-rl.html: Added. 54 * fast/css-grid-layout/grid-justify-content-distribution.html: Added. 55 * fast/css-grid-layout/grid-justify-content-expected.txt: Added. 56 * fast/css-grid-layout/grid-justify-content-vertical-lr-expected.txt: Added. 57 * fast/css-grid-layout/grid-justify-content-vertical-lr.html: Added. 58 * fast/css-grid-layout/grid-justify-content-vertical-rl-expected.txt: Added. 59 * fast/css-grid-layout/grid-justify-content-vertical-rl.html: Added. 60 * fast/css-grid-layout/grid-justify-content.html: Added. 61 * fast/css-grid-layout/resources/grid.css: 62 (.firstRowThirdColumn): 63 (.firstRowFourthColumn): 64 (.secondRowThirdColumn): 65 (.secondRowFourthColumn): 66 (.thirdRowFirstColumn): 67 (.thirdRowSecondColumn): 68 (.fourthRowFirstColumn): 69 (.fourthRowSecondColumn): 70 1 71 2015-10-01 Dean Jackson <dino@apple.com> 2 72 -
trunk/LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horizontal-rtl-expected.html
r183370 r190484 54 54 <div class="testContainer"> 55 55 <div class="grid gridLong"> 56 <div class="gridItem firstRowFirstColumn" style="left: 20px; top: 20px;"></div>57 <div class="gridItem firstRowSecondColumn" style="left: 0px"></div>58 <div class="gridItem secondRowFirstColumn" style="left: 20px; top: 60px;"></div>59 <div class="gridItem secondRowSecondColumn" style="left: 0px; top: 60px;"></div>56 <div class="gridItem firstRowFirstColumn" style="left: 180px; top: 20px;"></div> 57 <div class="gridItem firstRowSecondColumn" style="left: 160px"></div> 58 <div class="gridItem secondRowFirstColumn" style="left: 180px; top: 60px;"></div> 59 <div class="gridItem secondRowSecondColumn" style="left: 160px; top: 60px;"></div> 60 60 </div> 61 61 </div> … … 63 63 <div class="testContainer"> 64 64 <div class="grid gridShort"> 65 <div class="gridItem firstRowFirstColumn" style="left: 20px; top: 20px;"></div>66 <div class="gridItem firstRowSecondColumn" style="left: 0px;"></div>67 <div class="gridItem secondRowFirstColumn" style="left: 20px; top: 60px;"></div>68 <div class="gridItem secondRowSecondColumn" style="left: 0px; top: 60px;"></div>65 <div class="gridItem firstRowFirstColumn" style="left: 180px; top: 20px;"></div> 66 <div class="gridItem firstRowSecondColumn" style="left: 160px;"></div> 67 <div class="gridItem secondRowFirstColumn" style="left: 180px; top: 60px;"></div> 68 <div class="gridItem secondRowSecondColumn" style="left: 160px; top: 60px;"></div> 69 69 </div> 70 70 </div> … … 72 72 <div class="testContainer"> 73 73 <div class="grid gridLong"> 74 <div class="gridItem firstRowFirstColumn" style="left: 20px; top: 80px;"></div>75 <div class="gridItem firstRowSecondColumn" style="left: 0px; top: 80px;"></div>76 <div class="gridItem secondRowFirstColumn" style="left: 20px;"></div>77 <div class="gridItem secondRowSecondColumn" style="left: 0px; top: 20px;"></div>74 <div class="gridItem firstRowFirstColumn" style="left: 180px; top: 80px;"></div> 75 <div class="gridItem firstRowSecondColumn" style="left: 160px; top: 80px;"></div> 76 <div class="gridItem secondRowFirstColumn" style="left: 180px;"></div> 77 <div class="gridItem secondRowSecondColumn" style="left: 160px; top: 20px;"></div> 78 78 </div> 79 79 </div> … … 81 81 <div class="testContainer"> 82 82 <div class="grid gridShort"> 83 <div class="gridItem firstRowFirstColumn" style="left: 20px; top: 60px;"></div>84 <div class="gridItem firstRowSecondColumn" style="left: 0px; top: 40px;"></div>85 <div class="gridItem secondRowFirstColumn" style="left: 20px;"></div>86 <div class="gridItem secondRowSecondColumn" style="left: 0px;"></div>83 <div class="gridItem firstRowFirstColumn" style="left: 180px; top: 60px;"></div> 84 <div class="gridItem firstRowSecondColumn" style="left: 160px; top: 40px;"></div> 85 <div class="gridItem secondRowFirstColumn" style="left: 180px;"></div> 86 <div class="gridItem secondRowSecondColumn" style="left: 160px;"></div> 87 87 </div> 88 88 </div> -
trunk/LayoutTests/fast/css-grid-layout/resources/grid.css
r183399 r190484 28 28 } 29 29 30 .firstRowThirdColumn { 31 background-color: magenta; 32 -webkit-grid-column: 3; 33 -webkit-grid-row: 1; 34 } 35 36 .firstRowFourthColumn { 37 background-color: green; 38 -webkit-grid-column: 4; 39 -webkit-grid-row: 1; 40 } 41 30 42 .secondRowFirstColumn { 31 43 background-color: purple; … … 38 50 -webkit-grid-column: 2; 39 51 -webkit-grid-row: 2; 52 } 53 54 .secondRowThirdColumn { 55 background-color: navy; 56 -webkit-grid-column: 3; 57 -webkit-grid-row: 2; 58 } 59 60 .secondRowFourthColumn { 61 background-color: pink; 62 -webkit-grid-column: 4; 63 -webkitgrid-row: 2; 64 } 65 66 .thirdRowFirstColumn { 67 background-color: olive; 68 -webkit-grid-column: 1; 69 -webkit-grid-row: 3; 70 } 71 72 .thirdRowSecondColumn { 73 background-color: maroon; 74 -webkit-grid-column: 2; 75 -webkit-grid-row: 3; 76 } 77 78 .thirdRowThirdColumn { 79 background-color: yellow; 80 -webkit-grid-column: 3; 81 -webkit-grid-row: 3; 82 } 83 84 .fourthRowFirstColumn { 85 background-color: red; 86 -webkit-grid-column: 1; 87 -webkit-grid-row: 4; 88 } 89 90 .fourthRowSecondColumn { 91 background-color: aqua; 92 -webkit-grid-column: 2; 93 -webkit-grid-row: 4; 40 94 } 41 95 -
trunk/Source/WebCore/ChangeLog
r190482 r190484 1 2015-10-02 Javier Fernandez <jfernandez@igalia.com> 2 3 [CSS Grid Layout] Support for Content Alignment in grid layout 4 https://bugs.webkit.org/show_bug.cgi?id=145520 5 6 Reviewed by Darin Adler. 7 8 According to CSS Box Alignment specification, Content Distribution 9 alignment controls alignment of the box's content within the box. The 10 alignment container is the grid container's content box. The alignment 11 subjects are the grid tracks. 12 13 This patch implements Grid Layout support for Content Distribution 14 alignment along both block/column and inline/row axis, which are handled 15 by align-content and justify-content properties respectively. 16 17 This patch provides support for overflow handling, similar to what 18 Self Alignment provides with grid items, and both <content-position> 19 and <content-distribution> values. 20 21 Baseline Alignment is still missing because it requires some additional 22 behavior to be supported on grids before considering its implementation. 23 24 Tests: css3/overwrite-content-alignment.html 25 css3/overwrite-self-alignment.html 26 fast/css-grid-layout/grid-align-content-distribution-vertical-lr.html 27 fast/css-grid-layout/grid-align-content-distribution-vertical-rl.html 28 fast/css-grid-layout/grid-align-content-distribution.html 29 fast/css-grid-layout/grid-align-content-vertical-lr.html 30 fast/css-grid-layout/grid-align-content-vertical-rl.html 31 fast/css-grid-layout/grid-align-content.html 32 fast/css-grid-layout/grid-content-alignment-overflow.html 33 fast/css-grid-layout/grid-content-alignment-with-different-sized-tracks.html 34 fast/css-grid-layout/grid-content-alignment-with-span-vertical-lr.html 35 fast/css-grid-layout/grid-content-alignment-with-span-vertical-rl.html 36 fast/css-grid-layout/grid-content-alignment-with-span.html 37 fast/css-grid-layout/grid-justify-content-distribution-vertical-lr.html 38 fast/css-grid-layout/grid-justify-content-distribution-vertical-rl.html 39 fast/css-grid-layout/grid-justify-content-distribution.html 40 fast/css-grid-layout/grid-justify-content-vertical-lr.html 41 fast/css-grid-layout/grid-justify-content-vertical-rl.html 42 fast/css-grid-layout/grid-justify-content.html 43 44 * rendering/RenderFlexibleBox.cpp: 45 (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): 46 (WebCore::RenderFlexibleBox::layoutColumnReverse): 47 (WebCore::RenderFlexibleBox::alignFlexLines): 48 * rendering/RenderGrid.cpp: 49 (WebCore::ContentAlignmentData::ContentAlignmentData): 50 (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): 51 (WebCore::RenderGrid::layoutGridItems): 52 (WebCore::RenderGrid::gridAreaBreadthForChild): 53 (WebCore::RenderGrid::populateGridPositions): 54 (WebCore::resolveContentDistributionFallback): 55 (WebCore::offsetToStartEdge): 56 (WebCore::offsetToEndEdge): 57 (WebCore::contentDistributionOffset): 58 (WebCore::RenderGrid::computeContentPositionAndDistributionColumnOffset): 59 (WebCore::RenderGrid::computeContentPositionAndDistributionRowOffset): 60 (WebCore::RenderGrid::findChildLogicalPosition): 61 (WebCore::RenderGrid::computePreferredLogicalWidths): Deleted. 62 (WebCore::RenderGrid::autoPlacementMajorAxisDirection): Deleted. 63 (WebCore::RenderGrid::autoPlacementMinorAxisDirection): Deleted. 64 (WebCore::RenderGrid::cachedGridCoordinate): Deleted. 65 (WebCore::RenderGrid::rowPositionForChild): Deleted. 66 * rendering/RenderGrid.h: 67 * rendering/style/RenderStyle.cpp: 68 (WebCore::RenderStyle::resolvedAlignContentPosition): 69 (WebCore::RenderStyle::resolvedAlignContentDistribution): 70 (WebCore::RenderStyle::resolvedJustifyContentPosition): 71 (WebCore::RenderStyle::resolvedJustifyContentDistribution): 72 * rendering/style/RenderStyle.h: 73 1 74 2015-10-02 Dean Jackson <dino@apple.com> 2 75 -
trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp
r189567 r190484 1094 1094 ASSERT(childSizes.size() == children.size()); 1095 1095 1096 ContentPosition position = style().justifyContentPosition(); 1097 ContentDistributionType distribution = style().justifyContentDistribution(); 1098 RenderStyle::resolveContentJustification(style(), position); 1096 ContentPosition position = style().resolvedJustifyContentPosition(); 1097 ContentDistributionType distribution = style().resolvedJustifyContentDistribution(); 1099 1098 1100 1099 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(children); … … 1179 1178 void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) 1180 1179 { 1181 ContentPosition position = style().justifyContentPosition(); 1182 ContentDistributionType distribution = style().justifyContentDistribution(); 1183 RenderStyle::resolveContentJustification(style(), position); 1180 ContentPosition position = style().resolvedJustifyContentPosition(); 1181 ContentDistributionType distribution = style().resolvedJustifyContentDistribution(); 1184 1182 1185 1183 // This is similar to the logic in layoutAndPlaceChildren, except we place the children … … 1238 1236 void RenderFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) 1239 1237 { 1240 ContentPosition position = style().alignContentPosition(); 1241 ContentDistributionType distribution = style().alignContentDistribution(); 1242 RenderStyle::resolveContentAlignment(style(), position, distribution); 1238 ContentPosition position = style().resolvedAlignContentPosition(); 1239 ContentDistributionType distribution = style().resolvedAlignContentDistribution(); 1243 1240 1244 1241 if (!isMultiline() || position == ContentPositionFlexStart) -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r190308 r190484 117 117 }; 118 118 119 struct ContentAlignmentData { 120 WTF_MAKE_FAST_ALLOCATED; 121 public: 122 bool isValid() { return positionOffset >= 0 && distributionOffset >= 0; } 123 static ContentAlignmentData defaultOffsets() { return {-1, -1}; } 124 125 LayoutUnit positionOffset; 126 LayoutUnit distributionOffset; 127 }; 128 119 129 class RenderGrid::GridIterator { 120 130 WTF_MAKE_NONCOPYABLE(GridIterator); … … 346 356 } 347 357 348 void RenderGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection direction, GridSizingData& sizingData)349 {350 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogicalWidth() : availableLogicalHeight(IncludeMarginBorderPadding);351 computeUsedBreadthOfGridTracks(direction, sizingData, availableLogicalSpace);352 }353 354 358 bool RenderGrid::gridElementIsShrinkToFit() 355 359 { … … 490 494 } 491 495 492 double RenderGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, GridTrackSizingDirection direction, double flexFactorSum, LayoutUnit leftOverSpace, const Vector< size_t, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const496 double RenderGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, GridTrackSizingDirection direction, double flexFactorSum, LayoutUnit leftOverSpace, const Vector<unsigned, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const 493 497 { 494 498 // We want to avoid the effect of flex factors sum below 1 making the factor unit size to grow exponentially. … … 523 527 524 528 double flexFactorSum = 0; 525 Vector< size_t, 8> flexibleTracksIndexes;529 Vector<unsigned, 8> flexibleTracksIndexes; 526 530 for (const auto& resolvedPosition : tracksSpan) { 527 size_ttrackIndex = resolvedPosition.toInt();531 unsigned trackIndex = resolvedPosition.toInt(); 528 532 GridTrackSize trackSize = gridTrackSize(direction, trackIndex); 529 533 if (!trackSize.maxTrackBreadth().isFlex()) … … 1211 1215 } 1212 1216 1217 void RenderGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit availableSpace) 1218 { 1219 if (availableSpace <= 0 1220 || (direction == ForColumns && style().resolvedJustifyContentDistribution() != ContentDistributionStretch) 1221 || (direction == ForRows && style().resolvedAlignContentDistribution() != ContentDistributionStretch)) 1222 return; 1223 1224 // Spec defines auto-sized tracks as the ones with an 'auto' max-sizing function. 1225 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks; 1226 Vector<unsigned> autoSizedTracksIndex; 1227 for (unsigned i = 0; i < tracks.size(); ++i) { 1228 const GridTrackSize& trackSize = gridTrackSize(direction, i); 1229 if (trackSize.hasAutoMaxTrackBreadth()) 1230 autoSizedTracksIndex.append(i); 1231 } 1232 1233 unsigned numberOfAutoSizedTracks = autoSizedTracksIndex.size(); 1234 if (numberOfAutoSizedTracks < 1) 1235 return; 1236 1237 LayoutUnit sizeToIncrease = availableSpace / numberOfAutoSizedTracks; 1238 for (const auto& trackIndex : autoSizedTracksIndex) { 1239 auto& track = tracks[trackIndex]; 1240 track.setBaseSize(track.baseSize() + sizeToIncrease); 1241 } 1242 } 1243 1213 1244 void RenderGrid::layoutGridItems() 1214 1245 { 1215 1246 placeItemsOnGrid(); 1216 1247 1248 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); 1249 LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorderPadding); 1217 1250 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 1218 computeUsedBreadthOfGridTracks(ForColumns, sizingData );1251 computeUsedBreadthOfGridTracks(ForColumns, sizingData, availableSpaceForColumns); 1219 1252 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks)); 1220 computeUsedBreadthOfGridTracks(ForRows, sizingData );1253 computeUsedBreadthOfGridTracks(ForRows, sizingData, availableSpaceForRows); 1221 1254 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks)); 1222 1255 1223 populateGridPositions(sizingData); 1256 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData, availableSpaceForColumns); 1257 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData, availableSpaceForRows); 1258 1259 populateGridPositions(sizingData, availableSpaceForColumns, availableSpaceForRows); 1224 1260 1225 1261 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { … … 1229 1265 Optional<LayoutUnit> oldOverrideContainingBlockContentLogicalHeight = child->hasOverrideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogicalHeight() : LayoutUnit(); 1230 1266 1231 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthForChild (*child, ForColumns, sizingData.columnTracks);1232 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadthForChild (*child, ForRows, sizingData.rowTracks);1267 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthForChildIncludingAlignmentOffsets(*child, ForColumns, sizingData); 1268 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadthForChildIncludingAlignmentOffsets(*child, ForRows, sizingData); 1233 1269 if (!oldOverrideContainingBlockContentLogicalWidth || oldOverrideContainingBlockContentLogicalWidth.value() != overrideContainingBlockContentLogicalWidth 1234 1270 || ((!oldOverrideContainingBlockContentLogicalHeight || oldOverrideContainingBlockContentLogicalHeight.value() != overrideContainingBlockContentLogicalHeight) … … 1295 1331 } 1296 1332 1297 void RenderGrid::populateGridPositions(const GridSizingData& sizingData) 1298 { 1299 m_columnPositions.resizeToFit(sizingData.columnTracks.size() + 1); 1300 m_columnPositions[0] = borderAndPaddingStart(); 1301 for (unsigned i = 0; i < m_columnPositions.size() - 1; ++i) 1302 m_columnPositions[i + 1] = m_columnPositions[i] + sizingData.columnTracks[i].baseSize(); 1303 1304 m_rowPositions.resizeToFit(sizingData.rowTracks.size() + 1); 1305 m_rowPositions[0] = borderAndPaddingBefore(); 1306 for (unsigned i = 0; i < m_rowPositions.size() - 1; ++i) 1307 m_rowPositions[i + 1] = m_rowPositions[i] + sizingData.rowTracks[i].baseSize(); 1333 LayoutUnit RenderGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const RenderBox& child, GridTrackSizingDirection direction, const GridSizingData& sizingData) const 1334 { 1335 // We need the cached value when available because Content Distribution alignment properties 1336 // may have some influence in the final grid area breadth. 1337 const auto& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks; 1338 const auto& coordinate = cachedGridCoordinate(child); 1339 const auto& span = (direction == ForColumns) ? coordinate.columns : coordinate.rows; 1340 const auto& linePositions = (direction == ForColumns) ? m_columnPositions : m_rowPositions; 1341 1342 LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition.toInt()]; 1343 LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.toInt()]; 1344 1345 // Track Positions vector stores the 'start' grid line of each track, so we have to add last track's baseSize. 1346 return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition.toInt()].baseSize(); 1347 } 1348 1349 void RenderGrid::populateGridPositions(GridSizingData& sizingData, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows) 1350 { 1351 // Since we add alignment offsets, grid lines are not always adjacent. Hence we will have to 1352 // assume from now on that we just store positions of the initial grid lines of each track, 1353 // except the last one, which is the only one considered as a final grid line of a track. 1354 // FIXME: This will affect the computed style value of grid tracks size, since we are 1355 // using these positions to compute them. 1356 1357 unsigned numberOfTracks = sizingData.columnTracks.size(); 1358 unsigned numberOfLines = numberOfTracks + 1; 1359 unsigned lastLine = numberOfLines - 1; 1360 unsigned nextToLastLine = numberOfLines - 2; 1361 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(ForColumns, availableSpaceForColumns, numberOfTracks); 1362 m_columnPositions.resize(numberOfLines); 1363 m_columnPositions[0] = borderAndPaddingStart() + offset.positionOffset; 1364 for (unsigned i = 0; i < lastLine; ++i) 1365 m_columnPositions[i + 1] = m_columnPositions[i] + offset.distributionOffset + sizingData.columnTracks[i].baseSize(); 1366 m_columnPositions[lastLine] = m_columnPositions[nextToLastLine] + sizingData.columnTracks[nextToLastLine].baseSize(); 1367 1368 numberOfTracks = sizingData.rowTracks.size(); 1369 numberOfLines = numberOfTracks + 1; 1370 lastLine = numberOfLines - 1; 1371 nextToLastLine = numberOfLines - 2; 1372 offset = computeContentPositionAndDistributionOffset(ForRows, availableSpaceForRows, numberOfTracks); 1373 m_rowPositions.resize(numberOfLines); 1374 m_rowPositions[0] = borderAndPaddingBefore() + offset.positionOffset; 1375 for (unsigned i = 0; i < lastLine; ++i) 1376 m_rowPositions[i + 1] = m_rowPositions[i] + offset.distributionOffset + sizingData.rowTracks[i].baseSize(); 1377 m_rowPositions[lastLine] = m_rowPositions[nextToLastLine] + sizingData.rowTracks[nextToLastLine].baseSize(); 1308 1378 } 1309 1379 … … 1590 1660 } 1591 1661 1662 static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distribution, const Vector<LayoutUnit>& trackPositions, const LayoutUnit& childBreadth) 1663 { 1664 return (distribution == ContentDistributionStretch || ContentDistributionStretch == ContentDistributionDefault) ? LayoutUnit() : trackPositions[1] - trackPositions[0] - childBreadth; 1665 } 1666 1592 1667 LayoutUnit RenderGrid::columnAxisOffsetForChild(const RenderBox& child) const 1593 1668 { 1594 1669 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1595 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()]; 1670 unsigned childStartLine = coordinate.rows.resolvedInitialPosition.toInt(); 1671 LayoutUnit startOfRow = m_rowPositions[childStartLine]; 1596 1672 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); 1597 1673 if (hasAutoMarginsInColumnAxis(child)) … … 1603 1679 case GridAxisEnd: 1604 1680 case GridAxisCenter: { 1605 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()]; 1606 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveAlignmentOverflow(style(), child.style()), endOfRow - startOfRow, child.logicalHeight() + child.marginLogicalHeight()); 1681 unsigned childEndLine = coordinate.rows.resolvedFinalPosition.next().toInt(); 1682 LayoutUnit endOfRow = m_rowPositions[childEndLine]; 1683 LayoutUnit childBreadth = child.logicalHeight() + child.marginLogicalHeight(); 1684 if (childEndLine - childStartLine > 1 && childEndLine < m_rowPositions.size() - 1) 1685 endOfRow -= offsetBetweenTracks(style().resolvedAlignContentDistribution(), m_rowPositions, childBreadth); 1686 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveAlignmentOverflow(style(), child.style()), endOfRow - startOfRow, childBreadth); 1607 1687 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); 1608 1688 } … … 1617 1697 { 1618 1698 const GridCoordinate& coordinate = cachedGridCoordinate(child); 1619 LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()]; 1699 unsigned childStartLine = coordinate.columns.resolvedInitialPosition.toInt(); 1700 LayoutUnit startOfColumn = m_columnPositions[childStartLine]; 1620 1701 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); 1621 1702 if (hasAutoMarginsInRowAxis(child)) … … 1627 1708 case GridAxisEnd: 1628 1709 case GridAxisCenter: { 1629 LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()]; 1630 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveJustificationOverflow(style(), child.style()), endOfColumn - startOfColumn, child.logicalWidth() + child.marginLogicalWidth()); 1710 unsigned childEndLine = coordinate.columns.resolvedFinalPosition.next().toInt(); 1711 LayoutUnit endOfColumn = m_columnPositions[childEndLine]; 1712 LayoutUnit childBreadth = child.logicalWidth() + child.marginLogicalWidth(); 1713 if (childEndLine - childStartLine > 1 && childEndLine < m_columnPositions.size() - 1) 1714 endOfColumn -= offsetBetweenTracks(style().resolvedJustifyContentDistribution(), m_columnPositions, childBreadth); 1715 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveJustificationOverflow(style(), child.style()), endOfColumn - startOfColumn, childBreadth); 1631 1716 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2); 1632 1717 } … … 1635 1720 ASSERT_NOT_REACHED(); 1636 1721 return 0; 1722 } 1723 1724 ContentPosition static resolveContentDistributionFallback(ContentDistributionType distribution) 1725 { 1726 switch (distribution) { 1727 case ContentDistributionSpaceBetween: 1728 return ContentPositionStart; 1729 case ContentDistributionSpaceAround: 1730 return ContentPositionCenter; 1731 case ContentDistributionSpaceEvenly: 1732 return ContentPositionCenter; 1733 case ContentDistributionStretch: 1734 return ContentPositionStart; 1735 case ContentDistributionDefault: 1736 return ContentPositionAuto; 1737 } 1738 1739 ASSERT_NOT_REACHED(); 1740 return ContentPositionAuto; 1741 } 1742 1743 static inline LayoutUnit offsetToStartEdge(bool isLeftToRight, LayoutUnit availableSpace) 1744 { 1745 return isLeftToRight ? LayoutUnit() : availableSpace; 1746 } 1747 1748 static inline LayoutUnit offsetToEndEdge(bool isLeftToRight, LayoutUnit availableSpace) 1749 { 1750 return !isLeftToRight ? LayoutUnit() : availableSpace; 1751 } 1752 1753 static ContentAlignmentData contentDistributionOffset(LayoutUnit availableFreeSpace, ContentPosition& fallbackPosition, ContentDistributionType distribution, unsigned numberOfGridTracks) 1754 { 1755 if (distribution != ContentDistributionDefault && fallbackPosition == ContentPositionAuto) 1756 fallbackPosition = resolveContentDistributionFallback(distribution); 1757 1758 if (availableFreeSpace <= 0) 1759 return ContentAlignmentData::defaultOffsets(); 1760 1761 LayoutUnit distributionOffset; 1762 switch (distribution) { 1763 case ContentDistributionSpaceBetween: 1764 if (numberOfGridTracks < 2) 1765 return ContentAlignmentData::defaultOffsets(); 1766 return {0, availableFreeSpace / (numberOfGridTracks - 1)}; 1767 case ContentDistributionSpaceAround: 1768 if (numberOfGridTracks < 1) 1769 return ContentAlignmentData::defaultOffsets(); 1770 distributionOffset = availableFreeSpace / numberOfGridTracks; 1771 return {distributionOffset / 2, distributionOffset}; 1772 case ContentDistributionSpaceEvenly: 1773 distributionOffset = availableFreeSpace / (numberOfGridTracks + 1); 1774 return {distributionOffset, distributionOffset}; 1775 case ContentDistributionStretch: 1776 return {0, 0}; 1777 case ContentDistributionDefault: 1778 return ContentAlignmentData::defaultOffsets(); 1779 } 1780 1781 ASSERT_NOT_REACHED(); 1782 return ContentAlignmentData::defaultOffsets(); 1783 } 1784 1785 ContentAlignmentData RenderGrid::computeContentPositionAndDistributionOffset(GridTrackSizingDirection direction, LayoutUnit availableFreeSpace, unsigned numberOfGridTracks) const 1786 { 1787 bool isRowAxis = direction == ForColumns; 1788 ContentPosition position = isRowAxis ? style().resolvedJustifyContentPosition() : style().resolvedAlignContentPosition(); 1789 ContentDistributionType distribution = isRowAxis ? style().resolvedJustifyContentDistribution() : style().resolvedAlignContentDistribution(); 1790 // If <content-distribution> value can't be applied, 'position' will become the associated 1791 // <content-position> fallback value. 1792 ContentAlignmentData contentAlignment = contentDistributionOffset(availableFreeSpace, position, distribution, numberOfGridTracks); 1793 if (contentAlignment.isValid()) 1794 return contentAlignment; 1795 1796 OverflowAlignment overflow = isRowAxis ? style().justifyContentOverflowAlignment() : style().alignContentOverflowAlignment(); 1797 if (availableFreeSpace <= 0 && overflow == OverflowAlignmentSafe) 1798 return {0, 0}; 1799 1800 switch (position) { 1801 case ContentPositionLeft: 1802 // The align-content's axis is always orthogonal to the inline-axis. 1803 return {0, 0}; 1804 case ContentPositionRight: 1805 if (isRowAxis) 1806 return {availableFreeSpace, 0}; 1807 // The align-content's axis is always orthogonal to the inline-axis. 1808 return {0, 0}; 1809 case ContentPositionCenter: 1810 return {availableFreeSpace / 2, 0}; 1811 case ContentPositionFlexEnd: // Only used in flex layout, for other layout, it's equivalent to 'end'. 1812 case ContentPositionEnd: 1813 if (isRowAxis) 1814 return {offsetToEndEdge(style().isLeftToRightDirection(), availableFreeSpace), 0}; 1815 return {availableFreeSpace, 0}; 1816 case ContentPositionFlexStart: // Only used in flex layout, for other layout, it's equivalent to 'start'. 1817 case ContentPositionStart: 1818 if (isRowAxis) 1819 return {offsetToStartEdge(style().isLeftToRightDirection(), availableFreeSpace), 0}; 1820 return {0, 0}; 1821 case ContentPositionBaseline: 1822 case ContentPositionLastBaseline: 1823 // FIXME: Implement the previous values. For now, we always 'start' align. 1824 // http://webkit.org/b/145566 1825 if (isRowAxis) 1826 return {offsetToStartEdge(style().isLeftToRightDirection(), availableFreeSpace), 0}; 1827 return {0, 0}; 1828 case ContentPositionAuto: 1829 break; 1830 } 1831 1832 ASSERT_NOT_REACHED(); 1833 return {0, 0}; 1637 1834 } 1638 1835 … … 1648 1845 } 1649 1846 1650 // The grid items should be inside the grid container's border box, that's why they need to be shifted.1651 1847 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 1652 1848 } -
trunk/Source/WebCore/rendering/RenderGrid.h
r190308 r190484 41 41 class GridItemWithSpan; 42 42 43 struct ContentAlignmentData; 44 43 45 enum GridAxisPosition {GridAxisStart, GridAxisEnd, GridAxisCenter}; 44 46 … … 66 68 class GridIterator; 67 69 class GridSizingData; 68 void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&);69 70 void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&, LayoutUnit& availableLogicalSpace); 70 71 bool gridElementIsShrinkToFit(); … … 87 88 88 89 void layoutGridItems(); 89 void populateGridPositions( const GridSizingData&);90 void populateGridPositions(GridSizingData&, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows); 90 91 void clearGrid(); 91 92 … … 115 116 116 117 typedef HashSet<unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> TrackIndexSet; 117 double computeFlexFactorUnitSize(const Vector<GridTrack>&, GridTrackSizingDirection, double flexFactorSum, LayoutUnit leftOverSpace, const Vector< size_t, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const;118 double computeFlexFactorUnitSize(const Vector<GridTrack>&, GridTrackSizingDirection, double flexFactorSum, LayoutUnit leftOverSpace, const Vector<unsigned, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const; 118 119 double findFlexFactorUnitSize(const Vector<GridTrack>&, const GridSpan&, GridTrackSizingDirection, LayoutUnit spaceToFill) const; 119 120 … … 128 129 LayoutUnit columnAxisOffsetForChild(const RenderBox&) const; 129 130 LayoutUnit rowAxisOffsetForChild(const RenderBox&) const; 131 ContentAlignmentData computeContentPositionAndDistributionOffset(GridTrackSizingDirection, LayoutUnit availableFreeSpace, unsigned numberOfGridTracks) const; 130 132 LayoutPoint findChildLogicalPosition(const RenderBox&) const; 131 133 GridCoordinate cachedGridCoordinate(const RenderBox&) const; … … 133 135 134 136 LayoutUnit gridAreaBreadthForChild(const RenderBox& child, GridTrackSizingDirection, const Vector<GridTrack>&) const; 137 LayoutUnit gridAreaBreadthForChildIncludingAlignmentOffsets(const RenderBox&, GridTrackSizingDirection, const GridSizingData&) const; 138 139 void applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection, GridSizingData&, LayoutUnit availableSpace); 135 140 136 141 virtual void paintChildren(PaintInfo& forSelf, const LayoutPoint& paintOffset, PaintInfo& forChild, bool usePrintRect) override; -
trunk/Source/WebCore/rendering/style/RenderStyle.cpp
r189910 r190484 210 210 } 211 211 212 void RenderStyle::resolveContentAlignment(const RenderStyle& style, ContentPosition& position, ContentDistributionType& distribution) 213 { 214 if (position != ContentPositionAuto || distribution != ContentDistributionDefault) 215 return; 216 217 if (style.isDisplayFlexibleBox()) 218 distribution = ContentDistributionStretch; 219 else 220 position = ContentPositionStart; 221 } 222 223 void RenderStyle::resolveContentJustification(const RenderStyle& style, ContentPosition& position) 224 { 225 if (position != ContentPositionAuto || style.justifyContentDistribution() != ContentDistributionDefault) 226 return; 227 228 if (style.isDisplayFlexibleBox()) 229 position = ContentPositionFlexStart; 230 else 231 position = ContentPositionStart; 212 ContentPosition RenderStyle::resolvedAlignContentPosition() const 213 { 214 const StyleContentAlignmentData& align = alignContent(); 215 if (align.position() != ContentPositionAuto || align.distribution() != ContentDistributionDefault) 216 return align.position(); 217 // 'auto' computes to 'stretch' for flexbox, hence it's managed by distribution(). 218 return isDisplayFlexibleBox() ? ContentPositionAuto : ContentPositionStart; 219 } 220 221 ContentDistributionType RenderStyle::resolvedAlignContentDistribution() const 222 { 223 const StyleContentAlignmentData& align = alignContent(); 224 if (align.position() != ContentPositionAuto || align.distribution() != ContentDistributionDefault) 225 return align.distribution(); 226 return isDisplayFlexibleBox() ? ContentDistributionStretch : ContentDistributionDefault; 227 } 228 229 ContentPosition RenderStyle::resolvedJustifyContentPosition() const 230 { 231 const StyleContentAlignmentData& justify = justifyContent(); 232 if (justify.position() != ContentPositionAuto || justify.distribution() != ContentDistributionDefault) 233 return justify.position(); 234 // 'auto' computes to 'stretch' for flexbox, but since flexing in the main axis is controlled by flex, it behaves as flex-start. 235 return isDisplayFlexibleBox() ? ContentPositionFlexStart : ContentPositionStart; 236 } 237 238 ContentDistributionType RenderStyle::resolvedJustifyContentDistribution() const 239 { 240 // even that 'auto' computes to 'stretch' for flexbox it behaves as flex-start, hence it's managed by position(). 241 return justifyContentDistribution(); 232 242 } 233 243 -
trunk/Source/WebCore/rendering/style/RenderStyle.h
r190231 r190484 490 490 static Ref<RenderStyle> createStyleInheritingFromPseudoStyle(const RenderStyle& pseudoStyle); 491 491 492 static void resolveContentAlignment(const RenderStyle&, ContentPosition&, ContentDistributionType&); 493 static void resolveContentJustification(const RenderStyle&, ContentPosition&); 492 ContentPosition resolvedAlignContentPosition() const; 493 ContentDistributionType resolvedAlignContentDistribution() const; 494 ContentPosition resolvedJustifyContentPosition() const; 495 ContentDistributionType resolvedJustifyContentDistribution() const; 494 496 static ItemPosition resolveAlignment(const RenderStyle& parentStyle, const RenderStyle& childStyle, ItemPosition resolvedAutoPositionForRenderer); 495 497 static OverflowAlignment resolveAlignmentOverflow(const RenderStyle& parentStyle, const RenderStyle& childStyle);
Note: See TracChangeset
for help on using the changeset viewer.