Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(295)

Side by Side Diff: Source/core/rendering/RenderFlexibleBox.cpp

Issue 636993002: [CSS Grid Layout] Upgrade justify-content parsing to CSS3 Box Alignment spec. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebaseline some tests expectations. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 } 942 }
943 943
944 if (totalViolation) 944 if (totalViolation)
945 freezeViolations(totalViolation < 0 ? maxViolations : minViolations, ava ilableFreeSpace, totalFlexGrow, totalWeightedFlexShrink, inflexibleItems, hasInf initeLineLength); 945 freezeViolations(totalViolation < 0 ? maxViolations : minViolations, ava ilableFreeSpace, totalFlexGrow, totalWeightedFlexShrink, inflexibleItems, hasInf initeLineLength);
946 else 946 else
947 availableFreeSpace -= usedFreeSpace; 947 availableFreeSpace -= usedFreeSpace;
948 948
949 return !totalViolation; 949 return !totalViolation;
950 } 950 }
951 951
952 static LayoutUnit initialJustifyContentOffset(LayoutUnit availableFreeSpace, EJu stifyContent justifyContent, unsigned numberOfChildren) 952 static LayoutUnit initialJustifyContentOffset(LayoutUnit availableFreeSpace, Con tentPosition justifyContent, ContentDistributionType justifyContentDistribution, unsigned numberOfChildren)
953 { 953 {
954 if (justifyContent == JustifyFlexEnd) 954 if (justifyContent == ContentPositionFlexEnd)
955 return availableFreeSpace; 955 return availableFreeSpace;
956 if (justifyContent == JustifyCenter) 956 if (justifyContent == ContentPositionCenter)
957 return availableFreeSpace / 2; 957 return availableFreeSpace / 2;
958 if (justifyContent == JustifySpaceAround) { 958 if (justifyContentDistribution == ContentDistributionSpaceAround) {
959 if (availableFreeSpace > 0 && numberOfChildren) 959 if (availableFreeSpace > 0 && numberOfChildren)
960 return availableFreeSpace / (2 * numberOfChildren); 960 return availableFreeSpace / (2 * numberOfChildren);
961 else 961 else
962 return availableFreeSpace / 2; 962 return availableFreeSpace / 2;
963 } 963 }
964 return 0; 964 return 0;
965 } 965 }
966 966
967 static LayoutUnit justifyContentSpaceBetweenChildren(LayoutUnit availableFreeSpa ce, EJustifyContent justifyContent, unsigned numberOfChildren) 967 static LayoutUnit justifyContentSpaceBetweenChildren(LayoutUnit availableFreeSpa ce, ContentDistributionType justifyContentDistribution, unsigned numberOfChildre n)
968 { 968 {
969 if (availableFreeSpace > 0 && numberOfChildren > 1) { 969 if (availableFreeSpace > 0 && numberOfChildren > 1) {
970 if (justifyContent == JustifySpaceBetween) 970 if (justifyContentDistribution == ContentDistributionSpaceBetween)
971 return availableFreeSpace / (numberOfChildren - 1); 971 return availableFreeSpace / (numberOfChildren - 1);
972 if (justifyContent == JustifySpaceAround) 972 if (justifyContentDistribution == ContentDistributionSpaceAround)
973 return availableFreeSpace / numberOfChildren; 973 return availableFreeSpace / numberOfChildren;
974 } 974 }
975 return 0; 975 return 0;
976 } 976 }
977 977
978 void RenderFlexibleBox::setLogicalOverrideSize(RenderBox& child, LayoutUnit chil dPreferredSize) 978 void RenderFlexibleBox::setLogicalOverrideSize(RenderBox& child, LayoutUnit chil dPreferredSize)
979 { 979 {
980 if (hasOrthogonalFlow(child)) 980 if (hasOrthogonalFlow(child))
981 child.setOverrideLogicalContentHeight(childPreferredSize - child.borderA ndPaddingLogicalHeight()); 981 child.setOverrideLogicalContentHeight(childPreferredSize - child.borderA ndPaddingLogicalHeight());
982 else 982 else
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 return isHorizontalFlow() && child.style()->height().isAuto(); 1055 return isHorizontalFlow() && child.style()->height().isAuto();
1056 } 1056 }
1057 1057
1058 void RenderFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons t OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, Layou tUnit availableFreeSpace, bool relayoutChildren, Vector<LineContext>& lineContex ts, bool hasInfiniteLineLength) 1058 void RenderFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons t OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, Layou tUnit availableFreeSpace, bool relayoutChildren, Vector<LineContext>& lineContex ts, bool hasInfiniteLineLength)
1059 { 1059 {
1060 ASSERT(childSizes.size() == children.size()); 1060 ASSERT(childSizes.size() == children.size());
1061 1061
1062 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children); 1062 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children);
1063 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available FreeSpace); 1063 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available FreeSpace);
1064 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart() ; 1064 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart() ;
1065 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, style()->j ustifyContent(), numberOfChildrenForJustifyContent); 1065 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, style()->j ustifyContent(), style()->justifyContentDistribution(), numberOfChildrenForJusti fyContent);
1066 if (style()->flexDirection() == FlowRowReverse) 1066 if (style()->flexDirection() == FlowRowReverse)
1067 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo ntalScrollbarHeight(); 1067 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo ntalScrollbarHeight();
1068 1068
1069 LayoutUnit totalMainExtent = mainAxisExtent(); 1069 LayoutUnit totalMainExtent = mainAxisExtent();
1070 LayoutUnit maxAscent = 0, maxDescent = 0; // Used when align-items: baseline . 1070 LayoutUnit maxAscent = 0, maxDescent = 0; // Used when align-items: baseline .
1071 LayoutUnit maxChildCrossAxisExtent = 0; 1071 LayoutUnit maxChildCrossAxisExtent = 0;
1072 size_t seenInFlowPositionedChildren = 0; 1072 size_t seenInFlowPositionedChildren = 0;
1073 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 1073 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow();
1074 for (size_t i = 0; i < children.size(); ++i) { 1074 for (size_t i = 0; i < children.size(); ++i) {
1075 RenderBox* child = children[i]; 1075 RenderBox* child = children[i];
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1120 // This will be fixed later in flipForRightToLeftColumn. 1120 // This will be fixed later in flipForRightToLeftColumn.
1121 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset, 1121 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset,
1122 crossAxisOffset + flowAwareMarginBeforeForChild(*child)); 1122 crossAxisOffset + flowAwareMarginBeforeForChild(*child));
1123 1123
1124 // FIXME: Supporting layout deltas. 1124 // FIXME: Supporting layout deltas.
1125 setFlowAwareLocationForChild(*child, childLocation); 1125 setFlowAwareLocationForChild(*child, childLocation);
1126 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child); 1126 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child);
1127 1127
1128 ++seenInFlowPositionedChildren; 1128 ++seenInFlowPositionedChildren;
1129 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1129 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1130 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContent(), numberOfChildrenForJustifyContent); 1130 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContentDistribution(), numberOfChildrenForJustifyContent);
1131 } 1131 }
1132 1132
1133 if (isColumnFlow()) 1133 if (isColumnFlow())
1134 setLogicalHeight(mainAxisOffset + flowAwareBorderEnd() + flowAwarePaddin gEnd() + scrollbarLogicalHeight()); 1134 setLogicalHeight(mainAxisOffset + flowAwareBorderEnd() + flowAwarePaddin gEnd() + scrollbarLogicalHeight());
1135 1135
1136 if (style()->flexDirection() == FlowColumnReverse) { 1136 if (style()->flexDirection() == FlowColumnReverse) {
1137 // We have to do an extra pass for column-reverse to reposition the flex items since the start depends 1137 // We have to do an extra pass for column-reverse to reposition the flex items since the start depends
1138 // on the height of the flexbox, which we only know after we've position ed all the flex items. 1138 // on the height of the flexbox, which we only know after we've position ed all the flex items.
1139 updateLogicalHeight(); 1139 updateLogicalHeight();
1140 layoutColumnReverse(children, crossAxisOffset, availableFreeSpace); 1140 layoutColumnReverse(children, crossAxisOffset, availableFreeSpace);
1141 } 1141 }
1142 1142
1143 if (m_numberOfInFlowChildrenOnFirstLine == -1) 1143 if (m_numberOfInFlowChildrenOnFirstLine == -1)
1144 m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren; 1144 m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren;
1145 lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, ch ildren.size(), maxAscent)); 1145 lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, ch ildren.size(), maxAscent));
1146 crossAxisOffset += maxChildCrossAxisExtent; 1146 crossAxisOffset += maxChildCrossAxisExtent;
1147 } 1147 }
1148 1148
1149 void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) 1149 void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace)
1150 { 1150 {
1151 // This is similar to the logic in layoutAndPlaceChildren, except we place t he children 1151 // This is similar to the logic in layoutAndPlaceChildren, except we place t he children
1152 // starting from the end of the flexbox. We also don't need to layout anythi ng since we're 1152 // starting from the end of the flexbox. We also don't need to layout anythi ng since we're
1153 // just moving the children to a new position. 1153 // just moving the children to a new position.
1154 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children); 1154 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children);
1155 LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwa rePaddingEnd(); 1155 LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwa rePaddingEnd();
1156 mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, style()->j ustifyContent(), numberOfChildrenForJustifyContent); 1156 mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, style()->j ustifyContent(), style()->justifyContentDistribution(), numberOfChildrenForJusti fyContent);
1157 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal ScrollbarHeight(); 1157 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal ScrollbarHeight();
1158 1158
1159 size_t seenInFlowPositionedChildren = 0; 1159 size_t seenInFlowPositionedChildren = 0;
1160 for (size_t i = 0; i < children.size(); ++i) { 1160 for (size_t i = 0; i < children.size(); ++i) {
1161 RenderBox* child = children[i]; 1161 RenderBox* child = children[i];
1162 1162
1163 if (child->isOutOfFlowPositioned()) { 1163 if (child->isOutOfFlowPositioned()) {
1164 child->layer()->setStaticBlockPosition(mainAxisOffset); 1164 child->layer()->setStaticBlockPosition(mainAxisOffset);
1165 continue; 1165 continue;
1166 } 1166 }
1167 mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndFor Child(*child); 1167 mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndFor Child(*child);
1168 1168
1169 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child))); 1169 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child)));
1170 1170
1171 mainAxisOffset -= flowAwareMarginStartForChild(*child); 1171 mainAxisOffset -= flowAwareMarginStartForChild(*child);
1172 1172
1173 ++seenInFlowPositionedChildren; 1173 ++seenInFlowPositionedChildren;
1174 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1174 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1175 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContent(), numberOfChildrenForJustifyContent); 1175 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContentDistribution(), numberOfChildrenForJustifyContent);
1176 } 1176 }
1177 } 1177 }
1178 1178
1179 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, EAlig nContent alignContent, unsigned numberOfLines) 1179 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, EAlig nContent alignContent, unsigned numberOfLines)
1180 { 1180 {
1181 if (numberOfLines <= 1) 1181 if (numberOfLines <= 1)
1182 return 0; 1182 return 0;
1183 if (alignContent == AlignContentFlexEnd) 1183 if (alignContent == AlignContentFlexEnd)
1184 return availableFreeSpace; 1184 return availableFreeSpace;
1185 if (alignContent == AlignContentCenter) 1185 if (alignContent == AlignContentCenter)
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 ASSERT(child); 1393 ASSERT(child);
1394 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; 1394 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent;
1395 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; 1395 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge;
1396 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; 1396 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent;
1397 adjustAlignmentForChild(*child, newOffset - originalOffset); 1397 adjustAlignmentForChild(*child, newOffset - originalOffset);
1398 } 1398 }
1399 } 1399 }
1400 } 1400 }
1401 1401
1402 } 1402 }
OLDNEW
« no previous file with comments | « Source/core/css/resolver/StyleBuilderCustom.cpp ('k') | Source/core/rendering/RenderFullScreen.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698