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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp

Issue 1583433002: [css-align] New CSS Value 'normal' for Content Alignment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed layout tests failing. Created 4 years, 10 months 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 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di rection, LinePositionMode mode) const 174 int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di rection, LinePositionMode mode) const
175 { 175 {
176 ASSERT(mode == PositionOnContainingLine); 176 ASSERT(mode == PositionOnContainingLine);
177 int baseline = firstLineBoxBaseline(); 177 int baseline = firstLineBoxBaseline();
178 if (baseline == -1) 178 if (baseline == -1)
179 baseline = synthesizedBaselineFromContentBox(*this, direction); 179 baseline = synthesizedBaselineFromContentBox(*this, direction);
180 180
181 return beforeMarginInLineDirection(direction) + baseline; 181 return beforeMarginInLineDirection(direction) + baseline;
182 } 182 }
183 183
184 static const StyleContentAlignmentData& normalValueBehavior()
185 {
186 // The justify-content property applies along the main axis, but since flexi ng
187 // in the main axis is controlled by flex, stretch behaves as flex-start (ig noring
188 // the specified fallback alignment, if any).
189 // https://drafts.csswg.org/css-align/#distribution-flex
190 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm al, ContentDistributionStretch};
191 return normalBehavior;
192 }
193
184 int LayoutFlexibleBox::firstLineBoxBaseline() const 194 int LayoutFlexibleBox::firstLineBoxBaseline() const
185 { 195 {
186 if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0) 196 if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0)
187 return -1; 197 return -1;
188 LayoutBox* baselineChild = nullptr; 198 LayoutBox* baselineChild = nullptr;
189 int childNumber = 0; 199 int childNumber = 0;
190 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 200 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
191 if (child->isOutOfFlowPositioned()) 201 if (child->isOutOfFlowPositioned())
192 continue; 202 continue;
193 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMargins InCrossAxis(*child)) { 203 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMargins InCrossAxis(*child)) {
(...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 { 1305 {
1296 if (isHorizontalFlow()) 1306 if (isHorizontalFlow())
1297 return child.styleRef().overflowY(); 1307 return child.styleRef().overflowY();
1298 return child.styleRef().overflowX(); 1308 return child.styleRef().overflowX();
1299 } 1309 }
1300 1310
1301 void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons t OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, Layou tUnit availableFreeSpace, bool relayoutChildren, SubtreeLayoutScope& layoutScope , Vector<LineContext>& lineContexts) 1311 void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons t OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, Layou tUnit availableFreeSpace, bool relayoutChildren, SubtreeLayoutScope& layoutScope , Vector<LineContext>& lineContexts)
1302 { 1312 {
1303 ASSERT(childSizes.size() == children.size()); 1313 ASSERT(childSizes.size() == children.size());
1304 1314
1315 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV alueBehavior());
1316 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist ribution(normalValueBehavior());
1317
1305 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children); 1318 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children);
1306 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available FreeSpace); 1319 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available FreeSpace);
1307 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart() ; 1320 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart() ;
1308 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, style()->j ustifyContentPosition(), style()->justifyContentDistribution(), numberOfChildren ForJustifyContent); 1321 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent);
1309 if (style()->flexDirection() == FlowRowReverse) 1322 if (style()->flexDirection() == FlowRowReverse)
1310 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo ntalScrollbarHeight(); 1323 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo ntalScrollbarHeight();
1311 1324
1312 LayoutUnit totalMainExtent = mainAxisExtent(); 1325 LayoutUnit totalMainExtent = mainAxisExtent();
1313 LayoutUnit maxAscent, maxDescent; // Used when align-items: baseline. 1326 LayoutUnit maxAscent, maxDescent; // Used when align-items: baseline.
1314 LayoutUnit maxChildCrossAxisExtent; 1327 LayoutUnit maxChildCrossAxisExtent;
1315 size_t seenInFlowPositionedChildren = 0; 1328 size_t seenInFlowPositionedChildren = 0;
1316 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 1329 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow();
1317 for (size_t i = 0; i < children.size(); ++i) { 1330 for (size_t i = 0; i < children.size(); ++i) {
1318 LayoutBox* child = children[i]; 1331 LayoutBox* child = children[i];
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 // In an RTL column situation, this will apply the margin-right/margin-e nd on the left. 1378 // In an RTL column situation, this will apply the margin-right/margin-e nd on the left.
1366 // This will be fixed later in flipForRightToLeftColumn. 1379 // This will be fixed later in flipForRightToLeftColumn.
1367 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset, 1380 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset,
1368 crossAxisOffset + flowAwareMarginBeforeForChild(*child)); 1381 crossAxisOffset + flowAwareMarginBeforeForChild(*child));
1369 1382
1370 setFlowAwareLocationForChild(*child, childLocation); 1383 setFlowAwareLocationForChild(*child, childLocation);
1371 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child); 1384 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child);
1372 1385
1373 ++seenInFlowPositionedChildren; 1386 ++seenInFlowPositionedChildren;
1374 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1387 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1375 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContentDistribution(), numberOfChildrenForJustifyContent); 1388 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, distribution, numberOfChildrenForJustifyContent);
1376 } 1389 }
1377 1390
1378 if (isColumnFlow()) 1391 if (isColumnFlow())
1379 setLogicalHeight(std::max(logicalHeight(), mainAxisOffset + flowAwareBor derEnd() + flowAwarePaddingEnd() + scrollbarLogicalHeight())); 1392 setLogicalHeight(std::max(logicalHeight(), mainAxisOffset + flowAwareBor derEnd() + flowAwarePaddingEnd() + scrollbarLogicalHeight()));
1380 1393
1381 if (style()->flexDirection() == FlowColumnReverse) { 1394 if (style()->flexDirection() == FlowColumnReverse) {
1382 // We have to do an extra pass for column-reverse to reposition the flex items since the start depends 1395 // We have to do an extra pass for column-reverse to reposition the flex items since the start depends
1383 // on the height of the flexbox, which we only know after we've position ed all the flex items. 1396 // on the height of the flexbox, which we only know after we've position ed all the flex items.
1384 updateLogicalHeight(); 1397 updateLogicalHeight();
1385 layoutColumnReverse(children, crossAxisOffset, availableFreeSpace); 1398 layoutColumnReverse(children, crossAxisOffset, availableFreeSpace);
1386 } 1399 }
1387 1400
1388 if (m_numberOfInFlowChildrenOnFirstLine == -1) 1401 if (m_numberOfInFlowChildrenOnFirstLine == -1)
1389 m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren; 1402 m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren;
1390 lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, ch ildren.size(), maxAscent)); 1403 lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, ch ildren.size(), maxAscent));
1391 crossAxisOffset += maxChildCrossAxisExtent; 1404 crossAxisOffset += maxChildCrossAxisExtent;
1392 } 1405 }
1393 1406
1394 void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) 1407 void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace)
1395 { 1408 {
1409 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV alueBehavior());
1410 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist ribution(normalValueBehavior());
1411
1396 // This is similar to the logic in layoutAndPlaceChildren, except we place t he children 1412 // This is similar to the logic in layoutAndPlaceChildren, except we place t he children
1397 // starting from the end of the flexbox. We also don't need to layout anythi ng since we're 1413 // starting from the end of the flexbox. We also don't need to layout anythi ng since we're
1398 // just moving the children to a new position. 1414 // just moving the children to a new position.
1399 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children); 1415 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children);
1400 LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwa rePaddingEnd(); 1416 LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwa rePaddingEnd();
1401 mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, style()->j ustifyContentPosition(), style()->justifyContentDistribution(), numberOfChildren ForJustifyContent); 1417 mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent);
1402 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal ScrollbarHeight(); 1418 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal ScrollbarHeight();
1403 1419
1404 size_t seenInFlowPositionedChildren = 0; 1420 size_t seenInFlowPositionedChildren = 0;
1405 for (size_t i = 0; i < children.size(); ++i) { 1421 for (size_t i = 0; i < children.size(); ++i) {
1406 LayoutBox* child = children[i]; 1422 LayoutBox* child = children[i];
1407 1423
1408 if (child->isOutOfFlowPositioned()) { 1424 if (child->isOutOfFlowPositioned()) {
1409 child->layer()->setStaticBlockPosition(mainAxisOffset); 1425 child->layer()->setStaticBlockPosition(mainAxisOffset);
1410 continue; 1426 continue;
1411 } 1427 }
1412 mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndFor Child(*child); 1428 mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndFor Child(*child);
1413 1429
1414 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child))); 1430 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child)));
1415 1431
1416 mainAxisOffset -= flowAwareMarginStartForChild(*child); 1432 mainAxisOffset -= flowAwareMarginStartForChild(*child);
1417 1433
1418 ++seenInFlowPositionedChildren; 1434 ++seenInFlowPositionedChildren;
1419 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1435 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1420 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContentDistribution(), numberOfChildrenForJustifyContent); 1436 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, distribution, numberOfChildrenForJustifyContent);
1421 } 1437 }
1422 } 1438 }
1423 1439
1424 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, Conte ntPosition alignContent, ContentDistributionType alignContentDistribution, unsig ned numberOfLines) 1440 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, Conte ntPosition alignContent, ContentDistributionType alignContentDistribution, unsig ned numberOfLines)
1425 { 1441 {
1426 if (numberOfLines <= 1) 1442 if (numberOfLines <= 1)
1427 return LayoutUnit(); 1443 return LayoutUnit();
1428 if (alignContent == ContentPositionFlexEnd) 1444 if (alignContent == ContentPositionFlexEnd)
1429 return availableFreeSpace; 1445 return availableFreeSpace;
1430 if (alignContent == ContentPositionCenter) 1446 if (alignContent == ContentPositionCenter)
(...skipping 13 matching lines...) Expand all
1444 if (alignContentDistribution == ContentDistributionSpaceBetween) 1460 if (alignContentDistribution == ContentDistributionSpaceBetween)
1445 return availableFreeSpace / (numberOfLines - 1); 1461 return availableFreeSpace / (numberOfLines - 1);
1446 if (alignContentDistribution == ContentDistributionSpaceAround || alignC ontentDistribution == ContentDistributionStretch) 1462 if (alignContentDistribution == ContentDistributionSpaceAround || alignC ontentDistribution == ContentDistributionStretch)
1447 return availableFreeSpace / numberOfLines; 1463 return availableFreeSpace / numberOfLines;
1448 } 1464 }
1449 return LayoutUnit(); 1465 return LayoutUnit();
1450 } 1466 }
1451 1467
1452 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) 1468 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
1453 { 1469 {
1470 ContentPosition position = styleRef().resolvedAlignContentPosition(normalVal ueBehavior());
1471 ContentDistributionType distribution = styleRef().resolvedAlignContentDistri bution(normalValueBehavior());
1472
1454 // If we have a single line flexbox or a multiline line flexbox with only on e flex line, 1473 // If we have a single line flexbox or a multiline line flexbox with only on e flex line,
1455 // the line height is all the available space. 1474 // the line height is all the available space.
1456 // For flex-direction: row, this means we need to use the height, so we do t his after calling updateLogicalHeight. 1475 // For flex-direction: row, this means we need to use the height, so we do t his after calling updateLogicalHeight.
1457 if (lineContexts.size() == 1) { 1476 if (lineContexts.size() == 1) {
1458 lineContexts[0].crossAxisExtent = crossAxisContentExtent(); 1477 lineContexts[0].crossAxisExtent = crossAxisContentExtent();
1459 return; 1478 return;
1460 } 1479 }
1461 1480
1462 if (style()->alignContentPosition() == ContentPositionFlexStart) 1481 if (position == ContentPositionFlexStart)
1463 return; 1482 return;
1464 1483
1465 LayoutUnit availableCrossAxisSpace = crossAxisContentExtent(); 1484 LayoutUnit availableCrossAxisSpace = crossAxisContentExtent();
1466 for (size_t i = 0; i < lineContexts.size(); ++i) 1485 for (size_t i = 0; i < lineContexts.size(); ++i)
1467 availableCrossAxisSpace -= lineContexts[i].crossAxisExtent; 1486 availableCrossAxisSpace -= lineContexts[i].crossAxisExtent;
1468 1487
1469 LayoutBox* child = m_orderIterator.first(); 1488 LayoutBox* child = m_orderIterator.first();
1470 LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, s tyle()->alignContentPosition(), style()->alignContentDistribution(), lineContext s.size()); 1489 LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, p osition, distribution, lineContexts.size());
1471 for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber ) { 1490 for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber ) {
1472 lineContexts[lineNumber].crossAxisOffset += lineOffset; 1491 lineContexts[lineNumber].crossAxisOffset += lineOffset;
1473 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) 1492 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next())
1474 adjustAlignmentForChild(*child, lineOffset); 1493 adjustAlignmentForChild(*child, lineOffset);
1475 1494
1476 if (style()->alignContentDistribution() == ContentDistributionStretch && availableCrossAxisSpace > 0) 1495 if (distribution == ContentDistributionStretch && availableCrossAxisSpac e > 0)
1477 lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size()); 1496 lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size());
1478 1497
1479 lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, style()->alignContentDistribution(), lineContexts.size()); 1498 lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, distribution, lineContexts.size());
1480 } 1499 }
1481 } 1500 }
1482 1501
1483 void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child, LayoutUnit del ta) 1502 void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child, LayoutUnit del ta)
1484 { 1503 {
1485 if (child.isOutOfFlowPositioned()) { 1504 if (child.isOutOfFlowPositioned()) {
1486 LayoutUnit staticInlinePosition = child.layer()->staticInlinePosition(); 1505 LayoutUnit staticInlinePosition = child.layer()->staticInlinePosition();
1487 LayoutUnit staticBlockPosition = child.layer()->staticBlockPosition(); 1506 LayoutUnit staticBlockPosition = child.layer()->staticBlockPosition();
1488 LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlin ePosition; 1507 LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlin ePosition;
1489 LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlo ckPosition; 1508 LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlo ckPosition;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1637 ASSERT(child); 1656 ASSERT(child);
1638 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; 1657 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent;
1639 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; 1658 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge;
1640 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; 1659 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent;
1641 adjustAlignmentForChild(*child, newOffset - originalOffset); 1660 adjustAlignmentForChild(*child, newOffset - originalOffset);
1642 } 1661 }
1643 } 1662 }
1644 } 1663 }
1645 1664
1646 } // namespace blink 1665 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp ('k') | third_party/WebKit/Source/core/layout/LayoutGrid.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698