Commit a63ddcac authored by Alison Maher's avatar Alison Maher Committed by Commit Bot

[LayoutNG] Handle break statuses for fieldset

This change adds logic to handle various break status types for
fieldsets and their children.

Bug: 875235
Change-Id: I6c6c1ca6e0c5c72dc88be0f0808fa9c040e71bb4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2106477
Commit-Queue: Alison Maher <almaher@microsoft.com>
Reviewed-by: default avatarMorten Stenshorne <mstensho@chromium.org>
Cr-Commit-Position: refs/heads/master@{#752245}
parent 1f8dbd4b
...@@ -67,9 +67,11 @@ scoped_refptr<const NGLayoutResult> NGFieldsetLayoutAlgorithm::Layout() { ...@@ -67,9 +67,11 @@ scoped_refptr<const NGLayoutResult> NGFieldsetLayoutAlgorithm::Layout() {
container_builder_.SetIsInitialColumnBalancingPass(); container_builder_.SetIsInitialColumnBalancingPass();
} }
// TODO(almaher): Handle all break status cases.
NGBreakStatus break_status = LayoutChildren(); NGBreakStatus break_status = LayoutChildren();
DCHECK_EQ(break_status, NGBreakStatus::kContinue); if (break_status == NGBreakStatus::kNeedsEarlierBreak) {
// We need to abort the layout. No fragment will be generated.
return container_builder_.Abort(NGLayoutResult::kNeedsEarlierBreak);
}
intrinsic_block_size_ = intrinsic_block_size_ =
ClampIntrinsicBlockSize(ConstraintSpace(), Node(), ClampIntrinsicBlockSize(ConstraintSpace(), Node(),
...@@ -149,9 +151,9 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutChildren() { ...@@ -149,9 +151,9 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutChildren() {
legend && (legend_break_token || !IsResumingLayout(BreakToken())); legend && (legend_break_token || !IsResumingLayout(BreakToken()));
if (legend_needs_layout) { if (legend_needs_layout) {
// TODO(almaher): Handle all break status cases.
NGBreakStatus break_status = LayoutLegend(legend, legend_break_token); NGBreakStatus break_status = LayoutLegend(legend, legend_break_token);
DCHECK_EQ(break_status, NGBreakStatus::kContinue); if (break_status != NGBreakStatus::kContinue)
return break_status;
} }
borders_with_legend_ = borders_; borders_with_legend_ = borders_;
...@@ -182,10 +184,11 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutChildren() { ...@@ -182,10 +184,11 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutChildren() {
// all live inside an anonymous child box of the fieldset container. // all live inside an anonymous child box of the fieldset container.
auto fieldset_content = Node().GetFieldsetContent(); auto fieldset_content = Node().GetFieldsetContent();
if (fieldset_content && (content_break_token || !has_seen_all_children)) { if (fieldset_content && (content_break_token || !has_seen_all_children)) {
// TODO(almaher): Handle all break status cases. NGBreakStatus break_status =
NGBreakStatus break_status = LayoutFieldsetContent( LayoutFieldsetContent(fieldset_content, content_break_token,
fieldset_content, content_break_token, adjusted_padding_box_size); adjusted_padding_box_size, !!legend);
DCHECK_EQ(break_status, NGBreakStatus::kContinue); if (break_status == NGBreakStatus::kNeedsEarlierBreak)
return break_status;
} }
if (!fieldset_content) { if (!fieldset_content) {
...@@ -226,6 +229,18 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutLegend( ...@@ -226,6 +229,18 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutLegend(
// TODO(layout-dev): Handle abortions caused by block fragmentation. // TODO(layout-dev): Handle abortions caused by block fragmentation.
DCHECK_EQ(result->Status(), NGLayoutResult::kSuccess); DCHECK_EQ(result->Status(), NGLayoutResult::kSuccess);
if (ConstraintSpace().HasBlockFragmentation()) {
NGBreakStatus break_status = BreakBeforeChildIfNeeded(
ConstraintSpace(), legend, *result.get(),
ConstraintSpace().FragmentainerOffsetAtBfc() + block_offset,
/*has_container_separation*/ false, &container_builder_);
if (break_status != NGBreakStatus::kContinue)
return break_status;
EBreakBetween break_after = JoinFragmentainerBreakValues(
result->FinalBreakAfter(), legend.Style().BreakAfter());
container_builder_.SetPreviousBreakAfter(break_after);
}
const auto& physical_fragment = result->PhysicalFragment(); const auto& physical_fragment = result->PhysicalFragment();
// We have already adjusted the legend block offset, no need to adjust // We have already adjusted the legend block offset, no need to adjust
...@@ -268,14 +283,14 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutLegend( ...@@ -268,14 +283,14 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutLegend(
block_offset); block_offset);
container_builder_.AddResult(*result, legend_offset); container_builder_.AddResult(*result, legend_offset);
return NGBreakStatus::kContinue; return NGBreakStatus::kContinue;
} }
NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutFieldsetContent( NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutFieldsetContent(
NGBlockNode& fieldset_content, NGBlockNode& fieldset_content,
scoped_refptr<const NGBlockBreakToken> content_break_token, scoped_refptr<const NGBlockBreakToken> content_break_token,
const LogicalSize adjusted_padding_box_size) { LogicalSize adjusted_padding_box_size,
bool has_legend) {
auto child_space = CreateConstraintSpaceForFieldsetContent( auto child_space = CreateConstraintSpaceForFieldsetContent(
fieldset_content, adjusted_padding_box_size, fieldset_content, adjusted_padding_box_size,
borders_with_legend_.block_start); borders_with_legend_.block_start);
...@@ -288,9 +303,13 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutFieldsetContent( ...@@ -288,9 +303,13 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutFieldsetContent(
if (ConstraintSpace().HasBlockFragmentation()) { if (ConstraintSpace().HasBlockFragmentation()) {
LayoutUnit block_offset = LayoutUnit block_offset =
ConstraintSpace().FragmentainerOffsetAtBfc() + intrinsic_block_size_; ConstraintSpace().FragmentainerOffsetAtBfc() + intrinsic_block_size_;
// TODO(almaher): The legend should be treated as out-of-flow.
break_status = BreakBeforeChildIfNeeded( break_status = BreakBeforeChildIfNeeded(
ConstraintSpace(), fieldset_content, *result.get(), block_offset, ConstraintSpace(), fieldset_content, *result.get(), block_offset,
/*has_container_separation*/ true, &container_builder_); /*has_container_separation*/ has_legend, &container_builder_);
EBreakBetween break_after = JoinFragmentainerBreakValues(
result->FinalBreakAfter(), fieldset_content.Style().BreakAfter());
container_builder_.SetPreviousBreakAfter(break_after);
} }
if (break_status == NGBreakStatus::kContinue) { if (break_status == NGBreakStatus::kContinue) {
...@@ -300,8 +319,7 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutFieldsetContent( ...@@ -300,8 +319,7 @@ NGBreakStatus NGFieldsetLayoutAlgorithm::LayoutFieldsetContent(
container_builder_.SetHasSeenAllChildren(); container_builder_.SetHasSeenAllChildren();
} }
// TODO(almaher): return break_status return break_status;
return NGBreakStatus::kContinue;
} }
base::Optional<MinMaxSizes> NGFieldsetLayoutAlgorithm::ComputeMinMaxSizes( base::Optional<MinMaxSizes> NGFieldsetLayoutAlgorithm::ComputeMinMaxSizes(
......
...@@ -36,7 +36,8 @@ class CORE_EXPORT NGFieldsetLayoutAlgorithm ...@@ -36,7 +36,8 @@ class CORE_EXPORT NGFieldsetLayoutAlgorithm
NGBreakStatus LayoutFieldsetContent( NGBreakStatus LayoutFieldsetContent(
NGBlockNode& fieldset_content, NGBlockNode& fieldset_content,
scoped_refptr<const NGBlockBreakToken> content_break_token, scoped_refptr<const NGBlockBreakToken> content_break_token,
const LogicalSize adjusted_padding_box_size); LogicalSize adjusted_padding_box_size,
bool has_legend);
const NGConstraintSpace CreateConstraintSpaceForLegend( const NGConstraintSpace CreateConstraintSpaceForLegend(
NGBlockNode legend, NGBlockNode legend,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment