| 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 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 | 349 |
| 350 // FIXME: css3-sizing mentions that we should resolve "definite sizes" | 350 // FIXME: css3-sizing mentions that we should resolve "definite sizes" |
| 351 // (including <percentage> and calc()) but we don't do it elsewhere. | 351 // (including <percentage> and calc()) but we don't do it elsewhere. |
| 352 return 0; | 352 return 0; |
| 353 } | 353 } |
| 354 | 354 |
| 355 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction,
Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) | 355 void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction,
Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) |
| 356 { | 356 { |
| 357 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi
calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); | 357 LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogi
calWidth() : availableLogicalHeight(IncludeMarginBorderPadding); |
| 358 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; | 358 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; |
| 359 Vector<size_t> contentSizedTracks; |
| 359 for (size_t i = 0; i < tracks.size(); ++i) { | 360 for (size_t i = 0; i < tracks.size(); ++i) { |
| 360 GridTrack& track = tracks[i]; | 361 GridTrack& track = tracks[i]; |
| 361 const GridTrackSize& trackSize = gridTrackSize(direction, i); | 362 const GridTrackSize& trackSize = gridTrackSize(direction, i); |
| 362 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); | 363 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); |
| 363 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); | 364 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth(); |
| 364 | 365 |
| 365 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB
readth); | 366 track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackB
readth); |
| 366 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr
eadth, track.m_usedBreadth); | 367 track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBr
eadth, track.m_usedBreadth); |
| 367 | 368 |
| 368 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); | 369 track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); |
| 370 |
| 371 if (trackSize.isContentSized()) |
| 372 contentSizedTracks.append(i); |
| 369 } | 373 } |
| 370 | 374 |
| 371 // FIXME: We shouldn't call resolveContentBasedTrackSizingFunctions if we ha
ve no min-content / max-content tracks. | 375 if (!contentSizedTracks.isEmpty()) |
| 372 resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTracks,
availableLogicalSpace); | 376 resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTrac
ks, contentSizedTracks, availableLogicalSpace); |
| 377 |
| 378 for (size_t i = 0; i < tracks.size(); ++i) { |
| 379 ASSERT(tracks[i].m_maxBreadth != infinity); |
| 380 availableLogicalSpace -= tracks[i].m_usedBreadth; |
| 381 } |
| 373 | 382 |
| 374 if (availableLogicalSpace <= 0) | 383 if (availableLogicalSpace <= 0) |
| 375 return; | 384 return; |
| 376 | 385 |
| 377 const size_t tracksSize = tracks.size(); | 386 const size_t tracksSize = tracks.size(); |
| 378 Vector<GridTrack*> tracksForDistribution(tracksSize); | 387 Vector<GridTrack*> tracksForDistribution(tracksSize); |
| 379 for (size_t i = 0; i < tracksSize; ++i) | 388 for (size_t i = 0; i < tracksSize; ++i) |
| 380 tracksForDistribution[i] = tracks.data() + i; | 389 tracksForDistribution[i] = tracks.data() + i; |
| 381 | 390 |
| 382 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &
GridTrack::growUsedBreadth, availableLogicalSpace); | 391 distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &
GridTrack::growUsedBreadth, availableLogicalSpace); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 | 558 |
| 550 if (direction == ForColumns) { | 559 if (direction == ForColumns) { |
| 551 // FIXME: It's unclear if we should return the intrinsic width or the pr
eferred width. | 560 // FIXME: It's unclear if we should return the intrinsic width or the pr
eferred width. |
| 552 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html | 561 // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html |
| 553 return child->maxPreferredLogicalWidth(); | 562 return child->maxPreferredLogicalWidth(); |
| 554 } | 563 } |
| 555 | 564 |
| 556 return logicalContentHeightForChild(child, columnTracks); | 565 return logicalContentHeightForChild(child, columnTracks); |
| 557 } | 566 } |
| 558 | 567 |
| 559 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di
rection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, LayoutUn
it& availableLogicalSpace) | 568 void RenderGrid::resolveContentBasedTrackSizingFunctions(TrackSizingDirection di
rection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, Vector<s
ize_t> contentSizedTracks, LayoutUnit& availableLogicalSpace) |
| 560 { | 569 { |
| 561 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr
id track (crbug.com/235258). | 570 // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> gr
id track (crbug.com/235258). |
| 562 | 571 |
| 563 Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTr
acks; | 572 // FIXME: Per step 2 of the specification, we should order the grid items by
increasing span. |
| 564 | 573 |
| 565 // FIXME: Per step 2 of the specification, we should order the grid items by
increasing span. | 574 for (size_t i = 0; i < contentSizedTracks.size(); ++i) { |
| 566 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 575 GridIterator iterator(m_grid, direction, contentSizedTracks[i]); |
| 567 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGri
d::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 576 while (RenderBox* gridItem = iterator.nextGridItem()) { |
| 568 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::ma
xContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); | 577 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &Re
nderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBread
th); |
| 569 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGri
d::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxB
readth); | 578 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderG
rid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
| 570 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks,
rowTracks, child, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::ma
xContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadt
h); | 579 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &Re
nderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::g
rowMaxBreadth); |
| 571 } | 580 resolveContentBasedTrackSizingFunctionsForItems(direction, columnTra
cks, rowTracks, gridItem, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderG
rid::maxContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMa
xBreadth); |
| 581 } |
| 572 | 582 |
| 573 for (size_t i = 0; i < tracks.size(); ++i) { | 583 GridTrack& track = (direction == ForColumns) ? columnTracks[i] : rowTrac
ks[i]; |
| 574 GridTrack& track = tracks[i]; | |
| 575 if (track.m_maxBreadth == infinity) | 584 if (track.m_maxBreadth == infinity) |
| 576 track.m_maxBreadth = track.m_usedBreadth; | 585 track.m_maxBreadth = track.m_usedBreadth; |
| 577 | |
| 578 availableLogicalSpace -= track.m_usedBreadth; | |
| 579 } | 586 } |
| 580 } | 587 } |
| 581 | 588 |
| 582 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
ction direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks,
RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunctio
n, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) | 589 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
ction direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks,
RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunctio
n, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
| 583 { | 590 { |
| 584 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); | 591 const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |
| 585 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu
mns.initialPositionIndex : coordinate.rows.initialPositionIndex; | 592 const size_t initialTrackIndex = (direction == ForColumns) ? coordinate.colu
mns.initialPositionIndex : coordinate.rows.initialPositionIndex; |
| 586 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column
s.finalPositionIndex : coordinate.rows.finalPositionIndex; | 593 const size_t finalTrackIndex = (direction == ForColumns) ? coordinate.column
s.finalPositionIndex : coordinate.rows.finalPositionIndex; |
| 587 | 594 |
| 588 Vector<GridTrack*> tracks; | 595 Vector<GridTrack*> tracks; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 m_grid[row].grow(oldColumnSize + 1); | 674 m_grid[row].grow(oldColumnSize + 1); |
| 668 } else { | 675 } else { |
| 669 const size_t oldRowSize = m_grid.size(); | 676 const size_t oldRowSize = m_grid.size(); |
| 670 m_grid.grow(oldRowSize + 1); | 677 m_grid.grow(oldRowSize + 1); |
| 671 m_grid[oldRowSize].grow(m_grid[0].size()); | 678 m_grid[oldRowSize].grow(m_grid[0].size()); |
| 672 } | 679 } |
| 673 } | 680 } |
| 674 | 681 |
| 675 void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate& coor
dinate) | 682 void RenderGrid::insertItemIntoGrid(RenderBox* child, const GridCoordinate& coor
dinate) |
| 676 { | 683 { |
| 677 m_grid[coordinate.rows.initialPositionIndex][coordinate.columns.initialPosit
ionIndex].append(child); | 684 for (size_t row = coordinate.rows.initialPositionIndex; row <= coordinate.ro
ws.finalPositionIndex; ++row) { |
| 685 for (size_t column = coordinate.columns.initialPositionIndex; column <=
coordinate.columns.finalPositionIndex; ++column) |
| 686 m_grid[row][column].append(child); |
| 687 } |
| 688 |
| 678 m_gridItemCoordinate.set(child, coordinate); | 689 m_gridItemCoordinate.set(child, coordinate); |
| 679 } | 690 } |
| 680 | 691 |
| 681 void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t co
lumnTrack) | 692 void RenderGrid::insertItemIntoGrid(RenderBox* child, size_t rowTrack, size_t co
lumnTrack) |
| 682 { | 693 { |
| 683 const GridSpan& rowSpan = resolveGridPositionsFromAutoPlacementPosition(chil
d, ForRows, rowTrack); | 694 const GridSpan& rowSpan = resolveGridPositionsFromAutoPlacementPosition(chil
d, ForRows, rowTrack); |
| 684 const GridSpan& columnSpan = resolveGridPositionsFromAutoPlacementPosition(c
hild, ForColumns, columnTrack); | 695 const GridSpan& columnSpan = resolveGridPositionsFromAutoPlacementPosition(c
hild, ForColumns, columnTrack); |
| 685 insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan)); | 696 insertItemIntoGrid(child, GridCoordinate(rowSpan, columnSpan)); |
| 686 } | 697 } |
| 687 | 698 |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1139 if (isOutOfFlowPositioned()) | 1150 if (isOutOfFlowPositioned()) |
| 1140 return "RenderGrid (positioned)"; | 1151 return "RenderGrid (positioned)"; |
| 1141 if (isAnonymous()) | 1152 if (isAnonymous()) |
| 1142 return "RenderGrid (generated)"; | 1153 return "RenderGrid (generated)"; |
| 1143 if (isRelPositioned()) | 1154 if (isRelPositioned()) |
| 1144 return "RenderGrid (relative positioned)"; | 1155 return "RenderGrid (relative positioned)"; |
| 1145 return "RenderGrid"; | 1156 return "RenderGrid"; |
| 1146 } | 1157 } |
| 1147 | 1158 |
| 1148 } // namespace WebCore | 1159 } // namespace WebCore |
| OLD | NEW |