| Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| index 9dd7479fb492ed1ce80437d48edb7e60809a0eab..a9d80d7ebbd8775def2668b9adf41c2c2b336d45 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
|
| @@ -150,7 +150,8 @@ class LayoutGrid::GridIterator {
|
|
|
| public:
|
| // |direction| is the direction that is fixed to |fixedTrackIndex| so e.g
|
| - // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd column.
|
| + // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd
|
| + // column.
|
| GridIterator(const GridRepresentation& grid,
|
| GridTrackSizingDirection direction,
|
| size_t fixedTrackIndex,
|
| @@ -194,7 +195,8 @@ class LayoutGrid::GridIterator {
|
| size_t maxRows = std::min(m_rowIndex + rowSpan, m_grid.size());
|
| size_t maxColumns = std::min(m_columnIndex + columnSpan, m_grid[0].size());
|
|
|
| - // This adds a O(N^2) behavior that shouldn't be a big deal as we expect spanning areas to be small.
|
| + // This adds a O(N^2) behavior that shouldn't be a big deal as we expect
|
| + // spanning areas to be small.
|
| for (size_t row = m_rowIndex; row < maxRows; ++row) {
|
| for (size_t column = m_columnIndex; column < maxColumns; ++column) {
|
| const GridCell& children = m_grid[row][column];
|
| @@ -228,7 +230,8 @@ class LayoutGrid::GridIterator {
|
| m_rowIndex, m_rowIndex + rowSpan),
|
| GridSpan::translatedDefiniteGridSpan(
|
| m_columnIndex, m_columnIndex + columnSpan)));
|
| - // Advance the iterator to avoid an infinite loop where we would return the same grid area over and over.
|
| + // Advance the iterator to avoid an infinite loop where we would return
|
| + // the same grid area over and over.
|
| ++varyingTrackIndex;
|
| return result;
|
| }
|
| @@ -256,7 +259,8 @@ struct LayoutGrid::GridSizingData {
|
| Vector<GridTrack> rowTracks;
|
| Vector<size_t> contentSizedTracksIndex;
|
|
|
| - // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free.
|
| + // Performance optimization: hold onto these Vectors until the end of Layout
|
| + // to avoid repeated malloc / free.
|
| Vector<GridTrack*> filteredTracks;
|
| Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
|
| Vector<GridTrack*> growBeyondGrowthLimitsTracks;
|
| @@ -312,8 +316,9 @@ struct LayoutGrid::GridSizingData {
|
| private:
|
| LayoutUnit freeSpaceForColumns{};
|
| LayoutUnit freeSpaceForRows{};
|
| - // No need to store one per direction as it will be only used for computations during each axis
|
| - // track sizing. It's cached here because we need it to compute relative sizes.
|
| + // No need to store one per direction as it will be only used for computations
|
| + // during each axis track sizing. It's cached here because we need it to
|
| + // compute relative sizes.
|
| LayoutUnit m_availableSpace;
|
| };
|
|
|
| @@ -338,14 +343,16 @@ LayoutGrid* LayoutGrid::createAnonymous(Document* document) {
|
| void LayoutGrid::addChild(LayoutObject* newChild, LayoutObject* beforeChild) {
|
| LayoutBlock::addChild(newChild, beforeChild);
|
|
|
| - // The grid needs to be recomputed as it might contain auto-placed items that will change their position.
|
| + // The grid needs to be recomputed as it might contain auto-placed items that
|
| + // will change their position.
|
| dirtyGrid();
|
| }
|
|
|
| void LayoutGrid::removeChild(LayoutObject* child) {
|
| LayoutBlock::removeChild(child);
|
|
|
| - // The grid needs to be recomputed as it might contain auto-placed items that will change their position.
|
| + // The grid needs to be recomputed as it might contain auto-placed items that
|
| + // will change their position.
|
| dirtyGrid();
|
| }
|
|
|
| @@ -355,8 +362,10 @@ void LayoutGrid::styleDidChange(StyleDifference diff,
|
| if (!oldStyle)
|
| return;
|
|
|
| - // FIXME: The following checks could be narrowed down if we kept track of which type of grid items we have:
|
| - // - explicit grid size changes impact negative explicitely positioned and auto-placed grid items.
|
| + // FIXME: The following checks could be narrowed down if we kept track of
|
| + // which type of grid items we have:
|
| + // - explicit grid size changes impact negative explicitely positioned and
|
| + // auto-placed grid items.
|
| // - named grid lines only impact grid items with named grid lines.
|
| // - auto-flow changes only impacts auto-placed children.
|
|
|
| @@ -391,10 +400,11 @@ bool LayoutGrid::namedGridLinesDefinitionDidChange(
|
|
|
| size_t LayoutGrid::gridColumnCount() const {
|
| DCHECK(!m_gridIsDirty);
|
| - // Due to limitations in our internal representation, we cannot know the number of columns from
|
| - // m_grid *if* there is no row (because m_grid would be empty). That's why in that case we need
|
| - // to get it from the style. Note that we know for sure that there are't any implicit tracks,
|
| - // because not having rows implies that there are no "normal" children (out-of-flow children are
|
| + // Due to limitations in our internal representation, we cannot know the
|
| + // number of columns from m_grid *if* there is no row (because m_grid would be
|
| + // empty). That's why in that case we need to get it from the style. Note that
|
| + // we know for sure that there are't any implicit tracks, because not having
|
| + // rows implies that there are no "normal" children (out-of-flow children are
|
| // not stored in m_grid).
|
| return m_grid.size() ? m_grid[0].size()
|
| : GridPositionsResolver::explicitGridColumnCount(
|
| @@ -444,14 +454,16 @@ void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData,
|
| LayoutUnit availableSpaceForRows) {
|
| DCHECK(sizingData.sizingState > GridSizingData::RowSizingFirstIteration);
|
|
|
| - // In orthogonal flow cases column track's size is determined by using the computed
|
| - // row track's size, which it was estimated during the first cycle of the sizing
|
| - // algorithm. Hence we need to repeat computeUsedBreadthOfGridTracks for both,
|
| - // columns and rows, to determine the final values.
|
| + // In orthogonal flow cases column track's size is determined by using the
|
| + // computed row track's size, which it was estimated during the first cycle of
|
| + // the sizing algorithm.
|
| + // Hence we need to repeat computeUsedBreadthOfGridTracks for both, columns
|
| + // and rows, to determine the final values.
|
| // TODO (lajava): orthogonal flows is just one of the cases which may require
|
| - // a new cycle of the sizing algorithm; there may be more. In addition, not all the
|
| - // cases with orthogonal flows require this extra cycle; we need a more specific
|
| - // condition to detect whether child's min-content contribution has changed or not.
|
| + // a new cycle of the sizing algorithm; there may be more. In addition, not
|
| + // all the cases with orthogonal flows require this extra cycle; we need a
|
| + // more specific condition to detect whether child's min-content contribution
|
| + // has changed or not.
|
| if (m_hasAnyOrthogonalChild) {
|
| computeTrackSizesForDefiniteSize(ForColumns, sizingData,
|
| availableSpaceForColumns);
|
| @@ -469,8 +481,8 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
|
| SubtreeLayoutScope layoutScope(*this);
|
|
|
| {
|
| - // LayoutState needs this deliberate scope to pop before updating scroll information (which
|
| - // may trigger relayout).
|
| + // LayoutState needs this deliberate scope to pop before updating scroll
|
| + // information (which may trigger relayout).
|
| LayoutState state(*this, locationOffset());
|
|
|
| LayoutSize previousSize = size();
|
| @@ -480,8 +492,9 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
|
|
|
| TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope);
|
|
|
| - // TODO(svillar): we won't need to do this once the intrinsic width computation is isolated
|
| - // from the LayoutGrid object state (it should not touch any attribute) (see crbug.com/627812)
|
| + // TODO(svillar): we won't need to do this once the intrinsic width
|
| + // computation is isolated from the LayoutGrid object state (it should not
|
| + // touch any attribute) (see crbug.com/627812)
|
| if (m_autoRepeatColumns &&
|
| m_autoRepeatColumns !=
|
| computeAutoRepeatTracksCount(ForColumns, TrackSizing))
|
| @@ -490,17 +503,19 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
|
|
|
| GridSizingData sizingData(gridColumnCount(), gridRowCount());
|
|
|
| - // 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns.
|
| - // At this point the logical width is always definite as the above call to updateLogicalWidth()
|
| - // properly resolves intrinsic sizes. We cannot do the same for heights though because many code
|
| - // paths inside updateLogicalHeight() require a previous call to setLogicalHeight() to resolve
|
| - // heights properly (like for positioned items for example).
|
| + // 1- First, the track sizing algorithm is used to resolve the sizes of the
|
| + // grid columns.
|
| + // At this point the logical width is always definite as the above call to
|
| + // updateLogicalWidth() properly resolves intrinsic sizes. We cannot do the
|
| + // same for heights though because many code paths inside
|
| + // updateLogicalHeight() require a previous call to setLogicalHeight() to
|
| + // resolve heights properly (like for positioned items for example).
|
| LayoutUnit availableSpaceForColumns = availableLogicalWidth();
|
| computeTrackSizesForDefiniteSize(ForColumns, sizingData,
|
| availableSpaceForColumns);
|
|
|
| - // 2- Next, the track sizing algorithm resolves the sizes of the grid rows, using the
|
| - // grid column sizes calculated in the previous step.
|
| + // 2- Next, the track sizing algorithm resolves the sizes of the grid rows,
|
| + // using the grid column sizes calculated in the previous step.
|
| if (cachedHasDefiniteLogicalHeight()) {
|
| computeTrackSizesForDefiniteSize(
|
| ForRows, sizingData,
|
| @@ -518,13 +533,14 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
|
| LayoutUnit oldClientAfterEdge = clientLogicalBottom();
|
| updateLogicalHeight();
|
|
|
| - // 3- If the min-content contribution of any grid items have changed based on the row
|
| - // sizes calculated in step 2, steps 1 and 2 are repeated with the new min-content
|
| - // contribution (once only).
|
| + // 3- If the min-content contribution of any grid items have changed based
|
| + // on the row sizes calculated in step 2, steps 1 and 2 are repeated with
|
| + // the new min-content contribution (once only).
|
| repeatTracksSizingIfNeeded(sizingData, availableSpaceForColumns,
|
| contentLogicalHeight());
|
|
|
| - // Grid container should have the minimum height of a line if it's editable. That doesn't affect track sizing though.
|
| + // Grid container should have the minimum height of a line if it's editable.
|
| + // That doesn't affect track sizing though.
|
| if (hasLineIfEmpty())
|
| setLogicalHeight(
|
| std::max(logicalHeight(), minimumLogicalHeightForEmptyLine()));
|
| @@ -572,7 +588,8 @@ LayoutUnit LayoutGrid::gridGapForDirection(
|
| ? availableLogicalWidth()
|
| : availableLogicalHeightForPercentageComputation();
|
|
|
| - // TODO(rego): Maybe we could cache the computed percentage as a performance improvement.
|
| + // TODO(rego): Maybe we could cache the computed percentage as a performance
|
| + // improvement.
|
| return valueForLength(gap, availableSize);
|
| }
|
|
|
| @@ -590,10 +607,11 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
|
| if (!hasAutoRepeatEmptyTracks(direction))
|
| return gap * (span - 1);
|
|
|
| - // If there are collapsing tracks we need to be sure that gutters are properly collapsed. Apart
|
| - // from that, if we have a collapsed track in the edges of the span we're considering, we need
|
| - // to move forward (or backwards) in order to know whether the collapsed tracks reach the end of
|
| - // the grid (so the gap becomes 0) or there is a non empty track before that.
|
| + // If there are collapsing tracks we need to be sure that gutters are properly
|
| + // collapsed. Apart from that, if we have a collapsed track in the edges of
|
| + // the span we're considering, we need to move forward (or backwards) in order
|
| + // to know whether the collapsed tracks reach the end of the grid (so the gap
|
| + // becomes 0) or there is a non empty track before that.
|
|
|
| LayoutUnit gapAccumulator;
|
| size_t endLine = startLine + span;
|
| @@ -609,8 +627,9 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
|
| gapAccumulator -= gap;
|
| }
|
|
|
| - // If the startLine is the start line of a collapsed track we need to go backwards till we reach
|
| - // a non collapsed track. If we find a non collapsed track we need to add that gap.
|
| + // If the startLine is the start line of a collapsed track we need to go
|
| + // backwards till we reach a non collapsed track. If we find a non collapsed
|
| + // track we need to add that gap.
|
| if (startLine && isEmptyAutoRepeatTrack(direction, startLine)) {
|
| size_t nonEmptyTracksBeforeStartLine = startLine;
|
| auto begin = isRowAxis ? m_autoRepeatEmptyColumns->begin()
|
| @@ -623,8 +642,9 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
|
| gapAccumulator += gap;
|
| }
|
|
|
| - // If the endLine is the end line of a collapsed track we need to go forward till we reach a non
|
| - // collapsed track. If we find a non collapsed track we need to add that gap.
|
| + // If the endLine is the end line of a collapsed track we need to go forward
|
| + // till we reach a non collapsed track. If we find a non collapsed track we
|
| + // need to add that gap.
|
| if (isEmptyAutoRepeatTrack(direction, endLine - 1)) {
|
| size_t nonEmptyTracksAfterEndLine =
|
| (isRowAxis ? gridColumnCount() : gridRowCount()) - endLine;
|
| @@ -633,7 +653,8 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction,
|
| : m_autoRepeatEmptyRows->find(endLine - 1);
|
| auto endEmptyTrack = isRowAxis ? m_autoRepeatEmptyColumns->end()
|
| : m_autoRepeatEmptyRows->end();
|
| - // HashSet iterators do not implement operator- so we have to manually iterate to know the number of remaining empty tracks.
|
| + // HashSet iterators do not implement operator- so we have to manually
|
| + // iterate to know the number of remaining empty tracks.
|
| for (auto it = ++currentEmptyTrack; it != endEmptyTrack; ++it) {
|
| DCHECK(nonEmptyTracksAfterEndLine);
|
| --nonEmptyTracksAfterEndLine;
|
| @@ -730,7 +751,8 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(
|
| Vector<size_t> flexibleSizedTracksIndex;
|
| sizingData.contentSizedTracksIndex.shrink(0);
|
|
|
| - // Grid gutters were removed from freeSpace by the caller, but we must use them to compute relative (i.e. percentages) sizes.
|
| + // Grid gutters were removed from freeSpace by the caller, but we must use
|
| + // them to compute relative (i.e. percentages) sizes.
|
| LayoutUnit maxSize = sizingData.availableSpace().clampNegativeToZero();
|
| bool hasDefiniteFreeSpace = sizingData.sizingOperation == TrackSizing;
|
|
|
| @@ -767,8 +789,8 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(
|
| ASSERT(!track.infiniteGrowthPotential());
|
| baseSizesWithoutMaximization += track.baseSize();
|
| growthLimitsWithoutMaximization += track.growthLimit();
|
| - // The growth limit caps must be cleared now in order to properly sort tracks by growth
|
| - // potential on an eventual "Maximize Tracks".
|
| + // The growth limit caps must be cleared now in order to properly sort
|
| + // tracks by growth potential on an eventual "Maximize Tracks".
|
| track.setGrowthLimitCap(WTF::nullopt);
|
| }
|
| freeSpace = initialFreeSpace - baseSizesWithoutMaximization;
|
| @@ -776,7 +798,8 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(
|
| if (hasDefiniteFreeSpace && freeSpace <= 0)
|
| return;
|
|
|
| - // 3. Grow all Grid tracks in GridTracks from their baseSize up to their growthLimit value until freeSpace is exhausted.
|
| + // 3. Grow all Grid tracks in GridTracks from their baseSize up to their
|
| + // growthLimit value until freeSpace is exhausted.
|
| const size_t tracksSize = tracks.size();
|
| if (hasDefiniteFreeSpace) {
|
| Vector<GridTrack*> tracksForDistribution(tracksSize);
|
| @@ -888,11 +911,13 @@ double LayoutGrid::computeFlexFactorUnitSize(
|
| LayoutUnit& leftOverSpace,
|
| const Vector<size_t, 8>& flexibleTracksIndexes,
|
| std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const {
|
| - // We want to avoid the effect of flex factors sum below 1 making the factor unit size to grow exponentially.
|
| + // We want to avoid the effect of flex factors sum below 1 making the factor
|
| + // unit size to grow exponentially.
|
| double hypotheticalFactorUnitSize =
|
| leftOverSpace / std::max<double>(1, flexFactorSum);
|
|
|
| - // product of the hypothetical "flex factor unit" and any flexible track's "flex factor" must be grater than such track's "base size".
|
| + // product of the hypothetical "flex factor unit" and any flexible track's
|
| + // "flex factor" must be grater than such track's "base size".
|
| std::unique_ptr<TrackIndexSet> additionalTracksToTreatAsInflexible =
|
| std::move(tracksToTreatAsInflexible);
|
| bool validFlexFactorUnit = true;
|
| @@ -999,9 +1024,10 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(
|
| : styleRef().gridAutoRepeatRowsInsertionPoint();
|
| size_t autoRepeatTracksCount = autoRepeatCountForDirection(direction);
|
|
|
| - // We should not use GridPositionsResolver::explicitGridXXXCount() for this because the
|
| - // explicit grid might be larger than the number of tracks in grid-template-rows|columns (if
|
| - // grid-template-areas is specified for example).
|
| + // We should not use GridPositionsResolver::explicitGridXXXCount() for this
|
| + // because the explicit grid might be larger than the number of tracks in
|
| + // grid-template-rows|columns (if grid-template-areas is specified for
|
| + // example).
|
| size_t explicitTracksCount = trackStyles.size() + autoRepeatTracksCount;
|
|
|
| int untranslatedIndexAsInt =
|
| @@ -1010,7 +1036,8 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(
|
| size_t autoTrackStylesSize = autoTrackStyles.size();
|
| if (untranslatedIndexAsInt < 0) {
|
| int index = untranslatedIndexAsInt % static_cast<int>(autoTrackStylesSize);
|
| - // We need to traspose the index because the first negative implicit line will get the last defined auto track and so on.
|
| + // We need to traspose the index because the first negative implicit line
|
| + // will get the last defined auto track and so on.
|
| index += index ? autoTrackStylesSize : 0;
|
| return autoTrackStyles[index];
|
| }
|
| @@ -1046,9 +1073,11 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction,
|
|
|
| GridLength minTrackBreadth = trackSize.minTrackBreadth();
|
| GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
|
| - // If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>.
|
| + // If the logical width/height of the grid container is indefinite, percentage
|
| + // values are treated as <auto>.
|
| if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) {
|
| - // For the inline axis this only happens when we're computing the intrinsic sizes (AvailableSpaceIndefinite).
|
| + // For the inline axis this only happens when we're computing the intrinsic
|
| + // sizes (AvailableSpaceIndefinite).
|
| if ((sizingOperation == IntrinsicSizeComputation) ||
|
| (direction == ForRows && !cachedHasDefiniteLogicalHeight())) {
|
| if (minTrackBreadth.hasPercentage())
|
| @@ -1058,8 +1087,9 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction,
|
| }
|
| }
|
|
|
| - // Flex sizes are invalid as a min sizing function. However we still can have a flexible |minTrackBreadth|
|
| - // if the track had a flex size directly (e.g. "1fr"), the spec says that in this case it implies an automatic minimum.
|
| + // Flex sizes are invalid as a min sizing function. However we still can have
|
| + // a flexible |minTrackBreadth| if the track had a flex size directly (e.g.
|
| + // "1fr"), the spec says that in this case it implies an automatic minimum.
|
| if (minTrackBreadth.isFlex())
|
| minTrackBreadth = Length(Auto);
|
|
|
| @@ -1074,15 +1104,17 @@ LayoutUnit LayoutGrid::logicalHeightForChild(LayoutBox& child,
|
| GridSizingData& sizingData) const {
|
| GridTrackSizingDirection childBlockDirection =
|
| flowAwareDirectionForChild(child, ForRows);
|
| - // If |child| has a relative logical height, we shouldn't let it override its intrinsic height, which is
|
| - // what we are interested in here. Thus we need to set the block-axis override size to -1 (no possible resolution).
|
| + // If |child| has a relative logical height, we shouldn't let it override its
|
| + // intrinsic height, which is what we are interested in here. Thus we need to
|
| + // set the block-axis override size to -1 (no possible resolution).
|
| if (shouldClearOverrideContainingBlockContentSizeForChild(child, ForRows)) {
|
| setOverrideContainingBlockContentSizeForChild(child, childBlockDirection,
|
| LayoutUnit(-1));
|
| child.setNeedsLayout(LayoutInvalidationReason::GridChanged);
|
| }
|
|
|
| - // We need to clear the stretched height to properly compute logical height during layout.
|
| + // We need to clear the stretched height to properly compute logical height
|
| + // during layout.
|
| if (child.needsLayout())
|
| child.clearOverrideLogicalContentHeight();
|
|
|
| @@ -1159,23 +1191,27 @@ LayoutUnit LayoutGrid::minContentForChild(LayoutBox& child,
|
| GridTrackSizingDirection childInlineDirection =
|
| flowAwareDirectionForChild(child, ForColumns);
|
| if (direction == childInlineDirection) {
|
| - // If |child| has a relative logical width, we shouldn't let it override its intrinsic width, which is
|
| - // what we are interested in here. Thus we need to set the inline-axis override size to -1 (no possible resolution).
|
| + // If |child| has a relative logical width, we shouldn't let it override its
|
| + // intrinsic width, which is what we are interested in here. Thus we need to
|
| + // set the inline-axis override size to -1 (no possible resolution).
|
| if (shouldClearOverrideContainingBlockContentSizeForChild(child,
|
| ForColumns))
|
| setOverrideContainingBlockContentSizeForChild(child, childInlineDirection,
|
| LayoutUnit(-1));
|
|
|
| - // FIXME: It's unclear if we should return the intrinsic width or the preferred width.
|
| + // FIXME: It's unclear if we should return the intrinsic width or the
|
| + // preferred width.
|
| // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
|
| return child.minPreferredLogicalWidth() +
|
| marginIntrinsicLogicalWidthForChild(child);
|
| }
|
|
|
| - // All orthogonal flow boxes were already laid out during an early layout phase performed in FrameView::performLayout.
|
| - // It's true that grid track sizing was not completed at that time and it may afffect the final height of a
|
| - // grid item, but since it's forbidden to perform a layout during intrinsic width computation, we have to use
|
| - // that computed height for now.
|
| + // All orthogonal flow boxes were already laid out during an early layout
|
| + // phase performed in FrameView::performLayout.
|
| + // It's true that grid track sizing was not completed at that time and it may
|
| + // afffect the final height of a grid item, but since it's forbidden to
|
| + // perform a layout during intrinsic width computation, we have to use that
|
| + // computed height for now.
|
| if (direction == ForColumns &&
|
| sizingData.sizingOperation == IntrinsicSizeComputation) {
|
| DCHECK(isOrthogonalChild(child));
|
| @@ -1195,23 +1231,27 @@ LayoutUnit LayoutGrid::maxContentForChild(LayoutBox& child,
|
| GridTrackSizingDirection childInlineDirection =
|
| flowAwareDirectionForChild(child, ForColumns);
|
| if (direction == childInlineDirection) {
|
| - // If |child| has a relative logical width, we shouldn't let it override its intrinsic width, which is
|
| - // what we are interested in here. Thus we need to set the inline-axis override size to -1 (no possible resolution).
|
| + // If |child| has a relative logical width, we shouldn't let it override its
|
| + // intrinsic width, which is what we are interested in here. Thus we need to
|
| + // set the inline-axis override size to -1 (no possible resolution).
|
| if (shouldClearOverrideContainingBlockContentSizeForChild(child,
|
| ForColumns))
|
| setOverrideContainingBlockContentSizeForChild(child, childInlineDirection,
|
| LayoutUnit(-1));
|
|
|
| - // FIXME: It's unclear if we should return the intrinsic width or the preferred width.
|
| + // FIXME: It's unclear if we should return the intrinsic width or the
|
| + // preferred width.
|
| // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
|
| return child.maxPreferredLogicalWidth() +
|
| marginIntrinsicLogicalWidthForChild(child);
|
| }
|
|
|
| - // All orthogonal flow boxes were already laid out during an early layout phase performed in FrameView::performLayout.
|
| - // It's true that grid track sizing was not completed at that time and it may afffect the final height of a
|
| - // grid item, but since it's forbidden to perform a layout during intrinsic width computation, we have to use
|
| - // that computed height for now.
|
| + // All orthogonal flow boxes were already laid out during an early layout
|
| + // phase performed in FrameView::performLayout.
|
| + // It's true that grid track sizing was not completed at that time and it may
|
| + // afffect the final height of a grid item, but since it's forbidden to
|
| + // perform a layout during intrinsic width computation, we have to use that
|
| + // computed height for now.
|
| if (direction == ForColumns &&
|
| sizingData.sizingOperation == IntrinsicSizeComputation) {
|
| DCHECK(isOrthogonalChild(child));
|
| @@ -1224,10 +1264,12 @@ LayoutUnit LayoutGrid::maxContentForChild(LayoutBox& child,
|
| return logicalHeightForChild(child, sizingData);
|
| }
|
|
|
| -// We're basically using a class instead of a std::pair because of accessing gridItem() or getGridSpan() is much more
|
| -// self-explanatory that using .first or .second members in the pair. Having a std::pair<LayoutBox*, size_t>
|
| -// does not work either because we still need the GridSpan so we'd have to add an extra hash lookup for each item
|
| -// at the beginning of LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems().
|
| +// We're basically using a class instead of a std::pair because of accessing
|
| +// gridItem() or getGridSpan() is much more self-explanatory that using .first
|
| +// or .second members in the pair. Having a std::pair<LayoutBox*, size_t>
|
| +// does not work either because we still need the GridSpan so we'd have to add
|
| +// an extra hash lookup for each item at the beginning of
|
| +// LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems().
|
| class GridItemWithSpan {
|
| public:
|
| GridItemWithSpan(LayoutBox& gridItem, const GridSpan& gridSpan)
|
| @@ -1560,8 +1602,8 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(
|
|
|
| static bool sortByGridTrackGrowthPotential(const GridTrack* track1,
|
| const GridTrack* track2) {
|
| - // This check ensures that we respect the irreflexivity property of the strict weak ordering required by std::sort
|
| - // (forall x: NOT x < x).
|
| + // This check ensures that we respect the irreflexivity property of the strict
|
| + // weak ordering required by std::sort(forall x: NOT x < x).
|
| bool track1HasInfiniteGrowthPotentialWithoutCap =
|
| track1->infiniteGrowthPotential() && !track1->growthLimitCap();
|
| bool track2HasInfiniteGrowthPotentialWithoutCap =
|
| @@ -1634,8 +1676,9 @@ void LayoutGrid::distributeSpaceToTracks(
|
| }
|
|
|
| if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) {
|
| - // We need to sort them because there might be tracks with growth limit caps (like the ones
|
| - // with fit-content()) which cannot indefinitely grow over the limits.
|
| + // We need to sort them because there might be tracks with growth limit caps
|
| + // (like the ones with fit-content()) which cannot indefinitely grow over
|
| + // the limits.
|
| if (phase == ResolveMaxContentMaximums)
|
| std::sort(growBeyondGrowthLimitsTracks->begin(),
|
| growBeyondGrowthLimitsTracks->end(),
|
| @@ -1765,12 +1808,14 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(
|
| : autoTrackSize.minTrackBreadth().length();
|
| autoRepeatTracksSize += valueForLength(trackLength, availableSize);
|
| }
|
| - // For the purpose of finding the number of auto-repeated tracks, the UA must floor the track size to a UA-specified
|
| - // value to avoid division by zero. It is suggested that this floor be 1px.
|
| + // For the purpose of finding the number of auto-repeated tracks, the UA must
|
| + // floor the track size to a UA-specified value to avoid division by zero. It
|
| + // is suggested that this floor be 1px.
|
| autoRepeatTracksSize =
|
| std::max<LayoutUnit>(LayoutUnit(1), autoRepeatTracksSize);
|
|
|
| - // There will be always at least 1 auto-repeat track, so take it already into account when computing the total track size.
|
| + // There will be always at least 1 auto-repeat track, so take it already into
|
| + // account when computing the total track size.
|
| LayoutUnit tracksSize = autoRepeatTracksSize;
|
| const Vector<GridTrackSize>& trackSizes =
|
| isRowAxis ? styleRef().gridTemplateColumns()
|
| @@ -1788,8 +1833,8 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(
|
| availableSize);
|
| }
|
|
|
| - // Add gutters as if there where only 1 auto repeat track. Gaps between auto repeat tracks will be added later when
|
| - // computing the repetitions.
|
| + // Add gutters as if there where only 1 auto repeat track. Gaps between auto
|
| + // repeat tracks will be added later when computing the repetitions.
|
| LayoutUnit gapSize = gridGapForDirection(direction, sizingOperation);
|
| tracksSize += gapSize * trackSizes.size();
|
|
|
| @@ -1800,9 +1845,10 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(
|
| size_t repetitions =
|
| 1 + (freeSpace / (autoRepeatTracksSize + gapSize)).toInt();
|
|
|
| - // Provided the grid container does not have a definite size or max-size in the relevant axis,
|
| - // if the min size is definite then the number of repetitions is the largest possible positive
|
| - // integer that fulfills that minimum requirement.
|
| + // Provided the grid container does not have a definite size or max-size in
|
| + // the relevant axis, if the min size is definite then the number of
|
| + // repetitions is the largest possible positive integer that fulfills that
|
| + // minimum requirement.
|
| if (needsToFulfillMinimumSize)
|
| ++repetitions;
|
|
|
| @@ -1943,7 +1989,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
|
| populator.collectChild(child);
|
| m_gridItemsIndexesMap.set(child, childIndex++);
|
|
|
| - // This function bypasses the cache (cachedGridArea()) as it is used to build it.
|
| + // This function bypasses the cache (cachedGridArea()) as it is used to
|
| + // build it.
|
| GridSpan rowPositions =
|
| GridPositionsResolver::resolveGridPositionsFromStyle(
|
| *style(), *child, ForRows, m_autoRepeatRows);
|
| @@ -1959,7 +2006,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
|
| maximumRowIndex =
|
| std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine());
|
| } else {
|
| - // Grow the grid for items with a definite row span, getting the largest such span.
|
| + // Grow the grid for items with a definite row span, getting the largest
|
| + // such span.
|
| size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
|
| *style(), *child, ForRows);
|
| maximumRowIndex = std::max(maximumRowIndex, spanSize);
|
| @@ -1971,7 +2019,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() {
|
| maximumColumnIndex = std::max<int>(maximumColumnIndex,
|
| columnPositions.untranslatedEndLine());
|
| } else {
|
| - // Grow the grid for items with a definite column span, getting the largest such span.
|
| + // Grow the grid for items with a definite column span, getting the
|
| + // largest such span.
|
| size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
|
| *style(), *child, ForColumns);
|
| maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
|
| @@ -2009,8 +2058,9 @@ void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(
|
| bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns;
|
| bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense();
|
|
|
| - // Mapping between the major axis tracks (rows or columns) and the last auto-placed item's position inserted on
|
| - // that track. This is needed to implement "sparse" packing for items locked to a given track.
|
| + // Mapping between the major axis tracks (rows or columns) and the last
|
| + // auto-placed item's position inserted on that track. This is needed to
|
| + // implement "sparse" packing for items locked to a given track.
|
| // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo
|
| HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash,
|
| WTF::UnsignedWithZeroKeyHashTraits<unsigned>>
|
| @@ -2087,7 +2137,8 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(
|
|
|
| std::unique_ptr<GridArea> emptyGridArea;
|
| if (minorAxisPositions.isTranslatedDefinite()) {
|
| - // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor.
|
| + // Move to the next track in major axis if initial position in minor axis is
|
| + // before auto-placement cursor.
|
| if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor)
|
| majorAxisAutoPlacementCursor++;
|
|
|
| @@ -2114,7 +2165,9 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(
|
| iterator.nextEmptyGridArea(majorAxisSpanSize, minorAxisSpanSize);
|
|
|
| if (emptyGridArea) {
|
| - // Check that it fits in the minor axis direction, as we shouldn't grow in that direction here (it was already managed in populateExplicitGridAndOrderIterator()).
|
| + // Check that it fits in the minor axis direction, as we shouldn't grow
|
| + // in that direction here (it was already managed in
|
| + // populateExplicitGridAndOrderIterator()).
|
| size_t minorAxisFinalPositionIndex =
|
| autoPlacementMinorAxisDirection() == ForColumns
|
| ? emptyGridArea->columns.endLine()
|
| @@ -2125,12 +2178,14 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(
|
| if (minorAxisFinalPositionIndex <= endOfMinorAxis)
|
| break;
|
|
|
| - // Discard empty grid area as it does not fit in the minor axis direction.
|
| - // We don't need to create a new empty grid area yet as we might find a valid one in the next iteration.
|
| + // Discard empty grid area as it does not fit in the minor axis
|
| + // direction. We don't need to create a new empty grid area yet as we
|
| + // might find a valid one in the next iteration.
|
| emptyGridArea = nullptr;
|
| }
|
|
|
| - // As we're moving to the next track in the major axis we should reset the auto-placement cursor in the minor axis.
|
| + // As we're moving to the next track in the major axis we should reset the
|
| + // auto-placement cursor in the minor axis.
|
| minorAxisAutoPlacementCursor = 0;
|
| }
|
|
|
| @@ -2202,8 +2257,9 @@ Vector<LayoutUnit> LayoutGrid::trackSizesForComputedStyle(
|
| if (isEmptyAutoRepeatTrack(direction, i - 1)) {
|
| --remainingEmptyTracks;
|
| } else {
|
| - // Remove the gap between consecutive non empty tracks. Remove it also just once for an
|
| - // arbitrary number of empty tracks between two non empty ones.
|
| + // Remove the gap between consecutive non empty tracks. Remove it also
|
| + // just once for an arbitrary number of empty tracks between two non empty
|
| + // ones.
|
| bool allRemainingTracksAreEmpty = remainingEmptyTracks == (lastLine - i);
|
| if (!allRemainingTracksAreEmpty || !isEmptyAutoRepeatTrack(direction, i))
|
| tracks[i - 1] -= gap;
|
| @@ -2232,7 +2288,8 @@ void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(
|
| contentAlignmentNormalBehavior()) != ContentDistributionStretch))
|
| return;
|
|
|
| - // Spec defines auto-sized tracks as the ones with an 'auto' max-sizing function.
|
| + // Spec defines auto-sized tracks as the ones with an 'auto' max-sizing
|
| + // function.
|
| Vector<GridTrack>& tracks = (direction == ForColumns)
|
| ? sizingData.columnTracks
|
| : sizingData.rowTracks;
|
| @@ -2299,14 +2356,16 @@ void LayoutGrid::layoutGridItems(GridSizingData& sizingData) {
|
| child->setOverrideContainingBlockContentLogicalHeight(
|
| overrideContainingBlockContentLogicalHeight);
|
|
|
| - // Stretching logic might force a child layout, so we need to run it before the layoutIfNeeded
|
| - // call to avoid unnecessary relayouts. This might imply that child margins, needed to correctly
|
| - // determine the available space before stretching, are not set yet.
|
| + // Stretching logic might force a child layout, so we need to run it before
|
| + // the layoutIfNeeded call to avoid unnecessary relayouts. This might imply
|
| + // that child margins, needed to correctly determine the available space
|
| + // before stretching, are not set yet.
|
| applyStretchAlignmentToChildIfNeeded(*child);
|
|
|
| child->layoutIfNeeded();
|
|
|
| - // We need pending layouts to be done in order to compute auto-margins properly.
|
| + // We need pending layouts to be done in order to compute auto-margins
|
| + // properly.
|
| updateAutoMarginsInColumnAxisIfNeeded(*child);
|
| updateAutoMarginsInRowAxisIfNeeded(*child);
|
|
|
| @@ -2317,8 +2376,9 @@ void LayoutGrid::layoutGridItems(GridSizingData& sizingData) {
|
| #endif
|
| child->setLogicalLocation(findChildLogicalPosition(*child, sizingData));
|
|
|
| - // Keep track of children overflowing their grid area as we might need to paint them even if the grid-area is not visible.
|
| - // Using physical dimensions for simplicity, so we can forget about orthogonalty.
|
| + // Keep track of children overflowing their grid area as we might need to
|
| + // paint them even if the grid-area is not visible. Using physical
|
| + // dimensions for simplicity, so we can forget about orthogonalty.
|
| LayoutUnit childGridAreaHeight =
|
| isHorizontalWritingMode() ? overrideContainingBlockContentLogicalHeight
|
| : overrideContainingBlockContentLogicalWidth;
|
| @@ -2393,7 +2453,9 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(
|
| return;
|
| }
|
|
|
| - // For positioned items we cannot use GridSpan::translate(). Because we could end up with negative values, as the positioned items do not create implicit tracks per spec.
|
| + // For positioned items we cannot use GridSpan::translate(). Because we could
|
| + // end up with negative values, as the positioned items do not create implicit
|
| + // tracks per spec.
|
| int smallestStart =
|
| abs(isForColumns ? m_smallestColumnStart : m_smallestRowStart);
|
| int startLine = positions.untranslatedStartLine() + smallestStart;
|
| @@ -2446,7 +2508,8 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(
|
| end = m_rowPositions[endLine] - borderBefore();
|
| }
|
|
|
| - // These vectors store line positions including gaps, but we shouldn't consider them for the edges of the grid.
|
| + // These vectors store line positions including gaps, but we shouldn't
|
| + // consider them for the edges of the grid.
|
| if (endLine > 0 && endLine < lastLine) {
|
| end -= guttersSize(direction, endLine - 1, 2, TrackSizing);
|
| end -= isForColumns ? m_offsetBetweenColumns : m_offsetBetweenRows;
|
| @@ -2459,8 +2522,9 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(
|
| if (isForColumns && !styleRef().isLeftToRightDirection() &&
|
| !child.styleRef().hasStaticInlinePosition(
|
| child.isHorizontalWritingMode())) {
|
| - // If the child doesn't have a static inline position (i.e. "left" and/or "right" aren't "auto",
|
| - // we need to calculate the offset from the left (even if we're in RTL).
|
| + // If the child doesn't have a static inline position (i.e. "left" and/or
|
| + // "right" aren't "auto", we need to calculate the offset from the left
|
| + // (even if we're in RTL).
|
| if (endIsAuto) {
|
| offset = LayoutUnit();
|
| } else {
|
| @@ -2518,9 +2582,10 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(
|
| const LayoutBox& child,
|
| GridTrackSizingDirection direction,
|
| const GridSizingData& sizingData) const {
|
| - // To determine the column track's size based on an orthogonal grid item we need it's logical height, which
|
| - // may depend on the row track's size. It's possible that the row tracks sizing logic has not been performed yet,
|
| - // so we will need to do an estimation.
|
| + // To determine the column track's size based on an orthogonal grid item we
|
| + // need it's logical height, which may depend on the row track's size. It's
|
| + // possible that the row tracks sizing logic has not been performed yet, so we
|
| + // will need to do an estimation.
|
| if (direction == ForRows &&
|
| sizingData.sizingState == GridSizingData::ColumnSizingFirstIteration)
|
| return assumedRowsSizeForOrthogonalChild(child, sizingData.sizingOperation);
|
| @@ -2543,8 +2608,9 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(
|
| const LayoutBox& child,
|
| GridTrackSizingDirection direction,
|
| const GridSizingData& sizingData) const {
|
| - // We need the cached value when available because Content Distribution alignment properties
|
| - // may have some influence in the final grid area breadth.
|
| + // We need the cached value when available because Content Distribution
|
| + // alignment properties may have some influence in the final grid area
|
| + // breadth.
|
| const Vector<GridTrack>& tracks = (direction == ForColumns)
|
| ? sizingData.columnTracks
|
| : sizingData.rowTracks;
|
| @@ -2553,7 +2619,8 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(
|
| (direction == ForColumns) ? m_columnPositions : m_rowPositions;
|
| LayoutUnit initialTrackPosition = linePositions[span.startLine()];
|
| LayoutUnit finalTrackPosition = linePositions[span.endLine() - 1];
|
| - // Track Positions vector stores the 'start' grid line of each track, so w have to add last track's baseSize.
|
| + // Track Positions vector stores the 'start' grid line of each track, so we
|
| + // have to add last track's baseSize.
|
| return finalTrackPosition - initialTrackPosition +
|
| tracks[span.endLine() - 1].baseSize();
|
| }
|
| @@ -2561,13 +2628,16 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(
|
| void LayoutGrid::populateGridPositionsForDirection(
|
| GridSizingData& sizingData,
|
| GridTrackSizingDirection direction) {
|
| - // Since we add alignment offsets and track gutters, grid lines are not always adjacent. Hence we will have to
|
| - // assume from now on that we just store positions of the initial grid lines of each track,
|
| - // except the last one, which is the only one considered as a final grid line of a track.
|
| -
|
| - // The grid container's frame elements (border, padding and <content-position> offset) are sensible to the
|
| - // inline-axis flow direction. However, column lines positions are 'direction' unaware. This simplification
|
| - // allows us to use the same indexes to identify the columns independently on the inline-axis direction.
|
| + // Since we add alignment offsets and track gutters, grid lines are not always
|
| + // adjacent. Hence we will have to assume from now on that we just store
|
| + // positions of the initial grid lines of each track, except the last one,
|
| + // which is the only one considered as a final grid line of a track.
|
| +
|
| + // The grid container's frame elements (border, padding and <content-position>
|
| + // offset) are sensible to the inline-axis flow direction. However, column
|
| + // lines positions are 'direction' unaware. This simplification allows us to
|
| + // use the same indexes to identify the columns independently on the
|
| + // inline-axis direction.
|
| bool isRowAxis = direction == ForColumns;
|
| auto& tracks = isRowAxis ? sizingData.columnTracks : sizingData.rowTracks;
|
| size_t numberOfTracks = tracks.size();
|
| @@ -2581,8 +2651,9 @@ void LayoutGrid::populateGridPositionsForDirection(
|
| isRowAxis ? borderAndPaddingLogicalLeft() : borderAndPaddingBefore();
|
| positions[0] = borderAndPadding + offset.positionOffset;
|
| if (numberOfLines > 1) {
|
| - // If we have collapsed tracks we just ignore gaps here and add them later as we might not
|
| - // compute the gap between two consecutive tracks without examining the surrounding ones.
|
| + // If we have collapsed tracks we just ignore gaps here and add them later
|
| + // as we might not compute the gap between two consecutive tracks without
|
| + // examining the surrounding ones.
|
| bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction);
|
| LayoutUnit gap =
|
| !hasCollapsedTracks
|
| @@ -2595,8 +2666,9 @@ void LayoutGrid::populateGridPositionsForDirection(
|
| positions[lastLine] =
|
| positions[nextToLastLine] + tracks[nextToLastLine].baseSize();
|
|
|
| - // Adjust collapsed gaps. Collapsed tracks cause the surrounding gutters to collapse (they
|
| - // coincide exactly) except on the edges of the grid where they become 0.
|
| + // Adjust collapsed gaps. Collapsed tracks cause the surrounding gutters to
|
| + // collapse (they coincide exactly) except on the edges of the grid where
|
| + // they become 0.
|
| if (hasCollapsedTracks) {
|
| gap = gridGapForDirection(direction, sizingData.sizingOperation);
|
| size_t remainingEmptyTracks = isRowAxis ? m_autoRepeatEmptyColumns->size()
|
| @@ -2606,8 +2678,8 @@ void LayoutGrid::populateGridPositionsForDirection(
|
| if (isEmptyAutoRepeatTrack(direction, i - 1)) {
|
| --remainingEmptyTracks;
|
| } else {
|
| - // Add gap between consecutive non empty tracks. Add it also just once for an
|
| - // arbitrary number of empty tracks between two non empty ones.
|
| + // Add gap between consecutive non empty tracks. Add it also just once
|
| + // for an arbitrary number of empty tracks between two non empty ones.
|
| bool allRemainingTracksAreEmpty =
|
| remainingEmptyTracks == (lastLine - i);
|
| if (!allRemainingTracksAreEmpty ||
|
| @@ -2630,14 +2702,15 @@ static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow,
|
| LayoutUnit offset = trackSize - childSize;
|
| switch (overflow) {
|
| case OverflowAlignmentSafe:
|
| - // If overflow is 'safe', we have to make sure we don't overflow the 'start'
|
| - // edge (potentially cause some data loss as the overflow is unreachable).
|
| + // If overflow is 'safe', we have to make sure we don't overflow the
|
| + // 'start' edge (potentially cause some data loss as the overflow is
|
| + // unreachable).
|
| return offset.clampNegativeToZero();
|
| case OverflowAlignmentUnsafe:
|
| case OverflowAlignmentDefault:
|
| - // If we overflow our alignment container and overflow is 'true' (default), we
|
| - // ignore the overflow and just return the value regardless (which may cause data
|
| - // loss as we overflow the 'start' edge).
|
| + // If we overflow our alignment container and overflow is 'true'
|
| + // (default), we ignore the overflow and just return the value regardless
|
| + // (which may cause data loss as we overflow the 'start' edge).
|
| return offset;
|
| }
|
|
|
| @@ -2645,7 +2718,8 @@ static LayoutUnit computeOverflowAlignmentOffset(OverflowAlignment overflow,
|
| return LayoutUnit();
|
| }
|
|
|
| -// FIXME: This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox.
|
| +// FIXME: This logic is shared by LayoutFlexibleBox, so it should be moved to
|
| +// LayoutBox.
|
| LayoutUnit LayoutGrid::marginLogicalHeightForChild(
|
| const LayoutBox& child) const {
|
| return isHorizontalWritingMode() ? child.marginHeight() : child.marginWidth();
|
| @@ -2678,9 +2752,10 @@ LayoutUnit LayoutGrid::computeMarginLogicalSizeForChild(
|
| LayoutUnit LayoutGrid::availableAlignmentSpaceForChildBeforeStretching(
|
| LayoutUnit gridAreaBreadthForChild,
|
| const LayoutBox& child) const {
|
| - // Because we want to avoid multiple layouts, stretching logic might be performed before
|
| - // children are laid out, so we can't use the child cached values. Hence, we need to
|
| - // compute margins in order to determine the available height before stretching.
|
| + // Because we want to avoid multiple layouts, stretching logic might be
|
| + // performed before children are laid out, so we can't use the child cached
|
| + // values. Hence, we need to compute margins in order to determine the
|
| + // available height before stretching.
|
| return gridAreaBreadthForChild -
|
| (child.needsLayout()
|
| ? computeMarginLogicalSizeForChild(BlockDirection, child)
|
| @@ -2691,8 +2766,9 @@ StyleSelfAlignmentData LayoutGrid::alignSelfForChild(
|
| const LayoutBox& child) const {
|
| if (!child.isAnonymous())
|
| return child.styleRef().resolvedAlignSelf(selfAlignmentNormalBehavior());
|
| - // All the 'auto' values has been solved by the StyleAdjuster, but it's possible that
|
| - // some grid items generate Anonymous boxes, which need to be solved during layout.
|
| + // All the 'auto' values has been solved by the StyleAdjuster, but it's
|
| + // possible that some grid items generate Anonymous boxes, which need to be
|
| + // solved during layout.
|
| return child.styleRef().resolvedAlignSelf(selfAlignmentNormalBehavior(),
|
| style());
|
| }
|
| @@ -2701,16 +2777,19 @@ StyleSelfAlignmentData LayoutGrid::justifySelfForChild(
|
| const LayoutBox& child) const {
|
| if (!child.isAnonymous())
|
| return child.styleRef().resolvedJustifySelf(ItemPositionStretch);
|
| - // All the 'auto' values has been solved by the StyleAdjuster, but it's possible that
|
| - // some grid items generate Anonymous boxes, which need to be solved during layout.
|
| + // All the 'auto' values has been solved by the StyleAdjuster, but it's
|
| + // possible that some grid items generate Anonymous boxes, which need to be
|
| + // solved during layout.
|
| return child.styleRef().resolvedJustifySelf(selfAlignmentNormalBehavior(),
|
| style());
|
| }
|
|
|
| -// FIXME: This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox.
|
| +// FIXME: This logic is shared by LayoutFlexibleBox, so it should be moved to
|
| +// LayoutBox.
|
| void LayoutGrid::applyStretchAlignmentToChildIfNeeded(LayoutBox& child) {
|
| - // We clear height override values because we will decide now whether it's allowed or
|
| - // not, evaluating the conditions which might have changed since the old values were set.
|
| + // We clear height override values because we will decide now whether it's
|
| + // allowed or not, evaluating the conditions which might have changed since
|
| + // the old values were set.
|
| child.clearOverrideLogicalContentHeight();
|
|
|
| GridTrackSizingDirection childBlockDirection =
|
| @@ -2730,14 +2809,16 @@ void LayoutGrid::applyStretchAlignmentToChildIfNeeded(LayoutBox& child) {
|
| child.setOverrideLogicalContentHeight(
|
| desiredLogicalHeight - child.borderAndPaddingLogicalHeight());
|
| if (desiredLogicalHeight != child.logicalHeight()) {
|
| - // TODO (lajava): Can avoid laying out here in some cases. See https://webkit.org/b/87905.
|
| + // TODO (lajava): Can avoid laying out here in some cases. See
|
| + // https://webkit.org/b/87905.
|
| child.setLogicalHeight(LayoutUnit());
|
| child.setNeedsLayout(LayoutInvalidationReason::GridChanged);
|
| }
|
| }
|
| }
|
|
|
| -// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox.
|
| +// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be
|
| +// moved to LayoutBox.
|
| bool LayoutGrid::hasAutoMarginsInColumnAxis(const LayoutBox& child) const {
|
| if (isHorizontalWritingMode())
|
| return child.styleRef().marginTop().isAuto() ||
|
| @@ -2746,7 +2827,8 @@ bool LayoutGrid::hasAutoMarginsInColumnAxis(const LayoutBox& child) const {
|
| child.styleRef().marginRight().isAuto();
|
| }
|
|
|
| -// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox.
|
| +// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be
|
| +// moved to LayoutBox.
|
| bool LayoutGrid::hasAutoMarginsInRowAxis(const LayoutBox& child) const {
|
| if (isHorizontalWritingMode())
|
| return child.styleRef().marginLeft().isAuto() ||
|
| @@ -2755,7 +2837,8 @@ bool LayoutGrid::hasAutoMarginsInRowAxis(const LayoutBox& child) const {
|
| child.styleRef().marginBottom().isAuto();
|
| }
|
|
|
| -// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox.
|
| +// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be
|
| +// moved to LayoutBox.
|
| DISABLE_CFI_PERF
|
| void LayoutGrid::updateAutoMarginsInRowAxisIfNeeded(LayoutBox& child) {
|
| ASSERT(!child.isOutOfFlowPositioned());
|
| @@ -2778,7 +2861,8 @@ void LayoutGrid::updateAutoMarginsInRowAxisIfNeeded(LayoutBox& child) {
|
| }
|
| }
|
|
|
| -// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox.
|
| +// TODO(lajava): This logic is shared by LayoutFlexibleBox, so it should be
|
| +// moved to LayoutBox.
|
| DISABLE_CFI_PERF
|
| void LayoutGrid::updateAutoMarginsInColumnAxisIfNeeded(LayoutBox& child) {
|
| ASSERT(!child.isOutOfFlowPositioned());
|
| @@ -2809,55 +2893,69 @@ GridAxisPosition LayoutGrid::columnAxisPositionForChild(
|
|
|
| switch (alignSelfForChild(child).position()) {
|
| case ItemPositionSelfStart:
|
| - // TODO (lajava): Should we implement this logic in a generic utility function ?
|
| - // Aligns the alignment subject to be flush with the edge of the alignment container
|
| - // corresponding to the alignment subject's 'start' side in the column axis.
|
| + // TODO (lajava): Should we implement this logic in a generic utility
|
| + // function?
|
| + // Aligns the alignment subject to be flush with the edge of the alignment
|
| + // container corresponding to the alignment subject's 'start' side in the
|
| + // column axis.
|
| if (isOrthogonalChild(child)) {
|
| - // If orthogonal writing-modes, self-start will be based on the child's inline-axis
|
| - // direction (inline-start), because it's the one parallel to the column axis.
|
| + // If orthogonal writing-modes, self-start will be based on the child's
|
| + // inline-axis direction (inline-start), because it's the one parallel
|
| + // to the column axis.
|
| if (styleRef().isFlippedBlocksWritingMode())
|
| return childIsLTR ? GridAxisEnd : GridAxisStart;
|
| return childIsLTR ? GridAxisStart : GridAxisEnd;
|
| }
|
| - // self-start is based on the child's block-flow direction. That's why we need to check against the grid container's block-flow direction.
|
| + // self-start is based on the child's block-flow direction. That's why we
|
| + // need to check against the grid container's block-flow direction.
|
| return hasSameWritingMode ? GridAxisStart : GridAxisEnd;
|
| case ItemPositionSelfEnd:
|
| - // TODO (lajava): Should we implement this logic in a generic utility function ?
|
| - // Aligns the alignment subject to be flush with the edge of the alignment container
|
| - // corresponding to the alignment subject's 'end' side in the column axis.
|
| + // TODO (lajava): Should we implement this logic in a generic utility
|
| + // function?
|
| + // Aligns the alignment subject to be flush with the edge of the alignment
|
| + // container corresponding to the alignment subject's 'end' side in the
|
| + // column axis.
|
| if (isOrthogonalChild(child)) {
|
| - // If orthogonal writing-modes, self-end will be based on the child's inline-axis
|
| - // direction, (inline-end) because it's the one parallel to the column axis.
|
| + // If orthogonal writing-modes, self-end will be based on the child's
|
| + // inline-axis direction, (inline-end) because it's the one parallel to
|
| + // the column axis.
|
| if (styleRef().isFlippedBlocksWritingMode())
|
| return childIsLTR ? GridAxisStart : GridAxisEnd;
|
| return childIsLTR ? GridAxisEnd : GridAxisStart;
|
| }
|
| - // self-end is based on the child's block-flow direction. That's why we need to check against the grid container's block-flow direction.
|
| + // self-end is based on the child's block-flow direction. That's why we
|
| + // need to check against the grid container's block-flow direction.
|
| return hasSameWritingMode ? GridAxisEnd : GridAxisStart;
|
| case ItemPositionLeft:
|
| - // Aligns the alignment subject to be flush with the alignment container's 'line-left' edge.
|
| - // The alignment axis (column axis) is always orthogonal to the inline axis, hence this value behaves as 'start'.
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'line-left' edge. The alignment axis (column axis) is always orthogonal
|
| + // to the inline axis, hence this value behaves as 'start'.
|
| return GridAxisStart;
|
| case ItemPositionRight:
|
| - // Aligns the alignment subject to be flush with the alignment container's 'line-right' edge.
|
| - // The alignment axis (column axis) is always orthogonal to the inline axis, hence this value behaves as 'start'.
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'line-right' edge. The alignment axis (column axis) is always
|
| + // orthogonal to the inline axis, hence this value behaves as 'start'.
|
| return GridAxisStart;
|
| case ItemPositionCenter:
|
| return GridAxisCenter;
|
| - case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalent to 'start'.
|
| - // Aligns the alignment subject to be flush with the alignment container's 'start' edge (block-start) in the column axis.
|
| + // Only used in flex layout, otherwise equivalent to 'start'.
|
| + case ItemPositionFlexStart:
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'start' edge (block-start) in the column axis.
|
| case ItemPositionStart:
|
| return GridAxisStart;
|
| - case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'.
|
| - // Aligns the alignment subject to be flush with the alignment container's 'end' edge (block-end) in the column axis.
|
| + // Only used in flex layout, otherwise equivalent to 'end'.
|
| + case ItemPositionFlexEnd:
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'end' edge (block-end) in the column axis.
|
| case ItemPositionEnd:
|
| return GridAxisEnd;
|
| case ItemPositionStretch:
|
| return GridAxisStart;
|
| case ItemPositionBaseline:
|
| case ItemPositionLastBaseline:
|
| - // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child.
|
| - // crbug.com/234191
|
| + // FIXME: These two require implementing Baseline Alignment. For now, we
|
| + // always 'start' align the child. crbug.com/234191
|
| return GridAxisStart;
|
| case ItemPositionAuto:
|
| case ItemPositionNormal:
|
| @@ -2876,55 +2974,67 @@ GridAxisPosition LayoutGrid::rowAxisPositionForChild(
|
|
|
| switch (justifySelfForChild(child).position()) {
|
| case ItemPositionSelfStart:
|
| - // TODO (lajava): Should we implement this logic in a generic utility function ?
|
| - // Aligns the alignment subject to be flush with the edge of the alignment container
|
| - // corresponding to the alignment subject's 'start' side in the row axis.
|
| + // TODO (lajava): Should we implement this logic in a generic utility
|
| + // function?
|
| + // Aligns the alignment subject to be flush with the edge of the alignment
|
| + // container corresponding to the alignment subject's 'start' side in the
|
| + // row axis.
|
| if (isOrthogonalChild(child)) {
|
| - // If orthogonal writing-modes, self-start will be based on the child's block-axis
|
| - // direction, because it's the one parallel to the row axis.
|
| + // If orthogonal writing-modes, self-start will be based on the child's
|
| + // block-axis direction, because it's the one parallel to the row axis.
|
| if (child.styleRef().isFlippedBlocksWritingMode())
|
| return gridIsLTR ? GridAxisEnd : GridAxisStart;
|
| return gridIsLTR ? GridAxisStart : GridAxisEnd;
|
| }
|
| - // self-start is based on the child's inline-flow direction. That's why we need to check against the grid container's direction.
|
| + // self-start is based on the child's inline-flow direction. That's why we
|
| + // need to check against the grid container's direction.
|
| return hasSameDirection ? GridAxisStart : GridAxisEnd;
|
| case ItemPositionSelfEnd:
|
| - // TODO (lajava): Should we implement this logic in a generic utility function ?
|
| - // Aligns the alignment subject to be flush with the edge of the alignment container
|
| - // corresponding to the alignment subject's 'end' side in the row axis.
|
| + // TODO (lajava): Should we implement this logic in a generic utility
|
| + // function?
|
| + // Aligns the alignment subject to be flush with the edge of the alignment
|
| + // container corresponding to the alignment subject's 'end' side in the
|
| + // row axis.
|
| if (isOrthogonalChild(child)) {
|
| - // If orthogonal writing-modes, self-end will be based on the child's block-axis
|
| - // direction, because it's the one parallel to the row axis.
|
| + // If orthogonal writing-modes, self-end will be based on the child's
|
| + // block-axis direction, because it's the one parallel to the row axis.
|
| if (child.styleRef().isFlippedBlocksWritingMode())
|
| return gridIsLTR ? GridAxisStart : GridAxisEnd;
|
| return gridIsLTR ? GridAxisEnd : GridAxisStart;
|
| }
|
| - // self-end is based on the child's inline-flow direction. That's why we need to check against the grid container's direction.
|
| + // self-end is based on the child's inline-flow direction. That's why we
|
| + // need to check against the grid container's direction.
|
| return hasSameDirection ? GridAxisEnd : GridAxisStart;
|
| case ItemPositionLeft:
|
| - // Aligns the alignment subject to be flush with the alignment container's 'line-left' edge.
|
| - // We want the physical 'left' side, so we have to take account, container's inline-flow direction.
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'line-left' edge. We want the physical 'left' side, so we have to take
|
| + // account, container's inline-flow direction.
|
| return gridIsLTR ? GridAxisStart : GridAxisEnd;
|
| case ItemPositionRight:
|
| - // Aligns the alignment subject to be flush with the alignment container's 'line-right' edge.
|
| - // We want the physical 'right' side, so we have to take account, container's inline-flow direction.
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'line-right' edge. We want the physical 'right' side, so we have to
|
| + // take account, container's inline-flow direction.
|
| return gridIsLTR ? GridAxisEnd : GridAxisStart;
|
| case ItemPositionCenter:
|
| return GridAxisCenter;
|
| - case ItemPositionFlexStart: // Only used in flex layout, otherwise equivalent to 'start'.
|
| - // Aligns the alignment subject to be flush with the alignment container's 'start' edge (inline-start) in the row axis.
|
| + // Only used in flex layout, otherwise equivalent to 'start'.
|
| + case ItemPositionFlexStart:
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'start' edge (inline-start) in the row axis.
|
| case ItemPositionStart:
|
| return GridAxisStart;
|
| - case ItemPositionFlexEnd: // Only used in flex layout, otherwise equivalent to 'end'.
|
| - // Aligns the alignment subject to be flush with the alignment container's 'end' edge (inline-end) in the row axis.
|
| + // Only used in flex layout, otherwise equivalent to 'end'.
|
| + case ItemPositionFlexEnd:
|
| + // Aligns the alignment subject to be flush with the alignment container's
|
| + // 'end' edge (inline-end) in the row axis.
|
| case ItemPositionEnd:
|
| return GridAxisEnd;
|
| case ItemPositionStretch:
|
| return GridAxisStart;
|
| case ItemPositionBaseline:
|
| case ItemPositionLastBaseline:
|
| - // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child.
|
| - // crbug.com/234191
|
| + // FIXME: These two require implementing Baseline Alignment. For now, we
|
| + // always 'start' align the child. crbug.com/234191
|
| return GridAxisStart;
|
| case ItemPositionAuto:
|
| case ItemPositionNormal:
|
| @@ -2952,9 +3062,10 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(
|
| case GridAxisCenter: {
|
| size_t childEndLine = rowsSpan.endLine();
|
| LayoutUnit endOfRow = m_rowPositions[childEndLine];
|
| - // m_rowPositions include distribution offset (because of content alignment) and gutters
|
| - // so we need to subtract them to get the actual end position for a given row
|
| - // (this does not have to be done for the last track as there are no more m_columnPositions after it).
|
| + // m_rowPositions include distribution offset (because of content
|
| + // alignment) and gutters so we need to subtract them to get the actual
|
| + // end position for a given row (this does not have to be done for the
|
| + // last track as there are no more m_columnPositions after it).
|
| LayoutUnit trackGap =
|
| gridGapForDirection(ForRows, sizingData.sizingOperation);
|
| if (childEndLine < m_rowPositions.size() - 1) {
|
| @@ -2994,9 +3105,10 @@ LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child,
|
| case GridAxisCenter: {
|
| size_t childEndLine = columnsSpan.endLine();
|
| LayoutUnit endOfColumn = m_columnPositions[childEndLine];
|
| - // m_columnPositions include distribution offset (because of content alignment) and gutters
|
| - // so we need to subtract them to get the actual end position for a given column
|
| - // (this does not have to be done for the last track as there are no more m_columnPositions after it).
|
| + // m_columnPositions include distribution offset (because of content
|
| + // alignment) and gutters so we need to subtract them to get the actual
|
| + // end position for a given column (this does not have to be done for the
|
| + // last track as there are no more m_columnPositions after it).
|
| LayoutUnit trackGap =
|
| gridGapForDirection(ForColumns, sizingData.sizingOperation);
|
| if (childEndLine < m_columnPositions.size() - 1) {
|
| @@ -3090,8 +3202,8 @@ ContentAlignmentData LayoutGrid::computeContentPositionAndDistributionOffset(
|
| contentAlignmentNormalBehavior())
|
| : styleRef().resolvedAlignContentDistribution(
|
| contentAlignmentNormalBehavior());
|
| - // If <content-distribution> value can't be applied, 'position' will become the associated
|
| - // <content-position> fallback value.
|
| + // If <content-distribution> value can't be applied, 'position' will become
|
| + // the associated <content-position> fallback value.
|
| ContentAlignmentData contentAlignment = contentDistributionOffset(
|
| availableFreeSpace, position, distribution, numberOfGridTracks);
|
| if (contentAlignment.isValid())
|
| @@ -3114,14 +3226,16 @@ ContentAlignmentData LayoutGrid::computeContentPositionAndDistributionOffset(
|
| return {LayoutUnit(), LayoutUnit()};
|
| case ContentPositionCenter:
|
| return {availableFreeSpace / 2, LayoutUnit()};
|
| - case ContentPositionFlexEnd: // Only used in flex layout, for other layout, it's equivalent to 'End'.
|
| + // Only used in flex layout, for other layout, it's equivalent to 'End'.
|
| + case ContentPositionFlexEnd:
|
| case ContentPositionEnd:
|
| if (isRowAxis)
|
| return {styleRef().isLeftToRightDirection() ? availableFreeSpace
|
| : LayoutUnit(),
|
| LayoutUnit()};
|
| return {availableFreeSpace, LayoutUnit()};
|
| - case ContentPositionFlexStart: // Only used in flex layout, for other layout, it's equivalent to 'Start'.
|
| + // Only used in flex layout, for other layout, it's equivalent to 'Start'.
|
| + case ContentPositionFlexStart:
|
| case ContentPositionStart:
|
| if (isRowAxis)
|
| return {styleRef().isLeftToRightDirection() ? LayoutUnit()
|
| @@ -3130,8 +3244,8 @@ ContentAlignmentData LayoutGrid::computeContentPositionAndDistributionOffset(
|
| return {LayoutUnit(), LayoutUnit()};
|
| case ContentPositionBaseline:
|
| case ContentPositionLastBaseline:
|
| - // FIXME: These two require implementing Baseline Alignment. For now, we always 'start' align the child.
|
| - // crbug.com/234191
|
| + // FIXME: These two require implementing Baseline Alignment. For now, we
|
| + // always 'start' align the child. crbug.com/234191
|
| if (isRowAxis)
|
| return {styleRef().isLeftToRightDirection() ? LayoutUnit()
|
| : availableFreeSpace,
|
| @@ -3159,17 +3273,19 @@ LayoutPoint LayoutGrid::findChildLogicalPosition(
|
| GridSizingData& sizingData) const {
|
| LayoutUnit columnAxisOffset = columnAxisOffsetForChild(child, sizingData);
|
| LayoutUnit rowAxisOffset = rowAxisOffsetForChild(child, sizingData);
|
| - // We stored m_columnPosition's data ignoring the direction, hence we might need now
|
| - // to translate positions from RTL to LTR, as it's more convenient for painting.
|
| + // We stored m_columnPosition's data ignoring the direction, hence we might
|
| + // need now to translate positions from RTL to LTR, as it's more convenient
|
| + // for painting.
|
| if (!style()->isLeftToRightDirection())
|
| rowAxisOffset = translateRTLCoordinate(rowAxisOffset) -
|
| (isOrthogonalChild(child) ? child.logicalHeight()
|
| : child.logicalWidth());
|
|
|
| - // "In the positioning phase [...] calculations are performed according to the writing mode
|
| - // of the containing block of the box establishing the orthogonal flow." However, the
|
| - // resulting LayoutPoint will be used in 'setLogicalPosition' in order to set the child's
|
| - // logical position, which will only take into account the child's writing-mode.
|
| + // "In the positioning phase [...] calculations are performed according to the
|
| + // writing mode of the containing block of the box establishing the orthogonal
|
| + // flow." However, the resulting LayoutPoint will be used in
|
| + // 'setLogicalPosition' in order to set the child's logical position, which
|
| + // will only take into account the child's writing-mode.
|
| LayoutPoint childLocation(rowAxisOffset, columnAxisOffset);
|
| return isOrthogonalChild(child) ? childLocation.transposedPoint()
|
| : childLocation;
|
| @@ -3179,8 +3295,8 @@ LayoutPoint LayoutGrid::gridAreaLogicalPosition(const GridArea& area) const {
|
| LayoutUnit columnAxisOffset = m_rowPositions[area.rows.startLine()];
|
| LayoutUnit rowAxisOffset = m_columnPositions[area.columns.startLine()];
|
|
|
| - // See comment in findChildLogicalPosition() about why we need sometimes to translate from RTL
|
| - // to LTR the rowAxisOffset coordinate.
|
| + // See comment in findChildLogicalPosition() about why we need sometimes to
|
| + // translate from RTL to LTR the rowAxisOffset coordinate.
|
| return LayoutPoint(style()->isLeftToRightDirection()
|
| ? rowAxisOffset
|
| : translateRTLCoordinate(rowAxisOffset),
|
|
|