Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 1319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1330 // the grid breadth to account for 'box-sizing'. | 1330 // the grid breadth to account for 'box-sizing'. |
| 1331 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica lWidth() : LayoutUnit(); | 1331 LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOve rrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogica lWidth() : LayoutUnit(); |
| 1332 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi calHeight() : LayoutUnit(); | 1332 LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOv errideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogi calHeight() : LayoutUnit(); |
| 1333 | 1333 |
| 1334 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF orChildIncludingAlignmentOffsets(*child, ForColumns, sizingData); | 1334 LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthF orChildIncludingAlignmentOffsets(*child, ForColumns, sizingData); |
| 1335 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth ForChildIncludingAlignmentOffsets(*child, ForRows, sizingData); | 1335 LayoutUnit overrideContainingBlockContentLogicalHeight = gridAreaBreadth ForChildIncludingAlignmentOffsets(*child, ForRows, sizingData); |
| 1336 | 1336 |
| 1337 SubtreeLayoutScope layoutScope(*child); | 1337 SubtreeLayoutScope layoutScope(*child); |
| 1338 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB lockContentLogicalWidth || (oldOverrideContainingBlockContentLogicalHeight != ov errideContainingBlockContentLogicalHeight && child->hasRelativeLogicalHeight())) | 1338 if (oldOverrideContainingBlockContentLogicalWidth != overrideContainingB lockContentLogicalWidth || (oldOverrideContainingBlockContentLogicalHeight != ov errideContainingBlockContentLogicalHeight && child->hasRelativeLogicalHeight())) |
| 1339 layoutScope.setNeedsLayout(child, LayoutInvalidationReason::GridChan ged); | 1339 layoutScope.setNeedsLayout(child, LayoutInvalidationReason::GridChan ged); |
| 1340 else | |
| 1341 resetAutoMarginsAndLogicalTopInColumnAxis(*child); | |
| 1340 | 1342 |
| 1341 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB lockContentLogicalWidth); | 1343 child->setOverrideContainingBlockContentLogicalWidth(overrideContainingB lockContentLogicalWidth); |
| 1342 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining BlockContentLogicalHeight); | 1344 child->setOverrideContainingBlockContentLogicalHeight(overrideContaining BlockContentLogicalHeight); |
| 1343 | 1345 |
| 1344 // Stretching logic might force a child layout, so we need to run it bef ore the layoutIfNeeded | 1346 // Stretching logic might force a child layout, so we need to run it bef ore the layoutIfNeeded |
| 1345 // call to avoid unnecessary relayouts. This might imply that child marg ins, needed to correctly | 1347 // call to avoid unnecessary relayouts. This might imply that child marg ins, needed to correctly |
| 1346 // determine the available space before stretching, are not set yet. | 1348 // determine the available space before stretching, are not set yet. |
| 1347 applyStretchAlignmentToChildIfNeeded(*child); | 1349 applyStretchAlignmentToChildIfNeeded(*child); |
| 1348 | 1350 |
| 1349 child->layoutIfNeeded(); | 1351 child->layoutIfNeeded(); |
| 1350 | 1352 |
| 1353 // We need pending layouts to be done in order to compute auto-margins p roperly. | |
| 1354 updateAutoMarginsInColumnAxisIfNeeded(*child); | |
| 1355 updateAutoMarginsInRowAxisIfNeeded(*child); | |
| 1356 | |
| 1351 #if ENABLE(ASSERT) | 1357 #if ENABLE(ASSERT) |
| 1352 const GridCoordinate& coordinate = cachedGridCoordinate(*child); | 1358 const GridCoordinate& coordinate = cachedGridCoordinate(*child); |
| 1353 ASSERT(coordinate.columns.resolvedInitialPosition.toInt() < sizingData.c olumnTracks.size()); | 1359 ASSERT(coordinate.columns.resolvedInitialPosition.toInt() < sizingData.c olumnTracks.size()); |
| 1354 ASSERT(coordinate.rows.resolvedInitialPosition.toInt() < sizingData.rowT racks.size()); | 1360 ASSERT(coordinate.rows.resolvedInitialPosition.toInt() < sizingData.rowT racks.size()); |
| 1355 #endif | 1361 #endif |
| 1356 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); | 1362 child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); |
| 1357 | 1363 |
| 1358 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is | 1364 // Keep track of children overflowing their grid area as we might need t o paint them even if the grid-area is |
| 1359 // not visible | 1365 // not visible |
| 1360 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight | 1366 if (child->logicalHeight() > overrideContainingBlockContentLogicalHeight |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1652 child.setOverrideLogicalContentHeight(desiredLogicalHeight - child.b orderAndPaddingLogicalHeight()); | 1658 child.setOverrideLogicalContentHeight(desiredLogicalHeight - child.b orderAndPaddingLogicalHeight()); |
| 1653 if (desiredLogicalHeight != child.logicalHeight()) { | 1659 if (desiredLogicalHeight != child.logicalHeight()) { |
| 1654 // TODO (lajava): Can avoid laying out here in some cases. See h ttps://webkit.org/b/87905. | 1660 // TODO (lajava): Can avoid laying out here in some cases. See h ttps://webkit.org/b/87905. |
| 1655 child.setLogicalHeight(0); | 1661 child.setLogicalHeight(0); |
| 1656 child.setNeedsLayout(LayoutInvalidationReason::GridChanged); | 1662 child.setNeedsLayout(LayoutInvalidationReason::GridChanged); |
| 1657 } | 1663 } |
| 1658 } | 1664 } |
| 1659 } | 1665 } |
| 1660 } | 1666 } |
| 1661 | 1667 |
| 1668 // TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be move d to LayoutBox. | |
| 1669 bool LayoutGrid::hasAutoMarginsInColumnAxis(const LayoutBox& child) const | |
| 1670 { | |
| 1671 if (isHorizontalWritingMode()) | |
| 1672 return child.style()->marginTop().isAuto() || child.style()->marginBotto m().isAuto(); | |
| 1673 return child.style()->marginLeft().isAuto() || child.style()->marginRight(). isAuto(); | |
| 1674 } | |
| 1675 | |
| 1676 // TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be move d to LayoutBox. | |
| 1677 bool LayoutGrid::hasAutoMarginsInRowAxis(const LayoutBox& child) const | |
| 1678 { | |
| 1679 if (isHorizontalWritingMode()) | |
| 1680 return child.style()->marginLeft().isAuto() || child.style()->marginRigh t().isAuto(); | |
| 1681 return child.style()->marginTop().isAuto() || child.style()->marginBottom(). isAuto(); | |
| 1682 } | |
| 1683 | |
| 1684 // TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be move d to LayoutBox. | |
| 1685 void LayoutGrid::resetAutoMarginsAndLogicalTopInColumnAxis(LayoutBox& child) | |
| 1686 { | |
| 1687 if (hasAutoMarginsInColumnAxis(child) || child.needsLayout()) { | |
| 1688 child.clearOverrideLogicalContentHeight(); | |
|
cbiesinger
2015/08/17 23:50:40
Why do you have this line?
jfernandez
2015/08/24 10:28:23
Good you realized about this "obscure" change. The
cbiesinger
2015/08/26 23:07:44
Is your link correct? It does not point to compute
| |
| 1689 child.updateLogicalHeight(); | |
| 1690 if (isHorizontalWritingMode()) { | |
| 1691 if (child.style()->marginTop().isAuto()) | |
| 1692 child.setMarginTop(0); | |
| 1693 if (child.style()->marginBottom().isAuto()) | |
| 1694 child.setMarginBottom(0); | |
| 1695 } else { | |
| 1696 if (child.style()->marginLeft().isAuto()) | |
| 1697 child.setMarginLeft(0); | |
| 1698 if (child.style()->marginRight().isAuto()) | |
| 1699 child.setMarginRight(0); | |
| 1700 } | |
| 1701 | |
| 1702 } | |
| 1703 } | |
| 1704 | |
| 1705 // TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be move d to LayoutBox. | |
| 1706 void LayoutGrid::updateAutoMarginsInRowAxisIfNeeded(LayoutBox& child) | |
| 1707 { | |
| 1708 ASSERT(!child.isOutOfFlowPositioned()); | |
| 1709 | |
| 1710 LayoutUnit availableAlignmentSpace = child.overrideContainingBlockContentLog icalWidth() - child.logicalWidth(); | |
| 1711 if (availableAlignmentSpace <= 0) | |
| 1712 return; | |
| 1713 | |
| 1714 bool isHorizontal = isHorizontalWritingMode(); | |
| 1715 Length topOrLeft = isHorizontal ? child.style()->marginLeft() : child.style( )->marginTop(); | |
| 1716 Length bottomOrRight = isHorizontal ? child.style()->marginRight() : child.s tyle()->marginBottom(); | |
| 1717 if (topOrLeft.isAuto() && bottomOrRight.isAuto()) { | |
| 1718 if (isHorizontal) { | |
| 1719 child.setMarginLeft(availableAlignmentSpace / 2); | |
| 1720 child.setMarginRight(availableAlignmentSpace / 2); | |
| 1721 } else { | |
| 1722 child.setMarginTop(availableAlignmentSpace / 2); | |
| 1723 child.setMarginBottom(availableAlignmentSpace / 2); | |
| 1724 } | |
| 1725 } else if (topOrLeft.isAuto()) { | |
| 1726 if (isHorizontal) | |
| 1727 child.setMarginLeft(availableAlignmentSpace); | |
| 1728 else | |
| 1729 child.setMarginTop(availableAlignmentSpace); | |
| 1730 } else if (bottomOrRight.isAuto()) { | |
| 1731 if (isHorizontal) | |
| 1732 child.setMarginRight(availableAlignmentSpace); | |
| 1733 else | |
| 1734 child.setMarginBottom(availableAlignmentSpace); | |
| 1735 } | |
| 1736 } | |
| 1737 | |
| 1738 // TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be move d to LayoutBox. | |
| 1739 void LayoutGrid::updateAutoMarginsInColumnAxisIfNeeded(LayoutBox& child) | |
| 1740 { | |
| 1741 ASSERT(!child.isOutOfFlowPositioned()); | |
| 1742 | |
| 1743 LayoutUnit availableAlignmentSpace = child.overrideContainingBlockContentLog icalHeight() - child.logicalHeight(); | |
| 1744 if (availableAlignmentSpace <= 0) | |
| 1745 return; | |
| 1746 | |
| 1747 bool isHorizontal = isHorizontalWritingMode(); | |
| 1748 Length topOrLeft = isHorizontal ? child.style()->marginTop() : child.style() ->marginLeft(); | |
| 1749 Length bottomOrRight = isHorizontal ? child.style()->marginBottom() : child. style()->marginRight(); | |
| 1750 if (topOrLeft.isAuto() && bottomOrRight.isAuto()) { | |
| 1751 if (isHorizontal) { | |
| 1752 child.setMarginTop(availableAlignmentSpace / 2); | |
| 1753 child.setMarginBottom(availableAlignmentSpace / 2); | |
| 1754 } else { | |
| 1755 child.setMarginLeft(availableAlignmentSpace / 2); | |
| 1756 child.setMarginRight(availableAlignmentSpace / 2); | |
| 1757 } | |
| 1758 } else if (topOrLeft.isAuto()) { | |
| 1759 if (isHorizontal) | |
| 1760 child.setMarginTop(availableAlignmentSpace); | |
| 1761 else | |
| 1762 child.setMarginLeft(availableAlignmentSpace); | |
| 1763 } else if (bottomOrRight.isAuto()) { | |
| 1764 if (isHorizontal) | |
| 1765 child.setMarginBottom(availableAlignmentSpace); | |
| 1766 else | |
| 1767 child.setMarginRight(availableAlignmentSpace); | |
| 1768 } | |
| 1769 } | |
| 1770 | |
| 1662 GridAxisPosition LayoutGrid::columnAxisPositionForChild(const LayoutBox& child) const | 1771 GridAxisPosition LayoutGrid::columnAxisPositionForChild(const LayoutBox& child) const |
| 1663 { | 1772 { |
| 1664 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); | 1773 bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizon talWritingMode(); |
| 1665 bool hasSameWritingMode = child.styleRef().writingMode() == styleRef().writi ngMode(); | 1774 bool hasSameWritingMode = child.styleRef().writingMode() == styleRef().writi ngMode(); |
| 1666 | 1775 |
| 1667 switch (ComputedStyle::resolveAlignment(styleRef(), child.styleRef(), ItemPo sitionStretch)) { | 1776 switch (ComputedStyle::resolveAlignment(styleRef(), child.styleRef(), ItemPo sitionStretch)) { |
| 1668 case ItemPositionSelfStart: | 1777 case ItemPositionSelfStart: |
| 1669 // If orthogonal writing-modes, this computes to 'start'. | 1778 // If orthogonal writing-modes, this computes to 'start'. |
| 1670 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. | 1779 // FIXME: grid track sizing and positioning do not support orthogonal mo des yet. |
| 1671 // self-start is based on the child's block axis direction. That's why w e need to check against the grid container's block flow. | 1780 // self-start is based on the child's block axis direction. That's why w e need to check against the grid container's block flow. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1749 | 1858 |
| 1750 ASSERT_NOT_REACHED(); | 1859 ASSERT_NOT_REACHED(); |
| 1751 return GridAxisStart; | 1860 return GridAxisStart; |
| 1752 } | 1861 } |
| 1753 | 1862 |
| 1754 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const | 1863 LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
| 1755 { | 1864 { |
| 1756 const GridCoordinate& coordinate = cachedGridCoordinate(child); | 1865 const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| 1757 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPositi on.toInt()]; | 1866 LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPositi on.toInt()]; |
| 1758 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); | 1867 LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); |
| 1868 if (hasAutoMarginsInColumnAxis(child)) | |
| 1869 return startPosition; | |
| 1759 GridAxisPosition axisPosition = columnAxisPositionForChild(child); | 1870 GridAxisPosition axisPosition = columnAxisPositionForChild(child); |
| 1760 switch (axisPosition) { | 1871 switch (axisPosition) { |
| 1761 case GridAxisStart: | 1872 case GridAxisStart: |
| 1762 return startPosition; | 1873 return startPosition; |
| 1763 case GridAxisEnd: | 1874 case GridAxisEnd: |
| 1764 case GridAxisCenter: { | 1875 case GridAxisCenter: { |
| 1765 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPositi on.next().toInt()]; | 1876 LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPositi on.next().toInt()]; |
| 1766 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, child.logicalH eight() + child.marginLogicalHeight()); | 1877 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().alignSelfOverflowAlignment(), endOfRow - startOfRow, child.logicalH eight() + child.marginLogicalHeight()); |
| 1767 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); | 1878 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); |
| 1768 } | 1879 } |
| 1769 } | 1880 } |
| 1770 | 1881 |
| 1771 ASSERT_NOT_REACHED(); | 1882 ASSERT_NOT_REACHED(); |
| 1772 return 0; | 1883 return 0; |
| 1773 } | 1884 } |
| 1774 | 1885 |
| 1775 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const | 1886 LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
| 1776 { | 1887 { |
| 1777 const GridCoordinate& coordinate = cachedGridCoordinate(child); | 1888 const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| 1778 LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInit ialPosition.toInt()]; | 1889 LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInit ialPosition.toInt()]; |
| 1779 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); | 1890 LayoutUnit startPosition = startOfColumn + marginStartForChild(child); |
| 1891 if (hasAutoMarginsInRowAxis(child)) | |
| 1892 return startPosition; | |
| 1780 GridAxisPosition axisPosition = rowAxisPositionForChild(child); | 1893 GridAxisPosition axisPosition = rowAxisPositionForChild(child); |
| 1781 switch (axisPosition) { | 1894 switch (axisPosition) { |
| 1782 case GridAxisStart: | 1895 case GridAxisStart: |
| 1783 return startPosition; | 1896 return startPosition; |
| 1784 case GridAxisEnd: | 1897 case GridAxisEnd: |
| 1785 case GridAxisCenter: { | 1898 case GridAxisCenter: { |
| 1786 LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFi nalPosition.next().toInt()]; | 1899 LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFi nalPosition.next().toInt()]; |
| 1787 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, child. logicalWidth() + child.marginLogicalWidth()); | 1900 LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(chil d.styleRef().justifySelfOverflowAlignment(), endOfColumn - startOfColumn, child. logicalWidth() + child.marginLogicalWidth()); |
| 1788 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); | 1901 return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPos ition : offsetFromStartPosition / 2); |
| 1789 } | 1902 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1919 | 2032 |
| 1920 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); | 2033 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); |
| 1921 } | 2034 } |
| 1922 | 2035 |
| 1923 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) | 2036 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) |
| 1924 { | 2037 { |
| 1925 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2038 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
| 1926 } | 2039 } |
| 1927 | 2040 |
| 1928 } // namespace blink | 2041 } // namespace blink |
| OLD | NEW |