Index: third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc |
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc |
index 0802881f942ed8a23e142a024c152a2aa48e22c4..05b27372202237feb552162bb1cdd34e43db7caa 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc |
+++ b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc |
@@ -5,6 +5,7 @@ |
#include "core/layout/ng/ng_length_utils.h" |
#include "core/layout/ng/ng_constraint_space.h" |
+#include "core/layout/ng/ng_constraint_space_builder.h" |
#include "core/layout/ng/ng_fragment_base.h" |
#include "core/style/ComputedStyle.h" |
#include "platform/LayoutUnit.h" |
@@ -28,6 +29,11 @@ bool NeedMinAndMaxContentSizes(const ComputedStyle& style) { |
style.logicalMaxWidth().isIntrinsic(); |
} |
+bool NeedMinAndMaxContentSizesForContentContribution( |
+ const ComputedStyle& style) { |
+ return NeedMinAndMaxContentSizes(style) || style.logicalWidth().isAuto(); |
+} |
+ |
LayoutUnit ResolveInlineLength( |
const NGConstraintSpace& constraint_space, |
const ComputedStyle& style, |
@@ -175,6 +181,52 @@ LayoutUnit ResolveBlockLength(const NGConstraintSpace& constraint_space, |
} |
} |
+MinAndMaxContentSizes ComputeMinAndMaxContentContribution( |
+ const ComputedStyle& style, |
+ const WTF::Optional<MinAndMaxContentSizes>& min_and_max) { |
+ // Synthesize a zero-sized constraint space for passing to |
+ // ResolveInlineLength. |
+ NGWritingMode writing_mode = FromPlatformWritingMode(style.getWritingMode()); |
+ NGConstraintSpaceBuilder builder(writing_mode); |
+ NGConstraintSpace* space = builder.ToConstraintSpace(); |
+ |
+ MinAndMaxContentSizes computed_sizes; |
+ Length inline_size = style.logicalWidth(); |
+ if (inline_size.isAuto()) { |
+ CHECK(min_and_max.has_value()); |
+ NGBoxStrut border_and_padding = |
+ ComputeBorders(style) + ComputePadding(*space, style); |
+ computed_sizes.min_content = |
+ min_and_max->min_content + border_and_padding.InlineSum(); |
+ computed_sizes.max_content = |
+ min_and_max->max_content + border_and_padding.InlineSum(); |
+ } else { |
+ computed_sizes.min_content = computed_sizes.max_content = |
+ ResolveInlineLength(*space, style, min_and_max, inline_size, |
+ LengthResolveType::kContentSize); |
+ } |
+ |
+ Length max_length = style.logicalMaxWidth(); |
+ if (!max_length.isMaxSizeNone()) { |
+ LayoutUnit max = ResolveInlineLength(*space, style, min_and_max, max_length, |
+ LengthResolveType::kMaxSize); |
+ computed_sizes.min_content = std::min(computed_sizes.min_content, max); |
+ computed_sizes.max_content = std::min(computed_sizes.max_content, max); |
+ } |
+ |
+ LayoutUnit min = |
+ ResolveInlineLength(*space, style, min_and_max, style.logicalMinWidth(), |
+ LengthResolveType::kMinSize); |
+ computed_sizes.min_content = std::max(computed_sizes.min_content, min); |
+ computed_sizes.max_content = std::max(computed_sizes.max_content, min); |
+ |
+ NGBoxStrut margins = |
+ ComputeMargins(*space, style, writing_mode, style.direction()); |
+ computed_sizes.min_content += margins.InlineSum(); |
+ computed_sizes.max_content += margins.InlineSum(); |
+ return computed_sizes; |
+} |
+ |
LayoutUnit ComputeInlineSizeForFragment( |
const NGConstraintSpace& space, |
const ComputedStyle& style, |