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

Side by Side Diff: Source/core/rendering/RenderGrid.cpp

Issue 22867006: Content-sized resolution should only happen on content-sized tracks (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698