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

[LayoutNG] Initial support for column-span:all.

This adds support for the fundamentals required by column-span:all. We
still don't attempt to position the spanners correctly. We need to
margin-collapse between spanners and calculate the inline position
first. We also still don't support breaking between spanners, or between
column rows and spanners. This may be necessary if we're nested inside
another fragmentation context.

Spanners are detected during regular column layout, and will bubble up
to the column layout algorithm, where they will be laid out as children,
before regular column content resumes. The column content will see the
spanner as a forced column break.

Some tests now start to fail. Two dynamic tests fail because
NGPaintFragment doesn't really understand block fragmentation. One
starts to crash, because a spanner causes a break inside the containing
block of an out-of-flow positioned descendant, which we have never
supported anyway. See crbug.com/996655

Bug: 829028
Change-Id: I60229da59f745dd469bbf104f6f46e5f93e1a1de
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1771909
Commit-Queue: Morten Stenshorne <mstensho@chromium.org>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarEmil A Eklund <eae@chromium.org>
Cr-Commit-Position: refs/heads/master@{#691548}
parent 52f80bb3
......@@ -200,7 +200,8 @@ base::Optional<MinMaxSize> NGBlockLayoutAlgorithm::ComputeMinMaxSize(
for (NGLayoutInputNode child = Node().FirstChild(); child;
child = child.NextSibling()) {
if (child.IsOutOfFlowPositioned() || child.IsColumnSpanAll())
if (child.IsOutOfFlowPositioned() ||
(child.IsColumnSpanAll() && ConstraintSpace().IsInColumnBfc()))
continue;
const ComputedStyle& child_style = child.Style();
......@@ -516,7 +517,12 @@ inline scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::Layout(
const NGBreakToken* child_break_token = entry.token;
if (child.IsOutOfFlowPositioned()) {
DCHECK(!child_break_token);
// We don't support fragmentation inside out-of-flow positioned boxes yet,
// but breaking before is fine. This may happen when a column spanner is
// directly followed by an OOF.
DCHECK(!child_break_token ||
(child_break_token->IsBlockType() &&
To<NGBlockBreakToken>(child_break_token)->IsBreakBefore()));
HandleOutOfFlowPositioned(previous_inflow_position,
To<NGBlockNode>(child));
} else if (child.IsFloating()) {
......@@ -525,6 +531,21 @@ inline scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::Layout(
} else if (child.IsListMarker() && !child.ListMarkerOccupiesWholeLine()) {
container_builder_.SetUnpositionedListMarker(
NGUnpositionedListMarker(To<NGBlockNode>(child)));
} else if (child.IsColumnSpanAll() && ConstraintSpace().IsInColumnBfc()) {
// The child is a column spanner. We now need to finish this
// fragmentainer, then abort and let the column layout algorithm handle
// the spanner as a child.
container_builder_.SetColumnSpanner(To<NGBlockNode>(child));
// We also need to find out where to resume column layout after the
// spanner. If it has a next sibling, that's where we'll resume. If not,
// we'll need to keep looking for subsequent content on the way up the
// tree.
if (NGLayoutInputNode next = child.NextSibling()) {
container_builder_.AddBreakBeforeChild(next,
/* is_forced_break */ true);
container_builder_.SetDidBreak();
}
break;
} else {
// We need to propagate the initial break-before value up our container
// chain, until we reach a container that's not a first child. If we get
......@@ -543,8 +564,15 @@ inline scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::Layout(
abort = !HandleInflow(
child, child_break_token, &previous_inflow_position,
inline_child_layout_context, &previous_inline_break_token);
if (container_builder_.FoundColumnSpanner())
break;
}
// Spanners should be detected above. They can only occur in the same
// block formatting context as the initial one established by the multicol
// container.
DCHECK(!container_builder_.FoundColumnSpanner());
if (abort) {
// We need to abort the layout, as our BFC block offset was resolved.
return container_builder_.Abort(
......@@ -1611,6 +1639,23 @@ bool NGBlockLayoutAlgorithm::FinishInflow(
child.IsInline() ? To<NGInlineBreakToken>(physical_fragment.BreakToken())
: nullptr;
// If a spanner was found inside the child, we need to finish up and propagate
// the spanner to the column layout algorithm, so that it can take care of it.
if (UNLIKELY(ConstraintSpace().IsInColumnBfc())) {
if (NGBlockNode spanner_node = layout_result->ColumnSpanner()) {
container_builder_.SetColumnSpanner(spanner_node);
if (!container_builder_.DidBreak()) {
// If we still haven't found a descendant at which to resume column
// layout after the spanner, look for one now.
if (NGLayoutInputNode next = child.NextSibling()) {
container_builder_.AddBreakBeforeChild(next,
/* is_forced_break */ true);
container_builder_.SetDidBreak();
}
}
}
}
return true;
}
......@@ -2288,7 +2333,8 @@ NGConstraintSpace NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild(
// fragmentation line.
if (is_new_fc)
new_bfc_block_offset = child_data.bfc_offset_estimate.block_offset;
SetupFragmentation(ConstraintSpace(), new_bfc_block_offset, &builder);
SetupFragmentation(ConstraintSpace(), new_bfc_block_offset, &builder,
is_new_fc);
}
return builder.ToConstraintSpace();
......
......@@ -131,6 +131,11 @@ void UpdateLegacyMultiColumnFlowThread(
// Stitch the columns together.
for (const auto& child : fragment.Children()) {
// Skip column spanners, as they are not part of the flow thread (and
// besides, otherwise we'd hit a DCHECK below, because the inline-size of a
// spanner is typically different from that of the columns).
if (child->GetLayoutObject() && child->GetLayoutObject()->IsColumnSpanAll())
continue;
NGFragment child_fragment(writing_mode, *child);
flow_end += child_fragment.BlockSize();
// Non-uniform fragmentainer widths not supported by legacy layout.
......@@ -849,8 +854,13 @@ void NGBlockNode::PlaceChildrenInFlowThread(
const NGPhysicalBoxFragment& physical_fragment) {
LayoutUnit flowthread_offset;
for (const auto& child : physical_fragment.Children()) {
if (child->GetLayoutObject() != box_) {
DCHECK(child->GetLayoutObject()->IsColumnSpanAll());
// TODO(mstensho): Write back the spanner offset to the associated
// LayoutMultiColumnSpannerPlaceholder (if we bother)
continue;
}
// Each anonymous child of a multicol container constitutes one column.
DCHECK(child->GetLayoutObject() == box_);
// TODO(mstensho): writing modes
PhysicalOffset offset(LayoutUnit(), flowthread_offset);
......
......@@ -144,6 +144,7 @@ void NGBoxFragmentBuilder::AddResult(const NGLayoutResult& child_layout_result,
void NGBoxFragmentBuilder::AddBreakToken(
scoped_refptr<const NGBreakToken> token) {
DCHECK(token.get());
child_break_tokens_.push_back(std::move(token));
}
......
......@@ -154,6 +154,9 @@ class CORE_EXPORT NGBoxFragmentBuilder final
// left to discover.
void SetHasSeenAllChildren() { has_seen_all_children_ = true; }
void SetColumnSpanner(NGBlockNode spanner) { column_spanner_ = spanner; }
bool FoundColumnSpanner() const { return !!column_spanner_; }
// Offsets are not supposed to be set during fragment construction, so we
// do not provide a setter here.
......@@ -243,6 +246,8 @@ class CORE_EXPORT NGBoxFragmentBuilder final
NGFragmentItemsBuilder* items_builder_ = nullptr;
NGBlockNode column_spanner_ = nullptr;
NGPhysicalFragment::NGBoxType box_type_;
bool is_fieldset_container_ = false;
bool is_initial_block_size_indefinite_ = false;
......
......@@ -28,9 +28,21 @@ class CORE_EXPORT NGColumnLayoutAlgorithm
const MinMaxSizeInput&) const override;
private:
scoped_refptr<const NGBreakToken> LayoutRow(
// Lay out as many children as we can.
void LayoutChildren();
// Lay out one row of columns. The layout result returned is for the last
// column that was laid out. The rows themselves don't create fragments.
scoped_refptr<const NGLayoutResult> LayoutRow(
const NGBlockBreakToken* next_column_token);
// Lay out a column spanner. Will return a break token if we break before or
// inside the spanner. If no break token is returned, it means that we can
// proceed to the next row of columns.
scoped_refptr<const NGBlockBreakToken> LayoutSpanner(
NGBlockNode spanner_node,
const NGBlockBreakToken* break_token);
LayoutUnit CalculateBalancedColumnBlockSize(
const LogicalSize& column_size,
const NGBlockBreakToken* child_break_token);
......@@ -41,6 +53,7 @@ class CORE_EXPORT NGColumnLayoutAlgorithm
LayoutUnit current_column_size) const;
LayoutUnit ConstrainColumnBlockSize(LayoutUnit size) const;
LayoutUnit CurrentContentBlockOffset() const;
NGConstraintSpace CreateConstraintSpaceForColumns(
const LogicalSize& column_size,
......@@ -48,6 +61,8 @@ class CORE_EXPORT NGColumnLayoutAlgorithm
bool balance_columns) const;
NGConstraintSpace CreateConstraintSpaceForBalancing(
const LogicalSize& column_size) const;
NGConstraintSpace CreateConstraintSpaceForSpanner(
LayoutUnit block_offset) const;
NGConstraintSpace CreateConstraintSpaceForMinMax() const;
const NGBoxStrut border_padding_;
......
......@@ -342,6 +342,12 @@ class CORE_EXPORT NGConstraintSpace final {
return HasRareData() && rare_data_->is_inside_balanced_columns;
}
// Return true if we're participating in the same block formatting context as
// the one established by the nearest ancestor multicol container.
bool IsInColumnBfc() const {
return HasRareData() && rare_data_->is_in_column_bfc;
}
// Returns if this node is a table cell child, and which table layout mode
// is occurring.
NGTableCellChildLayoutMode TableCellChildLayoutMode() const {
......@@ -553,7 +559,8 @@ class CORE_EXPORT NGConstraintSpace final {
: bfc_offset(bfc_offset),
block_direction_fragmentation_type(
static_cast<unsigned>(kFragmentNone)),
is_inside_balanced_columns(false) {}
is_inside_balanced_columns(false),
is_in_column_bfc(false) {}
RareData(const RareData&) = default;
~RareData() = default;
......@@ -577,6 +584,7 @@ class CORE_EXPORT NGConstraintSpace final {
unsigned block_direction_fragmentation_type : 2;
unsigned is_inside_balanced_columns : 1;
unsigned is_in_column_bfc : 1;
bool MaySkipLayout(const RareData& other) const {
return margin_strut == other.margin_strut &&
......@@ -588,7 +596,8 @@ class CORE_EXPORT NGConstraintSpace final {
other.fragmentainer_space_at_bfc_start &&
block_direction_fragmentation_type ==
other.block_direction_fragmentation_type &&
is_inside_balanced_columns == other.is_inside_balanced_columns;
is_inside_balanced_columns == other.is_inside_balanced_columns &&
is_in_column_bfc == other.is_in_column_bfc;
}
// Must be kept in sync with members checked within |MaySkipLayout|.
......@@ -599,7 +608,7 @@ class CORE_EXPORT NGConstraintSpace final {
fragmentainer_block_size == kIndefiniteSize &&
fragmentainer_space_at_bfc_start == kIndefiniteSize &&
block_direction_fragmentation_type == kFragmentNone &&
!is_inside_balanced_columns;
!is_inside_balanced_columns && !is_in_column_bfc;
}
};
......
......@@ -167,6 +167,8 @@ class CORE_EXPORT NGConstraintSpaceBuilder final {
space_.EnsureRareData()->is_inside_balanced_columns = true;
}
void SetIsInColumnBfc() { space_.EnsureRareData()->is_in_column_bfc = true; }
void SetIsTableCell(bool b) { space_.bitfields_.is_table_cell = b; }
void SetIsRestrictedBlockSizeTableCell(bool b) {
......
......@@ -79,7 +79,8 @@ NGConstraintSpace CreateConstraintSpaceForFloat(
DCHECK(parent_space.HasBlockFragmentation());
DCHECK_EQ(style.GetWritingMode(), parent_space.GetWritingMode());
SetupFragmentation(parent_space, *origin_block_offset, &builder);
SetupFragmentation(parent_space, *origin_block_offset, &builder,
/* is_new_fc */ true);
} else {
builder.SetFragmentationType(NGFragmentationType::kFragmentNone);
}
......
......@@ -75,7 +75,8 @@ bool IsForcedBreakValue(const NGConstraintSpace& constraint_space,
void SetupFragmentation(const NGConstraintSpace& parent_space,
LayoutUnit new_bfc_block_offset,
NGConstraintSpaceBuilder* builder) {
NGConstraintSpaceBuilder* builder,
bool is_new_fc) {
DCHECK(parent_space.HasBlockFragmentation());
LayoutUnit space_available =
......@@ -84,6 +85,9 @@ void SetupFragmentation(const NGConstraintSpace& parent_space,
builder->SetFragmentainerBlockSize(parent_space.FragmentainerBlockSize());
builder->SetFragmentainerSpaceAtBfcStart(space_available);
builder->SetFragmentationType(parent_space.BlockFragmentationType());
if (parent_space.IsInColumnBfc() && !is_new_fc)
builder->SetIsInColumnBfc();
}
void FinishFragmentation(NGBoxFragmentBuilder* builder,
......
......@@ -45,7 +45,8 @@ inline bool IsResumingLayout(const NGBlockBreakToken* token) {
// fragmentainer block-start.
void SetupFragmentation(const NGConstraintSpace& parent_space,
LayoutUnit new_bfc_block_offset,
NGConstraintSpaceBuilder*);
NGConstraintSpaceBuilder*,
bool is_new_fc);
// Write fragmentation information to the fragment builder after layout.
void FinishFragmentation(NGBoxFragmentBuilder*,
......
......@@ -49,6 +49,8 @@ NGLayoutResult::NGLayoutResult(
EnsureRareData()->custom_layout_data =
std::move(builder->custom_layout_data_);
}
if (builder->column_spanner_)
EnsureRareData()->column_spanner = builder->column_spanner_;
bitfields_.initial_break_before =
static_cast<unsigned>(builder->initial_break_before_);
bitfields_.final_break_after =
......
......@@ -12,6 +12,7 @@
#include "third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_offset.h"
#include "third_party/blink/renderer/core/layout/ng/geometry/ng_margin_strut.h"
#include "third_party/blink/renderer/core/layout/ng/list/ng_unpositioned_list_marker.h"
#include "third_party/blink/renderer/core/layout/ng/ng_block_node.h"
#include "third_party/blink/renderer/core/layout/ng/ng_floats_utils.h"
#include "third_party/blink/renderer/core/layout/ng/ng_fragment.h"
#include "third_party/blink/renderer/core/layout/ng/ng_link.h"
......@@ -68,6 +69,11 @@ class CORE_EXPORT NGLayoutResult : public RefCounted<NGLayoutResult> {
: NGUnpositionedListMarker();
}
// Get the column spanner (if any) that interrupted column layout.
NGBlockNode ColumnSpanner() const {
return HasRareData() ? rare_data_->column_spanner : NGBlockNode(nullptr);
}
const NGExclusionSpace& ExclusionSpace() const {
if (bitfields_.has_rare_data_exclusion_space) {
DCHECK(HasRareData());
......@@ -284,6 +290,7 @@ class CORE_EXPORT NGLayoutResult : public RefCounted<NGLayoutResult> {
LogicalOffset oof_positioned_offset;
NGMarginStrut end_margin_strut;
NGUnpositionedListMarker unpositioned_list_marker;
NGBlockNode column_spanner = nullptr;
LayoutUnit minimal_space_shortage = LayoutUnit::Max();
NGExclusionSpace exclusion_space;
scoped_refptr<SerializedScriptValue> custom_layout_data;
......
......@@ -1348,6 +1348,7 @@ crbug.com/967329 virtual/layout_ng_experimental/external/wpt/css/css-multicol/co
crbug.com/967329 virtual/layout_ng_experimental/external/wpt/css/css-multicol/columnfill-auto-max-height-001.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/float-and-block.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure ]
crbug.com/996655 virtual/layout_ng_experimental/external/wpt/css/css-multicol/going-out-of-flow-after-spanner.html [ Crash Pass ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-basic-001.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-basic-002.html [ Failure ]
......@@ -1481,6 +1482,8 @@ crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/mu
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-004b.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-005.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-006.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-004.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-007.html [ Failure ]
crbug.com/924142 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-010.html [ Crash Pass ]
crbug.com/874051 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-fieldset-001.html [ Failure ]
crbug.com/874051 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-fieldset-002.html [ Failure ]
......@@ -1552,7 +1555,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/block-beco
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/change-second-row-height.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/change-spanner-display.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/float-becomes-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Crash Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-block-before-spanner.html [ Failure ]
......@@ -1571,14 +1573,11 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-spa
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-spanner-pseudo-before-after-in-content.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-spanner-pseudo-before-following-content.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-spanner-pseudo-before.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/invalid-spanner-container-becomes-valid.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/relpos-becomes-static-has-abspos.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-abspos-next-to-spanner.html [ Crash Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-block-after-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-block-before-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-block-between-spanners.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-column-content-next-to-abspos-between-spanners.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/remove-spanner-after-content.html [ Failure ]
......@@ -1658,7 +1657,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-forced
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-padding.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-single-empty-block.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-single-tall-line.html [ Failure ]
crbug.com/994172 virtual/layout_ng_experimental/fast/multicol/nested-with-spanner-inside-margins-crash.html [ Crash ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/avoid-column-break-inside.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance2.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance3.html [ Failure ]
......@@ -1707,15 +1705,11 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/balance-after
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/balance-after-spanner-some-extra-height.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/balance-before-and-after-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/balance-before-spanner-extra-height.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/becomes-spanner-with-new-width.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/block-with-top-border-and-margin-around-spanner-exact-fit.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/block-with-top-border-and-margin-around-spanner-extra-space.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/break-in-columns-before-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/change-multicol-writing-mode.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/change-spanner-margins.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-block-between-spanners.html [ Crash ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-block-between-spanners-with-margins.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-block-with-bottom-margin-between-spanners.html [ Crash ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/empty-spanner-between-spanners-with-margins.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/fill-after-spanner-exact-fit.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/fill-after-spanner-extra-height.html [ Failure ]
......@@ -1735,7 +1729,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/offset-proper
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/outline.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/overflow-on-multicol.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/overflow-on-viewport.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/percent-margins.html [ Failure ]
......@@ -1750,8 +1743,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/relpos-in-blo
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/relpos-spanner-with-abspos-child.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/remaining-space-in-last-column.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/simple-margins.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/sole-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/sole-spanner-inside-div.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/span-between-text.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/spanner-first.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/span/spanner-img.html [ Failure ]
......
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