Commit 99a25516 authored by Christian Biesinger's avatar Christian Biesinger Committed by Commit Bot

[css-flexbox] Remove unnecessary arguments to ComputeStretchedSize and AvailableAlignmentSpace

We can just get them from the line. This also moves overriding the line's
cross axis extent to a more logical place (and adds it to the NG implementation).

Change-Id: I04da17674645fa55ff1903a15bdd4781ad26ef6e
Reviewed-on: https://chromium-review.googlesource.com/c/1338478Reviewed-by: default avatarDavid Grogan <dgrogan@chromium.org>
Commit-Queue: Christian Biesinger <cbiesinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609022}
parent 22079e36
......@@ -1527,6 +1527,7 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ali
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-003.htm [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-004.htm [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-005.htm [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-006.htm [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-wrap-001.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-wrap-002.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/align-content-wrap-003.html [ Skip ]
......@@ -1626,7 +1627,6 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/fle
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-self-stretch.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_direction-column-reverse.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_direction-column.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_first-line.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Failure ]
......@@ -1702,13 +1702,11 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttw
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-order.html [ Failure ]
crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap-reverse.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap.html [ Failure ]
### virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-column-reverse.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-column-reverse.html [ Skip ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure ]
### virtual/layout_ng_experimental/external/wpt/css/css-flexbox/getcomputedstyle/
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/getcomputedstyle/flexbox_computedstyle_display-inline.html [ Skip ]
......
......@@ -41,7 +41,9 @@ FlexItem::FlexItem(LayoutBox* box,
MinMaxSize min_max_sizes,
LayoutUnit main_axis_border_and_padding,
LayoutUnit main_axis_margin)
: box(box),
: algorithm(nullptr),
line_number(0),
box(box),
flex_base_content_size(flex_base_content_size),
min_max_sizes(min_max_sizes),
hypothetical_main_content_size(
......@@ -104,10 +106,9 @@ LayoutUnit FlexItem::MarginBoxAscent() const {
return ascent + FlowAwareMarginBefore();
}
LayoutUnit FlexItem::AvailableAlignmentSpace(
LayoutUnit line_cross_axis_extent) const {
LayoutUnit FlexItem::AvailableAlignmentSpace() const {
LayoutUnit cross_extent = CrossAxisMarginExtent() + cross_axis_size;
return line_cross_axis_extent - cross_extent;
return Line()->cross_axis_extent - cross_extent;
}
bool FlexItem::HasAutoMarginsInCrossAxis() const {
......@@ -140,7 +141,7 @@ void FlexItem::UpdateAutoMarginsInMainAxis(LayoutUnit auto_margin_offset) {
}
}
void FlexItem::ComputeStretchedSize(LayoutUnit line_cross_axis_extent) {
void FlexItem::ComputeStretchedSize() {
// TODO(dgrogan): Pass resolved cross-axis MinMaxSize to FlexItem
// constructor. Then use cross_axis_min_max.ClampSizeToMinAndMax instead of
// relying on legacy in this method.
......@@ -149,12 +150,13 @@ void FlexItem::ComputeStretchedSize(LayoutUnit line_cross_axis_extent) {
if (MainAxisIsInlineAxis() && box->StyleRef().LogicalHeight().IsAuto()) {
LayoutUnit stretched_logical_height =
std::max(box->BorderAndPaddingLogicalHeight(),
line_cross_axis_extent - CrossAxisMarginExtent());
Line()->cross_axis_extent - CrossAxisMarginExtent());
cross_axis_size = box->ConstrainLogicalHeightByMinMax(
stretched_logical_height, box->IntrinsicContentLogicalHeight());
} else if (!MainAxisIsInlineAxis() &&
box->StyleRef().LogicalWidth().IsAuto()) {
LayoutUnit child_width = (line_cross_axis_extent - CrossAxisMarginExtent())
LayoutUnit child_width =
(Line()->cross_axis_extent - CrossAxisMarginExtent())
.ClampNegativeToZero();
// This probably doesn't work in NG because flexbox might not yet know its
// CrossAxisContentExtent()
......@@ -401,7 +403,7 @@ FlexLine* FlexLayoutAlgorithm::ComputeNextFlexLine(
wtf_size_t start_index = next_item_index_;
for (; next_item_index_ < all_items_.size(); ++next_item_index_) {
const FlexItem& flex_item = all_items_[next_item_index_];
FlexItem& flex_item = all_items_[next_item_index_];
DCHECK(!flex_item.box->IsOutOfFlowPositioned());
if (IsMultiline() &&
sum_hypothetical_main_size +
......@@ -417,6 +419,7 @@ FlexLine* FlexLayoutAlgorithm::ComputeNextFlexLine(
total_weighted_flex_shrink += flex_item.box->StyleRef().FlexShrink() *
flex_item.flex_base_content_size;
sum_hypothetical_main_size += flex_item.HypotheticalMainAxisMarginBoxSize();
flex_item.line_number = flex_lines_.size();
}
DCHECK(next_item_index_ > start_index ||
......
......@@ -45,6 +45,7 @@
namespace blink {
class FlexItem;
class FlexLine;
class FlexLayoutAlgorithm;
class LayoutBox;
struct MinMaxSize;
......@@ -106,7 +107,7 @@ class FlexItem {
LayoutUnit MarginBoxAscent() const;
LayoutUnit AvailableAlignmentSpace(LayoutUnit) const;
LayoutUnit AvailableAlignmentSpace() const;
bool HasAutoMarginsInCrossAxis() const;
......@@ -114,9 +115,12 @@ class FlexItem {
// Computes the cross-axis size that a stretched item should have and stores
// it in cross_axis_size. DCHECKs if the item is not stretch aligned.
void ComputeStretchedSize(LayoutUnit line_cross_axis_extent);
void ComputeStretchedSize();
inline const FlexLine* Line() const;
FlexLayoutAlgorithm* algorithm;
wtf_size_t line_number;
LayoutBox* box;
const LayoutUnit flex_base_content_size;
const MinMaxSize min_max_sizes;
......@@ -293,6 +297,7 @@ class FlexLayoutAlgorithm {
bool IsHorizontalFlow() const;
bool IsColumnFlow() const;
bool IsMultiline() const { return style_->FlexWrap() != EFlexWrap::kNowrap; }
static bool IsHorizontalFlow(const ComputedStyle&);
bool IsLeftToRightFlow() const;
TransformedWritingMode GetTransformedWritingMode() const;
......@@ -318,7 +323,6 @@ class FlexLayoutAlgorithm {
private:
EOverflow MainAxisOverflowForChild(const LayoutBox& child) const;
bool IsMultiline() const { return style_->FlexWrap() != EFlexWrap::kNowrap; }
const ComputedStyle* style_;
const LayoutUnit line_break_length_;
......@@ -328,6 +332,10 @@ class FlexLayoutAlgorithm {
DISALLOW_COPY_AND_ASSIGN(FlexLayoutAlgorithm);
};
inline const FlexLine* FlexItem::Line() const {
return &algorithm->FlexLines()[line_number];
}
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_FLEXIBLE_BOX_ALGORITHM_H_
......@@ -379,6 +379,13 @@ void LayoutFlexibleBox::RepositionLogicalHeightDependentFlexItems(
LayoutUnit cross_axis_start_edge = line_contexts.IsEmpty()
? LayoutUnit()
: line_contexts[0].cross_axis_offset;
// If we have a single line flexbox, the line height is all the available
// space. For flex-direction: row, this means we need to use the height, so
// we do this after calling updateLogicalHeight.
if (!IsMultiline() && !line_contexts.IsEmpty()) {
line_contexts[0].cross_axis_extent = CrossAxisContentExtent();
}
AlignFlexLines(line_contexts);
AlignChildren(line_contexts);
......@@ -1504,21 +1511,11 @@ void LayoutFlexibleBox::LayoutColumnReverse(FlexItemVectorView& children,
}
void LayoutFlexibleBox::AlignFlexLines(Vector<FlexLine>& line_contexts) {
if (line_contexts.IsEmpty())
if (line_contexts.IsEmpty() || !IsMultiline())
return;
const StyleContentAlignmentData align_content =
FlexLayoutAlgorithm::ResolvedAlignContent(StyleRef());
// If we have a single line flexbox or a multiline line flexbox with only one
// flex line, the line height is all the available space. For
// flex-direction: row, this means we need to use the height, so we do this
// after calling updateLogicalHeight.
if (!IsMultiline()) {
line_contexts[0].cross_axis_extent = CrossAxisContentExtent();
return;
}
if (align_content.GetPosition() == ContentPosition::kFlexStart)
return;
......@@ -1562,7 +1559,6 @@ void LayoutFlexibleBox::AlignChildren(Vector<FlexLine>& line_contexts) {
for (FlexLine& line_context : line_contexts) {
LayoutUnit min_margin_after_baseline = LayoutUnit::Max();
LayoutUnit line_cross_axis_extent = line_context.cross_axis_extent;
LayoutUnit max_ascent = line_context.max_ascent;
for (FlexItem& flex_item : line_context.line_items) {
......@@ -1570,26 +1566,24 @@ void LayoutFlexibleBox::AlignChildren(Vector<FlexLine>& line_contexts) {
if (UpdateAutoMarginsInCrossAxis(
*flex_item.box,
std::max(LayoutUnit(), flex_item.AvailableAlignmentSpace(
line_cross_axis_extent))))
std::max(LayoutUnit(), flex_item.AvailableAlignmentSpace())))
continue;
ItemPosition position = flex_item.Alignment();
if (position == ItemPosition::kStretch) {
flex_item.ComputeStretchedSize(line_cross_axis_extent);
flex_item.ComputeStretchedSize();
ApplyStretchAlignmentToChild(flex_item);
}
LayoutUnit available_space =
flex_item.AvailableAlignmentSpace(line_cross_axis_extent);
LayoutUnit available_space = flex_item.AvailableAlignmentSpace();
LayoutUnit offset = AlignmentOffset(
available_space, position, flex_item.MarginBoxAscent(), max_ascent,
StyleRef().FlexWrap() == EFlexWrap::kWrapReverse);
AdjustAlignmentForChild(*flex_item.box, offset);
if (position == ItemPosition::kBaseline &&
StyleRef().FlexWrap() == EFlexWrap::kWrapReverse) {
min_margin_after_baseline = std::min(
min_margin_after_baseline,
flex_item.AvailableAlignmentSpace(line_cross_axis_extent) - offset);
min_margin_after_baseline =
std::min(min_margin_after_baseline,
flex_item.AvailableAlignmentSpace() - offset);
}
}
min_margin_after_baselines.push_back(min_margin_after_baseline);
......
......@@ -164,15 +164,15 @@ scoped_refptr<NGLayoutResult> NGFlexLayoutAlgorithm::Layout() {
// flexboxes are supported.
LayoutUnit final_content_block_size =
block_size - flex_container_border_scrollbar_padding.BlockSum();
if (!algorithm.IsMultiline() && !algorithm.FlexLines().IsEmpty())
algorithm.FlexLines()[0].cross_axis_extent = final_content_block_size;
for (FlexLine& line_context : algorithm.FlexLines()) {
for (wtf_size_t child_number = 0;
child_number < line_context.line_items.size(); ++child_number) {
FlexItem& flex_item = line_context.line_items[child_number];
if (flex_item.Alignment() == ItemPosition::kStretch) {
flex_item.ComputeStretchedSize(
// TODO(dgrogan): Change this to line_context.cross_axis_extent once
// lines are also sized and spaced.
final_content_block_size);
flex_item.ComputeStretchedSize();
NGConstraintSpaceBuilder space_builder(
ConstraintSpace(), flex_item.box->StyleRef().GetWritingMode(),
/* is_new_fc */ true);
......
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