Commit 2be07a9e authored by Koji Ishii's avatar Koji Ishii Committed by Commit Bot

[LayoutNG] Fix RTL text-align with trailing spaces

This patch fixes RTL 'text-align: start|right|center' not to
shift the line by the amount of trailing spaces.

Bug: 636993
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_layout_ng
Change-Id: I99165bae187f7e76f183da20ce7a1909b10d1fc5
Reviewed-on: https://chromium-review.googlesource.com/1061273
Commit-Queue: Koji Ishii <kojii@chromium.org>
Reviewed-by: default avatarEmil A Eklund <eae@chromium.org>
Cr-Commit-Position: refs/heads/master@{#559161}
parent 7e0f41ff
...@@ -1318,7 +1318,6 @@ crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Failure ] ...@@ -1318,7 +1318,6 @@ crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Failure ]
crbug.com/591099 fast/text/international/bidi-linebreak-002.html [ Failure ] crbug.com/591099 fast/text/international/bidi-linebreak-002.html [ Failure ]
crbug.com/591099 fast/text/international/bidi-linebreak-003.html [ Failure ] crbug.com/591099 fast/text/international/bidi-linebreak-003.html [ Failure ]
crbug.com/714962 fast/text/international/hindi-whitespace.html [ Failure ] crbug.com/714962 fast/text/international/hindi-whitespace.html [ Failure ]
crbug.com/591099 fast/text/international/rtl-white-space-pre-wrap.html [ Failure ]
crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Pass ] crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Pass ]
crbug.com/591099 fast/text/international/text-combine-image-test.html [ Failure ] crbug.com/591099 fast/text/international/text-combine-image-test.html [ Failure ]
crbug.com/591099 fast/text/large-text-composed-char.html [ Pass Timeout ] crbug.com/591099 fast/text/large-text-composed-char.html [ Pass Timeout ]
......
...@@ -43,8 +43,12 @@ struct NGLineAlign { ...@@ -43,8 +43,12 @@ struct NGLineAlign {
NGLineAlign(const NGLineInfo&); NGLineAlign(const NGLineInfo&);
NGLineAlign() = delete; NGLineAlign() = delete;
// The space to align or justify. This includes trailing spaces if exists.
LayoutUnit space; LayoutUnit space;
// The end offset with trailing spaces excluded.
unsigned end_offset; unsigned end_offset;
LayoutUnit trailing_spaces_width;
}; };
NGLineAlign::NGLineAlign(const NGLineInfo& line_info) { NGLineAlign::NGLineAlign(const NGLineInfo& line_info) {
...@@ -56,14 +60,16 @@ NGLineAlign::NGLineAlign(const NGLineInfo& line_info) { ...@@ -56,14 +60,16 @@ NGLineAlign::NGLineAlign(const NGLineInfo& line_info) {
const NGInlineItemResult& item_result = *it; const NGInlineItemResult& item_result = *it;
if (!item_result.has_only_trailing_spaces) { if (!item_result.has_only_trailing_spaces) {
end_offset = item_result.end_offset; end_offset = item_result.end_offset;
space += trailing_spaces_width;
return; return;
} }
space += item_result.inline_size; trailing_spaces_width += item_result.inline_size;
} }
// An empty line, or only trailing spaces. // An empty line, or only trailing spaces.
DCHECK_EQ(space, line_info.AvailableWidth() - line_info.TextIndent()); DCHECK_EQ(space, line_info.AvailableWidth() - line_info.TextIndent());
end_offset = line_info.StartOffset(); end_offset = line_info.StartOffset();
space += trailing_spaces_width;
} }
} // namespace } // namespace
...@@ -516,8 +522,9 @@ LayoutUnit NGInlineLayoutAlgorithm::OffsetForTextAlign( ...@@ -516,8 +522,9 @@ LayoutUnit NGInlineLayoutAlgorithm::OffsetForTextAlign(
// Justification is applied in earlier phase, see PlaceItems(). // Justification is applied in earlier phase, see PlaceItems().
DCHECK_NE(text_align, ETextAlign::kJustify); DCHECK_NE(text_align, ETextAlign::kJustify);
NGLineAlign align(line_info);
return LineOffsetForTextAlign(text_align, line_info.BaseDirection(), return LineOffsetForTextAlign(text_align, line_info.BaseDirection(),
NGLineAlign(line_info).space); align.space, align.trailing_spaces_width);
} }
LayoutUnit NGInlineLayoutAlgorithm::ComputeContentSize( LayoutUnit NGInlineLayoutAlgorithm::ComputeContentSize(
......
...@@ -242,7 +242,7 @@ NGLogicalOffset NGBlockLayoutAlgorithm::CalculateLogicalOffset( ...@@ -242,7 +242,7 @@ NGLogicalOffset NGBlockLayoutAlgorithm::CalculateLogicalOffset(
if (child.IsInline()) { if (child.IsInline()) {
LayoutUnit offset = LayoutUnit offset =
LineOffsetForTextAlign(Style().GetTextAlign(), Style().Direction(), LineOffsetForTextAlign(Style().GetTextAlign(), Style().Direction(),
child_available_size_.inline_size); child_available_size_.inline_size, LayoutUnit());
if (IsRtl(Style().Direction())) if (IsRtl(Style().Direction()))
offset = child_available_size_.inline_size - offset; offset = child_available_size_.inline_size - offset;
inline_offset += offset; inline_offset += offset;
...@@ -1272,7 +1272,7 @@ NGBfcOffset NGBlockLayoutAlgorithm::PositionEmptyChildWithParentBfc( ...@@ -1272,7 +1272,7 @@ NGBfcOffset NGBlockLayoutAlgorithm::PositionEmptyChildWithParentBfc(
if (child.IsInline()) { if (child.IsInline()) {
child_bfc_offset.line_offset += child_bfc_offset.line_offset +=
LineOffsetForTextAlign(Style().GetTextAlign(), Style().Direction(), LineOffsetForTextAlign(Style().GetTextAlign(), Style().Direction(),
child_available_size_.inline_size); child_available_size_.inline_size, LayoutUnit());
} }
AdjustToClearance(child_space.ClearanceOffset(), &child_bfc_offset); AdjustToClearance(child_space.ClearanceOffset(), &child_bfc_offset);
......
...@@ -634,7 +634,8 @@ void ApplyAutoMargins(const ComputedStyle& style, ...@@ -634,7 +634,8 @@ void ApplyAutoMargins(const ComputedStyle& style,
LayoutUnit LineOffsetForTextAlign(ETextAlign text_align, LayoutUnit LineOffsetForTextAlign(ETextAlign text_align,
TextDirection direction, TextDirection direction,
LayoutUnit space_left) { LayoutUnit space_left,
LayoutUnit trailing_spaces_width) {
bool is_ltr = IsLtr(direction); bool is_ltr = IsLtr(direction);
if (text_align == ETextAlign::kStart || text_align == ETextAlign::kJustify) if (text_align == ETextAlign::kStart || text_align == ETextAlign::kJustify)
text_align = is_ltr ? ETextAlign::kLeft : ETextAlign::kRight; text_align = is_ltr ? ETextAlign::kLeft : ETextAlign::kRight;
...@@ -653,19 +654,25 @@ LayoutUnit LineOffsetForTextAlign(ETextAlign text_align, ...@@ -653,19 +654,25 @@ LayoutUnit LineOffsetForTextAlign(ETextAlign text_align,
} }
case ETextAlign::kRight: case ETextAlign::kRight:
case ETextAlign::kWebkitRight: { case ETextAlign::kWebkitRight: {
// In RTL, trailing spaces appear on the left of the line.
if (UNLIKELY(!is_ltr))
return space_left - trailing_spaces_width;
// Wide lines spill out of the block based off direction. // Wide lines spill out of the block based off direction.
// So even if text-align is right, if direction is LTR, wide lines // So even if text-align is right, if direction is LTR, wide lines
// should overflow out of the right side of the block. // should overflow out of the right side of the block.
if (space_left > LayoutUnit() || !is_ltr) if (space_left > LayoutUnit())
return space_left; return space_left;
return LayoutUnit(); return LayoutUnit();
} }
case ETextAlign::kCenter: case ETextAlign::kCenter:
case ETextAlign::kWebkitCenter: { case ETextAlign::kWebkitCenter: {
if (is_ltr || space_left > LayoutUnit()) if (is_ltr)
return (space_left / 2).ClampNegativeToZero(); return (space_left / 2).ClampNegativeToZero();
// In RTL, trailing spaces appear on the left of the line.
if (space_left > LayoutUnit())
return (space_left / 2).ClampNegativeToZero() - trailing_spaces_width;
// In RTL, wide lines should spill out to the left, same as kRight. // In RTL, wide lines should spill out to the left, same as kRight.
return space_left; return space_left - trailing_spaces_width;
} }
default: default:
NOTREACHED(); NOTREACHED();
......
...@@ -159,7 +159,8 @@ CORE_EXPORT void ApplyAutoMargins(const ComputedStyle& child_style, ...@@ -159,7 +159,8 @@ CORE_EXPORT void ApplyAutoMargins(const ComputedStyle& child_style,
// text-align, direction and amount of unused space. // text-align, direction and amount of unused space.
CORE_EXPORT LayoutUnit LineOffsetForTextAlign(ETextAlign, CORE_EXPORT LayoutUnit LineOffsetForTextAlign(ETextAlign,
TextDirection, TextDirection,
LayoutUnit space_left); LayoutUnit space_left,
LayoutUnit trailing_spaces_width);
CORE_EXPORT LayoutUnit ConstrainByMinMax(LayoutUnit length, CORE_EXPORT LayoutUnit ConstrainByMinMax(LayoutUnit length,
base::Optional<LayoutUnit> min, base::Optional<LayoutUnit> min,
......
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