Commit 2847ae48 authored by David Grogan's avatar David Grogan Committed by Commit Bot

[FlexNG] Use block % resolution size when finding image preferred widths

Flex uses image preferred widths as flex-basis. When an image has
max-height:blah%, that can affect its preferred width. FlexNG wasn't
passing the percent resolution height to legacy for this calculation,
and the % max-height was being treated as auto.

ComputeMinAndMaxContentContribution was already doing this for replaced
elements, so piggy-back on that code.

Bug: 1107604
Change-Id: Icecb312ce8aee22cad6e4b1925aab77ecbd3c2ef
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2309048Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Commit-Queue: David Grogan <dgrogan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#790439}
parent ed4717cb
......@@ -14,6 +14,7 @@
#include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h"
#include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
#include "third_party/blink/renderer/core/layout/ng/ng_fragment.h"
#include "third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h"
#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
#include "third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h"
#include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
......@@ -570,8 +571,11 @@ void NGFlexLayoutAlgorithm::ConstructAndAppendFlexItems() {
// is not exactly correct.
// TODO(dgrogan): Replace with a variant of ComputeReplacedSize that
// ignores min-width, width, max-width.
MinMaxSizesInput input(child_percentage_size_.block_size,
MinMaxSizesType::kContent);
flex_base_border_box =
child.GetLayoutBox()->PreferredLogicalWidths().max_size;
ComputeMinAndMaxContentContribution(Style(), child, input)
.sizes.max_size;
} else {
flex_base_border_box =
MinMaxSizesFunc(MinMaxSizesType::kContent).sizes.max_size;
......
<!doctype html>
<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes">
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
<link rel="bookmark" href="https://crbug.com/1107604">
<meta name="assert" content="Replaced children with % max-height are sized correctly when they are deeply nested flex items with imposed definite heights." />
<style>
#reference-overlapped-red {
position: absolute;
background-color: red;
width: 100px;
height: 100px;
z-index: -1;
}
#outer-flexbox {
display: flex;
width: 200px;
height: 200px;
flex-direction: column;
align-items: flex-start;
}
#middle-flexbox {
display: flex;
height: 50%;
/* This needs to be stretched for repro */
align-items: stretch;
min-height: 0px;
}
#inner-flexbox {
display: flex;
align-items: flex-start;
min-width: 0px;
}
img {
max-height: 100%;
min-width: 0px;
}
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="reference-overlapped-red"></div>
<div id=outer-flexbox>
<div id=middle-flexbox>
<div id=inner-flexbox>
<!-- This is a 400x400 green square. It's inline so that there is no
raciness when an image resource loads, which affects chrome's behavior
on this test. -->
<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 400' width='400' height='400'><rect width='400' height='400' fill='green'/></svg>">
</div>
</div>
</div>
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