summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc91
1 files changed, 48 insertions, 43 deletions
diff --git a/chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index 20fd62a50a6..6a8ee5eaedd 100644
--- a/chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/chromium/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -10,9 +10,9 @@
#include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h"
#include "third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h"
#include "third_party/blink/renderer/core/layout/ng/ng_block_node.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h"
#include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
#include "third_party/blink/renderer/core/layout/ng/ng_fragment.h"
-#include "third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h"
#include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h"
#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
#include "third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_descendant.h"
@@ -22,30 +22,36 @@
namespace blink {
NGOutOfFlowLayoutPart::NGOutOfFlowLayoutPart(
- NGFragmentBuilder* container_builder,
+ NGBoxFragmentBuilder* container_builder,
bool contains_absolute,
bool contains_fixed,
const NGBoxStrut& borders_and_scrollers,
const NGConstraintSpace& container_space,
- const ComputedStyle& container_style)
+ const ComputedStyle& container_style,
+ base::Optional<NGLogicalSize> initial_containing_block_fixed_size)
: container_builder_(container_builder),
contains_absolute_(contains_absolute),
contains_fixed_(contains_fixed) {
+ if (!container_builder->HasOutOfFlowDescendantCandidates())
+ return;
NGPhysicalBoxStrut physical_borders = borders_and_scrollers.ConvertToPhysical(
container_style.GetWritingMode(), container_style.Direction());
- icb_size_ = container_space.InitialContainingBlockSize();
-
default_containing_block_.style = &container_style;
- default_containing_block_.content_size = container_builder_->Size();
- default_containing_block_.content_size.inline_size =
- std::max(default_containing_block_.content_size.inline_size -
+ default_containing_block_.content_size_for_absolute =
+ container_builder_->Size();
+ default_containing_block_.content_size_for_absolute.inline_size =
+ std::max(default_containing_block_.content_size_for_absolute.inline_size -
borders_and_scrollers.InlineSum(),
LayoutUnit());
- default_containing_block_.content_size.block_size =
- std::max(default_containing_block_.content_size.block_size -
+ default_containing_block_.content_size_for_absolute.block_size =
+ std::max(default_containing_block_.content_size_for_absolute.block_size -
borders_and_scrollers.BlockSum(),
LayoutUnit());
+ default_containing_block_.content_size_for_fixed =
+ initial_containing_block_fixed_size
+ ? initial_containing_block_fixed_size.value()
+ : default_containing_block_.content_size_for_absolute;
default_containing_block_.content_offset = NGLogicalOffset{
borders_and_scrollers.inline_start, borders_and_scrollers.block_start};
default_containing_block_.content_physical_offset =
@@ -74,7 +80,7 @@ void NGOutOfFlowLayoutPart::Run(LayoutBox* only_layout) {
}
// Sweep any descendants that might have been added.
// This happens when an absolute container has a fixed child.
- descendant_candidates.clear();
+ descendant_candidates.Shrink(0);
container_builder_->GetAndClearOutOfFlowDescendantCandidates(
&descendant_candidates, container_builder_->GetLayoutObject());
}
@@ -94,13 +100,13 @@ NGOutOfFlowLayoutPart::GetContainingBlockInfo(
void NGOutOfFlowLayoutPart::ComputeInlineContainingBlocks(
Vector<NGOutOfFlowPositionedDescendant> descendants) {
- HashMap<const LayoutObject*, NGFragmentBuilder::FragmentPair>
+ HashMap<const LayoutObject*, NGBoxFragmentBuilder::FragmentPair>
inline_container_fragments;
for (auto& descendant : descendants) {
if (descendant.inline_container &&
!inline_container_fragments.Contains(descendant.inline_container)) {
- NGFragmentBuilder::FragmentPair fragment_pair = {};
+ NGBoxFragmentBuilder::FragmentPair fragment_pair = {};
inline_container_fragments.insert(descendant.inline_container,
fragment_pair);
}
@@ -110,8 +116,8 @@ void NGOutOfFlowLayoutPart::ComputeInlineContainingBlocks(
container_builder_->ComputeInlineContainerFragments(
&inline_container_fragments, &container_builder_size);
NGPhysicalSize container_builder_physical_size =
- container_builder_size.ConvertToPhysical(
- default_containing_block_.style->GetWritingMode());
+ ToNGPhysicalSize(container_builder_size,
+ default_containing_block_.style->GetWritingMode());
// Translate start/end fragments into ContainingBlockInfo.
for (auto& block_info : inline_container_fragments) {
// Variables needed to describe ContainingBlockInfo
@@ -133,8 +139,11 @@ void NGOutOfFlowLayoutPart::ComputeInlineContainingBlocks(
} else {
inline_cb_style = &block_info.value.start_fragment->Style();
NGConstraintSpace dummy_constraint_space =
- NGConstraintSpaceBuilder(inline_cb_style->GetWritingMode(), icb_size_)
- .ToConstraintSpace(inline_cb_style->GetWritingMode());
+ NGConstraintSpaceBuilder(inline_cb_style->GetWritingMode(),
+ inline_cb_style->GetWritingMode(),
+ /* is_new_fc */ false)
+ .ToConstraintSpace();
+
// TODO Creating dummy constraint space just to get borders feels wrong.
NGBoxStrut inline_cb_borders =
ComputeBorders(dummy_constraint_space, *inline_cb_style);
@@ -198,11 +207,6 @@ void NGOutOfFlowLayoutPart::ComputeInlineContainingBlocks(
start_fragment_logical_offset.ConvertToPhysical(
container_writing_mode, container_direction,
start_linebox_fragment->Size(), NGPhysicalSize());
- NGPhysicalOffset start_linebox_physical_offset =
- block_info.value.start_linebox_offset.ConvertToPhysical(
- container_writing_mode, container_direction,
- container_builder_physical_size, start_linebox_fragment->Size());
- start_fragment_physical_offset += start_linebox_physical_offset;
// Step 2
const NGPhysicalLineBoxFragment* end_linebox_fragment =
block_info.value.end_linebox_fragment;
@@ -227,11 +231,6 @@ void NGOutOfFlowLayoutPart::ComputeInlineContainingBlocks(
end_fragment_bottom_right.ConvertToPhysical(
container_writing_mode, container_direction,
end_linebox_fragment->Size(), NGPhysicalSize());
- NGPhysicalOffset end_linebox_physical_offset =
- block_info.value.end_linebox_offset.ConvertToPhysical(
- container_writing_mode, container_direction,
- container_builder_physical_size, end_linebox_fragment->Size());
- end_fragment_physical_offset += end_linebox_physical_offset;
// Step 3
NGLogicalOffset start_fragment_logical_offset_wrt_box =
start_fragment_physical_offset.ConvertToLogical(
@@ -276,10 +275,11 @@ void NGOutOfFlowLayoutPart::ComputeInlineContainingBlocks(
default_container_offset += inline_cb_borders.StartOffset();
}
containing_blocks_map_.insert(
- block_info.key, ContainingBlockInfo{inline_cb_style, inline_cb_size,
- inline_content_offset,
- inline_content_physical_offset,
- default_container_offset});
+ block_info.key,
+ ContainingBlockInfo{inline_cb_style, inline_cb_size, inline_cb_size,
+ inline_content_offset,
+ inline_content_physical_offset,
+ default_container_offset});
}
}
@@ -300,8 +300,9 @@ scoped_refptr<NGLayoutResult> NGOutOfFlowLayoutPart::LayoutDescendant(
// and default_container border width.
NGStaticPosition static_position(descendant.static_position);
NGPhysicalSize default_containing_block_physical_size =
- default_containing_block_.content_size.ConvertToPhysical(
- default_containing_block_.style->GetWritingMode());
+ ToNGPhysicalSize(default_containing_block_.ContentSize(
+ descendant.node.Style().GetPosition()),
+ default_containing_block_.style->GetWritingMode());
NGPhysicalOffset default_container_physical_offset =
container_info.default_container_offset.ConvertToPhysical(
default_containing_block_.style->GetWritingMode(),
@@ -313,13 +314,16 @@ scoped_refptr<NGLayoutResult> NGOutOfFlowLayoutPart::LayoutDescendant(
default_containing_block_.content_physical_offset -
default_container_physical_offset;
+ NGLogicalSize container_content_size =
+ container_info.ContentSize(descendant.node.Style().GetPosition());
// The block estimate is in the descendant's writing mode.
NGConstraintSpace descendant_constraint_space =
- NGConstraintSpaceBuilder(container_writing_mode, icb_size_)
+ NGConstraintSpaceBuilder(container_writing_mode, descendant_writing_mode,
+ /* is_new_fc */ true)
.SetTextDirection(container_info.style->Direction())
- .SetAvailableSize(container_info.content_size)
- .SetPercentageResolutionSize(container_info.content_size)
- .ToConstraintSpace(descendant_writing_mode);
+ .SetAvailableSize(container_content_size)
+ .SetPercentageResolutionSize(container_content_size)
+ .ToConstraintSpace();
base::Optional<MinMaxSize> min_max_size;
base::Optional<LayoutUnit> block_estimate;
@@ -362,7 +366,7 @@ scoped_refptr<NGLayoutResult> NGOutOfFlowLayoutPart::LayoutDescendant(
layout_result = GenerateFragment(descendant.node, container_info,
block_estimate, node_position);
- DCHECK(layout_result->PhysicalFragment().get());
+ DCHECK(layout_result->PhysicalFragment());
NGFragment fragment(descendant_writing_mode,
*layout_result->PhysicalFragment());
@@ -439,8 +443,9 @@ scoped_refptr<NGLayoutResult> NGOutOfFlowLayoutPart::GenerateFragment(
// the constraint space in the descendant's writing mode.
WritingMode writing_mode(descendant.Style().GetWritingMode());
NGLogicalSize container_size(
- container_info.content_size
- .ConvertToPhysical(default_containing_block_.style->GetWritingMode())
+ ToNGPhysicalSize(
+ container_info.ContentSize(descendant.Style().GetPosition()),
+ default_containing_block_.style->GetWritingMode())
.ConvertToLogical(writing_mode));
LayoutUnit inline_size =
@@ -451,15 +456,15 @@ scoped_refptr<NGLayoutResult> NGOutOfFlowLayoutPart::GenerateFragment(
NGLogicalSize available_size{inline_size, block_size};
// TODO(atotic) will need to be adjusted for scrollbars.
- NGConstraintSpaceBuilder builder(writing_mode, icb_size_);
+ NGConstraintSpaceBuilder builder(writing_mode, writing_mode,
+ /* is_new_fc */ true);
builder.SetAvailableSize(available_size)
.SetTextDirection(descendant.Style().Direction())
.SetPercentageResolutionSize(container_size)
- .SetIsNewFormattingContext(true)
.SetIsFixedSizeInline(true);
if (block_estimate)
builder.SetIsFixedSizeBlock(true);
- NGConstraintSpace space = builder.ToConstraintSpace(writing_mode);
+ NGConstraintSpace space = builder.ToConstraintSpace();
scoped_refptr<NGLayoutResult> result = descendant.Layout(space);