Chromium Code Reviews| 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 f955002399cbeb49112738b948ec1f5b00a557b2..263f3abae4db187de05857a3e181dc050c139f31 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| @@ -97,12 +97,78 @@ void LayoutGrid::RemoveChild(LayoutObject* child) { |
| DirtyGrid(); |
| } |
| +bool LayoutGrid::SelfAlignmentChangedToStretchInRowAxis( |
| + const ComputedStyle& old_style, |
| + const ComputedStyle& new_style, |
| + const LayoutBox& child) { |
| + return child.StyleRef() |
| + .ResolvedJustifySelf(SelfAlignmentNormalBehavior(&child), |
| + &old_style) |
| + .GetPosition() != kItemPositionStretch && |
| + child.StyleRef() |
| + .ResolvedJustifySelf(SelfAlignmentNormalBehavior(&child), |
| + &new_style) |
| + .GetPosition() == kItemPositionStretch; |
| +} |
| + |
| +bool LayoutGrid::SelfAlignmentChangedFromStretchInRowAxis( |
| + const ComputedStyle& old_style, |
| + const ComputedStyle& new_style, |
| + const LayoutBox& child) { |
| + return child.StyleRef() |
| + .ResolvedJustifySelf(SelfAlignmentNormalBehavior(&child), |
| + &old_style) |
| + .GetPosition() == kItemPositionStretch && |
| + child.StyleRef() |
| + .ResolvedJustifySelf(SelfAlignmentNormalBehavior(&child), |
| + &new_style) |
| + .GetPosition() != kItemPositionStretch; |
| +} |
| + |
| +bool LayoutGrid::SelfAlignmentChangedFromStretchInColumnAxis( |
| + const ComputedStyle& old_style, |
| + const ComputedStyle& new_style, |
| + const LayoutBox& child) { |
| + return child.StyleRef() |
| + .ResolvedAlignSelf(SelfAlignmentNormalBehavior(&child), |
| + &old_style) |
| + .GetPosition() == kItemPositionStretch && |
| + child.StyleRef() |
| + .ResolvedAlignSelf(SelfAlignmentNormalBehavior(&child), |
| + &new_style) |
| + .GetPosition() != kItemPositionStretch; |
| +} |
|
svillar
2017/05/25 08:13:09
Very compact but impossible to read. Could we add
jfernandez
2017/05/25 11:25:15
Done.
|
| + |
| void LayoutGrid::StyleDidChange(StyleDifference diff, |
| const ComputedStyle* old_style) { |
| LayoutBlock::StyleDidChange(diff, old_style); |
| if (!old_style) |
| return; |
| + const ComputedStyle& new_style = StyleRef(); |
| + if (old_style && |
| + old_style->ResolvedAlignItems(SelfAlignmentNormalBehavior(this)) |
| + .GetPosition() == kItemPositionStretch && |
| + diff.NeedsFullLayout()) { |
| + // Grid items that were not previously stretched in row-axis need to be |
| + // relayed out so we can compute new available space. |
| + // Grid items that were previously stretching in column-axis need to be |
| + // relayed out so we can compute new available space. |
| + // This is only necessary for stretching since other alignment values don't |
| + // change the size of the box. |
| + for (LayoutBox* child = FirstInFlowChildBox(); child; |
| + child = child->NextInFlowSiblingBox()) { |
| + if (SelfAlignmentChangedToStretchInRowAxis(*old_style, new_style, |
| + *child) || |
| + SelfAlignmentChangedFromStretchInRowAxis(*old_style, new_style, |
| + *child) || |
| + SelfAlignmentChangedFromStretchInColumnAxis(*old_style, new_style, |
| + *child)) { |
| + child->SetNeedsLayout(LayoutInvalidationReason::kGridChanged); |
|
svillar
2017/05/25 08:13:09
Shouldn't we clear the stretch overrides here?
jfernandez
2017/05/25 11:25:15
Well, I'd rather let the Grid layout logic do it w
|
| + } |
| + } |
| + } |
| + |
| // 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 |
| @@ -1530,26 +1596,12 @@ LayoutUnit LayoutGrid::AvailableAlignmentSpaceForChildBeforeStretching( |
| StyleSelfAlignmentData LayoutGrid::AlignSelfForChild( |
| const LayoutBox& child) const { |
| - if (!child.IsAnonymous()) { |
| - return child.StyleRef().ResolvedAlignSelf( |
| - SelfAlignmentNormalBehavior(&child)); |
| - } |
| - // 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(&child), |
| Style()); |
| } |
| StyleSelfAlignmentData LayoutGrid::JustifySelfForChild( |
| const LayoutBox& child) const { |
| - if (!child.IsAnonymous()) { |
| - return child.StyleRef().ResolvedJustifySelf( |
| - SelfAlignmentNormalBehavior(&child)); |
| - } |
| - // 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(&child), Style()); |
| } |