diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_break_token_data.h b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_break_token_data.h index 67bbe3880a318..407a6aba501c6 100644 --- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_break_token_data.h +++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_break_token_data.h @@ -11,18 +11,32 @@ namespace blink { struct NGFlexBreakTokenData final : NGBlockBreakTokenData { + // NGFlexBreakBeforeRow is used to maintain the state of break before rows + // during flex fragmentation. kNotBreakBeforeRow implies that we are either + // fragmenting a column-based flex container, or the current break token does + // not represent a break before a row. If kAtStartOfBreakBeforeRow is set, + // then the current break token represents a break before a row, and it is the + // first time we broke before the given row. If kPastStartOfBreakBeforeRow is + // set, then the current break token similarly represents a break before a + // row, but it is not the first time we've broken before the given row. + enum NGFlexBreakBeforeRow { + kNotBreakBeforeRow, + kAtStartOfBreakBeforeRow, + kPastStartOfBreakBeforeRow + }; + NGFlexBreakTokenData(const NGBlockBreakTokenData* break_token_data, const HeapVector& flex_lines, const Vector& row_break_between, const HeapVector>& oof_children, LayoutUnit intrinsic_block_size, - bool broke_before_row) + NGFlexBreakBeforeRow break_before_row) : NGBlockBreakTokenData(kFlexBreakTokenData, break_token_data), flex_lines(flex_lines), row_break_between(row_break_between), oof_children(oof_children), intrinsic_block_size(intrinsic_block_size), - broke_before_row(broke_before_row) {} + break_before_row(break_before_row) {} void Trace(Visitor* visitor) const override { visitor->Trace(flex_lines); @@ -34,10 +48,17 @@ struct NGFlexBreakTokenData final : NGBlockBreakTokenData { Vector row_break_between; HeapVector> oof_children; LayoutUnit intrinsic_block_size; - // |broke_before_row| is only used in the case of row flex containers. If this - // is true, that means that the next row to be processed had broken before, - // as represented by a break before its first child. - bool broke_before_row = false; + // `break_before_row` is only used in the case of row flex containers. If this + // is set to anything other than kNotBreakBeforeRow, that means that the next + // row to be processed has broken before, as represented by a break before its + // first child. + // + // We do not clamp row gaps, so we can have more than one break before a row. + // There are certain adjustments we only want to make the first time a row + // breaks before. Thus, we will also track if the current break before is the + // first, or if we are past the first break before row (as distinguished by + // the kAtStartOfBreakBeforeRow and kPastStartOfBreakBeforeRow values). + NGFlexBreakBeforeRow break_before_row = kNotBreakBeforeRow; }; template <> diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc index 25c1b80492839..98a13300b275e 100644 --- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc @@ -13,7 +13,6 @@ #include "third_party/blink/renderer/core/layout/layout_button.h" #include "third_party/blink/renderer/core/layout/layout_flexible_box.h" #include "third_party/blink/renderer/core/layout/ng/flex/layout_ng_flexible_box.h" -#include "third_party/blink/renderer/core/layout/ng/flex/ng_flex_break_token_data.h" #include "third_party/blink/renderer/core/layout/ng/flex/ng_flex_child_iterator.h" #include "third_party/blink/renderer/core/layout/ng/flex/ng_flex_data.h" #include "third_party/blink/renderer/core/layout/ng/flex/ng_flex_item_iterator.h" @@ -1097,7 +1096,8 @@ const NGLayoutResult* NGFlexLayoutAlgorithm::LayoutInternal() { Vector row_break_between_outputs; HeapVector flex_line_outputs; HeapVector> oof_children; - bool broke_before_row = false; + NGFlexBreakTokenData::NGFlexBreakBeforeRow break_before_row = + NGFlexBreakTokenData::kNotBreakBeforeRow; ClearCollectionScope> scope(&flex_line_outputs); bool use_empty_line_block_size; @@ -1107,7 +1107,7 @@ const NGLayoutResult* NGFlexLayoutAlgorithm::LayoutInternal() { total_intrinsic_block_size_ = flex_data->intrinsic_block_size; flex_line_outputs = flex_data->flex_lines; row_break_between_outputs = flex_data->row_break_between; - broke_before_row = flex_data->broke_before_row; + break_before_row = flex_data->break_before_row; oof_children = flex_data->oof_children; use_empty_line_block_size = @@ -1148,7 +1148,7 @@ const NGLayoutResult* NGFlexLayoutAlgorithm::LayoutInternal() { NGLayoutResult::EStatus status = GiveItemsFinalPositionAndSizeForFragmentation( - &flex_line_outputs, &row_break_between_outputs, &broke_before_row); + &flex_line_outputs, &row_break_between_outputs, &break_before_row); if (status != NGLayoutResult::kSuccess) return container_builder_.Abort(status); @@ -1211,7 +1211,7 @@ const NGLayoutResult* NGFlexLayoutAlgorithm::LayoutInternal() { MakeGarbageCollected( container_builder_.GetBreakTokenData(), flex_line_outputs, row_break_between_outputs, oof_children, - total_intrinsic_block_size_, broke_before_row)); + total_intrinsic_block_size_, break_before_row)); } #if DCHECK_IS_ON() @@ -1546,11 +1546,11 @@ NGLayoutResult::EStatus NGFlexLayoutAlgorithm::GiveItemsFinalPositionAndSizeForFragmentation( HeapVector* flex_line_outputs, Vector* row_break_between_outputs, - bool* broke_before_row) { + NGFlexBreakTokenData::NGFlexBreakBeforeRow* break_before_row) { DCHECK(InvolvedInBlockFragmentation(container_builder_)); DCHECK(flex_line_outputs); DCHECK(row_break_between_outputs); - DCHECK(broke_before_row); + DCHECK(break_before_row); NGFlexItemIterator item_iterator(*flex_line_outputs, BreakToken(), is_column_); @@ -1572,9 +1572,11 @@ NGFlexLayoutAlgorithm::GiveItemsFinalPositionAndSizeForFragmentation( previously_consumed_block_size = BreakToken()->ConsumedBlockSize(); BaselineAccumulator baseline_accumulator(Style()); - for (auto entry = item_iterator.NextItem(*broke_before_row); + bool broke_before_row = + *break_before_row != NGFlexBreakTokenData::kNotBreakBeforeRow; + for (auto entry = item_iterator.NextItem(broke_before_row); NGFlexItem* flex_item = entry.flex_item; - entry = item_iterator.NextItem(*broke_before_row)) { + entry = item_iterator.NextItem(broke_before_row)) { wtf_size_t flex_item_idx = entry.flex_item_idx; wtf_size_t flex_line_idx = entry.flex_line_idx; NGFlexLine& line_output = (*flex_line_outputs)[flex_line_idx]; @@ -1626,11 +1628,56 @@ NGFlexLayoutAlgorithm::GiveItemsFinalPositionAndSizeForFragmentation( // the item or row expanded by. This allows for things like margins // and alignment offsets to not get sliced by a forced break. line_output.item_offset_adjustment += previously_consumed_block_size; - } else if (!is_column_ && flex_item_idx == 0 && *broke_before_row) { - LayoutUnit total_row_block_offset = - row_block_offset + line_output.item_offset_adjustment; - line_output.item_offset_adjustment += - previously_consumed_block_size - total_row_block_offset; + } else if (!is_column_ && flex_item_idx == 0 && broke_before_row) { + // If this is the first time we are handling a break before a row, + // adjust the offset of items in the row to accommodate the break. The + // following cases need to be considered: + // + // 1. If we are not the first line in the container, and the previous + // sibling row overflowed the fragmentainer in the block axis, flex + // items in the current row should be adjusted upward in the block + // direction to account for the overflowed content. + // + // 2. Otherwise, the current row gap should be decreased by the amount + // of extra space in the previous fragmentainer remaining after the + // block-end of the previous row. The reason being that we should not + // clamp row gaps between breaks, similarly to how flex item margins are + // handled during fragmentation. + // + // 3. If the entire row gap was accounted for in the previous + // fragmentainer, the block-offsets of the flex items in the current row + // will need to be adjusted downward in the block direction to + // accommodate the extra space consumed by the container. + if (*break_before_row == + NGFlexBreakTokenData::kAtStartOfBreakBeforeRow) { + // Calculate the amount of space remaining in the previous + // fragmentainer after the block-end of the previous flex row, if any. + LayoutUnit previous_row_end = + is_first_line + ? LayoutUnit() + : (*flex_line_outputs)[flex_line_idx - 1].LineCrossEnd(); + LayoutUnit fragmentainer_space_remaining = + (previously_consumed_block_size - previous_row_end) + .ClampNegativeToZero(); + + // If there was any remaining space after the previous flex line, + // determine how much of the row gap was consumed in the previous + // fragmentainer, if any. + LayoutUnit consumed_row_gap; + if (fragmentainer_space_remaining) { + LayoutUnit total_row_block_offset = + row_block_offset + line_output.item_offset_adjustment; + LayoutUnit row_gap = total_row_block_offset - previous_row_end; + DCHECK_GE(row_gap, LayoutUnit()); + consumed_row_gap = std::min(row_gap, fragmentainer_space_remaining); + } + + // Adjust the item offsets to account for any overflow or consumed row + // gap in the previous fragmentainer. + LayoutUnit row_adjustment = previously_consumed_block_size - + previous_row_end - consumed_row_gap; + line_output.item_offset_adjustment += row_adjustment; + } } else { LayoutUnit total_item_block_offset = offset.block_offset + line_output.item_offset_adjustment; @@ -1666,8 +1713,9 @@ NGFlexLayoutAlgorithm::GiveItemsFinalPositionAndSizeForFragmentation( container_builder_.AddBreakBeforeChild(flex_item->ng_input_node, kBreakAppealPerfect, /* is_forced_break */ false); - if (early_break_->Type() == NGEarlyBreak::kLine) - *broke_before_row = true; + if (early_break_->Type() == NGEarlyBreak::kLine) { + *break_before_row = NGFlexBreakTokenData::kAtStartOfBreakBeforeRow; + } ConsumeRemainingFragmentainerSpace(previously_consumed_block_size, &line_output); // For column flex containers, continue to the next column. For rows, @@ -1743,29 +1791,36 @@ NGFlexLayoutAlgorithm::GiveItemsFinalPositionAndSizeForFragmentation( if (!is_column_) { has_container_separation = offset.block_offset > row_block_offset && - (!item_break_token || (*broke_before_row && flex_item_idx == 0 && + (!item_break_token || (broke_before_row && flex_item_idx == 0 && item_break_token->IsBreakBefore())); // Don't attempt to break before a row if the fist item is resuming // layout. In which case, the row should be resuming layout, as well. if (flex_item_idx == 0 && (!item_break_token || - (item_break_token->IsBreakBefore() && *broke_before_row))) { + (item_break_token->IsBreakBefore() && broke_before_row))) { // Rows have no layout result, so if the row breaks before, we // will break before the first item in the row instead. bool row_container_separation = has_processed_first_line_; - bool is_first_for_row = !item_break_token || *broke_before_row; + bool is_first_for_row = !item_break_token || broke_before_row; NGBreakStatus row_break_status = BreakBeforeRowIfNeeded( - line_output, (*row_break_between_outputs)[flex_line_idx], - flex_line_idx, flex_item->ng_input_node, row_container_separation, + line_output, row_block_offset, + (*row_break_between_outputs)[flex_line_idx], flex_line_idx, + flex_item->ng_input_node, row_container_separation, is_first_for_row); if (row_break_status == NGBreakStatus::kBrokeBefore) { ConsumeRemainingFragmentainerSpace(previously_consumed_block_size, &line_output); - *broke_before_row = true; + if (broke_before_row) { + *break_before_row = + NGFlexBreakTokenData::kPastStartOfBreakBeforeRow; + } else { + *break_before_row = + NGFlexBreakTokenData::kAtStartOfBreakBeforeRow; + } DCHECK_EQ(status, NGLayoutResult::kSuccess); break; } - *broke_before_row = false; + *break_before_row = NGFlexBreakTokenData::kNotBreakBeforeRow; if (row_break_status == NGBreakStatus::kNeedsEarlierBreak) { status = NGLayoutResult::kNeedsEarlierBreak; break; @@ -1955,7 +2010,7 @@ NGFlexLayoutAlgorithm::GiveItemsFinalPositionAndSizeForFragmentation( } if (!container_builder_.HasInflowChildBreakInside() && - !item_iterator.NextItem(*broke_before_row).flex_item) { + !item_iterator.NextItem(broke_before_row).flex_item) { container_builder_.SetHasSeenAllChildren(); } @@ -2538,6 +2593,7 @@ void NGFlexLayoutAlgorithm::ConsumeRemainingFragmentainerSpace( NGBreakStatus NGFlexLayoutAlgorithm::BreakBeforeRowIfNeeded( const NGFlexLine& row, + LayoutUnit row_block_offset, EBreakBetween row_break_between, wtf_size_t row_index, NGLayoutInputNode child, @@ -2547,9 +2603,7 @@ NGBreakStatus NGFlexLayoutAlgorithm::BreakBeforeRowIfNeeded( DCHECK(InvolvedInBlockFragmentation(container_builder_)); LayoutUnit fragmentainer_block_offset = - ConstraintSpace().FragmentainerOffset() + row.cross_axis_offset; - if (BreakToken()) - fragmentainer_block_offset -= BreakToken()->ConsumedBlockSize(); + ConstraintSpace().FragmentainerOffset() + row_block_offset; if (has_container_separation) { if (IsForcedBreakValue(ConstraintSpace(), row_break_between)) { diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h index aa9400854ac52..8d321f3217fd5 100644 --- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h +++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h @@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h" #include "third_party/blink/renderer/core/layout/flexible_box_algorithm.h" +#include "third_party/blink/renderer/core/layout/ng/flex/ng_flex_break_token_data.h" #include "third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h" namespace blink { @@ -96,7 +97,7 @@ class CORE_EXPORT NGFlexLayoutAlgorithm NGLayoutResult::EStatus GiveItemsFinalPositionAndSizeForFragmentation( HeapVector* flex_line_outputs, Vector* row_break_between_outputs, - bool* broke_before_row); + NGFlexBreakTokenData::NGFlexBreakBeforeRow* break_before_row); NGLayoutResult::EStatus PropagateFlexItemInfo(FlexItem* flex_item, wtf_size_t flex_line_idx, LogicalOffset offset, @@ -137,10 +138,12 @@ class CORE_EXPORT NGFlexLayoutAlgorithm // a layout result, so when breaking before a row, we will insert a // fragmentainer break before the first child in a row. |child| should be // those associated with the first child in the row. |row|, - // |row_break_between|, |row_index|, |has_container_separation| and - // |is_first_for_row| are specific to the row itself. See + // |row_block_offset|, |row_break_between|, |row_index|, + // |has_container_separation| and |is_first_for_row| are specific to the row + // itself. See // |::blink::BreakBeforeChildIfNeeded()| for more documentation. NGBreakStatus BreakBeforeRowIfNeeded(const NGFlexLine& row, + LayoutUnit row_block_offset, EBreakBetween row_break_between, wtf_size_t row_index, NGLayoutInputNode child, diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 31d0e98842022..60d48d3e36e24 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations @@ -1481,7 +1481,6 @@ crbug.com/1396218 fragmentation/table-overlapping-rowspan.html [ Failure ] ### Tests failing with LayoutNGFlexFragmentation enabled: crbug.com/1367912 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-058.html [ Failure ] -crbug.com/1413089 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-063-print.html [ Failure ] crbug.com/1367912 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-043.html [ Failure ] crbug.com/1225630 fast/multicol/flexbox/doubly-nested-with-zero-width-flexbox-and-forced-break-crash.html [ Skip Timeout ] diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-065-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-065-ref.html new file mode 100644 index 0000000000000..50cf3c34c6d5a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-065-ref.html @@ -0,0 +1,35 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-065.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-065.html new file mode 100644 index 0000000000000..10ae8ca41d7d1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-065.html @@ -0,0 +1,37 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). + + + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-066.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-066.html new file mode 100644 index 0000000000000..b4c7fcd12f33f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-066.html @@ -0,0 +1,32 @@ + + + Multi-line row flex fragmentation: tall content inside constrained block. + + + + + +

Test passes if there is a filled green square and no red.

+
+
+
+
+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-067-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-067-ref.html new file mode 100644 index 0000000000000..4d230d12d0b8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-067-ref.html @@ -0,0 +1,36 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Test with forced breaks. + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-067.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-067.html new file mode 100644 index 0000000000000..797089cabed14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-067.html @@ -0,0 +1,38 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Test with forced breaks. + + + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-068-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-068-ref.html new file mode 100644 index 0000000000000..04263fb775b6f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-068-ref.html @@ -0,0 +1,34 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Test with content overflow. + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-068.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-068.html new file mode 100644 index 0000000000000..809f0c9a3a434 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-068.html @@ -0,0 +1,36 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Test with content overflow. + + + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-069-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-069-ref.html new file mode 100644 index 0000000000000..723b3dbc955e0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-069-ref.html @@ -0,0 +1,34 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-069.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-069.html new file mode 100644 index 0000000000000..3c3ee17bb4876 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-069.html @@ -0,0 +1,36 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). + + + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-070-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-070-ref.html new file mode 100644 index 0000000000000..ee511d287e730 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-070-ref.html @@ -0,0 +1,34 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Tests row gap that + is larger than the fragmentainer block-size. + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-070.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-070.html new file mode 100644 index 0000000000000..ea301c33b20e2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-070.html @@ -0,0 +1,36 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Tests row gap that + is larger than the fragmentainer block-size. + + + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-071-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-071-ref.html new file mode 100644 index 0000000000000..cd7ca531900a8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-071-ref.html @@ -0,0 +1,34 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Tests row gap that + is larger than the fragmentainer block-size. + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-071.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-071.html new file mode 100644 index 0000000000000..4a855f7fcec8b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-071.html @@ -0,0 +1,36 @@ + + + Multi-line row flex fragmentation: row gaps should not be truncated by + fragmentainer breaks (similar to flex-item margins). Tests row gap that + is larger than the fragmentainer block-size. + + + + +

Flex row gaps should not be truncated when a row breaks.

+
+
+
+
+
+