Commit b27bb70d authored by Morten Stenshorne's avatar Morten Stenshorne Committed by Commit Bot

[LayoutNG] Bring back legacy write-back for lines in columns.

A multicol container establishes anonymous child fragments to represent
columns, and the contents (lines, blocks, whatever) are children of
those column fragments. We therefore need to examine grandchildren of
the multicol container to find lines to create RootInlineBox objects.

Examining the grandchildren previously wasn't necessary, and support for
writing back direct line box children used to work, as of
block with inline children would always create an anonymous child
fragment to hold all inline children. However, creation of said
(unnecessary) anonymous fragment was removed later on, and legacy
write-back of lines inside columns broke again.

https: //chromium-review.googlesource.com/716877 . It worked, because a
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_layout_ng
Change-Id: I73fd038d99c4a8b1dc0982e6f3f3a6e0572a44ba
Reviewed-on: https://chromium-review.googlesource.com/768671Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Commit-Queue: Morten Stenshorne <mstensho@chromium.org>
Cr-Commit-Position: refs/heads/master@{#516825}
parent 1ca3acf5
......@@ -4999,6 +4999,7 @@ crbug.com/591099 fast/multicol/span/sole-spanner.html [ Failure ]
crbug.com/591099 fast/multicol/span/span-between-text.html [ Crash ]
crbug.com/591099 fast/multicol/span/spanner-first.html [ Crash ]
crbug.com/591099 fast/multicol/span/spanner-img.html [ Crash ]
crbug.com/591099 fast/multicol/span/spanner-inline-block.html [ Failure ]
crbug.com/591099 fast/multicol/span/spanner-last.html [ Crash ]
crbug.com/591099 fast/multicol/span/spanner-table.html [ Crash ]
crbug.com/591099 fast/multicol/span/spanner-with-margin.html [ Crash ]
......@@ -5021,6 +5022,7 @@ crbug.com/591099 fast/multicol/table-cell-content-change.html [ Failure ]
crbug.com/591099 fast/multicol/table-margin-collapse.html [ Failure ]
crbug.com/591099 fast/multicol/tall-content-in-inner-with-fixed-height.html [ Failure ]
crbug.com/591099 fast/multicol/tall-float2.html [ Failure ]
crbug.com/591099 fast/multicol/text-shadow-at-column-boundaries.html [ Failure ]
crbug.com/591099 fast/multicol/three-inner-rows.html [ Failure ]
crbug.com/591099 fast/multicol/transform-inside-opacity.html [ Failure ]
crbug.com/591099 fast/multicol/unbreakable-block-too-tall-at-column-start.html [ Failure ]
......@@ -5472,13 +5474,11 @@ crbug.com/591099 fast/multicol/auto-height-forced-break-complex-margin-collapsin
crbug.com/591099 fast/multicol/balance-breakafter-before-table-section-crash.html [ Crash ]
crbug.com/591099 fast/multicol/break-after-empty-set-crash.html [ Crash ]
crbug.com/591099 fast/multicol/change-block-child-height.html [ Crash ]
crbug.com/591099 fast/multicol/change-height.html [ Failure ]
crbug.com/591099 fast/multicol/client-rect-overflowing-multicol-2-columns.html [ Crash ]
crbug.com/591099 fast/multicol/clone-block-children-inline-mismatch-crash.html [ Crash ]
crbug.com/591099 fast/multicol/composited-relpos-2nd-column.html [ Crash Pass ]
crbug.com/591099 fast/multicol/composited-relpos-simple.html [ Crash Pass ]
crbug.com/591099 fast/multicol/constrained-content-height-with-overflow-crash.html [ Crash ]
crbug.com/591099 fast/multicol/content-change-same-height.html [ Failure ]
crbug.com/591099 fast/multicol/doubly-nested-with-increasing-row-heights-crash.html [ Crash ]
crbug.com/591099 fast/multicol/dynamic/block-with-abspos-video-becomes-multicol-crash.html [ Crash Pass ]
crbug.com/591099 fast/multicol/dynamic/block-with-spanner-and-inline-and-table-column.html [ Crash ]
......@@ -5501,33 +5501,20 @@ crbug.com/591099 fast/multicol/dynamic/static-becomes-relpos-has-abspos-crash.ht
crbug.com/591099 fast/multicol/dynamic/untransformed-becomes-transformed-has-abspos-crash.html [ Crash ]
crbug.com/591099 fast/multicol/dynamic/valid-spanner-container-becomes-invalid.html [ Crash ]
crbug.com/591099 fast/multicol/flowthread-with-floats-destroyed-crash.html [ Crash ]
crbug.com/591099 fast/multicol/huge-column-count.html [ Failure ]
crbug.com/591099 fast/multicol/huge-column-gap-crash.html [ Failure ]
crbug.com/591099 fast/multicol/infinite-height-causing-fractional-row-height-crash.html [ Crash ]
crbug.com/591099 fast/multicol/input-type-number.html [ Failure ]
crbug.com/591099 fast/multicol/input-with-overflow-second-column.html [ Failure ]
crbug.com/591099 fast/multicol/large-padding-crash.html [ Crash ]
crbug.com/591099 fast/multicol/layers-split-across-columns.html [ Crash ]
crbug.com/591099 fast/multicol/margin-bottom-and-break-after.html [ Crash ]
crbug.com/591099 fast/multicol/min-height-much-greater-than-content.html [ Failure ]
crbug.com/591099 fast/multicol/multicol-becomes-abspos-crash.html [ Failure ]
crbug.com/591099 fast/multicol/negative-margins-crash.html [ Crash ]
crbug.com/591099 fast/multicol/nested-after-composited-layer-crash.html [ Failure ]
crbug.com/591099 fast/multicol/nested-multicol-two-spanners-dynamic.html [ Crash ]
crbug.com/591099 fast/multicol/nested-with-spanner-and-margin-crash.html [ Crash ]
crbug.com/591099 fast/multicol/nested-with-spanner-inside-margins-crash.html [ Crash ]
crbug.com/591099 fast/multicol/newmulticol/balance-maxheight1.html [ Failure ]
crbug.com/591099 fast/multicol/newmulticol/balance1.html [ Failure ]
crbug.com/591099 fast/multicol/newmulticol/balance5.html [ Failure ]
crbug.com/591099 fast/multicol/newmulticol/clipping.html [ Crash ]
crbug.com/591099 fast/multicol/newmulticol/leading-margin.html [ Crash ]
crbug.com/591099 fast/multicol/newmulticol/regular-block-becomes-multicol.html [ Failure ]
crbug.com/591099 fast/multicol/newmulticol/spanner-inside-child-crash.html [ Crash ]
crbug.com/591099 fast/multicol/paged-becomes-multicol-auto-height.html [ Failure ]
crbug.com/591099 fast/multicol/paged-becomes-multicol-fixed-height.html [ Failure ]
crbug.com/591099 fast/multicol/paged-becomes-multicol-with-spanner.html [ Crash ]
crbug.com/591099 fast/multicol/regular-block-becomes-multicol.html [ Failure ]
crbug.com/591099 fast/multicol/scale-transform-text.html [ Failure ]
crbug.com/591099 fast/multicol/span/anonymous-before-child-parent-crash.html [ Crash ]
crbug.com/591099 fast/multicol/span/anonymous-split-block-crash.html [ Crash ]
crbug.com/591099 fast/multicol/span/becomes-empty-spanner-crash.html [ Crash ]
......@@ -5546,7 +5533,6 @@ crbug.com/591099 fast/multicol/span/spanner-after-negative-margin-bottom-crash-2
crbug.com/591099 fast/multicol/span/spanner-after-negative-margin-bottom-crash.html [ Crash ]
crbug.com/591099 fast/multicol/span/update-after-content-before-child-crash.html [ Crash Pass ]
crbug.com/591099 fast/multicol/triply-nested-with-padding-crash.html [ Crash ]
crbug.com/591099 fast/multicol/unbreakable-content-taller-than-height-crash.html [ Failure ]
crbug.com/591099 fast/overflow/line-clamp-hides-trailing-anchor.html [ Failure ]
crbug.com/591099 fast/overflow/overflow-visible-should-ignore-scroll.html [ Failure ]
crbug.com/591099 fast/pagination/div-x-vertical-lr-ltr.html [ Failure ]
......@@ -6709,7 +6695,7 @@ crbug.com/591099 ietestcenter/css3/bordersbackgrounds/none-as-image-layer.htm [
crbug.com/591099 ietestcenter/css3/bordersbackgrounds/order-of-images.htm [ Failure ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-block-formatting-context-001.htm [ Failure ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-containing-block-001.htm [ Failure ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-containing-block-002.htm [ Crash Pass ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-containing-block-002.htm [ Crash Failure ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-containing-block-003.htm [ Failure ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-width-applies-to-001.htm [ Failure Pass ]
crbug.com/591099 ietestcenter/css3/multicolumn/column-width-applies-to-002.htm [ Failure Pass ]
......
......@@ -360,6 +360,74 @@ void CollectInlinesInternal(
builder->ExitBlock();
}
void PlaceLineBoxChildren(const Vector<NGInlineItem>& items,
const Vector<unsigned, 32>& text_offsets,
const NGConstraintSpace& constraint_space,
const NGPhysicalBoxFragment& box_fragment,
LayoutBlockFlow& block_flow,
LineInfo& line_info) {
FontBaseline baseline_type =
IsHorizontalWritingMode(constraint_space.WritingMode())
? FontBaseline::kAlphabeticBaseline
: FontBaseline::kIdeographicBaseline;
Vector<FragmentPosition, 32> positions_for_bidi_runs;
HashMap<LineLayoutItem, FragmentPosition> positions;
BidiRunList<BidiRun> bidi_runs;
for (const auto& child : box_fragment.Children()) {
// Skip any float children we might have, these are handled by the wrapping
// parent NGBlockNode.
if (!child->IsLineBox())
continue;
const auto& physical_line_box = ToNGPhysicalLineBoxFragment(*child);
NGFragment line_box(constraint_space.WritingMode(), physical_line_box);
NGLogicalOffset line_box_offset =
physical_line_box.Offset().ConvertToLogical(
constraint_space.WritingMode(), TextDirection::kLtr,
box_fragment.Size(), physical_line_box.Size());
// Create a BidiRunList for this line.
CreateBidiRuns(&bidi_runs, physical_line_box.Children(), constraint_space,
line_box_offset, physical_line_box.Size(), items,
text_offsets, &positions_for_bidi_runs, &positions);
// TODO(kojii): When a line contains a list marker but nothing else, there
// are fragments but there is no BidiRun. How to handle this is TBD.
if (!bidi_runs.FirstRun())
continue;
// TODO(kojii): bidi needs to find the logical last run.
bidi_runs.SetLogicallyLastRun(bidi_runs.LastRun());
// Create a RootInlineBox from BidiRunList. InlineBoxes created for the
// RootInlineBox are set to Bidirun::m_box.
line_info.SetEmpty(false);
// TODO(kojii): Implement setFirstLine, LastLine, etc.
RootInlineBox* root_line_box =
block_flow.ConstructLine(bidi_runs, line_info);
// Copy fragments data to InlineBoxes.
PlaceInlineBoxChildren(root_line_box, positions_for_bidi_runs, positions);
// Copy to RootInlineBox.
root_line_box->SetLogicalLeft(line_box_offset.inline_offset);
root_line_box->SetLogicalWidth(line_box.InlineSize());
NGLineHeightMetrics line_metrics(box_fragment.Style(), baseline_type);
const NGLineHeightMetrics& max_with_leading = physical_line_box.Metrics();
LayoutUnit baseline =
line_box_offset.block_offset + max_with_leading.ascent;
root_line_box->SetLogicalTop(baseline - line_metrics.ascent);
root_line_box->SetLineTopBottomPositions(
baseline - line_metrics.ascent, baseline + line_metrics.descent,
line_box_offset.block_offset, baseline + max_with_leading.descent);
line_info.SetFirstLine(false);
bidi_runs.DeleteRuns();
positions_for_bidi_runs.clear();
positions.clear();
}
}
} // namespace
NGInlineNode::NGInlineNode(LayoutBlockFlow* block)
......@@ -658,10 +726,13 @@ void NGInlineNode::CopyFragmentDataToLayoutBox(
const NGConstraintSpace& constraint_space,
const NGLayoutResult& layout_result) {
LayoutBlockFlow* block_flow = GetLayoutBlockFlow();
bool descend_into_fragmentainers = false;
// If we have a flow thread, that's where to put the line boxes.
if (auto* flow_thread = block_flow->MultiColumnFlowThread())
if (auto* flow_thread = block_flow->MultiColumnFlowThread()) {
block_flow = flow_thread;
descend_into_fragmentainers = true;
}
block_flow->DeleteLineBoxTree();
......@@ -669,69 +740,19 @@ void NGInlineNode::CopyFragmentDataToLayoutBox(
Vector<unsigned, 32> text_offsets(items.size());
GetLayoutTextOffsets(&text_offsets);
FontBaseline baseline_type =
IsHorizontalWritingMode(constraint_space.WritingMode())
? FontBaseline::kAlphabeticBaseline
: FontBaseline::kIdeographicBaseline;
Vector<FragmentPosition, 32> positions_for_bidi_runs;
HashMap<LineLayoutItem, FragmentPosition> positions;
BidiRunList<BidiRun> bidi_runs;
LineInfo line_info;
NGPhysicalBoxFragment* box_fragment =
ToNGPhysicalBoxFragment(layout_result.PhysicalFragment().get());
for (const auto& container_child : box_fragment->Children()) {
// Skip any float children we might have, these are handled by the wrapping
// parent NGBlockNode.
if (!container_child.get()->IsLineBox())
continue;
const auto& physical_line_box =
ToNGPhysicalLineBoxFragment(*container_child);
NGFragment line_box(constraint_space.WritingMode(), physical_line_box);
NGLogicalOffset line_box_offset =
physical_line_box.Offset().ConvertToLogical(
constraint_space.WritingMode(), TextDirection::kLtr,
box_fragment->Size(), physical_line_box.Size());
// Create a BidiRunList for this line.
CreateBidiRuns(&bidi_runs, physical_line_box.Children(), constraint_space,
line_box_offset, physical_line_box.Size(), items,
text_offsets, &positions_for_bidi_runs, &positions);
// TODO(kojii): When a line contains a list marker but nothing else, there
// are fragments but there is no BidiRun. How to handle this is TBD.
if (!bidi_runs.FirstRun())
continue;
// TODO(kojii): bidi needs to find the logical last run.
bidi_runs.SetLogicallyLastRun(bidi_runs.LastRun());
// Create a RootInlineBox from BidiRunList. InlineBoxes created for the
// RootInlineBox are set to Bidirun::m_box.
line_info.SetEmpty(false);
// TODO(kojii): Implement setFirstLine, LastLine, etc.
RootInlineBox* root_line_box =
block_flow->ConstructLine(bidi_runs, line_info);
// Copy fragments data to InlineBoxes.
PlaceInlineBoxChildren(root_line_box, positions_for_bidi_runs, positions);
// Copy to RootInlineBox.
root_line_box->SetLogicalLeft(line_box_offset.inline_offset);
root_line_box->SetLogicalWidth(line_box.InlineSize());
NGLineHeightMetrics line_metrics(Style(), baseline_type);
const NGLineHeightMetrics& max_with_leading = physical_line_box.Metrics();
LayoutUnit baseline =
line_box_offset.block_offset + max_with_leading.ascent;
root_line_box->SetLogicalTop(baseline - line_metrics.ascent);
root_line_box->SetLineTopBottomPositions(
baseline - line_metrics.ascent, baseline + line_metrics.descent,
line_box_offset.block_offset, baseline + max_with_leading.descent);
line_info.SetFirstLine(false);
bidi_runs.DeleteRuns();
positions_for_bidi_runs.clear();
positions.clear();
if (descend_into_fragmentainers) {
for (const auto& child : box_fragment->Children()) {
DCHECK(child->IsBox());
const auto& fragmentainer = ToNGPhysicalBoxFragment(*child.get());
PlaceLineBoxChildren(items, text_offsets, constraint_space, fragmentainer,
*block_flow, line_info);
}
} else {
PlaceLineBoxChildren(items, text_offsets, constraint_space, *box_fragment,
*block_flow, line_info);
}
}
......
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