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 8e2fa7f696353fe741dce04d11995ed2dd6852eb..e26950b4109636adeaa64a62225614a88d1bf11c 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 |
@@ -14,6 +14,47 @@ namespace blink { |
// - positioned and/or replaced calculations |
// - Take scrollbars into account |
+namespace { |
+ |
+// Converts physical dimensions to logical ones per |
+// https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical |
+// For now it's only used to calculate abstract values for margins. |
+NGBoxStrut ToLogicalDimensions(const NGPhysicalDimensions& physical_dim, |
+ const NGWritingMode writing_mode, |
+ const NGDirection direction) { |
+ bool is_ltr = direction == LeftToRight; |
+ NGBoxStrut logical_dim; |
+ switch (writing_mode) { |
+ case VerticalRightLeft: |
+ case SidewaysRightLeft: |
+ logical_dim = {is_ltr ? physical_dim.top : physical_dim.bottom, |
+ is_ltr ? physical_dim.bottom : physical_dim.top, |
+ physical_dim.right, physical_dim.left}; |
+ break; |
+ case VerticalLeftRight: |
+ logical_dim = {is_ltr ? physical_dim.top : physical_dim.bottom, |
+ is_ltr ? physical_dim.bottom : physical_dim.top, |
+ physical_dim.left, physical_dim.right}; |
+ break; |
+ case SidewaysLeftRight: |
+ logical_dim = {is_ltr ? physical_dim.bottom : physical_dim.top, |
+ is_ltr ? physical_dim.top : physical_dim.bottom, |
+ physical_dim.left, physical_dim.right}; |
+ break; |
+ default: |
+ NOTREACHED(); |
+ /* FALLTHROUGH */ |
+ case HorizontalTopBottom: |
+ logical_dim = {is_ltr ? physical_dim.left : physical_dim.right, |
+ is_ltr ? physical_dim.right : physical_dim.left, |
+ physical_dim.top, physical_dim.bottom}; |
+ break; |
+ } |
+ return logical_dim; |
+} |
+ |
+} // namespace |
+ |
LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace, |
const ComputedStyle& style, |
const Length& length, |
@@ -32,7 +73,10 @@ LayoutUnit resolveInlineLength(const NGConstraintSpace& constraintSpace, |
switch (length.type()) { |
case Auto: |
case FillAvailable: { |
- NGBoxStrut margins = computeMargins(constraintSpace, style); |
+ NGBoxStrut margins = |
+ computeMargins(constraintSpace, style, |
+ FromPlatformWritingMode(style.getWritingMode()), |
+ FromPlatformDirection(style.direction())); |
return container_size - margins.InlineSum(); |
} |
case Percent: |
@@ -88,7 +132,10 @@ LayoutUnit resolveBlockLength(const NGConstraintSpace& constraintSpace, |
LayoutUnit container_size = constraintSpace.ContainerSize().block_size; |
switch (length.type()) { |
case FillAvailable: { |
- NGBoxStrut margins = computeMargins(constraintSpace, style); |
+ NGBoxStrut margins = |
+ computeMargins(constraintSpace, style, |
+ FromPlatformWritingMode(style.getWritingMode()), |
+ FromPlatformDirection(style.direction())); |
return container_size - margins.BlockSum(); |
} |
case Percent: |
@@ -178,23 +225,25 @@ LayoutUnit computeBlockSizeForFragment(const NGConstraintSpace& constraintSpace, |
} |
NGBoxStrut computeMargins(const NGConstraintSpace& constraintSpace, |
- const ComputedStyle& style) { |
+ const ComputedStyle& style, |
+ const NGWritingMode writing_mode, |
+ const NGDirection direction) { |
// Margins always get computed relative to the inline size: |
// https://www.w3.org/TR/CSS2/box.html#value-def-margin-width |
- NGBoxStrut margins; |
- margins.inline_start = |
- resolveInlineLength(constraintSpace, style, style.marginStart(), |
+ NGPhysicalDimensions physical_dim; |
+ physical_dim.left = |
+ resolveInlineLength(constraintSpace, style, style.marginLeft(), |
LengthResolveType::MarginBorderPaddingSize); |
- margins.inline_end = |
- resolveInlineLength(constraintSpace, style, style.marginEnd(), |
+ physical_dim.right = |
+ resolveInlineLength(constraintSpace, style, style.marginRight(), |
LengthResolveType::MarginBorderPaddingSize); |
- margins.block_start = |
- resolveInlineLength(constraintSpace, style, style.marginBefore(), |
+ physical_dim.top = |
+ resolveInlineLength(constraintSpace, style, style.marginTop(), |
LengthResolveType::MarginBorderPaddingSize); |
- margins.block_end = |
- resolveInlineLength(constraintSpace, style, style.marginAfter(), |
+ physical_dim.bottom = |
+ resolveInlineLength(constraintSpace, style, style.marginBottom(), |
LengthResolveType::MarginBorderPaddingSize); |
- return margins; |
+ return ToLogicalDimensions(physical_dim, writing_mode, direction); |
} |
NGBoxStrut computeBorders(const ComputedStyle& style) { |