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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 2333583002: [css-grid] Update intrinsic size for the extra sizing alg iteration. (Closed)
Patch Set: Created 4 years, 3 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
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 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 sizingData.setAvailableSpace(availableSpace); 411 sizingData.setAvailableSpace(availableSpace);
412 sizingData.freeSpace(direction) = availableSpace - guttersSize(direction, 0, direction == ForRows ? gridRowCount() : gridColumnCount()); 412 sizingData.freeSpace(direction) = availableSpace - guttersSize(direction, 0, direction == ForRows ? gridRowCount() : gridColumnCount());
413 sizingData.sizingOperation = TrackSizing; 413 sizingData.sizingOperation = TrackSizing;
414 414
415 LayoutUnit baseSizes, growthLimits; 415 LayoutUnit baseSizes, growthLimits;
416 computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimit s); 416 computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimit s);
417 ASSERT(tracksAreWiderThanMinTrackBreadth(direction, sizingData)); 417 ASSERT(tracksAreWiderThanMinTrackBreadth(direction, sizingData));
418 sizingData.nextState(); 418 sizingData.nextState();
419 } 419 }
420 420
421 void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData, LayoutUn it availableSpaceForColumns, LayoutUnit availableSpaceForRows) 421 void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData)
422 { 422 {
423 DCHECK(sizingData.sizingState > GridSizingData::RowSizingFirstIteration); 423 DCHECK(sizingData.sizingState > GridSizingData::RowSizingFirstIteration);
424 424
425 // In orthogonal flow cases column track's size is determined by using the c omputed 425 // In orthogonal flow cases column track's size is determined by using the c omputed
426 // row track's size, which it was estimated during the first cycle of the si zing 426 // row track's size, which it was estimated during the first cycle of the si zing
427 // algorithm. Hence we need to repeat computeUsedBreadthOfGridTracks for bot h, 427 // algorithm. Hence we need to repeat computeUsedBreadthOfGridTracks for bot h,
428 // columns and rows, to determine the final values. 428 // columns and rows, to determine the final values.
429 // TODO (lajava): orthogonal flows is just one of the cases which may requir e 429 // TODO (lajava): orthogonal flows is just one of the cases which may requir e
430 // a new cycle of the sizing algorithm; there may be more. In addition, not all the 430 // a new cycle of the sizing algorithm; there may be more. In addition, not all the
431 // cases with orthogonal flows require this extra cycle; we need a more spec ific 431 // cases with orthogonal flows require this extra cycle; we need a more spec ific
432 // condition to detect whether child's min-content contribution has changed or not. 432 // condition to detect whether child's min-content contribution has changed or not.
433 if (m_hasAnyOrthogonalChild) { 433 bool minContentContributionChanged = false;
434 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC olumns); 434 for (auto* child : m_orthogonalChilds) {
435 if (updateOverrideContainingBlockContentSizeForChild(*child, ForRows, si zingData))
436 child->setNeedsLayout(LayoutInvalidationReason::GridChanged);
437 child->layoutIfNeeded();
438 if (!minContentContributionChanged) {
svillar 2016/09/13 13:44:18 I don't get this. For example for the first orthog
jfernandez 2016/09/13 14:56:59 Umm, why "first orthogonal child" ? We definitivel
439 LayoutUnit minContentInlineSize = child->hasOverrideContainingBlockL ogicalWidth() ? child->overrideContainingBlockContentLogicalWidth() : LayoutUnit ();
440 minContentContributionChanged = child->logicalHeight() > minContentI nlineSize;
441 }
442 }
443
444 if (minContentContributionChanged) {
445 setPreferredLogicalWidthsDirty();
446 updateLogicalWidth();
447 computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWi dth());
448 resolveSizeOfGridRows(sizingData);
449 }
svillar 2016/09/13 13:44:18 I have many doubts about the above block. It's lik
jfernandez 2016/09/13 14:56:59 I understand your concerns. However, notice that w
450 }
451
452 void LayoutGrid::resolveSizeOfGridRows(GridSizingData& sizingData)
453 {
454 bool logicalHeightWasIndefinite = !hasDefiniteLogicalHeight();
455 if (logicalHeightWasIndefinite)
456 computeIntrinsicLogicalHeight(sizingData);
457 else
458 computeTrackSizesForDirection(ForRows, sizingData, availableLogicalHeigh t(ExcludeMarginBorderPadding));
459 setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddi ngLogicalHeight() + scrollbarLogicalHeight());
460
461 updateLogicalHeight();
462
463 // The above call might have changed the grid's logical height depending on min|max height restrictions.
464 // Update the sizes of the rows whose size depends on the logical height (al so on definite|indefinite sizes).
465 LayoutUnit availableSpaceForRows = contentLogicalHeight();
466 if (logicalHeightWasIndefinite)
435 computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows ); 467 computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows );
436 }
437 } 468 }
438 469
439 void LayoutGrid::layoutBlock(bool relayoutChildren) 470 void LayoutGrid::layoutBlock(bool relayoutChildren)
440 { 471 {
441 ASSERT(needsLayout()); 472 ASSERT(needsLayout());
442 473
443 if (!relayoutChildren && simplifiedLayout()) 474 if (!relayoutChildren && simplifiedLayout())
444 return; 475 return;
445 476
446 SubtreeLayoutScope layoutScope(*this); 477 SubtreeLayoutScope layoutScope(*this);
447 478
448 { 479 {
449 // LayoutState needs this deliberate scope to pop before updating scroll information (which 480 // LayoutState needs this deliberate scope to pop before updating scroll information (which
450 // may trigger relayout). 481 // may trigger relayout).
451 LayoutState state(*this, locationOffset()); 482 LayoutState state(*this, locationOffset());
452 483
453 LayoutSize previousSize = size(); 484 LayoutSize previousSize = size();
454 485
455 updateLogicalWidth(); 486 updateLogicalWidth();
456 bool logicalHeightWasIndefinite = !hasDefiniteLogicalHeight();
457 487
458 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); 488 TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope);
459 489
460 // TODO(svillar): we won't need to do this once the intrinsic width comp utation is isolated 490 // TODO(svillar): we won't need to do this once the intrinsic width comp utation is isolated
461 // from the LayoutGrid object state (it should not touch any attribute) (see crbug.com/627812) 491 // from the LayoutGrid object state (it should not touch any attribute) (see crbug.com/627812)
462 if (m_autoRepeatColumns && m_autoRepeatColumns != computeAutoRepeatTrack sCount(ForColumns, TrackSizing)) 492 if (m_autoRepeatColumns && m_autoRepeatColumns != computeAutoRepeatTrack sCount(ForColumns, TrackSizing))
463 dirtyGrid(); 493 dirtyGrid();
464 placeItemsOnGrid(TrackSizing); 494 placeItemsOnGrid(TrackSizing);
465 495
466 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 496 GridSizingData sizingData(gridColumnCount(), gridRowCount());
467 497
468 // 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns. 498 // 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns.
469 // At this point the logical width is always definite as the above call to updateLogicalWidth() 499 // At this point the logical width is always definite as the above call to updateLogicalWidth()
470 // properly resolves intrinsic sizes. We cannot do the same for heights though because many code 500 // properly resolves intrinsic sizes. We cannot do the same for heights though because many code
471 // paths inside updateLogicalHeight() require a previous call to setLogi calHeight() to resolve 501 // paths inside updateLogicalHeight() require a previous call to setLogi calHeight() to resolve
472 // heights properly (like for positioned items for example). 502 // heights properly (like for positioned items for example).
473 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); 503 computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWi dth());
474 computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForC olumns);
475 504
476 // 2- Next, the track sizing algorithm resolves the sizes of the grid ro ws, using the 505 // 2- Next, the track sizing algorithm resolves the sizes of the grid ro ws, using the
477 // grid column sizes calculated in the previous step. 506 // grid column sizes calculated in the previous step.
478 if (logicalHeightWasIndefinite)
479 computeIntrinsicLogicalHeight(sizingData);
480 else
481 computeTrackSizesForDirection(ForRows, sizingData, availableLogicalH eight(ExcludeMarginBorderPadding));
482 setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndP addingLogicalHeight() + scrollbarLogicalHeight());
483
484 LayoutUnit oldClientAfterEdge = clientLogicalBottom(); 507 LayoutUnit oldClientAfterEdge = clientLogicalBottom();
485 updateLogicalHeight(); 508 resolveSizeOfGridRows(sizingData);
486
487 // The above call might have changed the grid's logical height depending on min|max height restrictions.
488 // Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes).
489 LayoutUnit availableSpaceForRows = contentLogicalHeight();
490 if (logicalHeightWasIndefinite)
491 computeTrackSizesForDirection(ForRows, sizingData, availableSpaceFor Rows);
492 509
493 // 3- If the min-content contribution of any grid items have changed bas ed on the row 510 // 3- If the min-content contribution of any grid items have changed bas ed on the row
494 // sizes calculated in step 2, steps 1 and 2 are repeated with the new m in-content 511 // sizes calculated in step 2, steps 1 and 2 are repeated with the new m in-content
495 // contribution (once only). 512 // contribution (once only).
496 repeatTracksSizingIfNeeded(sizingData, availableSpaceForColumns, availab leSpaceForRows); 513 repeatTracksSizingIfNeeded(sizingData);
497 514
498 // Grid container should have the minimum height of a line if it's edita ble. That doesn't affect track sizing though. 515 // Grid container should have the minimum height of a line if it's edita ble. That doesn't affect track sizing though.
499 if (hasLineIfEmpty()) 516 if (hasLineIfEmpty())
500 setLogicalHeight(std::max(logicalHeight(), minimumLogicalHeightForEm ptyLine())); 517 setLogicalHeight(std::max(logicalHeight(), minimumLogicalHeightForEm ptyLine()));
501 518
502 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData); 519 applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData);
503 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData); 520 applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData);
504 521
505 layoutGridItems(sizingData); 522 layoutGridItems(sizingData);
506 523
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOpe ration); 1575 m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOpe ration);
1559 m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation); 1576 m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation);
1560 1577
1561 populateExplicitGridAndOrderIterator(); 1578 populateExplicitGridAndOrderIterator();
1562 1579
1563 // We clear the dirty bit here as the grid sizes have been updated. 1580 // We clear the dirty bit here as the grid sizes have been updated.
1564 m_gridIsDirty = false; 1581 m_gridIsDirty = false;
1565 1582
1566 Vector<LayoutBox*> autoMajorAxisAutoGridItems; 1583 Vector<LayoutBox*> autoMajorAxisAutoGridItems;
1567 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; 1584 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems;
1568 m_hasAnyOrthogonalChild = false; 1585 m_orthogonalChilds.shrink(0);
1569 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 1586 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
1570 if (child->isOutOfFlowPositioned()) 1587 if (child->isOutOfFlowPositioned())
1571 continue; 1588 continue;
1572 1589
1573 m_hasAnyOrthogonalChild = m_hasAnyOrthogonalChild || isOrthogonalChild(* child); 1590 if (isOrthogonalChild(*child))
1591 m_orthogonalChilds.append(child);
1574 1592
1575 GridArea area = cachedGridArea(*child); 1593 GridArea area = cachedGridArea(*child);
1576 if (!area.rows.isIndefinite()) 1594 if (!area.rows.isIndefinite())
1577 area.rows.translate(abs(m_smallestRowStart)); 1595 area.rows.translate(abs(m_smallestRowStart));
1578 if (!area.columns.isIndefinite()) 1596 if (!area.columns.isIndefinite())
1579 area.columns.translate(abs(m_smallestColumnStart)); 1597 area.columns.translate(abs(m_smallestColumnStart));
1580 m_gridItemArea.set(child, area); 1598 m_gridItemArea.set(child, area);
1581 1599
1582 if (area.rows.isIndefinite() || area.columns.isIndefinite()) { 1600 if (area.rows.isIndefinite() || area.columns.isIndefinite()) {
1583 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? area.columns : area.rows; 1601 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? area.columns : area.rows;
(...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after
2656 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation; 2674 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation;
2657 } 2675 }
2658 2676
2659 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2677 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2660 { 2678 {
2661 if (!m_gridItemArea.isEmpty()) 2679 if (!m_gridItemArea.isEmpty())
2662 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2680 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2663 } 2681 }
2664 2682
2665 } // namespace blink 2683 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698