Index: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc |
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc |
index d387bb9a6e8c4547975923b0aef90b96cf5a75c2..1b1bbfa3f646f123473b1034d119fc7e7f5ba4e5 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc |
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc |
@@ -248,7 +248,7 @@ bool NGInlineLayoutAlgorithm::PlaceItems( |
LayoutUnit inline_size = position; |
NGLogicalOffset offset(LogicalLeftOffset(line_opp), |
baseline - box_states_.LineBoxState().metrics.ascent); |
- ApplyTextAlign(line_style, line_style.GetTextAlign(line_info->IsLastLine()), |
+ ApplyTextAlign(line_style.GetTextAlign(line_info->IsLastLine()), |
&offset.inline_offset, inline_size, line_opp.InlineSize()); |
line_box.SetInlineSize(inline_size); |
@@ -311,25 +311,55 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline( |
return box_states_.OnCloseTag(item, line_box, box, baseline_type_); |
} |
-void NGInlineLayoutAlgorithm::ApplyTextAlign(const ComputedStyle& line_style, |
- ETextAlign text_align, |
+void NGInlineLayoutAlgorithm::ApplyTextAlign(ETextAlign text_align, |
LayoutUnit* line_left, |
LayoutUnit inline_size, |
LayoutUnit available_width) { |
- switch (text_align) { |
- case ETextAlign::kRight: |
- case ETextAlign::kWebkitRight: |
- // Wide lines spill out of the block based off direction. |
- // So even if text-align is right, if direction is LTR, wide lines should |
- // overflow out of the right side of the block. |
- // TODO(kojii): Investigate how to handle trailing spaces. |
- if (inline_size < available_width || !line_style.IsLeftToRightDirection()) |
- *line_left += available_width - inline_size; |
- break; |
- default: |
- // TODO(layout-dev): Implement. |
- // Refer to LayoutBlockFlow::UpdateLogicalWidthForAlignment(). |
- break; |
+ bool is_base_ltr = IsLtr(Node().BaseDirection()); |
+ // TODO(kojii): Investigate handling trailing spaces for 'white-space: |
+ // pre|pre-wrap'. Refer to LayoutBlockFlow::UpdateLogicalWidthForAlignment(). |
+ while (true) { |
+ switch (text_align) { |
+ case ETextAlign::kLeft: |
+ case ETextAlign::kWebkitLeft: |
+ // The direction of the block should determine what happens with wide |
+ // lines. In particular with RTL blocks, wide lines should still spill |
+ // out to the left. |
+ if (!is_base_ltr && inline_size > available_width) |
+ *line_left -= inline_size - available_width; |
+ return; |
+ case ETextAlign::kRight: |
+ case ETextAlign::kWebkitRight: |
+ // Wide lines spill out of the block based off direction. |
+ // So even if text-align is right, if direction is LTR, wide lines |
+ // should overflow out of the right side of the block. |
+ if (inline_size < available_width || !is_base_ltr) |
+ *line_left += available_width - inline_size; |
+ return; |
+ case ETextAlign::kCenter: |
+ case ETextAlign::kWebkitCenter: |
+ if (is_base_ltr) { |
+ *line_left += |
+ std::max((available_width - inline_size) / 2, LayoutUnit()); |
+ } else if (inline_size <= available_width) { |
+ *line_left += (available_width - inline_size) / 2; |
+ } else { |
+ // In RTL, wide lines should spill out to the left, same as kRight. |
+ *line_left += available_width - inline_size; |
+ } |
+ return; |
+ case ETextAlign::kStart: |
+ text_align = is_base_ltr ? ETextAlign::kLeft : ETextAlign::kRight; |
+ continue; |
+ case ETextAlign::kEnd: |
+ text_align = is_base_ltr ? ETextAlign::kRight : ETextAlign::kLeft; |
+ continue; |
+ case ETextAlign::kJustify: |
+ // TODO(kojii): Implement. |
+ return; |
+ } |
+ NOTREACHED(); |
+ return; |
} |
} |