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

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

Issue 2191683003: [css-flexbox] align-content should apply even when there's just a single line (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Mark Firefox tests as failing; they haven't fixed this bug yet Created 4 years, 4 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
« no previous file with comments | « third_party/WebKit/LayoutTests/css3/flexbox/multiline-align-content.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1716 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child))); 1727 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child)));
1728 1728
1729 mainAxisOffset -= flowAwareMarginStartForChild(*child); 1729 mainAxisOffset -= flowAwareMarginStartForChild(*child);
1730 1730
1731 ++seenInFlowPositionedChildren; 1731 ++seenInFlowPositionedChildren;
1732 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1732 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1733 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, distribution, numberOfChildrenForJustifyContent); 1733 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, distribution, numberOfChildrenForJustifyContent);
1734 } 1734 }
1735 } 1735 }
1736 1736
1737 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, Conte ntPosition alignContent, ContentDistributionType alignContentDistribution, unsig ned numberOfLines) 1737 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, Conte ntPosition alignContent, ContentDistributionType alignContentDistribution, bool isMultiline, unsigned numberOfLines)
1738 { 1738 {
1739 if (numberOfLines <= 1) 1739 if (!isMultiline)
1740 return LayoutUnit(); 1740 return LayoutUnit();
1741 if (alignContent == ContentPositionFlexEnd) 1741 if (alignContent == ContentPositionFlexEnd)
1742 return availableFreeSpace; 1742 return availableFreeSpace;
1743 if (alignContent == ContentPositionCenter) 1743 if (alignContent == ContentPositionCenter)
1744 return availableFreeSpace / 2; 1744 return availableFreeSpace / 2;
1745 if (alignContentDistribution == ContentDistributionSpaceAround) { 1745 if (alignContentDistribution == ContentDistributionSpaceAround) {
1746 if (availableFreeSpace > 0 && numberOfLines) 1746 if (availableFreeSpace > 0 && numberOfLines)
1747 return availableFreeSpace / (2 * numberOfLines); 1747 return availableFreeSpace / (2 * numberOfLines);
1748 if (availableFreeSpace < 0) 1748 if (availableFreeSpace < 0)
1749 return availableFreeSpace / 2; 1749 return availableFreeSpace / 2;
1750 } 1750 }
1751 return LayoutUnit(); 1751 return LayoutUnit();
1752 } 1752 }
1753 1753
1754 static LayoutUnit alignContentSpaceBetweenChildren(LayoutUnit availableFreeSpace , ContentDistributionType alignContentDistribution, unsigned numberOfLines) 1754 static LayoutUnit alignContentSpaceBetweenChildren(LayoutUnit availableFreeSpace , ContentDistributionType alignContentDistribution, unsigned numberOfLines)
1755 { 1755 {
1756 if (availableFreeSpace > 0 && numberOfLines > 1) { 1756 if (availableFreeSpace > 0 && numberOfLines > 1) {
1757 if (alignContentDistribution == ContentDistributionSpaceBetween) 1757 if (alignContentDistribution == ContentDistributionSpaceBetween)
1758 return availableFreeSpace / (numberOfLines - 1); 1758 return availableFreeSpace / (numberOfLines - 1);
1759 if (alignContentDistribution == ContentDistributionSpaceAround || alignC ontentDistribution == ContentDistributionStretch) 1759 if (alignContentDistribution == ContentDistributionSpaceAround || alignC ontentDistribution == ContentDistributionStretch)
1760 return availableFreeSpace / numberOfLines; 1760 return availableFreeSpace / numberOfLines;
1761 } 1761 }
1762 return LayoutUnit(); 1762 return LayoutUnit();
1763 } 1763 }
1764 1764
1765 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) 1765 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
1766 { 1766 {
1767 if (!lineContexts.size())
1768 return;
1769
1767 ContentPosition position = styleRef().resolvedAlignContentPosition(normalVal ueBehavior()); 1770 ContentPosition position = styleRef().resolvedAlignContentPosition(normalVal ueBehavior());
1768 ContentDistributionType distribution = styleRef().resolvedAlignContentDistri bution(normalValueBehavior()); 1771 ContentDistributionType distribution = styleRef().resolvedAlignContentDistri bution(normalValueBehavior());
1769 1772
1770 // If we have a single line flexbox or a multiline line flexbox with only on e flex line, 1773 // If we have a single line flexbox the line height is all the available spa ce.
1771 // the line height is all the available space.
1772 // For flex-direction: row, this means we need to use the height, so we do t his after calling updateLogicalHeight. 1774 // For flex-direction: row, this means we need to use the height, so we do t his after calling updateLogicalHeight.
1773 if (lineContexts.size() == 1) { 1775 if (!isMultiline()) {
1774 lineContexts[0].crossAxisExtent = crossAxisContentExtent(); 1776 lineContexts[0].crossAxisExtent = crossAxisContentExtent();
1775 return; 1777 return;
1776 } 1778 }
1777 1779
1778 if (position == ContentPositionFlexStart) 1780 if (position == ContentPositionFlexStart)
1779 return; 1781 return;
1780 1782
1781 LayoutUnit availableCrossAxisSpace = crossAxisContentExtent(); 1783 LayoutUnit availableCrossAxisSpace = crossAxisContentExtent();
1782 for (size_t i = 0; i < lineContexts.size(); ++i) 1784 for (size_t i = 0; i < lineContexts.size(); ++i)
1783 availableCrossAxisSpace -= lineContexts[i].crossAxisExtent; 1785 availableCrossAxisSpace -= lineContexts[i].crossAxisExtent;
1784 1786
1785 LayoutBox* child = m_orderIterator.first(); 1787 LayoutBox* child = m_orderIterator.first();
1786 LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, p osition, distribution, lineContexts.size()); 1788 LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, p osition, distribution, isMultiline(), lineContexts.size());
1787 for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber ) { 1789 for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber ) {
1788 lineContexts[lineNumber].crossAxisOffset += lineOffset; 1790 lineContexts[lineNumber].crossAxisOffset += lineOffset;
1789 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) 1791 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next())
1790 adjustAlignmentForChild(*child, lineOffset); 1792 adjustAlignmentForChild(*child, lineOffset);
1791 1793
1792 if (distribution == ContentDistributionStretch && availableCrossAxisSpac e > 0) 1794 if (distribution == ContentDistributionStretch && availableCrossAxisSpac e > 0)
1793 lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size()); 1795 lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size());
1794 1796
1795 lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, distribution, lineContexts.size()); 1797 lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, distribution, lineContexts.size());
1796 } 1798 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1920 DCHECK(child); 1922 DCHECK(child);
1921 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; 1923 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent;
1922 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; 1924 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge;
1923 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; 1925 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent;
1924 adjustAlignmentForChild(*child, newOffset - originalOffset); 1926 adjustAlignmentForChild(*child, newOffset - originalOffset);
1925 } 1927 }
1926 } 1928 }
1927 } 1929 }
1928 1930
1929 } // namespace blink 1931 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/css3/flexbox/multiline-align-content.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698