| 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 9075296088616e2458f9fe86c5682e67528e382a..87894828d679bff724a9b0adefe525186176be38 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
|
| @@ -69,6 +69,13 @@ LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace,
|
| if (type == LengthResolveType::MarginBorderPaddingSize && length.isAuto())
|
| return LayoutUnit();
|
|
|
| + // We don't need this when we're resolving margin/border/padding; skip
|
| + // computing it as an optimization and to simplify the code below.
|
| + NGBoxStrut border_and_padding;
|
| + if (type != LengthResolveType::MarginBorderPaddingSize) {
|
| + border_and_padding =
|
| + computeBorders(style) + computePadding(constraintSpace, style);
|
| + }
|
| LayoutUnit container_size = constraintSpace.ContainerSize().inline_size;
|
| switch (length.type()) {
|
| case Auto:
|
| @@ -77,18 +84,17 @@ LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace,
|
| computeMargins(constraintSpace, style,
|
| FromPlatformWritingMode(style.getWritingMode()),
|
| FromPlatformDirection(style.direction()));
|
| - return container_size - margins.InlineSum();
|
| + return std::max(border_and_padding.InlineSum(),
|
| + container_size - margins.InlineSum());
|
| }
|
| case Percent:
|
| case Fixed:
|
| case Calculated: {
|
| - // TODO(layout-ng): adjust for border-box
|
| LayoutUnit value = valueForLength(length, container_size);
|
| - if (style.boxSizing() == BoxSizingContentBox &&
|
| - type != LengthResolveType::MarginBorderPaddingSize) {
|
| - NGBoxStrut border_and_padding =
|
| - computeBorders(style) + computePadding(constraintSpace, style);
|
| + if (style.boxSizing() == BoxSizingContentBox) {
|
| value += border_and_padding.InlineSum();
|
| + } else {
|
| + value = std::max(border_and_padding.InlineSum(), value);
|
| }
|
| return value;
|
| }
|
| @@ -96,7 +102,7 @@ LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace,
|
| case MaxContent:
|
| case FitContent:
|
| // TODO(layout-ng): implement
|
| - return LayoutUnit();
|
| + return border_and_padding.InlineSum();
|
| case DeviceWidth:
|
| case DeviceHeight:
|
| case ExtendToZoom:
|
| @@ -104,7 +110,7 @@ LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace,
|
| case MaxSizeNone:
|
| default:
|
| NOTREACHED();
|
| - return LayoutUnit();
|
| + return border_and_padding.InlineSum();
|
| }
|
| }
|
|
|
| @@ -125,6 +131,13 @@ LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace,
|
| constraintSpace.ContainerSize().block_size == NGSizeIndefinite)
|
| return contentSize;
|
|
|
| + // We don't need this when we're resolving margin/border/padding; skip
|
| + // computing it as an optimization and to simplify the code below.
|
| + NGBoxStrut border_and_padding;
|
| + if (type != LengthResolveType::MarginBorderPaddingSize) {
|
| + border_and_padding =
|
| + computeBorders(style) + computePadding(constraintSpace, style);
|
| + }
|
| LayoutUnit container_size = constraintSpace.ContainerSize().block_size;
|
| switch (length.type()) {
|
| case FillAvailable: {
|
| @@ -132,18 +145,17 @@ LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace,
|
| computeMargins(constraintSpace, style,
|
| FromPlatformWritingMode(style.getWritingMode()),
|
| FromPlatformDirection(style.direction()));
|
| - return container_size - margins.BlockSum();
|
| + return std::max(border_and_padding.BlockSum(),
|
| + container_size - margins.BlockSum());
|
| }
|
| case Percent:
|
| case Fixed:
|
| case Calculated: {
|
| - // TODO(layout-ng): adjust for border-box
|
| LayoutUnit value = valueForLength(length, container_size);
|
| - if (style.boxSizing() == BoxSizingContentBox &&
|
| - type != LengthResolveType::MarginBorderPaddingSize) {
|
| - NGBoxStrut border_and_padding =
|
| - computeBorders(style) + computePadding(constraintSpace, style);
|
| + if (style.boxSizing() == BoxSizingContentBox) {
|
| value += border_and_padding.BlockSum();
|
| + } else {
|
| + value = std::max(border_and_padding.BlockSum(), value);
|
| }
|
| return value;
|
| }
|
| @@ -151,6 +163,10 @@ LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace,
|
| case MinContent:
|
| case MaxContent:
|
| case FitContent:
|
| + // Due to how contentSize is calculated, it should always include border
|
| + // and padding.
|
| + if (contentSize != LayoutUnit(-1))
|
| + DCHECK_GE(contentSize, border_and_padding.BlockSum());
|
| return contentSize;
|
| case DeviceWidth:
|
| case DeviceHeight:
|
| @@ -159,7 +175,7 @@ LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace,
|
| case MaxSizeNone:
|
| default:
|
| NOTREACHED();
|
| - return LayoutUnit();
|
| + return border_and_padding.BlockSum();
|
| }
|
| }
|
|
|
|
|