OLD | NEW |
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 Loading... |
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) { |
| 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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |