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

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

Issue 1921553008: Fix scroll origin, overflow rects, and coordinate flipping for flexbox. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Add docs to Source/core/layout/README.md Created 4 years, 7 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 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 int LayoutFlexibleBox::inlineBlockBaseline(LineDirectionMode direction) const 234 int LayoutFlexibleBox::inlineBlockBaseline(LineDirectionMode direction) const
235 { 235 {
236 int baseline = firstLineBoxBaseline(); 236 int baseline = firstLineBoxBaseline();
237 if (baseline != -1) 237 if (baseline != -1)
238 return baseline; 238 return baseline;
239 239
240 int marginAscent = direction == HorizontalLine ? marginTop() : marginRight() ; 240 int marginAscent = direction == HorizontalLine ? marginTop() : marginRight() ;
241 return synthesizedBaselineFromContentBox(*this, direction) + marginAscent; 241 return synthesizedBaselineFromContentBox(*this, direction) + marginAscent;
242 } 242 }
243 243
244 IntSize LayoutFlexibleBox::originAdjustmentForScrollbars() const
245 {
246 IntSize size;
247 int adjustmentWidth = verticalScrollbarWidth();
248 int adjustmentHeight = horizontalScrollbarHeight();
249 if (!adjustmentWidth && !adjustmentHeight)
250 return size;
251
252 EFlexDirection flexDirection = style()->flexDirection();
253 TextDirection textDirection = style()->direction();
254 WritingMode writingMode = style()->getWritingMode();
255
256 if (flexDirection == FlowRow) {
leviw_travelin_and_unemployed 2016/05/10 17:52:42 This is super easy to follow now, but I can totall
257 if (textDirection == RTL) {
258 if (writingMode == TopToBottomWritingMode)
259 size.expand(adjustmentWidth, 0);
260 else
261 size.expand(0, adjustmentHeight);
262 }
263 if (writingMode == RightToLeftWritingMode)
264 size.expand(adjustmentWidth, 0);
265 } else if (flexDirection == FlowRowReverse) {
266 if (textDirection == LTR) {
267 if (writingMode == TopToBottomWritingMode)
268 size.expand(adjustmentWidth, 0);
269 else
270 size.expand(0, adjustmentHeight);
271 }
272 if (writingMode == RightToLeftWritingMode)
273 size.expand(adjustmentWidth, 0);
274 } else if (flexDirection == FlowColumn) {
275 if (writingMode == RightToLeftWritingMode)
276 size.expand(adjustmentWidth, 0);
277 } else {
278 if (writingMode == TopToBottomWritingMode)
279 size.expand(0, adjustmentHeight);
280 else if (writingMode == LeftToRightWritingMode)
281 size.expand(adjustmentWidth, 0);
282 }
283 return size;
284 }
285
286 bool LayoutFlexibleBox::hasTopOverflow() const
287 {
288 EFlexDirection flexDirection = style()->flexDirection();
289 if (isHorizontalWritingMode())
290 return flexDirection == FlowColumnReverse;
291 return flexDirection == (style()->isLeftToRightDirection() ? FlowRowReverse : FlowRow);
292 }
293
294 bool LayoutFlexibleBox::hasLeftOverflow() const
295 {
296 EFlexDirection flexDirection = style()->flexDirection();
297 if (isHorizontalWritingMode())
298 return flexDirection == (style()->isLeftToRightDirection() ? FlowRowReve rse : FlowRow);
299 return flexDirection == FlowColumnReverse;
300 }
301
244 void LayoutFlexibleBox::removeChild(LayoutObject* child) 302 void LayoutFlexibleBox::removeChild(LayoutObject* child)
245 { 303 {
246 LayoutBlock::removeChild(child); 304 LayoutBlock::removeChild(child);
247 m_intrinsicSizeAlongMainAxis.remove(child); 305 m_intrinsicSizeAlongMainAxis.remove(child);
248 } 306 }
249 307
250 void LayoutFlexibleBox::styleDidChange(StyleDifference diff, const ComputedStyle * oldStyle) 308 void LayoutFlexibleBox::styleDidChange(StyleDifference diff, const ComputedStyle * oldStyle)
251 { 309 {
252 LayoutBlock::styleDidChange(diff, oldStyle); 310 LayoutBlock::styleDidChange(diff, oldStyle);
253 311
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 { 1583 {
1526 ASSERT(childSizes.size() == children.size()); 1584 ASSERT(childSizes.size() == children.size());
1527 1585
1528 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV alueBehavior()); 1586 ContentPosition position = styleRef().resolvedJustifyContentPosition(normalV alueBehavior());
1529 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist ribution(normalValueBehavior()); 1587 ContentDistributionType distribution = styleRef().resolvedJustifyContentDist ribution(normalValueBehavior());
1530 1588
1531 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children); 1589 size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren( children);
1532 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available FreeSpace); 1590 LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, available FreeSpace);
1533 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart() ; 1591 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart() ;
1534 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent); 1592 mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent);
1535 if (style()->flexDirection() == FlowRowReverse) 1593 if (style()->flexDirection() == FlowRowReverse && shouldPlaceBlockDirectionS crollbarOnLogicalLeft())
1536 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo ntalScrollbarHeight(); 1594 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizo ntalScrollbarHeight();
1537 1595
1538 LayoutUnit totalMainExtent = mainAxisExtent(); 1596 LayoutUnit totalMainExtent = mainAxisExtent();
1597 if (!shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
1598 totalMainExtent -= isHorizontalFlow() ? verticalScrollbarWidth() : horiz ontalScrollbarHeight();
1539 LayoutUnit maxAscent, maxDescent; // Used when align-items: baseline. 1599 LayoutUnit maxAscent, maxDescent; // Used when align-items: baseline.
1540 LayoutUnit maxChildCrossAxisExtent; 1600 LayoutUnit maxChildCrossAxisExtent;
1541 size_t seenInFlowPositionedChildren = 0; 1601 size_t seenInFlowPositionedChildren = 0;
1542 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 1602 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow();
1543 for (size_t i = 0; i < children.size(); ++i) { 1603 for (size_t i = 0; i < children.size(); ++i) {
1544 LayoutBox* child = children[i]; 1604 LayoutBox* child = children[i];
1545 1605
1546 if (child->isOutOfFlowPositioned()) { 1606 if (child->isOutOfFlowPositioned()) {
1547 prepareChildForPositionedLayout(*child); 1607 prepareChildForPositionedLayout(*child);
1548 continue; 1608 continue;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1592 setLogicalHeight(std::max(logicalHeight(), crossAxisOffset + flowAwa reBorderAfter() + flowAwarePaddingAfter() + childCrossAxisMarginBoxExtent + cros sAxisScrollbarExtent())); 1652 setLogicalHeight(std::max(logicalHeight(), crossAxisOffset + flowAwa reBorderAfter() + flowAwarePaddingAfter() + childCrossAxisMarginBoxExtent + cros sAxisScrollbarExtent()));
1593 maxChildCrossAxisExtent = std::max(maxChildCrossAxisExtent, childCrossAx isMarginBoxExtent); 1653 maxChildCrossAxisExtent = std::max(maxChildCrossAxisExtent, childCrossAx isMarginBoxExtent);
1594 1654
1595 mainAxisOffset += flowAwareMarginStartForChild(*child); 1655 mainAxisOffset += flowAwareMarginStartForChild(*child);
1596 1656
1597 LayoutUnit childMainExtent = mainAxisExtentForChild(*child); 1657 LayoutUnit childMainExtent = mainAxisExtentForChild(*child);
1598 // In an RTL column situation, this will apply the margin-right/margin-e nd on the left. 1658 // In an RTL column situation, this will apply the margin-right/margin-e nd on the left.
1599 // This will be fixed later in flipForRightToLeftColumn. 1659 // This will be fixed later in flipForRightToLeftColumn.
1600 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset, 1660 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset,
1601 crossAxisOffset + flowAwareMarginBeforeForChild(*child)); 1661 crossAxisOffset + flowAwareMarginBeforeForChild(*child));
1602
1603 setFlowAwareLocationForChild(*child, childLocation); 1662 setFlowAwareLocationForChild(*child, childLocation);
1604 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child); 1663 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child);
1605 1664
1606 ++seenInFlowPositionedChildren; 1665 ++seenInFlowPositionedChildren;
1607 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1666 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1608 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, distribution, numberOfChildrenForJustifyContent); 1667 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, distribution, numberOfChildrenForJustifyContent);
1609 } 1668 }
1610 1669
1611 if (isColumnFlow()) 1670 if (isColumnFlow())
1612 setLogicalHeight(std::max(logicalHeight(), mainAxisOffset + flowAwareBor derEnd() + flowAwarePaddingEnd() + scrollbarLogicalHeight())); 1671 setLogicalHeight(std::max(logicalHeight(), mainAxisOffset + flowAwareBor derEnd() + flowAwarePaddingEnd() + scrollbarLogicalHeight()));
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1820 return; 1879 return;
1821 1880
1822 LayoutUnit crossExtent = crossAxisExtent(); 1881 LayoutUnit crossExtent = crossAxisExtent();
1823 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 1882 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
1824 if (child->isOutOfFlowPositioned()) 1883 if (child->isOutOfFlowPositioned())
1825 continue; 1884 continue;
1826 LayoutPoint location = flowAwareLocationForChild(*child); 1885 LayoutPoint location = flowAwareLocationForChild(*child);
1827 // For vertical flows, setFlowAwareLocationForChild will transpose x and y, 1886 // For vertical flows, setFlowAwareLocationForChild will transpose x and y,
1828 // so using the y axis for a column cross axis extent is correct. 1887 // so using the y axis for a column cross axis extent is correct.
1829 location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y ()); 1888 location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y ());
1889 if (!isHorizontalWritingMode())
1890 location.move(LayoutSize(0, -horizontalScrollbarHeight()));
1830 setFlowAwareLocationForChild(*child, location); 1891 setFlowAwareLocationForChild(*child, location);
1831 } 1892 }
1832 } 1893 }
1833 1894
1834 void LayoutFlexibleBox::flipForWrapReverse(const Vector<LineContext>& lineContex ts, LayoutUnit crossAxisStartEdge) 1895 void LayoutFlexibleBox::flipForWrapReverse(const Vector<LineContext>& lineContex ts, LayoutUnit crossAxisStartEdge)
1835 { 1896 {
1836 LayoutUnit contentExtent = crossAxisContentExtent(); 1897 LayoutUnit contentExtent = crossAxisContentExtent();
1837 LayoutBox* child = m_orderIterator.first(); 1898 LayoutBox* child = m_orderIterator.first();
1838 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 1899 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
1839 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) { 1900 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) {
1840 ASSERT(child); 1901 ASSERT(child);
1841 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; 1902 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent;
1842 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; 1903 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge;
1843 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; 1904 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent;
1844 adjustAlignmentForChild(*child, newOffset - originalOffset); 1905 adjustAlignmentForChild(*child, newOffset - originalOffset);
1845 } 1906 }
1846 } 1907 }
1847 } 1908 }
1848 1909
1849 } // namespace blink 1910 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698