| Index: third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| index ea90c1aebdb47a4a9269426d06fef15d1db9b1bf..c58908fa0a69c57eedc41a5a6306add279ad892a 100644
|
| --- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| +++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| @@ -25,12 +25,29 @@
|
| namespace blink {
|
| namespace {
|
|
|
| +// Whether child's constraint space should shrink to its intrinsic width.
|
| +// This is needed for buttons, select, input, floats and orthogonal children.
|
| +// See LayoutBox::sizesLogicalWidthToFitContent for the rationale behind this.
|
| +bool ShouldShrinkToFit(const NGConstraintSpace& parent_space,
|
| + const ComputedStyle& child_style) {
|
| + NGWritingMode child_writing_mode =
|
| + FromPlatformWritingMode(child_style.getWritingMode());
|
| + // Whether the child and the containing block are parallel to each other.
|
| + // Example: vertical-rl and vertical-lr
|
| + bool is_in_parallel_flow =
|
| + (parent_space.WritingMode() == kHorizontalTopBottom) ==
|
| + (child_writing_mode == kHorizontalTopBottom);
|
| +
|
| + return child_style.display() == EDisplay::InlineBlock ||
|
| + child_style.isFloating() || !is_in_parallel_flow;
|
| +}
|
| +
|
| // Updates the fragment's BFC offset if it's not already set.
|
| void UpdateFragmentBfcOffset(const NGLogicalOffset& offset,
|
| const NGConstraintSpace& space,
|
| NGFragmentBuilder* builder) {
|
| NGLogicalOffset fragment_offset =
|
| - space.IsNewFormattingContext() ? NGLogicalOffset() : offset;
|
| + space.IsNewFormattingContext() ? space.BfcOffset() : offset;
|
| if (!builder->BfcOffset())
|
| builder->SetBfcOffset(fragment_offset);
|
| }
|
| @@ -379,7 +396,8 @@ RefPtr<NGPhysicalFragment> NGBlockLayoutAlgorithm::Layout() {
|
| // Margins collapsing:
|
| // Do not collapse margins between parent and its child if there is
|
| // border/padding between them.
|
| - if (border_and_padding_.block_start) {
|
| + if (border_and_padding_.block_start ||
|
| + ConstraintSpace().IsNewFormattingContext()) {
|
| curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| builder_->SetBfcOffset(curr_bfc_offset_);
|
| curr_margin_strut_ = NGMarginStrut();
|
| @@ -702,30 +720,27 @@ NGBoxStrut NGBlockLayoutAlgorithm::CalculateMargins(
|
|
|
| NGConstraintSpace*
|
| NGBlockLayoutAlgorithm::CreateConstraintSpaceForCurrentChild() {
|
| - // TODO(layout-ng): Orthogonal children should also shrink to fit (in *their*
|
| - // inline axis)
|
| DCHECK(current_child_);
|
| if (current_child_->Type() == NGLayoutInputNode::kLegacyInline) {
|
| // TODO(kojii): Setup space_builder_ appropriately for inline child.
|
| return space_builder_->ToConstraintSpace();
|
| + // Calculate margins in parent's writing mode.
|
| }
|
| + curr_child_margins_ = CalculateMargins(*space_builder_->ToConstraintSpace(),
|
| + CurrentChildStyle());
|
|
|
| const ComputedStyle& current_child_style = CurrentChildStyle();
|
| - bool shrink_to_fit = current_child_style.display() == EDisplay::InlineBlock ||
|
| - current_child_style.isFloating();
|
| bool is_new_bfc = IsNewFormattingContextForInFlowBlockLevelChild(
|
| ConstraintSpace(), current_child_style);
|
| space_builder_->SetIsNewFormattingContext(is_new_bfc)
|
| - .SetIsShrinkToFit(shrink_to_fit)
|
| + .SetIsShrinkToFit(
|
| + ShouldShrinkToFit(ConstraintSpace(), CurrentChildStyle()))
|
| .SetWritingMode(
|
| FromPlatformWritingMode(current_child_style.getWritingMode()))
|
| .SetTextDirection(current_child_style.direction());
|
| LayoutUnit space_available = SpaceAvailableForCurrentChild();
|
| space_builder_->SetFragmentainerSpaceAvailable(space_available);
|
|
|
| - curr_child_margins_ = CalculateMargins(*space_builder_->ToConstraintSpace(),
|
| - current_child_style);
|
| -
|
| // Clearance :
|
| // - Collapse margins
|
| // - Update curr_bfc_offset and parent BFC offset if needed.
|
|
|